{"files":{"LICENSE":"MIT License\n\nCopyright (c) 2026 Worker Safety contributors\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","composer.json":"{\n    \"name\": \"goktugcy/worker-safety\",\n    \"description\": \"Static analysis for PHP applications running on persistent workers. Detect cross-request state risks before they reach production.\",\n    \"type\": \"library\",\n    \"keywords\": [\n        \"frankenphp\",\n        \"laravel\",\n        \"octane\",\n        \"php\",\n        \"roadrunner\",\n        \"sarif\",\n        \"static-analysis\",\n        \"swoole\",\n        \"worker\"\n    ],\n    \"homepage\": \"https://github.com/goktugcy/worker-safety\",\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"Worker Safety Contributors\",\n            \"homepage\": \"https://github.com/goktugcy/worker-safety/graphs/contributors\"\n        }\n    ],\n    \"require\": {\n        \"php\": \"^8.2\",\n        \"ext-json\": \"*\",\n        \"ext-mbstring\": \"*\",\n        \"nikic/php-parser\": \"^5.3\",\n        \"symfony/console\": \"^6.4 || ^7.0 || ^8.0\",\n        \"symfony/yaml\": \"^6.4 || ^7.0 || ^8.0\"\n    },\n    \"require-dev\": {\n        \"friendsofphp/php-cs-fixer\": \"^3.64\",\n        \"laravel/framework\": \"^12.0 || ^13.0\",\n        \"phpstan/phpstan\": \"^2.1\",\n        \"phpunit/phpunit\": \"^11.5 || ^12.0\"\n    },\n    \"suggest\": {\n        \"laravel/framework\": \"Registers `php artisan worker-safety:scan` through package discovery. Verified against Laravel 11, 12 and 13.\"\n    },\n    \"autoload\": {\n        \"psr-4\": {\n            \"WorkerSafety\\\\\": \"src/\"\n        }\n    },\n    \"autoload-dev\": {\n        \"psr-4\": {\n            \"WorkerSafety\\\\Tests\\\\\": \"tests/\"\n        },\n        \"exclude-from-classmap\": [\n            \"/tests/Fixtures/\"\n        ]\n    },\n    \"bin\": [\n        \"bin/worker-safety\"\n    ],\n    \"config\": {\n        \"platform\": {\n            \"php\": \"8.2.0\"\n        },\n        \"sort-packages\": true,\n        \"optimize-autoloader\": true,\n        \"policy\": {}\n    },\n    \"extra\": {\n        \"branch-alias\": {\n            \"dev-main\": \"1.x-dev\"\n        },\n        \"laravel\": {\n            \"providers\": [\n                \"WorkerSafety\\\\Integration\\\\Laravel\\\\WorkerSafetyServiceProvider\"\n            ]\n        }\n    },\n    \"scripts\": {\n        \"test\": \"phpunit\",\n        \"test:coverage\": \"phpunit --coverage-text\",\n        \"analyse\": \"phpstan analyse --memory-limit=512M\",\n        \"lint\": \"php-cs-fixer fix --dry-run --diff\",\n        \"lint:fix\": \"php-cs-fixer fix\",\n        \"ci\": [\n            \"@lint\",\n            \"@analyse\",\n            \"@test\"\n        ]\n    },\n    \"scripts-descriptions\": {\n        \"test\": \"Run the PHPUnit test suite.\",\n        \"analyse\": \"Run PHPStan static analysis at max level.\",\n        \"lint\": \"Check coding style with PHP-CS-Fixer (no changes written).\",\n        \"lint:fix\": \"Fix coding style with PHP-CS-Fixer.\"\n    },\n    \"minimum-stability\": \"stable\",\n    \"prefer-stable\": true\n}\n","composer.lock":"{\n    \"_readme\": [\n        \"This file locks the dependencies of your project to a known state\",\n        \"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies\",\n        \"This file is @generated automatically\"\n    ],\n    \"content-hash\": \"ade0b511dfb236ccca8e627237d0e6fb\",\n    \"packages\": [\n        {\n            \"name\": \"nikic/php-parser\",\n            \"version\": \"v5.8.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/nikic/PHP-Parser.git\",\n                \"reference\": \"044a6a392ff8ad0d61f14370a5fbbd0a0107152f\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/nikic/PHP-Parser/zipball/044a6a392ff8ad0d61f14370a5fbbd0a0107152f\",\n                \"reference\": \"044a6a392ff8ad0d61f14370a5fbbd0a0107152f\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"ext-json\": \"*\",\n                \"ext-tokenizer\": \"*\",\n                \"php\": \">=7.4\"\n            },\n            \"require-dev\": {\n                \"ircmaxell/php-yacc\": \"^0.0.7\",\n                \"phpunit/phpunit\": \"^9.0\"\n            },\n            \"bin\": [\n                \"bin/php-parse\"\n            ],\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-master\": \"5.x-dev\"\n                }\n            },\n            \"autoload\": {\n                \"psr-4\": {\n                    \"PhpParser\\\\\": \"lib/PhpParser\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"BSD-3-Clause\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Nikita Popov\"\n                }\n            ],\n            \"description\": \"A PHP parser written in PHP\",\n            \"keywords\": [\n                \"parser\",\n                \"php\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/nikic/PHP-Parser/issues\",\n                \"source\": \"https://github.com/nikic/PHP-Parser/tree/v5.8.0\"\n            },\n            \"time\": \"2026-07-04T14:30:18+00:00\"\n        },\n        {\n            \"name\": \"psr/container\",\n            \"version\": \"2.0.2\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/php-fig/container.git\",\n                \"reference\": \"c71ecc56dfe541dbd90c5360474fbc405f8d5963\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963\",\n                \"reference\": \"c71ecc56dfe541dbd90c5360474fbc405f8d5963\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=7.4.0\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-master\": \"2.0.x-dev\"\n                }\n            },\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Psr\\\\Container\\\\\": \"src/\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"PHP-FIG\",\n                    \"homepage\": \"https://www.php-fig.org/\"\n                }\n            ],\n            \"description\": \"Common Container Interface (PHP FIG PSR-11)\",\n            \"homepage\": \"https://github.com/php-fig/container\",\n            \"keywords\": [\n                \"PSR-11\",\n                \"container\",\n                \"container-interface\",\n                \"container-interop\",\n                \"psr\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/php-fig/container/issues\",\n                \"source\": \"https://github.com/php-fig/container/tree/2.0.2\"\n            },\n            \"time\": \"2021-11-05T16:47:00+00:00\"\n        },\n        {\n            \"name\": \"symfony/console\",\n            \"version\": \"v7.4.18\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/symfony/console.git\",\n                \"reference\": \"23d6f88a29f6d0eac45bd77d70307adf83ba7ab0\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/symfony/console/zipball/23d6f88a29f6d0eac45bd77d70307adf83ba7ab0\",\n                \"reference\": \"23d6f88a29f6d0eac45bd77d70307adf83ba7ab0\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=8.2\",\n                \"symfony/deprecation-contracts\": \"^2.5|^3\",\n                \"symfony/polyfill-mbstring\": \"~1.0\",\n                \"symfony/service-contracts\": \"^2.5|^3\",\n                \"symfony/string\": \"^7.2|^8.0\"\n            },\n            \"conflict\": {\n                \"symfony/dependency-injection\": \"<6.4\",\n                \"symfony/dotenv\": \"<6.4\",\n                \"symfony/event-dispatcher\": \"<6.4\",\n                \"symfony/lock\": \"<6.4\",\n                \"symfony/process\": \"<6.4\"\n            },\n            \"provide\": {\n                \"psr/log-implementation\": \"1.0|2.0|3.0\"\n            },\n            \"require-dev\": {\n                \"psr/log\": \"^1|^2|^3\",\n                \"symfony/config\": \"^6.4|^7.0|^8.0\",\n                \"symfony/dependency-injection\": \"^6.4|^7.0|^8.0\",\n                \"symfony/event-dispatcher\": \"^6.4|^7.0|^8.0\",\n                \"symfony/http-foundation\": \"^6.4|^7.0|^8.0\",\n                \"symfony/http-kernel\": \"^6.4|^7.0|^8.0\",\n                \"symfony/lock\": \"^6.4|^7.0|^8.0\",\n                \"symfony/messenger\": \"^6.4|^7.0|^8.0\",\n                \"symfony/process\": \"^6.4|^7.0|^8.0\",\n                \"symfony/stopwatch\": \"^6.4|^7.0|^8.0\",\n                \"symfony/var-dumper\": \"^6.4|^7.0|^8.0\"\n            },\n            \"type\": \"library\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Symfony\\\\Component\\\\Console\\\\\": \"\"\n                },\n                \"exclude-from-classmap\": [\n                    \"/Tests/\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Fabien Potencier\",\n                    \"email\": \"fabien@symfony.com\"\n                },\n                {\n                    \"name\": \"Symfony Community\",\n                    \"homepage\": \"https://symfony.com/contributors\"\n                }\n            ],\n            \"description\": \"Eases the creation of beautiful and testable command line interfaces\",\n            \"homepage\": \"https://symfony.com\",\n            \"keywords\": [\n                \"cli\",\n                \"command-line\",\n                \"console\",\n                \"terminal\"\n            ],\n            \"support\": {\n                \"source\": \"https://github.com/symfony/console/tree/v7.4.18\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://symfony.com/sponsor\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://github.com/fabpot\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://github.com/nicolas-grekas\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"time\": \"2026-08-25T14:18:37+00:00\"\n        },\n        {\n            \"name\": \"symfony/deprecation-contracts\",\n            \"version\": \"v3.7.1\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/symfony/deprecation-contracts.git\",\n                \"reference\": \"f3202fa1b5097b0af062dc978b32ecf63404e31d\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/symfony/deprecation-contracts/zipball/f3202fa1b5097b0af062dc978b32ecf63404e31d\",\n                \"reference\": \"f3202fa1b5097b0af062dc978b32ecf63404e31d\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=8.1\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"thanks\": {\n                    \"url\": \"https://github.com/symfony/contracts\",\n                    \"name\": \"symfony/contracts\"\n                },\n                \"branch-alias\": {\n                    \"dev-main\": \"3.7-dev\"\n                }\n            },\n            \"autoload\": {\n                \"files\": [\n                    \"function.php\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Nicolas Grekas\",\n                    \"email\": \"p@tchwork.com\"\n                },\n                {\n                    \"name\": \"Symfony Community\",\n                    \"homepage\": \"https://symfony.com/contributors\"\n                }\n            ],\n            \"description\": \"A generic function and convention to trigger deprecation notices\",\n            \"homepage\": \"https://symfony.com\",\n            \"support\": {\n                \"source\": \"https://github.com/symfony/deprecation-contracts/tree/v3.7.1\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://symfony.com/sponsor\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://github.com/fabpot\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://github.com/nicolas-grekas\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"time\": \"2026-06-05T06:23:12+00:00\"\n        },\n        {\n            \"name\": \"symfony/polyfill-ctype\",\n            \"version\": \"v1.37.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/symfony/polyfill-ctype.git\",\n                \"reference\": \"141046a8f9477948ff284fa65be2095baafb94f2\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/symfony/polyfill-ctype/zipball/141046a8f9477948ff284fa65be2095baafb94f2\",\n                \"reference\": \"141046a8f9477948ff284fa65be2095baafb94f2\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=7.2\"\n            },\n            \"provide\": {\n                \"ext-ctype\": \"*\"\n            },\n            \"suggest\": {\n                \"ext-ctype\": \"For best performance\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"thanks\": {\n                    \"url\": \"https://github.com/symfony/polyfill\",\n                    \"name\": \"symfony/polyfill\"\n                }\n            },\n            \"autoload\": {\n                \"files\": [\n                    \"bootstrap.php\"\n                ],\n                \"psr-4\": {\n                    \"Symfony\\\\Polyfill\\\\Ctype\\\\\": \"\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Gert de Pagter\",\n                    \"email\": \"BackEndTea@gmail.com\"\n                },\n                {\n                    \"name\": \"Symfony Community\",\n                    \"homepage\": \"https://symfony.com/contributors\"\n                }\n            ],\n            \"description\": \"Symfony polyfill for ctype functions\",\n            \"homepage\": \"https://symfony.com\",\n            \"keywords\": [\n                \"compatibility\",\n                \"ctype\",\n                \"polyfill\",\n                \"portable\"\n            ],\n            \"support\": {\n                \"source\": \"https://github.com/symfony/polyfill-ctype/tree/v1.37.0\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://symfony.com/sponsor\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://github.com/fabpot\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://github.com/nicolas-grekas\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"time\": \"2026-04-10T16:19:22+00:00\"\n        },\n        {\n            \"name\": \"symfony/polyfill-intl-grapheme\",\n            \"version\": \"v1.41.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/symfony/polyfill-intl-grapheme.git\",\n                \"reference\": \"bb899c1db0aa8127dc3afe8cda4a67eb24915f8d\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/bb899c1db0aa8127dc3afe8cda4a67eb24915f8d\",\n                \"reference\": \"bb899c1db0aa8127dc3afe8cda4a67eb24915f8d\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=7.2\"\n            },\n            \"suggest\": {\n                \"ext-intl\": \"For best performance\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"thanks\": {\n                    \"url\": \"https://github.com/symfony/polyfill\",\n                    \"name\": \"symfony/polyfill\"\n                }\n            },\n            \"autoload\": {\n                \"files\": [\n                    \"bootstrap.php\"\n                ],\n                \"psr-4\": {\n                    \"Symfony\\\\Polyfill\\\\Intl\\\\Grapheme\\\\\": \"\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Nicolas Grekas\",\n                    \"email\": \"p@tchwork.com\"\n                },\n                {\n                    \"name\": \"Symfony Community\",\n                    \"homepage\": \"https://symfony.com/contributors\"\n                }\n            ],\n            \"description\": \"Symfony polyfill for intl's grapheme_* functions\",\n            \"homepage\": \"https://symfony.com\",\n            \"keywords\": [\n                \"compatibility\",\n                \"grapheme\",\n                \"intl\",\n                \"polyfill\",\n                \"portable\",\n                \"shim\"\n            ],\n            \"support\": {\n                \"source\": \"https://github.com/symfony/polyfill-intl-grapheme/tree/v1.41.0\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://symfony.com/sponsor\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://github.com/fabpot\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://github.com/nicolas-grekas\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"time\": \"2026-07-28T08:25:59+00:00\"\n        },\n        {\n            \"name\": \"symfony/polyfill-intl-normalizer\",\n            \"version\": \"v1.42.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/symfony/polyfill-intl-normalizer.git\",\n                \"reference\": \"aa20edea75bd9c48cfecc8360922e5a6e5c44502\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/aa20edea75bd9c48cfecc8360922e5a6e5c44502\",\n                \"reference\": \"aa20edea75bd9c48cfecc8360922e5a6e5c44502\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=7.2\"\n            },\n            \"suggest\": {\n                \"ext-intl\": \"For best performance\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"thanks\": {\n                    \"url\": \"https://github.com/symfony/polyfill\",\n                    \"name\": \"symfony/polyfill\"\n                }\n            },\n            \"autoload\": {\n                \"files\": [\n                    \"bootstrap.php\"\n                ],\n                \"psr-4\": {\n                    \"Symfony\\\\Polyfill\\\\Intl\\\\Normalizer\\\\\": \"\"\n                },\n                \"classmap\": [\n                    \"Resources/stubs\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Nicolas Grekas\",\n                    \"email\": \"p@tchwork.com\"\n                },\n                {\n                    \"name\": \"Symfony Community\",\n                    \"homepage\": \"https://symfony.com/contributors\"\n                }\n            ],\n            \"description\": \"Symfony polyfill for intl's Normalizer class and related functions\",\n            \"homepage\": \"https://symfony.com\",\n            \"keywords\": [\n                \"compatibility\",\n                \"intl\",\n                \"normalizer\",\n                \"polyfill\",\n                \"portable\",\n                \"shim\"\n            ],\n            \"support\": {\n                \"source\": \"https://github.com/symfony/polyfill-intl-normalizer/tree/v1.42.0\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://symfony.com/sponsor\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://github.com/fabpot\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://github.com/nicolas-grekas\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"time\": \"2026-08-07T06:33:24+00:00\"\n        },\n        {\n            \"name\": \"symfony/polyfill-mbstring\",\n            \"version\": \"v1.38.2\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/symfony/polyfill-mbstring.git\",\n                \"reference\": \"d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/symfony/polyfill-mbstring/zipball/d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6\",\n                \"reference\": \"d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"ext-iconv\": \"*\",\n                \"php\": \">=7.2\"\n            },\n            \"provide\": {\n                \"ext-mbstring\": \"*\"\n            },\n            \"suggest\": {\n                \"ext-mbstring\": \"For best performance\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"thanks\": {\n                    \"url\": \"https://github.com/symfony/polyfill\",\n                    \"name\": \"symfony/polyfill\"\n                }\n            },\n            \"autoload\": {\n                \"files\": [\n                    \"bootstrap.php\"\n                ],\n                \"psr-4\": {\n                    \"Symfony\\\\Polyfill\\\\Mbstring\\\\\": \"\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Nicolas Grekas\",\n                    \"email\": \"p@tchwork.com\"\n                },\n                {\n                    \"name\": \"Symfony Community\",\n                    \"homepage\": \"https://symfony.com/contributors\"\n                }\n            ],\n            \"description\": \"Symfony polyfill for the Mbstring extension\",\n            \"homepage\": \"https://symfony.com\",\n            \"keywords\": [\n                \"compatibility\",\n                \"mbstring\",\n                \"polyfill\",\n                \"portable\",\n                \"shim\"\n            ],\n            \"support\": {\n                \"source\": \"https://github.com/symfony/polyfill-mbstring/tree/v1.38.2\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://symfony.com/sponsor\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://github.com/fabpot\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://github.com/nicolas-grekas\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"time\": \"2026-05-27T06:59:30+00:00\"\n        },\n        {\n            \"name\": \"symfony/service-contracts\",\n            \"version\": \"v3.7.3\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/symfony/service-contracts.git\",\n                \"reference\": \"15e6a07ec2a2c75ceb1b21dd98105ee8456d2257\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/symfony/service-contracts/zipball/15e6a07ec2a2c75ceb1b21dd98105ee8456d2257\",\n                \"reference\": \"15e6a07ec2a2c75ceb1b21dd98105ee8456d2257\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=8.1\",\n                \"psr/container\": \"^1.1|^2.0\",\n                \"symfony/deprecation-contracts\": \"^2.5|^3\"\n            },\n            \"conflict\": {\n                \"ext-psr\": \"<1.1|>=2\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"thanks\": {\n                    \"url\": \"https://github.com/symfony/contracts\",\n                    \"name\": \"symfony/contracts\"\n                },\n                \"branch-alias\": {\n                    \"dev-main\": \"3.7-dev\"\n                }\n            },\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Symfony\\\\Contracts\\\\Service\\\\\": \"\"\n                },\n                \"exclude-from-classmap\": [\n                    \"/Test/\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Nicolas Grekas\",\n                    \"email\": \"p@tchwork.com\"\n                },\n                {\n                    \"name\": \"Symfony Community\",\n                    \"homepage\": \"https://symfony.com/contributors\"\n                }\n            ],\n            \"description\": \"Generic abstractions related to writing services\",\n            \"homepage\": \"https://symfony.com\",\n            \"keywords\": [\n                \"abstractions\",\n                \"contracts\",\n                \"decoupling\",\n                \"interfaces\",\n                \"interoperability\",\n                \"standards\"\n            ],\n            \"support\": {\n                \"source\": \"https://github.com/symfony/service-contracts/tree/v3.7.3\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://symfony.com/sponsor\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://github.com/fabpot\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://github.com/nicolas-grekas\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"time\": \"2026-07-27T15:39:01+00:00\"\n        },\n        {\n            \"name\": \"symfony/string\",\n            \"version\": \"v7.4.15\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/symfony/string.git\",\n                \"reference\": \"e394af32256bf9e7bf80849d95e589167c10097b\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/symfony/string/zipball/e394af32256bf9e7bf80849d95e589167c10097b\",\n                \"reference\": \"e394af32256bf9e7bf80849d95e589167c10097b\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=8.2\",\n                \"symfony/deprecation-contracts\": \"^2.5|^3.0\",\n                \"symfony/polyfill-ctype\": \"~1.8\",\n                \"symfony/polyfill-intl-grapheme\": \"~1.33\",\n                \"symfony/polyfill-intl-normalizer\": \"~1.0\",\n                \"symfony/polyfill-mbstring\": \"~1.0\"\n            },\n            \"conflict\": {\n                \"symfony/translation-contracts\": \"<2.5\"\n            },\n            \"require-dev\": {\n                \"symfony/emoji\": \"^7.1|^8.0\",\n                \"symfony/http-client\": \"^6.4|^7.0|^8.0\",\n                \"symfony/intl\": \"^6.4|^7.0|^8.0\",\n                \"symfony/translation-contracts\": \"^2.5|^3.0\",\n                \"symfony/var-exporter\": \"^6.4|^7.0|^8.0\"\n            },\n            \"type\": \"library\",\n            \"autoload\": {\n                \"files\": [\n                    \"Resources/functions.php\"\n                ],\n                \"psr-4\": {\n                    \"Symfony\\\\Component\\\\String\\\\\": \"\"\n                },\n                \"exclude-from-classmap\": [\n                    \"/Tests/\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Nicolas Grekas\",\n                    \"email\": \"p@tchwork.com\"\n                },\n                {\n                    \"name\": \"Symfony Community\",\n                    \"homepage\": \"https://symfony.com/contributors\"\n                }\n            ],\n            \"description\": \"Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way\",\n            \"homepage\": \"https://symfony.com\",\n            \"keywords\": [\n                \"grapheme\",\n                \"i18n\",\n                \"string\",\n                \"unicode\",\n                \"utf-8\",\n                \"utf8\"\n            ],\n            \"support\": {\n                \"source\": \"https://github.com/symfony/string/tree/v7.4.15\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://symfony.com/sponsor\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://github.com/fabpot\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://github.com/nicolas-grekas\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"time\": \"2026-07-28T07:33:02+00:00\"\n        },\n        {\n            \"name\": \"symfony/yaml\",\n            \"version\": \"v7.4.18\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/symfony/yaml.git\",\n                \"reference\": \"4cef939e55b8a21c5780418de0d98ab00d0736e1\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/symfony/yaml/zipball/4cef939e55b8a21c5780418de0d98ab00d0736e1\",\n                \"reference\": \"4cef939e55b8a21c5780418de0d98ab00d0736e1\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=8.2\",\n                \"symfony/deprecation-contracts\": \"^2.5|^3\",\n                \"symfony/polyfill-ctype\": \"^1.8\"\n            },\n            \"conflict\": {\n                \"symfony/console\": \"<6.4\"\n            },\n            \"require-dev\": {\n                \"symfony/console\": \"^6.4|^7.0|^8.0\"\n            },\n            \"bin\": [\n                \"Resources/bin/yaml-lint\"\n            ],\n            \"type\": \"library\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Symfony\\\\Component\\\\Yaml\\\\\": \"\"\n                },\n                \"exclude-from-classmap\": [\n                    \"/Tests/\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Fabien Potencier\",\n                    \"email\": \"fabien@symfony.com\"\n                },\n                {\n                    \"name\": \"Symfony Community\",\n                    \"homepage\": \"https://symfony.com/contributors\"\n                }\n            ],\n            \"description\": \"Loads and dumps YAML files\",\n            \"homepage\": \"https://symfony.com\",\n            \"support\": {\n                \"source\": \"https://github.com/symfony/yaml/tree/v7.4.18\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://symfony.com/sponsor\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://github.com/fabpot\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://github.com/nicolas-grekas\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"time\": \"2026-08-30T00:47:26+00:00\"\n        }\n    ],\n    \"packages-dev\": [\n        {\n            \"name\": \"brick/math\",\n            \"version\": \"0.14.8\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/brick/math.git\",\n                \"reference\": \"63422359a44b7f06cae63c3b429b59e8efcc0629\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/brick/math/zipball/63422359a44b7f06cae63c3b429b59e8efcc0629\",\n                \"reference\": \"63422359a44b7f06cae63c3b429b59e8efcc0629\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \"^8.2\"\n            },\n            \"require-dev\": {\n                \"php-coveralls/php-coveralls\": \"^2.2\",\n                \"phpstan/phpstan\": \"2.1.22\",\n                \"phpunit/phpunit\": \"^11.5\"\n            },\n            \"type\": \"library\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Brick\\\\Math\\\\\": \"src/\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"description\": \"Arbitrary-precision arithmetic library\",\n            \"keywords\": [\n                \"Arbitrary-precision\",\n                \"BigInteger\",\n                \"BigRational\",\n                \"arithmetic\",\n                \"bigdecimal\",\n                \"bignum\",\n                \"bignumber\",\n                \"brick\",\n                \"decimal\",\n                \"integer\",\n                \"math\",\n                \"mathematics\",\n                \"rational\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/brick/math/issues\",\n                \"source\": \"https://github.com/brick/math/tree/0.14.8\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://github.com/BenMorel\",\n                    \"type\": \"github\"\n                }\n            ],\n            \"time\": \"2026-02-10T14:33:43+00:00\"\n        },\n        {\n            \"name\": \"carbonphp/carbon-doctrine-types\",\n            \"version\": \"3.2.1\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/CarbonPHP/carbon-doctrine-types.git\",\n                \"reference\": \"5fa5eacafd9ef47c8c6ab9143fc901ba0194d3dc\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/CarbonPHP/carbon-doctrine-types/zipball/5fa5eacafd9ef47c8c6ab9143fc901ba0194d3dc\",\n                \"reference\": \"5fa5eacafd9ef47c8c6ab9143fc901ba0194d3dc\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \"^8.1\"\n            },\n            \"conflict\": {\n                \"doctrine/dbal\": \"<4.0.0 || >=5.0.0\"\n            },\n            \"require-dev\": {\n                \"doctrine/dbal\": \"^4.0.0\",\n                \"nesbot/carbon\": \"^2.71.0 || ^3.0.0\",\n                \"phpunit/phpunit\": \"^10.3\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-main\": \"3.x-dev\"\n                }\n            },\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Carbon\\\\Doctrine\\\\\": \"src/Carbon/Doctrine/\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"KyleKatarn\",\n                    \"email\": \"kylekatarnls@gmail.com\"\n                }\n            ],\n            \"description\": \"Types to use Carbon in Doctrine\",\n            \"keywords\": [\n                \"carbon\",\n                \"date\",\n                \"datetime\",\n                \"doctrine\",\n                \"time\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/CarbonPHP/carbon-doctrine-types/issues\",\n                \"source\": \"https://github.com/CarbonPHP/carbon-doctrine-types/tree/3.2.1\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://github.com/kylekatarnls\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://opencollective.com/Carbon\",\n                    \"type\": \"open_collective\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/nesbot/carbon\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"time\": \"2026-09-06T14:11:38+00:00\"\n        },\n        {\n            \"name\": \"clue/ndjson-react\",\n            \"version\": \"v1.3.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/clue/reactphp-ndjson.git\",\n                \"reference\": \"392dc165fce93b5bb5c637b67e59619223c931b0\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/clue/reactphp-ndjson/zipball/392dc165fce93b5bb5c637b67e59619223c931b0\",\n                \"reference\": \"392dc165fce93b5bb5c637b67e59619223c931b0\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=5.3\",\n                \"react/stream\": \"^1.2\"\n            },\n            \"require-dev\": {\n                \"phpunit/phpunit\": \"^9.5 || ^5.7 || ^4.8.35\",\n                \"react/event-loop\": \"^1.2\"\n            },\n            \"type\": \"library\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Clue\\\\React\\\\NDJson\\\\\": \"src/\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Christian Lück\",\n                    \"email\": \"christian@clue.engineering\"\n                }\n            ],\n            \"description\": \"Streaming newline-delimited JSON (NDJSON) parser and encoder for ReactPHP.\",\n            \"homepage\": \"https://github.com/clue/reactphp-ndjson\",\n            \"keywords\": [\n                \"NDJSON\",\n                \"json\",\n                \"jsonlines\",\n                \"newline\",\n                \"reactphp\",\n                \"streaming\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/clue/reactphp-ndjson/issues\",\n                \"source\": \"https://github.com/clue/reactphp-ndjson/tree/v1.3.0\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://clue.engineering/support\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://github.com/clue\",\n                    \"type\": \"github\"\n                }\n            ],\n            \"time\": \"2022-12-23T10:58:28+00:00\"\n        },\n        {\n            \"name\": \"composer/pcre\",\n            \"version\": \"3.4.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/composer/pcre.git\",\n                \"reference\": \"d5a341b3fb61f3001970940afb1d332968a183ed\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/composer/pcre/zipball/d5a341b3fb61f3001970940afb1d332968a183ed\",\n                \"reference\": \"d5a341b3fb61f3001970940afb1d332968a183ed\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \"^7.4 || ^8.0\"\n            },\n            \"conflict\": {\n                \"phpstan/phpstan\": \"<2.2.2\"\n            },\n            \"require-dev\": {\n                \"phpstan/phpstan\": \"^2\",\n                \"phpstan/phpstan-deprecation-rules\": \"^2\",\n                \"phpstan/phpstan-strict-rules\": \"^2\",\n                \"phpunit/phpunit\": \"^9\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"phpstan\": {\n                    \"includes\": [\n                        \"extension.neon\"\n                    ]\n                },\n                \"branch-alias\": {\n                    \"dev-main\": \"3.x-dev\"\n                }\n            },\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Composer\\\\Pcre\\\\\": \"src\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Jordi Boggiano\",\n                    \"email\": \"j.boggiano@seld.be\",\n                    \"homepage\": \"http://seld.be\"\n                }\n            ],\n            \"description\": \"PCRE wrapping library that offers type-safe preg_* replacements.\",\n            \"keywords\": [\n                \"PCRE\",\n                \"preg\",\n                \"regex\",\n                \"regular expression\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/composer/pcre/issues\",\n                \"source\": \"https://github.com/composer/pcre/tree/3.4.0\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://packagist.com\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://github.com/composer\",\n                    \"type\": \"github\"\n                }\n            ],\n            \"time\": \"2026-06-07T11:47:49+00:00\"\n        },\n        {\n            \"name\": \"composer/semver\",\n            \"version\": \"3.4.4\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/composer/semver.git\",\n                \"reference\": \"198166618906cb2de69b95d7d47e5fa8aa1b2b95\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/composer/semver/zipball/198166618906cb2de69b95d7d47e5fa8aa1b2b95\",\n                \"reference\": \"198166618906cb2de69b95d7d47e5fa8aa1b2b95\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \"^5.3.2 || ^7.0 || ^8.0\"\n            },\n            \"require-dev\": {\n                \"phpstan/phpstan\": \"^1.11\",\n                \"symfony/phpunit-bridge\": \"^3 || ^7\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-main\": \"3.x-dev\"\n                }\n            },\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Composer\\\\Semver\\\\\": \"src\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Nils Adermann\",\n                    \"email\": \"naderman@naderman.de\",\n                    \"homepage\": \"http://www.naderman.de\"\n                },\n                {\n                    \"name\": \"Jordi Boggiano\",\n                    \"email\": \"j.boggiano@seld.be\",\n                    \"homepage\": \"http://seld.be\"\n                },\n                {\n                    \"name\": \"Rob Bast\",\n                    \"email\": \"rob.bast@gmail.com\",\n                    \"homepage\": \"http://robbast.nl\"\n                }\n            ],\n            \"description\": \"Semver library that offers utilities, version constraint parsing and validation.\",\n            \"keywords\": [\n                \"semantic\",\n                \"semver\",\n                \"validation\",\n                \"versioning\"\n            ],\n            \"support\": {\n                \"irc\": \"ircs://irc.libera.chat:6697/composer\",\n                \"issues\": \"https://github.com/composer/semver/issues\",\n                \"source\": \"https://github.com/composer/semver/tree/3.4.4\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://packagist.com\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://github.com/composer\",\n                    \"type\": \"github\"\n                }\n            ],\n            \"time\": \"2025-08-20T19:15:30+00:00\"\n        },\n        {\n            \"name\": \"composer/xdebug-handler\",\n            \"version\": \"3.0.5\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/composer/xdebug-handler.git\",\n                \"reference\": \"6c1925561632e83d60a44492e0b344cf48ab85ef\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/composer/xdebug-handler/zipball/6c1925561632e83d60a44492e0b344cf48ab85ef\",\n                \"reference\": \"6c1925561632e83d60a44492e0b344cf48ab85ef\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"composer/pcre\": \"^1 || ^2 || ^3\",\n                \"php\": \"^7.2.5 || ^8.0\",\n                \"psr/log\": \"^1 || ^2 || ^3\"\n            },\n            \"require-dev\": {\n                \"phpstan/phpstan\": \"^1.0\",\n                \"phpstan/phpstan-strict-rules\": \"^1.1\",\n                \"phpunit/phpunit\": \"^8.5 || ^9.6 || ^10.5\"\n            },\n            \"type\": \"library\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Composer\\\\XdebugHandler\\\\\": \"src\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"John Stevenson\",\n                    \"email\": \"john-stevenson@blueyonder.co.uk\"\n                }\n            ],\n            \"description\": \"Restarts a process without Xdebug.\",\n            \"keywords\": [\n                \"Xdebug\",\n                \"performance\"\n            ],\n            \"support\": {\n                \"irc\": \"ircs://irc.libera.chat:6697/composer\",\n                \"issues\": \"https://github.com/composer/xdebug-handler/issues\",\n                \"source\": \"https://github.com/composer/xdebug-handler/tree/3.0.5\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://packagist.com\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://github.com/composer\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/composer/composer\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"time\": \"2024-05-06T16:37:16+00:00\"\n        },\n        {\n            \"name\": \"dflydev/dot-access-data\",\n            \"version\": \"v3.0.3\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/dflydev/dflydev-dot-access-data.git\",\n                \"reference\": \"a23a2bf4f31d3518f3ecb38660c95715dfead60f\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/a23a2bf4f31d3518f3ecb38660c95715dfead60f\",\n                \"reference\": \"a23a2bf4f31d3518f3ecb38660c95715dfead60f\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \"^7.1 || ^8.0\"\n            },\n            \"require-dev\": {\n                \"phpstan/phpstan\": \"^0.12.42\",\n                \"phpunit/phpunit\": \"^7.5 || ^8.5 || ^9.3\",\n                \"scrutinizer/ocular\": \"1.6.0\",\n                \"squizlabs/php_codesniffer\": \"^3.5\",\n                \"vimeo/psalm\": \"^4.0.0\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-main\": \"3.x-dev\"\n                }\n            },\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Dflydev\\\\DotAccessData\\\\\": \"src/\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Dragonfly Development Inc.\",\n                    \"email\": \"info@dflydev.com\",\n                    \"homepage\": \"http://dflydev.com\"\n                },\n                {\n                    \"name\": \"Beau Simensen\",\n                    \"email\": \"beau@dflydev.com\",\n                    \"homepage\": \"http://beausimensen.com\"\n                },\n                {\n                    \"name\": \"Carlos Frutos\",\n                    \"email\": \"carlos@kiwing.it\",\n                    \"homepage\": \"https://github.com/cfrutos\"\n                },\n                {\n                    \"name\": \"Colin O'Dell\",\n                    \"email\": \"colinodell@gmail.com\",\n                    \"homepage\": \"https://www.colinodell.com\"\n                }\n            ],\n            \"description\": \"Given a deep data structure, access data by dot notation.\",\n            \"homepage\": \"https://github.com/dflydev/dflydev-dot-access-data\",\n            \"keywords\": [\n                \"access\",\n                \"data\",\n                \"dot\",\n                \"notation\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/dflydev/dflydev-dot-access-data/issues\",\n                \"source\": \"https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.3\"\n            },\n            \"time\": \"2024-07-08T12:26:09+00:00\"\n        },\n        {\n            \"name\": \"doctrine/inflector\",\n            \"version\": \"2.1.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/doctrine/inflector.git\",\n                \"reference\": \"6d6c96277ea252fc1304627204c3d5e6e15faa3b\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/doctrine/inflector/zipball/6d6c96277ea252fc1304627204c3d5e6e15faa3b\",\n                \"reference\": \"6d6c96277ea252fc1304627204c3d5e6e15faa3b\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \"^7.2 || ^8.0\"\n            },\n            \"require-dev\": {\n                \"doctrine/coding-standard\": \"^12.0 || ^13.0\",\n                \"phpstan/phpstan\": \"^1.12 || ^2.0\",\n                \"phpstan/phpstan-phpunit\": \"^1.4 || ^2.0\",\n                \"phpstan/phpstan-strict-rules\": \"^1.6 || ^2.0\",\n                \"phpunit/phpunit\": \"^8.5 || ^12.2\"\n            },\n            \"type\": \"library\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Doctrine\\\\Inflector\\\\\": \"src\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Guilherme Blanco\",\n                    \"email\": \"guilhermeblanco@gmail.com\"\n                },\n                {\n                    \"name\": \"Roman Borschel\",\n                    \"email\": \"roman@code-factory.org\"\n                },\n                {\n                    \"name\": \"Benjamin Eberlei\",\n                    \"email\": \"kontakt@beberlei.de\"\n                },\n                {\n                    \"name\": \"Jonathan Wage\",\n                    \"email\": \"jonwage@gmail.com\"\n                },\n                {\n                    \"name\": \"Johannes Schmitt\",\n                    \"email\": \"schmittjoh@gmail.com\"\n                }\n            ],\n            \"description\": \"PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.\",\n            \"homepage\": \"https://www.doctrine-project.org/projects/inflector.html\",\n            \"keywords\": [\n                \"inflection\",\n                \"inflector\",\n                \"lowercase\",\n                \"manipulation\",\n                \"php\",\n                \"plural\",\n                \"singular\",\n                \"strings\",\n                \"uppercase\",\n                \"words\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/doctrine/inflector/issues\",\n                \"source\": \"https://github.com/doctrine/inflector/tree/2.1.0\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://www.doctrine-project.org/sponsorship.html\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://www.patreon.com/phpdoctrine\",\n                    \"type\": \"patreon\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/doctrine%2Finflector\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"time\": \"2025-08-10T19:31:58+00:00\"\n        },\n        {\n            \"name\": \"doctrine/lexer\",\n            \"version\": \"3.0.1\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/doctrine/lexer.git\",\n                \"reference\": \"31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/doctrine/lexer/zipball/31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd\",\n                \"reference\": \"31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \"^8.1\"\n            },\n            \"require-dev\": {\n                \"doctrine/coding-standard\": \"^12\",\n                \"phpstan/phpstan\": \"^1.10\",\n                \"phpunit/phpunit\": \"^10.5\",\n                \"psalm/plugin-phpunit\": \"^0.18.3\",\n                \"vimeo/psalm\": \"^5.21\"\n            },\n            \"type\": \"library\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Doctrine\\\\Common\\\\Lexer\\\\\": \"src\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Guilherme Blanco\",\n                    \"email\": \"guilhermeblanco@gmail.com\"\n                },\n                {\n                    \"name\": \"Roman Borschel\",\n                    \"email\": \"roman@code-factory.org\"\n                },\n                {\n                    \"name\": \"Johannes Schmitt\",\n                    \"email\": \"schmittjoh@gmail.com\"\n                }\n            ],\n            \"description\": \"PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.\",\n            \"homepage\": \"https://www.doctrine-project.org/projects/lexer.html\",\n            \"keywords\": [\n                \"annotations\",\n                \"docblock\",\n                \"lexer\",\n                \"parser\",\n                \"php\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/doctrine/lexer/issues\",\n                \"source\": \"https://github.com/doctrine/lexer/tree/3.0.1\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://www.doctrine-project.org/sponsorship.html\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://www.patreon.com/phpdoctrine\",\n                    \"type\": \"patreon\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/doctrine%2Flexer\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"time\": \"2024-02-05T11:56:58+00:00\"\n        },\n        {\n            \"name\": \"dragonmantank/cron-expression\",\n            \"version\": \"v3.6.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/dragonmantank/cron-expression.git\",\n                \"reference\": \"d61a8a9604ec1f8c3d150d09db6ce98b32675013\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/dragonmantank/cron-expression/zipball/d61a8a9604ec1f8c3d150d09db6ce98b32675013\",\n                \"reference\": \"d61a8a9604ec1f8c3d150d09db6ce98b32675013\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \"^8.2|^8.3|^8.4|^8.5\"\n            },\n            \"replace\": {\n                \"mtdowling/cron-expression\": \"^1.0\"\n            },\n            \"require-dev\": {\n                \"phpstan/extension-installer\": \"^1.4.3\",\n                \"phpstan/phpstan\": \"^1.12.32|^2.1.31\",\n                \"phpunit/phpunit\": \"^8.5.48|^9.0\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-master\": \"3.x-dev\"\n                }\n            },\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Cron\\\\\": \"src/Cron/\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Chris Tankersley\",\n                    \"email\": \"chris@ctankersley.com\",\n                    \"homepage\": \"https://github.com/dragonmantank\"\n                }\n            ],\n            \"description\": \"CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due\",\n            \"keywords\": [\n                \"cron\",\n                \"schedule\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/dragonmantank/cron-expression/issues\",\n                \"source\": \"https://github.com/dragonmantank/cron-expression/tree/v3.6.0\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://github.com/dragonmantank\",\n                    \"type\": \"github\"\n                }\n            ],\n            \"time\": \"2025-10-31T18:51:33+00:00\"\n        },\n        {\n            \"name\": \"egulias/email-validator\",\n            \"version\": \"4.0.4\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/egulias/EmailValidator.git\",\n                \"reference\": \"d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/egulias/EmailValidator/zipball/d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa\",\n                \"reference\": \"d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"doctrine/lexer\": \"^2.0 || ^3.0\",\n                \"php\": \">=8.1\",\n                \"symfony/polyfill-intl-idn\": \"^1.26\"\n            },\n            \"require-dev\": {\n                \"phpunit/phpunit\": \"^10.2\",\n                \"vimeo/psalm\": \"^5.12\"\n            },\n            \"suggest\": {\n                \"ext-intl\": \"PHP Internationalization Libraries are required to use the SpoofChecking validation\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-master\": \"4.0.x-dev\"\n                }\n            },\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Egulias\\\\EmailValidator\\\\\": \"src\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Eduardo Gulias Davis\"\n                }\n            ],\n            \"description\": \"A library for validating emails against several RFCs\",\n            \"homepage\": \"https://github.com/egulias/EmailValidator\",\n            \"keywords\": [\n                \"email\",\n                \"emailvalidation\",\n                \"emailvalidator\",\n                \"validation\",\n                \"validator\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/egulias/EmailValidator/issues\",\n                \"source\": \"https://github.com/egulias/EmailValidator/tree/4.0.4\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://github.com/egulias\",\n                    \"type\": \"github\"\n                }\n            ],\n            \"time\": \"2025-03-06T22:45:56+00:00\"\n        },\n        {\n            \"name\": \"ergebnis/agent-detector\",\n            \"version\": \"1.2.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/ergebnis/agent-detector.git\",\n                \"reference\": \"e211f17928c8b95a51e06040792d57f5462fb271\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/ergebnis/agent-detector/zipball/e211f17928c8b95a51e06040792d57f5462fb271\",\n                \"reference\": \"e211f17928c8b95a51e06040792d57f5462fb271\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \"~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0 || ~8.6.0\"\n            },\n            \"require-dev\": {\n                \"ergebnis/composer-normalize\": \"^2.51.0\",\n                \"ergebnis/license\": \"^2.7.0\",\n                \"ergebnis/php-cs-fixer-config\": \"^6.60.2\",\n                \"ergebnis/phpstan-rules\": \"^2.13.1\",\n                \"ergebnis/phpunit-slow-test-detector\": \"^2.24.0\",\n                \"ergebnis/rector-rules\": \"^1.18.1\",\n                \"fakerphp/faker\": \"^1.24.1\",\n                \"infection/infection\": \"^0.26.6\",\n                \"phpstan/extension-installer\": \"^1.4.3\",\n                \"phpstan/phpstan\": \"^2.1.54\",\n                \"phpstan/phpstan-deprecation-rules\": \"^2.0.4\",\n                \"phpstan/phpstan-phpunit\": \"^2.0.16\",\n                \"phpstan/phpstan-strict-rules\": \"^2.0.10\",\n                \"phpunit/phpunit\": \"^9.6.34\",\n                \"rector/rector\": \"^2.4.2\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-main\": \"1.2-dev\"\n                },\n                \"composer-normalize\": {\n                    \"indent-size\": 2,\n                    \"indent-style\": \"space\"\n                }\n            },\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Ergebnis\\\\AgentDetector\\\\\": \"src/\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Andreas Möller\",\n                    \"email\": \"am@localheinz.com\",\n                    \"homepage\": \"https://localheinz.com\"\n                }\n            ],\n            \"description\": \"Provides a detector for detecting the presence of an agent.\",\n            \"homepage\": \"https://github.com/ergebnis/agent-detector\",\n            \"support\": {\n                \"issues\": \"https://github.com/ergebnis/agent-detector/issues\",\n                \"security\": \"https://github.com/ergebnis/agent-detector/blob/main/.github/SECURITY.md\",\n                \"source\": \"https://github.com/ergebnis/agent-detector\"\n            },\n            \"time\": \"2026-05-07T08:19:07+00:00\"\n        },\n        {\n            \"name\": \"evenement/evenement\",\n            \"version\": \"v3.0.2\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/igorw/evenement.git\",\n                \"reference\": \"0a16b0d71ab13284339abb99d9d2bd813640efbc\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/igorw/evenement/zipball/0a16b0d71ab13284339abb99d9d2bd813640efbc\",\n                \"reference\": \"0a16b0d71ab13284339abb99d9d2bd813640efbc\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=7.0\"\n            },\n            \"require-dev\": {\n                \"phpunit/phpunit\": \"^9 || ^6\"\n            },\n            \"type\": \"library\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Evenement\\\\\": \"src/\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Igor Wiedler\",\n                    \"email\": \"igor@wiedler.ch\"\n                }\n            ],\n            \"description\": \"Événement is a very simple event dispatching library for PHP\",\n            \"keywords\": [\n                \"event-dispatcher\",\n                \"event-emitter\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/igorw/evenement/issues\",\n                \"source\": \"https://github.com/igorw/evenement/tree/v3.0.2\"\n            },\n            \"time\": \"2023-08-08T05:53:35+00:00\"\n        },\n        {\n            \"name\": \"fidry/cpu-core-counter\",\n            \"version\": \"1.3.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/theofidry/cpu-core-counter.git\",\n                \"reference\": \"db9508f7b1474469d9d3c53b86f817e344732678\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/theofidry/cpu-core-counter/zipball/db9508f7b1474469d9d3c53b86f817e344732678\",\n                \"reference\": \"db9508f7b1474469d9d3c53b86f817e344732678\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \"^7.2 || ^8.0\"\n            },\n            \"require-dev\": {\n                \"fidry/makefile\": \"^0.2.0\",\n                \"fidry/php-cs-fixer-config\": \"^1.1.2\",\n                \"phpstan/extension-installer\": \"^1.2.0\",\n                \"phpstan/phpstan\": \"^2.0\",\n                \"phpstan/phpstan-deprecation-rules\": \"^2.0.0\",\n                \"phpstan/phpstan-phpunit\": \"^2.0\",\n                \"phpstan/phpstan-strict-rules\": \"^2.0\",\n                \"phpunit/phpunit\": \"^8.5.31 || ^9.5.26\",\n                \"webmozarts/strict-phpunit\": \"^7.5\"\n            },\n            \"type\": \"library\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Fidry\\\\CpuCoreCounter\\\\\": \"src/\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Théo FIDRY\",\n                    \"email\": \"theo.fidry@gmail.com\"\n                }\n            ],\n            \"description\": \"Tiny utility to get the number of CPU cores.\",\n            \"keywords\": [\n                \"CPU\",\n                \"core\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/theofidry/cpu-core-counter/issues\",\n                \"source\": \"https://github.com/theofidry/cpu-core-counter/tree/1.3.0\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://github.com/theofidry\",\n                    \"type\": \"github\"\n                }\n            ],\n            \"time\": \"2025-08-14T07:29:31+00:00\"\n        },\n        {\n            \"name\": \"friendsofphp/php-cs-fixer\",\n            \"version\": \"v3.95.25\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git\",\n                \"reference\": \"2cdfc1f3daf173d83a1ebb6177949b58c95de6ff\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/2cdfc1f3daf173d83a1ebb6177949b58c95de6ff\",\n                \"reference\": \"2cdfc1f3daf173d83a1ebb6177949b58c95de6ff\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"clue/ndjson-react\": \"^1.3\",\n                \"composer/semver\": \"^3.4\",\n                \"composer/xdebug-handler\": \"^3.0.5\",\n                \"ergebnis/agent-detector\": \"^1.2\",\n                \"ext-filter\": \"*\",\n                \"ext-hash\": \"*\",\n                \"ext-json\": \"*\",\n                \"ext-tokenizer\": \"*\",\n                \"fidry/cpu-core-counter\": \"^1.3\",\n                \"php\": \"^7.4 || ^8.0\",\n                \"react/child-process\": \"^0.6.6\",\n                \"react/event-loop\": \"^1.5\",\n                \"react/socket\": \"^1.16\",\n                \"react/stream\": \"^1.4\",\n                \"sebastian/diff\": \"^4.0.6 || ^5.1.1 || ^6.0.2 || ^7.0 || ^8.0 || ^9.0\",\n                \"symfony/console\": \"^5.4.47 || ^6.4.24 || ^7.0 || ^8.0\",\n                \"symfony/event-dispatcher\": \"^5.4.45 || ^6.4.24 || ^7.0 || ^8.0\",\n                \"symfony/filesystem\": \"^5.4.45 || ^6.4.24 || ^7.0 || ^8.0\",\n                \"symfony/finder\": \"^5.4.45 || ^6.4.24 || ^7.0 || ^8.0\",\n                \"symfony/options-resolver\": \"^5.4.45 || ^6.4.24 || ^7.0 || ^8.0\",\n                \"symfony/polyfill-mbstring\": \"^1.37\",\n                \"symfony/polyfill-php80\": \"^1.37\",\n                \"symfony/polyfill-php81\": \"^1.37\",\n                \"symfony/polyfill-php84\": \"^1.37\",\n                \"symfony/process\": \"^5.4.47 || ^6.4.24 || ^7.2 || ^8.0\",\n                \"symfony/stopwatch\": \"^5.4.45 || ^6.4.24 || ^7.0 || ^8.0\"\n            },\n            \"require-dev\": {\n                \"facile-it/paraunit\": \"^1.3.1 || ^2.11.0\",\n                \"infection/infection\": \"^0.32.7\",\n                \"justinrainbow/json-schema\": \"^6.10.0\",\n                \"keradus/cli-executor\": \"^2.3\",\n                \"php-coveralls/php-coveralls\": \"^2.9.1\",\n                \"php-cs-fixer/phpunit-constraint-isidenticalstring\": \"^1.8\",\n                \"php-cs-fixer/phpunit-constraint-xmlmatchesxsd\": \"^1.8\",\n                \"phpunit/phpunit\": \"^9.6.35 || ^10.5.64 || ^11.5.56 || ^12.5.31 || ^13.0.6\",\n                \"symfony/polyfill-php85\": \"^1.38\",\n                \"symfony/var-dumper\": \"^5.4.48 || ^6.4.36 || ^7.4.8 || ^8.1.1\",\n                \"symfony/yaml\": \"^5.4.53 || ^6.4.41 || ^7.4.13 || ^8.1.1\"\n            },\n            \"suggest\": {\n                \"ext-dom\": \"For handling output formats in XML\",\n                \"ext-mbstring\": \"For handling non-UTF8 characters.\"\n            },\n            \"bin\": [\n                \"php-cs-fixer\"\n            ],\n            \"type\": \"application\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"PhpCsFixer\\\\\": \"src/\"\n                },\n                \"exclude-from-classmap\": [\n                    \"src/**/Internal/\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Fabien Potencier\",\n                    \"email\": \"fabien@symfony.com\"\n                },\n                {\n                    \"name\": \"Dariusz Rumiński\",\n                    \"email\": \"dariusz.ruminski@gmail.com\"\n                }\n            ],\n            \"description\": \"A tool to automatically fix PHP code style\",\n            \"keywords\": [\n                \"Static code analysis\",\n                \"fixer\",\n                \"standards\",\n                \"static analysis\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues\",\n                \"source\": \"https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.95.25\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://github.com/keradus\",\n                    \"type\": \"github\"\n                }\n            ],\n            \"time\": \"2026-09-08T11:11:37+00:00\"\n        },\n        {\n            \"name\": \"fruitcake/php-cors\",\n            \"version\": \"v1.4.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/fruitcake/php-cors.git\",\n                \"reference\": \"38aaa6c3fd4c157ffe2a4d10aa8b9b16ba8de379\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/fruitcake/php-cors/zipball/38aaa6c3fd4c157ffe2a4d10aa8b9b16ba8de379\",\n                \"reference\": \"38aaa6c3fd4c157ffe2a4d10aa8b9b16ba8de379\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \"^8.1\",\n                \"symfony/http-foundation\": \"^5.4|^6.4|^7.3|^8\"\n            },\n            \"require-dev\": {\n                \"phpstan/phpstan\": \"^2\",\n                \"phpunit/phpunit\": \"^9\",\n                \"squizlabs/php_codesniffer\": \"^4\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-master\": \"1.3-dev\"\n                }\n            },\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Fruitcake\\\\Cors\\\\\": \"src/\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Fruitcake\",\n                    \"homepage\": \"https://fruitcake.nl\"\n                },\n                {\n                    \"name\": \"Barryvdh\",\n                    \"email\": \"barryvdh@gmail.com\"\n                }\n            ],\n            \"description\": \"Cross-origin resource sharing library for the Symfony HttpFoundation\",\n            \"homepage\": \"https://github.com/fruitcake/php-cors\",\n            \"keywords\": [\n                \"cors\",\n                \"laravel\",\n                \"symfony\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/fruitcake/php-cors/issues\",\n                \"source\": \"https://github.com/fruitcake/php-cors/tree/v1.4.0\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://fruitcake.nl\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://github.com/barryvdh\",\n                    \"type\": \"github\"\n                }\n            ],\n            \"time\": \"2025-12-03T09:33:47+00:00\"\n        },\n        {\n            \"name\": \"graham-campbell/result-type\",\n            \"version\": \"v1.2.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/GrahamCampbell/Result-Type.git\",\n                \"reference\": \"adccca3324eece92ca35463648c12b9e6293c05b\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/adccca3324eece92ca35463648c12b9e6293c05b\",\n                \"reference\": \"adccca3324eece92ca35463648c12b9e6293c05b\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \"^7.2.5 || ^8.0\",\n                \"phpoption/phpoption\": \"^1.10\"\n            },\n            \"require-dev\": {\n                \"phpunit/phpunit\": \"^8.5.52 || ^9.6.34 || ^10.5.63 || ^11.5.55 || ^12.5.14\"\n            },\n            \"type\": \"library\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"GrahamCampbell\\\\ResultType\\\\\": \"src/\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Graham Campbell\",\n                    \"email\": \"hello@gjcampbell.co.uk\",\n                    \"homepage\": \"https://github.com/GrahamCampbell\"\n                }\n            ],\n            \"description\": \"An Implementation Of The Result Type\",\n            \"keywords\": [\n                \"Graham Campbell\",\n                \"GrahamCampbell\",\n                \"Result Type\",\n                \"Result-Type\",\n                \"result\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/GrahamCampbell/Result-Type/issues\",\n                \"source\": \"https://github.com/GrahamCampbell/Result-Type/tree/v1.2.0\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://github.com/GrahamCampbell\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/graham-campbell/result-type\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"time\": \"2026-08-24T09:06:52+00:00\"\n        },\n        {\n            \"name\": \"guzzlehttp/guzzle\",\n            \"version\": \"7.15.5\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/guzzle/guzzle.git\",\n                \"reference\": \"ee80339fd9177ba44c49cdb653ff02a4d1106b9a\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/guzzle/guzzle/zipball/ee80339fd9177ba44c49cdb653ff02a4d1106b9a\",\n                \"reference\": \"ee80339fd9177ba44c49cdb653ff02a4d1106b9a\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"ext-json\": \"*\",\n                \"guzzlehttp/promises\": \"^2.5.3\",\n                \"guzzlehttp/psr7\": \"^2.13.1\",\n                \"php\": \"^7.2.5 || ^8.0\",\n                \"psr/http-client\": \"^1.0\",\n                \"symfony/deprecation-contracts\": \"^2.5 || ^3.0\",\n                \"symfony/polyfill-php80\": \"^1.25\"\n            },\n            \"provide\": {\n                \"psr/http-client-implementation\": \"1.0\"\n            },\n            \"require-dev\": {\n                \"bamarni/composer-bin-plugin\": \"^1.8.2\",\n                \"ext-curl\": \"*\",\n                \"guzzle/client-integration-tests\": \"3.0.3\",\n                \"guzzlehttp/test-server\": \"^0.7\",\n                \"php-http/message-factory\": \"^1.1\",\n                \"phpunit/phpunit\": \"^8.5.52 || ^9.6.34\",\n                \"psr/log\": \"^1.1 || ^2.0 || ^3.0\"\n            },\n            \"suggest\": {\n                \"ext-curl\": \"Required for CURL handler support\",\n                \"ext-intl\": \"Required for Internationalized Domain Name (IDN) support\",\n                \"psr/log\": \"Required for using the Log middleware\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"bamarni-bin\": {\n                    \"bin-links\": true,\n                    \"forward-command\": false\n                }\n            },\n            \"autoload\": {\n                \"files\": [\n                    \"src/functions_include.php\"\n                ],\n                \"psr-4\": {\n                    \"GuzzleHttp\\\\\": \"src/\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Graham Campbell\",\n                    \"email\": \"hello@gjcampbell.co.uk\",\n                    \"homepage\": \"https://github.com/GrahamCampbell\"\n                },\n                {\n                    \"name\": \"Michael Dowling\",\n                    \"email\": \"mtdowling@gmail.com\",\n                    \"homepage\": \"https://github.com/mtdowling\"\n                },\n                {\n                    \"name\": \"Jeremy Lindblom\",\n                    \"email\": \"jeremeamia@gmail.com\",\n                    \"homepage\": \"https://github.com/jeremeamia\"\n                },\n                {\n                    \"name\": \"George Mponos\",\n                    \"email\": \"gmponos@gmail.com\",\n                    \"homepage\": \"https://github.com/gmponos\"\n                },\n                {\n                    \"name\": \"Tobias Nyholm\",\n                    \"email\": \"tobias.nyholm@gmail.com\",\n                    \"homepage\": \"https://github.com/Nyholm\"\n                },\n                {\n                    \"name\": \"Márk Sági-Kazár\",\n                    \"email\": \"mark.sagikazar@gmail.com\",\n                    \"homepage\": \"https://github.com/sagikazarmark\"\n                },\n                {\n                    \"name\": \"Tobias Schultze\",\n                    \"email\": \"webmaster@tubo-world.de\",\n                    \"homepage\": \"https://github.com/Tobion\"\n                }\n            ],\n            \"description\": \"Guzzle is a PHP HTTP client library\",\n            \"keywords\": [\n                \"client\",\n                \"curl\",\n                \"framework\",\n                \"http\",\n                \"http client\",\n                \"psr-18\",\n                \"psr-7\",\n                \"rest\",\n                \"web service\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/guzzle/guzzle/issues\",\n                \"source\": \"https://github.com/guzzle/guzzle/tree/7.15.5\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://github.com/GrahamCampbell\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://github.com/Nyholm\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"time\": \"2026-08-24T09:21:06+00:00\"\n        },\n        {\n            \"name\": \"guzzlehttp/promises\",\n            \"version\": \"2.5.3\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/guzzle/promises.git\",\n                \"reference\": \"cde49999552d185d64715fe9c1f77a2aadd2f9f1\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/guzzle/promises/zipball/cde49999552d185d64715fe9c1f77a2aadd2f9f1\",\n                \"reference\": \"cde49999552d185d64715fe9c1f77a2aadd2f9f1\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \"^7.2.5 || ^8.0\",\n                \"symfony/deprecation-contracts\": \"^2.5 || ^3.0\"\n            },\n            \"require-dev\": {\n                \"bamarni/composer-bin-plugin\": \"^1.8.2\",\n                \"phpunit/phpunit\": \"^8.5.52 || ^9.6.34\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"bamarni-bin\": {\n                    \"bin-links\": true,\n                    \"forward-command\": false\n                }\n            },\n            \"autoload\": {\n                \"psr-4\": {\n                    \"GuzzleHttp\\\\Promise\\\\\": \"src/\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Graham Campbell\",\n                    \"email\": \"hello@gjcampbell.co.uk\",\n                    \"homepage\": \"https://github.com/GrahamCampbell\"\n                },\n                {\n                    \"name\": \"Michael Dowling\",\n                    \"email\": \"mtdowling@gmail.com\",\n                    \"homepage\": \"https://github.com/mtdowling\"\n                },\n                {\n                    \"name\": \"Tobias Nyholm\",\n                    \"email\": \"tobias.nyholm@gmail.com\",\n                    \"homepage\": \"https://github.com/Nyholm\"\n                },\n                {\n                    \"name\": \"Tobias Schultze\",\n                    \"email\": \"webmaster@tubo-world.de\",\n                    \"homepage\": \"https://github.com/Tobion\"\n                }\n            ],\n            \"description\": \"Guzzle promises library\",\n            \"keywords\": [\n                \"promise\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/guzzle/promises/issues\",\n                \"source\": \"https://github.com/guzzle/promises/tree/2.5.3\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://github.com/GrahamCampbell\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://github.com/Nyholm\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/guzzlehttp/promises\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"time\": \"2026-08-24T09:11:28+00:00\"\n        },\n        {\n            \"name\": \"guzzlehttp/psr7\",\n            \"version\": \"2.13.1\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/guzzle/psr7.git\",\n                \"reference\": \"95e7828100de18b4e269fb1703be530082d5166d\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/guzzle/psr7/zipball/95e7828100de18b4e269fb1703be530082d5166d\",\n                \"reference\": \"95e7828100de18b4e269fb1703be530082d5166d\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \"^7.2.5 || ^8.0\",\n                \"psr/http-factory\": \"^1.0\",\n                \"psr/http-message\": \"^1.1 || ^2.0\",\n                \"ralouphie/getallheaders\": \"^3.0\",\n                \"symfony/deprecation-contracts\": \"^2.5 || ^3.0\",\n                \"symfony/polyfill-php80\": \"^1.25\"\n            },\n            \"provide\": {\n                \"psr/http-factory-implementation\": \"1.0\",\n                \"psr/http-message-implementation\": \"1.0\"\n            },\n            \"require-dev\": {\n                \"bamarni/composer-bin-plugin\": \"^1.8.2\",\n                \"http-interop/http-factory-tests\": \"1.1.0\",\n                \"jshttp/mime-db\": \"1.54.0.1\",\n                \"phpunit/phpunit\": \"^8.5.52 || ^9.6.34\"\n            },\n            \"suggest\": {\n                \"laminas/laminas-httphandlerrunner\": \"Emit PSR-7 responses\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"bamarni-bin\": {\n                    \"bin-links\": true,\n                    \"forward-command\": false\n                }\n            },\n            \"autoload\": {\n                \"psr-4\": {\n                    \"GuzzleHttp\\\\Psr7\\\\\": \"src/\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Graham Campbell\",\n                    \"email\": \"hello@gjcampbell.co.uk\",\n                    \"homepage\": \"https://github.com/GrahamCampbell\"\n                },\n                {\n                    \"name\": \"Michael Dowling\",\n                    \"email\": \"mtdowling@gmail.com\",\n                    \"homepage\": \"https://github.com/mtdowling\"\n                },\n                {\n                    \"name\": \"George Mponos\",\n                    \"email\": \"gmponos@gmail.com\",\n                    \"homepage\": \"https://github.com/gmponos\"\n                },\n                {\n                    \"name\": \"Tobias Nyholm\",\n                    \"email\": \"tobias.nyholm@gmail.com\",\n                    \"homepage\": \"https://github.com/Nyholm\"\n                },\n                {\n                    \"name\": \"Márk Sági-Kazár\",\n                    \"email\": \"mark.sagikazar@gmail.com\",\n                    \"homepage\": \"https://github.com/sagikazarmark\"\n                },\n                {\n                    \"name\": \"Tobias Schultze\",\n                    \"email\": \"webmaster@tubo-world.de\",\n                    \"homepage\": \"https://github.com/Tobion\"\n                },\n                {\n                    \"name\": \"Márk Sági-Kazár\",\n                    \"email\": \"mark.sagikazar@gmail.com\",\n                    \"homepage\": \"https://sagikazarmark.hu\"\n                }\n            ],\n            \"description\": \"PSR-7 message implementation that also provides common utility methods\",\n            \"keywords\": [\n                \"http\",\n                \"message\",\n                \"psr-7\",\n                \"request\",\n                \"response\",\n                \"stream\",\n                \"uri\",\n                \"url\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/guzzle/psr7/issues\",\n                \"source\": \"https://github.com/guzzle/psr7/tree/2.13.1\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://github.com/GrahamCampbell\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://github.com/Nyholm\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/guzzlehttp/psr7\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"time\": \"2026-08-24T09:13:11+00:00\"\n        },\n        {\n            \"name\": \"guzzlehttp/uri-template\",\n            \"version\": \"v1.0.11\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/guzzle/uri-template.git\",\n                \"reference\": \"d0058dccf4299d70c3d9da3378b8908b32780368\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/guzzle/uri-template/zipball/d0058dccf4299d70c3d9da3378b8908b32780368\",\n                \"reference\": \"d0058dccf4299d70c3d9da3378b8908b32780368\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \"^7.2.5 || ^8.0\",\n                \"symfony/polyfill-php80\": \"^1.25\"\n            },\n            \"require-dev\": {\n                \"bamarni/composer-bin-plugin\": \"^1.8.2\",\n                \"phpunit/phpunit\": \"^8.5.52 || ^9.6.34\",\n                \"uri-template/tests\": \"1.0.0\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"bamarni-bin\": {\n                    \"bin-links\": true,\n                    \"forward-command\": false\n                }\n            },\n            \"autoload\": {\n                \"psr-4\": {\n                    \"GuzzleHttp\\\\UriTemplate\\\\\": \"src\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Graham Campbell\",\n                    \"email\": \"hello@gjcampbell.co.uk\",\n                    \"homepage\": \"https://github.com/GrahamCampbell\"\n                },\n                {\n                    \"name\": \"Michael Dowling\",\n                    \"email\": \"mtdowling@gmail.com\",\n                    \"homepage\": \"https://github.com/mtdowling\"\n                },\n                {\n                    \"name\": \"George Mponos\",\n                    \"email\": \"gmponos@gmail.com\",\n                    \"homepage\": \"https://github.com/gmponos\"\n                },\n                {\n                    \"name\": \"Tobias Nyholm\",\n                    \"email\": \"tobias.nyholm@gmail.com\",\n                    \"homepage\": \"https://github.com/Nyholm\"\n                }\n            ],\n            \"description\": \"A polyfill class for uri_template of PHP\",\n            \"keywords\": [\n                \"guzzlehttp\",\n                \"uri-template\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/guzzle/uri-template/issues\",\n                \"source\": \"https://github.com/guzzle/uri-template/tree/v1.0.11\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://github.com/GrahamCampbell\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://github.com/Nyholm\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/guzzlehttp/uri-template\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"time\": \"2026-08-24T09:15:32+00:00\"\n        },\n        {\n            \"name\": \"laravel/framework\",\n            \"version\": \"v12.69.2\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/laravel/framework.git\",\n                \"reference\": \"17d034ef1e209b63a1d3a89c90ce5e89a4eb3fc5\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/laravel/framework/zipball/17d034ef1e209b63a1d3a89c90ce5e89a4eb3fc5\",\n                \"reference\": \"17d034ef1e209b63a1d3a89c90ce5e89a4eb3fc5\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"brick/math\": \"^0.11|^0.12|^0.13|^0.14\",\n                \"composer-runtime-api\": \"^2.2\",\n                \"doctrine/inflector\": \"^2.0.5\",\n                \"dragonmantank/cron-expression\": \"^3.4\",\n                \"egulias/email-validator\": \"^3.2.1|^4.0\",\n                \"ext-ctype\": \"*\",\n                \"ext-filter\": \"*\",\n                \"ext-hash\": \"*\",\n                \"ext-mbstring\": \"*\",\n                \"ext-openssl\": \"*\",\n                \"ext-session\": \"*\",\n                \"ext-tokenizer\": \"*\",\n                \"fruitcake/php-cors\": \"^1.3\",\n                \"guzzlehttp/guzzle\": \"^7.8.2\",\n                \"guzzlehttp/uri-template\": \"^1.0\",\n                \"laravel/prompts\": \"^0.3.0\",\n                \"laravel/serializable-closure\": \"^1.3|^2.0\",\n                \"league/commonmark\": \"^2.8.1\",\n                \"league/flysystem\": \"^3.25.1\",\n                \"league/flysystem-local\": \"^3.25.1\",\n                \"league/uri\": \"^7.5.1\",\n                \"monolog/monolog\": \"^3.0\",\n                \"nesbot/carbon\": \"^3.8.4\",\n                \"nunomaduro/termwind\": \"^2.0\",\n                \"php\": \"^8.2\",\n                \"psr/container\": \"^1.1.1|^2.0.1\",\n                \"psr/log\": \"^1.0|^2.0|^3.0\",\n                \"psr/simple-cache\": \"^1.0|^2.0|^3.0\",\n                \"ramsey/uuid\": \"^4.7\",\n                \"symfony/console\": \"^7.2.0\",\n                \"symfony/error-handler\": \"^7.2.0\",\n                \"symfony/finder\": \"^7.2.0\",\n                \"symfony/http-foundation\": \"^7.2.0\",\n                \"symfony/http-kernel\": \"^7.2.0\",\n                \"symfony/mailer\": \"^7.2.0\",\n                \"symfony/mime\": \"^7.2.0\",\n                \"symfony/polyfill-php83\": \"^1.33\",\n                \"symfony/polyfill-php84\": \"^1.34\",\n                \"symfony/polyfill-php85\": \"^1.34\",\n                \"symfony/process\": \"^7.2.0\",\n                \"symfony/routing\": \"^7.2.0\",\n                \"symfony/uid\": \"^7.2.0\",\n                \"symfony/var-dumper\": \"^7.2.0\",\n                \"tijsverkoyen/css-to-inline-styles\": \"^2.2.5\",\n                \"vlucas/phpdotenv\": \"^5.6.1\",\n                \"voku/portable-ascii\": \"^2.0.2\"\n            },\n            \"conflict\": {\n                \"tightenco/collect\": \"<5.5.33\"\n            },\n            \"provide\": {\n                \"psr/container-implementation\": \"1.1|2.0\",\n                \"psr/log-implementation\": \"1.0|2.0|3.0\",\n                \"psr/simple-cache-implementation\": \"1.0|2.0|3.0\"\n            },\n            \"replace\": {\n                \"illuminate/auth\": \"self.version\",\n                \"illuminate/broadcasting\": \"self.version\",\n                \"illuminate/bus\": \"self.version\",\n                \"illuminate/cache\": \"self.version\",\n                \"illuminate/collections\": \"self.version\",\n                \"illuminate/concurrency\": \"self.version\",\n                \"illuminate/conditionable\": \"self.version\",\n                \"illuminate/config\": \"self.version\",\n                \"illuminate/console\": \"self.version\",\n                \"illuminate/container\": \"self.version\",\n                \"illuminate/contracts\": \"self.version\",\n                \"illuminate/cookie\": \"self.version\",\n                \"illuminate/database\": \"self.version\",\n                \"illuminate/encryption\": \"self.version\",\n                \"illuminate/events\": \"self.version\",\n                \"illuminate/filesystem\": \"self.version\",\n                \"illuminate/hashing\": \"self.version\",\n                \"illuminate/http\": \"self.version\",\n                \"illuminate/json-schema\": \"self.version\",\n                \"illuminate/log\": \"self.version\",\n                \"illuminate/macroable\": \"self.version\",\n                \"illuminate/mail\": \"self.version\",\n                \"illuminate/notifications\": \"self.version\",\n                \"illuminate/pagination\": \"self.version\",\n                \"illuminate/pipeline\": \"self.version\",\n                \"illuminate/process\": \"self.version\",\n                \"illuminate/queue\": \"self.version\",\n                \"illuminate/redis\": \"self.version\",\n                \"illuminate/reflection\": \"self.version\",\n                \"illuminate/routing\": \"self.version\",\n                \"illuminate/session\": \"self.version\",\n                \"illuminate/support\": \"self.version\",\n                \"illuminate/testing\": \"self.version\",\n                \"illuminate/translation\": \"self.version\",\n                \"illuminate/validation\": \"self.version\",\n                \"illuminate/view\": \"self.version\",\n                \"spatie/once\": \"*\"\n            },\n            \"require-dev\": {\n                \"ably/ably-php\": \"^1.0\",\n                \"aws/aws-sdk-php\": \"^3.322.9\",\n                \"ext-gmp\": \"*\",\n                \"fakerphp/faker\": \"^1.24\",\n                \"guzzlehttp/promises\": \"^2.0.3\",\n                \"guzzlehttp/psr7\": \"^2.4\",\n                \"laravel/pint\": \"^1.18\",\n                \"league/flysystem-aws-s3-v3\": \"^3.25.1\",\n                \"league/flysystem-ftp\": \"^3.25.1\",\n                \"league/flysystem-path-prefixing\": \"^3.25.1\",\n                \"league/flysystem-read-only\": \"^3.25.1\",\n                \"league/flysystem-sftp-v3\": \"^3.25.1\",\n                \"mockery/mockery\": \"^1.6.10\",\n                \"opis/json-schema\": \"^2.4.1\",\n                \"orchestra/testbench-core\": \"^10.9.0\",\n                \"pda/pheanstalk\": \"^5.0.6|^7.0.0\",\n                \"php-http/discovery\": \"^1.15\",\n                \"phpstan/phpstan\": \"^2.1.41\",\n                \"phpunit/phpunit\": \"^10.5.35|^11.5.3|^12.0.1\",\n                \"predis/predis\": \"^2.3|^3.0\",\n                \"resend/resend-php\": \"^0.10.0|^1.0\",\n                \"symfony/cache\": \"^7.2.0\",\n                \"symfony/http-client\": \"^7.2.0\",\n                \"symfony/psr-http-message-bridge\": \"^7.2.0\",\n                \"symfony/translation\": \"^7.2.0\"\n            },\n            \"suggest\": {\n                \"ably/ably-php\": \"Required to use the Ably broadcast driver (^1.0).\",\n                \"aws/aws-sdk-php\": \"Required to use the SQS queue driver, DynamoDb failed job storage, and SES mail driver (^3.322.9).\",\n                \"brianium/paratest\": \"Required to run tests in parallel (^7.0|^8.0).\",\n                \"ext-apcu\": \"Required to use the APC cache driver.\",\n                \"ext-fileinfo\": \"Required to use the Filesystem class.\",\n                \"ext-ftp\": \"Required to use the Flysystem FTP driver.\",\n                \"ext-gd\": \"Required to use Illuminate\\\\Http\\\\Testing\\\\FileFactory::image().\",\n                \"ext-memcached\": \"Required to use the memcache cache driver.\",\n                \"ext-pcntl\": \"Required to use all features of the queue worker and console signal trapping.\",\n                \"ext-pdo\": \"Required to use all database features.\",\n                \"ext-posix\": \"Required to use all features of the queue worker.\",\n                \"ext-redis\": \"Required to use the Redis cache and queue drivers (^4.0|^5.0|^6.0).\",\n                \"fakerphp/faker\": \"Required to generate fake data using the fake() helper (^1.23).\",\n                \"filp/whoops\": \"Required for friendly error pages in development (^2.14.3).\",\n                \"laravel/tinker\": \"Required to use the tinker console command (^2.0).\",\n                \"league/flysystem-aws-s3-v3\": \"Required to use the Flysystem S3 driver (^3.25.1).\",\n                \"league/flysystem-ftp\": \"Required to use the Flysystem FTP driver (^3.25.1).\",\n                \"league/flysystem-path-prefixing\": \"Required to use the scoped driver (^3.25.1).\",\n                \"league/flysystem-read-only\": \"Required to use read-only disks (^3.25.1)\",\n                \"league/flysystem-sftp-v3\": \"Required to use the Flysystem SFTP driver (^3.25.1).\",\n                \"mockery/mockery\": \"Required to use mocking (^1.6).\",\n                \"pda/pheanstalk\": \"Required to use the beanstalk queue driver (^5.0).\",\n                \"php-http/discovery\": \"Required to use PSR-7 bridging features (^1.15).\",\n                \"phpunit/phpunit\": \"Required to use assertions and run tests (^10.5.35|^11.5.3|^12.0.1).\",\n                \"predis/predis\": \"Required to use the predis connector (^2.3|^3.0).\",\n                \"psr/http-message\": \"Required to allow Storage::put to accept a StreamInterface (^1.0).\",\n                \"pusher/pusher-php-server\": \"Required to use the Pusher broadcast driver (^6.0|^7.0).\",\n                \"resend/resend-php\": \"Required to enable support for the Resend mail transport (^0.10.0|^1.0).\",\n                \"symfony/cache\": \"Required to PSR-6 cache bridge (^7.2).\",\n                \"symfony/filesystem\": \"Required to enable support for relative symbolic links (^7.2).\",\n                \"symfony/http-client\": \"Required to enable support for the Symfony API mail transports (^7.2).\",\n                \"symfony/mailgun-mailer\": \"Required to enable support for the Mailgun mail transport (^7.2).\",\n                \"symfony/postmark-mailer\": \"Required to enable support for the Postmark mail transport (^7.2).\",\n                \"symfony/psr-http-message-bridge\": \"Required to use PSR-7 bridging features (^7.2).\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-master\": \"12.x-dev\"\n                }\n            },\n            \"autoload\": {\n                \"files\": [\n                    \"src/Illuminate/Collections/functions.php\",\n                    \"src/Illuminate/Collections/helpers.php\",\n                    \"src/Illuminate/Events/functions.php\",\n                    \"src/Illuminate/Filesystem/functions.php\",\n                    \"src/Illuminate/Foundation/helpers.php\",\n                    \"src/Illuminate/Log/functions.php\",\n                    \"src/Illuminate/Reflection/helpers.php\",\n                    \"src/Illuminate/Support/functions.php\",\n                    \"src/Illuminate/Support/helpers.php\"\n                ],\n                \"psr-4\": {\n                    \"Illuminate\\\\\": \"src/Illuminate/\",\n                    \"Illuminate\\\\Support\\\\\": [\n                        \"src/Illuminate/Macroable/\",\n                        \"src/Illuminate/Collections/\",\n                        \"src/Illuminate/Conditionable/\",\n                        \"src/Illuminate/Reflection/\"\n                    ]\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Taylor Otwell\",\n                    \"email\": \"taylor@laravel.com\"\n                }\n            ],\n            \"description\": \"The Laravel Framework.\",\n            \"homepage\": \"https://laravel.com\",\n            \"keywords\": [\n                \"framework\",\n                \"laravel\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/laravel/framework/issues\",\n                \"source\": \"https://github.com/laravel/framework\"\n            },\n            \"time\": \"2026-09-08T14:29:09+00:00\"\n        },\n        {\n            \"name\": \"laravel/prompts\",\n            \"version\": \"v0.3.24\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/laravel/prompts.git\",\n                \"reference\": \"5d3cdef29e93ca3b62b1871359db3078cd99908b\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/laravel/prompts/zipball/5d3cdef29e93ca3b62b1871359db3078cd99908b\",\n                \"reference\": \"5d3cdef29e93ca3b62b1871359db3078cd99908b\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"composer-runtime-api\": \"^2.2\",\n                \"ext-mbstring\": \"*\",\n                \"php\": \"^8.1\",\n                \"symfony/console\": \"^6.2|^7.0|^8.0\"\n            },\n            \"conflict\": {\n                \"illuminate/console\": \">=10.17.0 <10.25.0\",\n                \"laravel/framework\": \">=10.17.0 <10.25.0\"\n            },\n            \"require-dev\": {\n                \"illuminate/collections\": \"^10.0|^11.0|^12.0|^13.0\",\n                \"mockery/mockery\": \"^1.5\",\n                \"pestphp/pest\": \"^2.3|^3.4|^4.0\",\n                \"phpstan/phpstan\": \"^1.12.28\",\n                \"phpstan/phpstan-mockery\": \"^1.1.3\"\n            },\n            \"suggest\": {\n                \"ext-pcntl\": \"Required for the spinner to be animated.\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-main\": \"0.3.x-dev\"\n                }\n            },\n            \"autoload\": {\n                \"files\": [\n                    \"src/helpers.php\"\n                ],\n                \"psr-4\": {\n                    \"Laravel\\\\Prompts\\\\\": \"src/\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"description\": \"Add beautiful and user-friendly forms to your command-line applications.\",\n            \"support\": {\n                \"issues\": \"https://github.com/laravel/prompts/issues\",\n                \"source\": \"https://github.com/laravel/prompts/tree/v0.3.24\"\n            },\n            \"time\": \"2026-08-20T12:55:36+00:00\"\n        },\n        {\n            \"name\": \"laravel/serializable-closure\",\n            \"version\": \"v2.0.16\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/laravel/serializable-closure.git\",\n                \"reference\": \"7cfc24e4fa2cca045fb8dd2a797a2b2b13b655ed\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/laravel/serializable-closure/zipball/7cfc24e4fa2cca045fb8dd2a797a2b2b13b655ed\",\n                \"reference\": \"7cfc24e4fa2cca045fb8dd2a797a2b2b13b655ed\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \"^8.1\"\n            },\n            \"require-dev\": {\n                \"illuminate/support\": \"^10.0|^11.0|^12.0|^13.0\",\n                \"nesbot/carbon\": \"^2.67|^3.0\",\n                \"pestphp/pest\": \"^2.36|^3.0|^4.0\",\n                \"phpstan/phpstan\": \"^2.0\",\n                \"symfony/var-dumper\": \"^6.2.0|^7.0.0|^8.0.0\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-master\": \"2.x-dev\"\n                }\n            },\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Laravel\\\\SerializableClosure\\\\\": \"src/\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Taylor Otwell\",\n                    \"email\": \"taylor@laravel.com\"\n                },\n                {\n                    \"name\": \"Nuno Maduro\",\n                    \"email\": \"nuno@laravel.com\"\n                }\n            ],\n            \"description\": \"Laravel Serializable Closure provides an easy and secure way to serialize closures in PHP.\",\n            \"keywords\": [\n                \"closure\",\n                \"laravel\",\n                \"serializable\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/laravel/serializable-closure/issues\",\n                \"source\": \"https://github.com/laravel/serializable-closure\"\n            },\n            \"time\": \"2026-08-18T20:28:54+00:00\"\n        },\n        {\n            \"name\": \"league/commonmark\",\n            \"version\": \"2.10.1\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/thephpleague/commonmark.git\",\n                \"reference\": \"9d489ab67a02960fd8ffe624d93f751daf95439e\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/thephpleague/commonmark/zipball/9d489ab67a02960fd8ffe624d93f751daf95439e\",\n                \"reference\": \"9d489ab67a02960fd8ffe624d93f751daf95439e\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"ext-mbstring\": \"*\",\n                \"league/config\": \"^1.1.1\",\n                \"php\": \"^7.4 || ^8.0\",\n                \"psr/event-dispatcher\": \"^1.0\",\n                \"symfony/deprecation-contracts\": \"^2.1 || ^3.0\",\n                \"symfony/polyfill-php80\": \"^1.16\"\n            },\n            \"require-dev\": {\n                \"cebe/markdown\": \"^1.0\",\n                \"commonmark/cmark\": \"0.31.1\",\n                \"commonmark/commonmark.js\": \"0.31.1\",\n                \"composer/package-versions-deprecated\": \"^1.8\",\n                \"embed/embed\": \"^4.4\",\n                \"erusev/parsedown\": \"^1.0\",\n                \"ext-json\": \"*\",\n                \"github/gfm\": \"0.29.0\",\n                \"michelf/php-markdown\": \"^1.4 || ^2.0\",\n                \"nyholm/psr7\": \"^1.5\",\n                \"phpstan/phpstan\": \"^2.0.0\",\n                \"phpunit/phpunit\": \"^9.5.21 || ^10.5.9 || ^11.0.0 || ^12.0.0 || ^13.0.0\",\n                \"scrutinizer/ocular\": \"^1.8.1\",\n                \"symfony/finder\": \"^5.3 | ^6.0 | ^7.0 || ^8.0\",\n                \"symfony/process\": \"^5.4 | ^6.0 | ^7.0 || ^8.0\",\n                \"symfony/yaml\": \"^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 | ^7.0 || ^8.0\",\n                \"unleashedtech/php-coding-standard\": \"^3.1.1\",\n                \"vimeo/psalm\": \"^4.24.0 || ^5.0.0 || ^6.0.0\"\n            },\n            \"suggest\": {\n                \"symfony/yaml\": \"v2.3+ required if using the Front Matter extension\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-main\": \"2.11-dev\"\n                }\n            },\n            \"autoload\": {\n                \"psr-4\": {\n                    \"League\\\\CommonMark\\\\\": \"src\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"BSD-3-Clause\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Colin O'Dell\",\n                    \"email\": \"colinodell@gmail.com\",\n                    \"homepage\": \"https://www.colinodell.com\",\n                    \"role\": \"Lead Developer\"\n                }\n            ],\n            \"description\": \"Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and GitHub-Flavored Markdown (GFM)\",\n            \"homepage\": \"https://commonmark.thephpleague.com\",\n            \"keywords\": [\n                \"commonmark\",\n                \"flavored\",\n                \"gfm\",\n                \"github\",\n                \"github-flavored\",\n                \"markdown\",\n                \"md\",\n                \"parser\"\n            ],\n            \"support\": {\n                \"docs\": \"https://commonmark.thephpleague.com/\",\n                \"forum\": \"https://github.com/thephpleague/commonmark/discussions\",\n                \"issues\": \"https://github.com/thephpleague/commonmark/issues\",\n                \"rss\": \"https://github.com/thephpleague/commonmark/releases.atom\",\n                \"source\": \"https://github.com/thephpleague/commonmark\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://www.colinodell.com/sponsor\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://www.paypal.me/colinpodell/10.00\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://github.com/colinodell\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/league/commonmark\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"time\": \"2026-09-07T13:44:26+00:00\"\n        },\n        {\n            \"name\": \"league/config\",\n            \"version\": \"v1.2.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/thephpleague/config.git\",\n                \"reference\": \"754b3604fb2984c71f4af4a9cbe7b57f346ec1f3\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/thephpleague/config/zipball/754b3604fb2984c71f4af4a9cbe7b57f346ec1f3\",\n                \"reference\": \"754b3604fb2984c71f4af4a9cbe7b57f346ec1f3\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"dflydev/dot-access-data\": \"^3.0.1\",\n                \"nette/schema\": \"^1.2\",\n                \"php\": \"^7.4 || ^8.0\"\n            },\n            \"require-dev\": {\n                \"phpstan/phpstan\": \"^1.8.2\",\n                \"phpunit/phpunit\": \"^9.5.5\",\n                \"scrutinizer/ocular\": \"^1.8.1\",\n                \"unleashedtech/php-coding-standard\": \"^3.1\",\n                \"vimeo/psalm\": \"^4.7.3\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-main\": \"1.2-dev\"\n                }\n            },\n            \"autoload\": {\n                \"psr-4\": {\n                    \"League\\\\Config\\\\\": \"src\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"BSD-3-Clause\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Colin O'Dell\",\n                    \"email\": \"colinodell@gmail.com\",\n                    \"homepage\": \"https://www.colinodell.com\",\n                    \"role\": \"Lead Developer\"\n                }\n            ],\n            \"description\": \"Define configuration arrays with strict schemas and access values with dot notation\",\n            \"homepage\": \"https://config.thephpleague.com\",\n            \"keywords\": [\n                \"array\",\n                \"config\",\n                \"configuration\",\n                \"dot\",\n                \"dot-access\",\n                \"nested\",\n                \"schema\"\n            ],\n            \"support\": {\n                \"docs\": \"https://config.thephpleague.com/\",\n                \"issues\": \"https://github.com/thephpleague/config/issues\",\n                \"rss\": \"https://github.com/thephpleague/config/releases.atom\",\n                \"source\": \"https://github.com/thephpleague/config\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://www.colinodell.com/sponsor\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://www.paypal.me/colinpodell/10.00\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://github.com/colinodell\",\n                    \"type\": \"github\"\n                }\n            ],\n            \"time\": \"2022-12-11T20:36:23+00:00\"\n        },\n        {\n            \"name\": \"league/flysystem\",\n            \"version\": \"3.36.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/thephpleague/flysystem.git\",\n                \"reference\": \"f7fb152932f30072d573510cbd4dd657d6475b25\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/thephpleague/flysystem/zipball/f7fb152932f30072d573510cbd4dd657d6475b25\",\n                \"reference\": \"f7fb152932f30072d573510cbd4dd657d6475b25\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"league/flysystem-local\": \"^3.0.0\",\n                \"league/mime-type-detection\": \"^1.0.0\",\n                \"php\": \"^8.0.2\"\n            },\n            \"conflict\": {\n                \"async-aws/core\": \"<1.19.0\",\n                \"async-aws/s3\": \"<1.14.0\",\n                \"aws/aws-sdk-php\": \"3.209.31 || 3.210.0\",\n                \"guzzlehttp/guzzle\": \"<7.0\",\n                \"guzzlehttp/ringphp\": \"<1.1.1\",\n                \"phpseclib/phpseclib\": \"3.0.15\",\n                \"symfony/http-client\": \"<5.2\"\n            },\n            \"require-dev\": {\n                \"async-aws/s3\": \"^1.5 || ^2.0\",\n                \"async-aws/simple-s3\": \"^1.1 || ^2.0\",\n                \"aws/aws-sdk-php\": \"^3.295.10\",\n                \"composer/semver\": \"^3.0\",\n                \"ext-fileinfo\": \"*\",\n                \"ext-ftp\": \"*\",\n                \"ext-mongodb\": \"^1.3|^2\",\n                \"ext-zip\": \"*\",\n                \"friendsofphp/php-cs-fixer\": \"^3.5\",\n                \"google/cloud-storage\": \"^1.23\",\n                \"guzzlehttp/psr7\": \"^2.6\",\n                \"microsoft/azure-storage-blob\": \"^1.1\",\n                \"mongodb/mongodb\": \"^1.2|^2\",\n                \"phpseclib/phpseclib\": \"^3.0.36\",\n                \"phpstan/phpstan\": \"^1.10\",\n                \"phpunit/phpunit\": \"^9.5.11|^10.0\",\n                \"sabre/dav\": \"^4.6.0\"\n            },\n            \"type\": \"library\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"League\\\\Flysystem\\\\\": \"src\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Frank de Jonge\",\n                    \"email\": \"info@frankdejonge.nl\"\n                }\n            ],\n            \"description\": \"File storage abstraction for PHP\",\n            \"keywords\": [\n                \"WebDAV\",\n                \"aws\",\n                \"cloud\",\n                \"file\",\n                \"files\",\n                \"filesystem\",\n                \"filesystems\",\n                \"ftp\",\n                \"s3\",\n                \"sftp\",\n                \"storage\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/thephpleague/flysystem/issues\",\n                \"source\": \"https://github.com/thephpleague/flysystem/tree/3.36.0\"\n            },\n            \"time\": \"2026-09-02T08:00:27+00:00\"\n        },\n        {\n            \"name\": \"league/flysystem-local\",\n            \"version\": \"3.35.3\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/thephpleague/flysystem-local.git\",\n                \"reference\": \"a099b24dce160f3b2239043d13d47c4a1a214ea4\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/thephpleague/flysystem-local/zipball/a099b24dce160f3b2239043d13d47c4a1a214ea4\",\n                \"reference\": \"a099b24dce160f3b2239043d13d47c4a1a214ea4\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"ext-fileinfo\": \"*\",\n                \"league/flysystem\": \"^3.0.0\",\n                \"league/mime-type-detection\": \"^1.0.0\",\n                \"php\": \"^8.0.2\"\n            },\n            \"type\": \"library\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"League\\\\Flysystem\\\\Local\\\\\": \"\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Frank de Jonge\",\n                    \"email\": \"info@frankdejonge.nl\"\n                }\n            ],\n            \"description\": \"Local filesystem adapter for Flysystem.\",\n            \"keywords\": [\n                \"Flysystem\",\n                \"file\",\n                \"files\",\n                \"filesystem\",\n                \"local\"\n            ],\n            \"support\": {\n                \"source\": \"https://github.com/thephpleague/flysystem-local/tree/3.35.3\"\n            },\n            \"time\": \"2026-08-12T13:29:21+00:00\"\n        },\n        {\n            \"name\": \"league/mime-type-detection\",\n            \"version\": \"1.17.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/thephpleague/mime-type-detection.git\",\n                \"reference\": \"f5f47eff7c48ed1003069a2ca67f316fb4021c76\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/thephpleague/mime-type-detection/zipball/f5f47eff7c48ed1003069a2ca67f316fb4021c76\",\n                \"reference\": \"f5f47eff7c48ed1003069a2ca67f316fb4021c76\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"ext-fileinfo\": \"*\",\n                \"php\": \"^7.4 || ^8.0\"\n            },\n            \"require-dev\": {\n                \"friendsofphp/php-cs-fixer\": \"^3.2\",\n                \"phpstan/phpstan\": \"^0.12.68\",\n                \"phpunit/phpunit\": \"^8.5.8 || ^9.3 || ^10.0 || ^11.0 || ^12.0\"\n            },\n            \"type\": \"library\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"League\\\\MimeTypeDetection\\\\\": \"src\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Frank de Jonge\",\n                    \"email\": \"info@frankdejonge.nl\"\n                }\n            ],\n            \"description\": \"Mime-type detection for Flysystem\",\n            \"support\": {\n                \"issues\": \"https://github.com/thephpleague/mime-type-detection/issues\",\n                \"source\": \"https://github.com/thephpleague/mime-type-detection/tree/1.17.0\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://github.com/frankdejonge\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/league/flysystem\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"time\": \"2026-07-09T11:49:27+00:00\"\n        },\n        {\n            \"name\": \"league/uri\",\n            \"version\": \"7.8.1\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/thephpleague/uri.git\",\n                \"reference\": \"08cf38e3924d4f56238125547b5720496fac8fd4\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/thephpleague/uri/zipball/08cf38e3924d4f56238125547b5720496fac8fd4\",\n                \"reference\": \"08cf38e3924d4f56238125547b5720496fac8fd4\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"league/uri-interfaces\": \"^7.8.1\",\n                \"php\": \"^8.1\",\n                \"psr/http-factory\": \"^1\"\n            },\n            \"conflict\": {\n                \"league/uri-schemes\": \"^1.0\"\n            },\n            \"suggest\": {\n                \"ext-bcmath\": \"to improve IPV4 host parsing\",\n                \"ext-dom\": \"to convert the URI into an HTML anchor tag\",\n                \"ext-fileinfo\": \"to create Data URI from file contennts\",\n                \"ext-gmp\": \"to improve IPV4 host parsing\",\n                \"ext-intl\": \"to handle IDN host with the best performance\",\n                \"ext-uri\": \"to use the PHP native URI class\",\n                \"jeremykendall/php-domain-parser\": \"to further parse the URI host and resolve its Public Suffix and Top Level Domain\",\n                \"league/uri-components\": \"to provide additional tools to manipulate URI objects components\",\n                \"league/uri-polyfill\": \"to backport the PHP URI extension for older versions of PHP\",\n                \"php-64bit\": \"to improve IPV4 host parsing\",\n                \"rowbot/url\": \"to handle URLs using the WHATWG URL Living Standard specification\",\n                \"symfony/polyfill-intl-idn\": \"to handle IDN host via the Symfony polyfill if ext-intl is not present\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-master\": \"7.x-dev\"\n                }\n            },\n            \"autoload\": {\n                \"psr-4\": {\n                    \"League\\\\Uri\\\\\": \"\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Ignace Nyamagana Butera\",\n                    \"email\": \"nyamsprod@gmail.com\",\n                    \"homepage\": \"https://nyamsprod.com\"\n                }\n            ],\n            \"description\": \"URI manipulation library\",\n            \"homepage\": \"https://uri.thephpleague.com\",\n            \"keywords\": [\n                \"URN\",\n                \"data-uri\",\n                \"file-uri\",\n                \"ftp\",\n                \"hostname\",\n                \"http\",\n                \"https\",\n                \"middleware\",\n                \"parse_str\",\n                \"parse_url\",\n                \"psr-7\",\n                \"query-string\",\n                \"querystring\",\n                \"rfc2141\",\n                \"rfc3986\",\n                \"rfc3987\",\n                \"rfc6570\",\n                \"rfc8141\",\n                \"uri\",\n                \"uri-template\",\n                \"url\",\n                \"ws\"\n            ],\n            \"support\": {\n                \"docs\": \"https://uri.thephpleague.com\",\n                \"forum\": \"https://thephpleague.slack.com\",\n                \"issues\": \"https://github.com/thephpleague/uri-src/issues\",\n                \"source\": \"https://github.com/thephpleague/uri/tree/7.8.1\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://github.com/sponsors/nyamsprod\",\n                    \"type\": \"github\"\n                }\n            ],\n            \"time\": \"2026-03-15T20:22:25+00:00\"\n        },\n        {\n            \"name\": \"league/uri-interfaces\",\n            \"version\": \"7.8.1\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/thephpleague/uri-interfaces.git\",\n                \"reference\": \"85d5c77c5d6d3af6c54db4a78246364908f3c928\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/thephpleague/uri-interfaces/zipball/85d5c77c5d6d3af6c54db4a78246364908f3c928\",\n                \"reference\": \"85d5c77c5d6d3af6c54db4a78246364908f3c928\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"ext-filter\": \"*\",\n                \"php\": \"^8.1\",\n                \"psr/http-message\": \"^1.1 || ^2.0\"\n            },\n            \"suggest\": {\n                \"ext-bcmath\": \"to improve IPV4 host parsing\",\n                \"ext-gmp\": \"to improve IPV4 host parsing\",\n                \"ext-intl\": \"to handle IDN host with the best performance\",\n                \"php-64bit\": \"to improve IPV4 host parsing\",\n                \"rowbot/url\": \"to handle URLs using the WHATWG URL Living Standard specification\",\n                \"symfony/polyfill-intl-idn\": \"to handle IDN host via the Symfony polyfill if ext-intl is not present\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-master\": \"7.x-dev\"\n                }\n            },\n            \"autoload\": {\n                \"psr-4\": {\n                    \"League\\\\Uri\\\\\": \"\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Ignace Nyamagana Butera\",\n                    \"email\": \"nyamsprod@gmail.com\",\n                    \"homepage\": \"https://nyamsprod.com\"\n                }\n            ],\n            \"description\": \"Common tools for parsing and resolving RFC3987/RFC3986 URI\",\n            \"homepage\": \"https://uri.thephpleague.com\",\n            \"keywords\": [\n                \"data-uri\",\n                \"file-uri\",\n                \"ftp\",\n                \"hostname\",\n                \"http\",\n                \"https\",\n                \"parse_str\",\n                \"parse_url\",\n                \"psr-7\",\n                \"query-string\",\n                \"querystring\",\n                \"rfc3986\",\n                \"rfc3987\",\n                \"rfc6570\",\n                \"uri\",\n                \"url\",\n                \"ws\"\n            ],\n            \"support\": {\n                \"docs\": \"https://uri.thephpleague.com\",\n                \"forum\": \"https://thephpleague.slack.com\",\n                \"issues\": \"https://github.com/thephpleague/uri-src/issues\",\n                \"source\": \"https://github.com/thephpleague/uri-interfaces/tree/7.8.1\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://github.com/sponsors/nyamsprod\",\n                    \"type\": \"github\"\n                }\n            ],\n            \"time\": \"2026-03-08T20:05:35+00:00\"\n        },\n        {\n            \"name\": \"monolog/monolog\",\n            \"version\": \"3.12.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/Seldaek/monolog.git\",\n                \"reference\": \"72c534fc0ab181ef52d92a68382318631e301608\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/Seldaek/monolog/zipball/72c534fc0ab181ef52d92a68382318631e301608\",\n                \"reference\": \"72c534fc0ab181ef52d92a68382318631e301608\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=8.1\",\n                \"psr/log\": \"^2.0 || ^3.0\"\n            },\n            \"provide\": {\n                \"psr/log-implementation\": \"3.0.0\"\n            },\n            \"require-dev\": {\n                \"aws/aws-sdk-php\": \"^3.0\",\n                \"doctrine/couchdb\": \"~1.0@dev\",\n                \"elasticsearch/elasticsearch\": \"^7 || ^8\",\n                \"ext-json\": \"*\",\n                \"graylog2/gelf-php\": \"^1.4.2 || ^2.0\",\n                \"guzzlehttp/guzzle\": \"^7.4.5\",\n                \"guzzlehttp/psr7\": \"^2.2\",\n                \"mongodb/mongodb\": \"^1.8 || ^2.0\",\n                \"php-amqplib/php-amqplib\": \"~2.4 || ^3\",\n                \"php-console/php-console\": \"^3.1.8\",\n                \"phpstan/phpstan\": \"^2\",\n                \"phpstan/phpstan-deprecation-rules\": \"^2\",\n                \"phpstan/phpstan-strict-rules\": \"^2\",\n                \"phpunit/phpunit\": \"^10.5.17 || ^11.0.7\",\n                \"predis/predis\": \"^1.1 || ^2\",\n                \"psr/clock\": \"^1.0\",\n                \"rollbar/rollbar\": \"^4.0\",\n                \"ruflin/elastica\": \"^7 || ^8\",\n                \"symfony/mailer\": \"^5.4 || ^6\",\n                \"symfony/mime\": \"^5.4 || ^6\"\n            },\n            \"suggest\": {\n                \"aws/aws-sdk-php\": \"Allow sending log messages to AWS services like DynamoDB\",\n                \"doctrine/couchdb\": \"Allow sending log messages to a CouchDB server\",\n                \"elasticsearch/elasticsearch\": \"Allow sending log messages to an Elasticsearch server via official client\",\n                \"ext-amqp\": \"Allow sending log messages to an AMQP server (1.0+ required)\",\n                \"ext-curl\": \"Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler\",\n                \"ext-mbstring\": \"Allow to work properly with unicode symbols\",\n                \"ext-mongodb\": \"Allow sending log messages to a MongoDB server (via driver)\",\n                \"ext-openssl\": \"Required to send log messages using SSL\",\n                \"ext-sockets\": \"Allow sending log messages to a Syslog server (via UDP driver)\",\n                \"graylog2/gelf-php\": \"Allow sending log messages to a GrayLog2 server\",\n                \"mongodb/mongodb\": \"Allow sending log messages to a MongoDB server (via library)\",\n                \"php-amqplib/php-amqplib\": \"Allow sending log messages to an AMQP server using php-amqplib\",\n                \"psr/clock\": \"Required to pass a clock to the Logger and control the timestamp of log records\",\n                \"rollbar/rollbar\": \"Allow sending log messages to Rollbar\",\n                \"ruflin/elastica\": \"Allow sending log messages to an Elastic Search server\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-main\": \"3.x-dev\"\n                }\n            },\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Monolog\\\\\": \"src/Monolog\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Jordi Boggiano\",\n                    \"email\": \"j.boggiano@seld.be\",\n                    \"homepage\": \"https://seld.be\"\n                }\n            ],\n            \"description\": \"Sends your logs to files, sockets, inboxes, databases and various web services\",\n            \"homepage\": \"https://github.com/Seldaek/monolog\",\n            \"keywords\": [\n                \"log\",\n                \"logging\",\n                \"psr-3\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/Seldaek/monolog/issues\",\n                \"source\": \"https://github.com/Seldaek/monolog/tree/3.12.0\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://github.com/Seldaek\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/monolog/monolog\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"time\": \"2026-09-09T08:34:20+00:00\"\n        },\n        {\n            \"name\": \"myclabs/deep-copy\",\n            \"version\": \"1.14.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/myclabs/DeepCopy.git\",\n                \"reference\": \"8680aa248f8e07bc8fb43f56f0f5fc77a0c96aae\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/myclabs/DeepCopy/zipball/8680aa248f8e07bc8fb43f56f0f5fc77a0c96aae\",\n                \"reference\": \"8680aa248f8e07bc8fb43f56f0f5fc77a0c96aae\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \"^8.0\"\n            },\n            \"conflict\": {\n                \"doctrine/collections\": \"<1.6.8\",\n                \"doctrine/common\": \"<2.13.3 || >=3 <3.2.2\"\n            },\n            \"require-dev\": {\n                \"doctrine/collections\": \"^1.6.8\",\n                \"doctrine/common\": \"^2.13.3 || ^3.2.2\",\n                \"phpspec/prophecy\": \"^1.10\",\n                \"phpunit/phpunit\": \"^7.5.20 || ^8.5.23 || ^9.5.13\"\n            },\n            \"type\": \"library\",\n            \"autoload\": {\n                \"files\": [\n                    \"src/DeepCopy/deep_copy.php\"\n                ],\n                \"psr-4\": {\n                    \"DeepCopy\\\\\": \"src/DeepCopy/\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"description\": \"Create deep copies (clones) of your objects\",\n            \"keywords\": [\n                \"clone\",\n                \"copy\",\n                \"duplicate\",\n                \"object\",\n                \"object graph\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/myclabs/DeepCopy/issues\",\n                \"source\": \"https://github.com/myclabs/DeepCopy/tree/1.14.0\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://github.com/mnapoli\",\n                    \"type\": \"github\"\n                }\n            ],\n            \"time\": \"2026-08-11T10:17:44+00:00\"\n        },\n        {\n            \"name\": \"nesbot/carbon\",\n            \"version\": \"3.13.2\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/CarbonPHP/carbon.git\",\n                \"reference\": \"a1c54919f5fff9800cd03c32bd01defd5a4061cb\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/CarbonPHP/carbon/zipball/a1c54919f5fff9800cd03c32bd01defd5a4061cb\",\n                \"reference\": \"a1c54919f5fff9800cd03c32bd01defd5a4061cb\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"carbonphp/carbon-doctrine-types\": \"<100.0\",\n                \"ext-json\": \"*\",\n                \"php\": \"^8.1\",\n                \"psr/clock\": \"^1.0\",\n                \"symfony/clock\": \"^6.3.12 || ^7.0 || ^8.0\",\n                \"symfony/polyfill-mbstring\": \"^1.0\",\n                \"symfony/translation\": \"^4.4.18 || ^5.2.1 || ^6.0 || ^7.0 || ^8.0\"\n            },\n            \"provide\": {\n                \"psr/clock-implementation\": \"1.0\"\n            },\n            \"require-dev\": {\n                \"doctrine/dbal\": \"^3.6.3 || ^4.0\",\n                \"doctrine/orm\": \"^2.15.2 || ^3.0\",\n                \"friendsofphp/php-cs-fixer\": \"^v3.87.1\",\n                \"kylekatarnls/multi-tester\": \"^2.5.3\",\n                \"phpmd/phpmd\": \"^2.15.0\",\n                \"phpstan/extension-installer\": \"^1.4.3\",\n                \"phpstan/phpstan\": \"^2.1.22\",\n                \"phpunit/phpunit\": \"^10.5.53\",\n                \"squizlabs/php_codesniffer\": \"^3.13.4 || ^4.0.0\"\n            },\n            \"bin\": [\n                \"bin/carbon\"\n            ],\n            \"type\": \"library\",\n            \"extra\": {\n                \"laravel\": {\n                    \"providers\": [\n                        \"Carbon\\\\Laravel\\\\ServiceProvider\"\n                    ]\n                },\n                \"phpstan\": {\n                    \"includes\": [\n                        \"extension.neon\"\n                    ]\n                },\n                \"branch-alias\": {\n                    \"dev-2.x\": \"2.x-dev\",\n                    \"dev-master\": \"3.x-dev\"\n                }\n            },\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Carbon\\\\\": \"src/Carbon/\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Brian Nesbitt\",\n                    \"email\": \"brian@nesbot.com\",\n                    \"homepage\": \"https://markido.com\"\n                },\n                {\n                    \"name\": \"kylekatarnls\",\n                    \"homepage\": \"https://github.com/kylekatarnls\"\n                }\n            ],\n            \"description\": \"An API extension for DateTime that supports 281 different languages.\",\n            \"homepage\": \"https://carbonphp.github.io/carbon/\",\n            \"keywords\": [\n                \"date\",\n                \"datetime\",\n                \"time\"\n            ],\n            \"support\": {\n                \"docs\": \"https://carbonphp.github.io/carbon/guide/getting-started/introduction.html\",\n                \"issues\": \"https://github.com/CarbonPHP/carbon/issues\",\n                \"source\": \"https://github.com/CarbonPHP/carbon\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://github.com/sponsors/kylekatarnls\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://opencollective.com/Carbon#sponsor\",\n                    \"type\": \"opencollective\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"time\": \"2026-08-08T11:40:35+00:00\"\n        },\n        {\n            \"name\": \"nette/schema\",\n            \"version\": \"v1.3.6\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/nette/schema.git\",\n                \"reference\": \"c54350438cd6914616f790a49cb424605f421562\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/nette/schema/zipball/c54350438cd6914616f790a49cb424605f421562\",\n                \"reference\": \"c54350438cd6914616f790a49cb424605f421562\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"nette/utils\": \"^4.0\",\n                \"php\": \"8.1 - 8.5\"\n            },\n            \"require-dev\": {\n                \"nette/phpstan-rules\": \"^1.0\",\n                \"nette/tester\": \"^2.6\",\n                \"phpstan/extension-installer\": \"^1.4@stable\",\n                \"phpstan/phpstan\": \"^2.1.39@stable\",\n                \"tracy/tracy\": \"^2.8\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-master\": \"1.3-dev\"\n                }\n            },\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Nette\\\\\": \"src\"\n                },\n                \"classmap\": [\n                    \"src/\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"BSD-3-Clause\",\n                \"GPL-2.0-only\",\n                \"GPL-3.0-only\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"David Grudl\",\n                    \"homepage\": \"https://davidgrudl.com\"\n                },\n                {\n                    \"name\": \"Nette Community\",\n                    \"homepage\": \"https://nette.org/contributors\"\n                }\n            ],\n            \"description\": \"📐 Nette Schema: validating data structures against a given Schema.\",\n            \"homepage\": \"https://nette.org\",\n            \"keywords\": [\n                \"config\",\n                \"nette\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/nette/schema/issues\",\n                \"source\": \"https://github.com/nette/schema/tree/v1.3.6\"\n            },\n            \"time\": \"2026-08-16T21:58:41+00:00\"\n        },\n        {\n            \"name\": \"nette/utils\",\n            \"version\": \"v4.1.5\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/nette/utils.git\",\n                \"reference\": \"b043439dbdf954e6c28b5ea7e34b0100f83165e0\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/nette/utils/zipball/b043439dbdf954e6c28b5ea7e34b0100f83165e0\",\n                \"reference\": \"b043439dbdf954e6c28b5ea7e34b0100f83165e0\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \"8.2 - 8.5\"\n            },\n            \"conflict\": {\n                \"nette/finder\": \"<3\",\n                \"nette/schema\": \"<1.2.2\"\n            },\n            \"require-dev\": {\n                \"jetbrains/phpstorm-attributes\": \"^1.2\",\n                \"nette/phpstan-rules\": \"^1.0\",\n                \"nette/tester\": \"^2.5\",\n                \"phpstan/extension-installer\": \"^1.4@stable\",\n                \"phpstan/phpstan\": \"^2.1@stable\",\n                \"tracy/tracy\": \"^2.9\"\n            },\n            \"suggest\": {\n                \"ext-gd\": \"to use Image\",\n                \"ext-iconv\": \"to use Strings::chr(), ord() and reverse()\",\n                \"ext-intl\": \"to use Strings::webalize(), toAscii(), normalize() and compare()\",\n                \"ext-json\": \"to use Nette\\\\Utils\\\\Json\",\n                \"ext-mbstring\": \"to use Strings::lower() etc...\",\n                \"ext-tokenizer\": \"to use Nette\\\\Utils\\\\Reflection::getUseStatements()\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-master\": \"4.1-dev\"\n                }\n            },\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Nette\\\\\": \"src\"\n                },\n                \"classmap\": [\n                    \"src/\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"BSD-3-Clause\",\n                \"GPL-2.0-only\",\n                \"GPL-3.0-only\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"David Grudl\",\n                    \"homepage\": \"https://davidgrudl.com\"\n                },\n                {\n                    \"name\": \"Nette Community\",\n                    \"homepage\": \"https://nette.org/contributors\"\n                }\n            ],\n            \"description\": \"🛠  Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.\",\n            \"homepage\": \"https://nette.org\",\n            \"keywords\": [\n                \"array\",\n                \"core\",\n                \"datetime\",\n                \"images\",\n                \"json\",\n                \"nette\",\n                \"paginator\",\n                \"password\",\n                \"slugify\",\n                \"string\",\n                \"unicode\",\n                \"utf-8\",\n                \"utility\",\n                \"validation\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/nette/utils/issues\",\n                \"source\": \"https://github.com/nette/utils/tree/v4.1.5\"\n            },\n            \"time\": \"2026-07-17T23:02:45+00:00\"\n        },\n        {\n            \"name\": \"nunomaduro/termwind\",\n            \"version\": \"v2.4.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/nunomaduro/termwind.git\",\n                \"reference\": \"712a31b768f5daea284c2169a7d227031001b9a8\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/nunomaduro/termwind/zipball/712a31b768f5daea284c2169a7d227031001b9a8\",\n                \"reference\": \"712a31b768f5daea284c2169a7d227031001b9a8\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"ext-mbstring\": \"*\",\n                \"php\": \"^8.2\",\n                \"symfony/console\": \"^7.4.4 || ^8.0.4\"\n            },\n            \"require-dev\": {\n                \"illuminate/console\": \"^11.47.0\",\n                \"laravel/pint\": \"^1.27.1\",\n                \"mockery/mockery\": \"^1.6.12\",\n                \"pestphp/pest\": \"^2.36.0 || ^3.8.4 || ^4.3.2\",\n                \"phpstan/phpstan\": \"^1.12.32\",\n                \"phpstan/phpstan-strict-rules\": \"^1.6.2\",\n                \"symfony/var-dumper\": \"^7.3.5 || ^8.0.4\",\n                \"thecodingmachine/phpstan-strict-rules\": \"^1.0.0\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"laravel\": {\n                    \"providers\": [\n                        \"Termwind\\\\Laravel\\\\TermwindServiceProvider\"\n                    ]\n                },\n                \"branch-alias\": {\n                    \"dev-2.x\": \"2.x-dev\"\n                }\n            },\n            \"autoload\": {\n                \"files\": [\n                    \"src/Functions.php\"\n                ],\n                \"psr-4\": {\n                    \"Termwind\\\\\": \"src/\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Nuno Maduro\",\n                    \"email\": \"enunomaduro@gmail.com\"\n                }\n            ],\n            \"description\": \"It's like Tailwind CSS, but for the console.\",\n            \"keywords\": [\n                \"cli\",\n                \"console\",\n                \"css\",\n                \"package\",\n                \"php\",\n                \"style\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/nunomaduro/termwind/issues\",\n                \"source\": \"https://github.com/nunomaduro/termwind/tree/v2.4.0\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://www.paypal.com/paypalme/enunomaduro\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://github.com/nunomaduro\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://github.com/xiCO2k\",\n                    \"type\": \"github\"\n                }\n            ],\n            \"time\": \"2026-02-16T23:10:27+00:00\"\n        },\n        {\n            \"name\": \"phar-io/manifest\",\n            \"version\": \"2.0.4\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/phar-io/manifest.git\",\n                \"reference\": \"54750ef60c58e43759730615a392c31c80e23176\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176\",\n                \"reference\": \"54750ef60c58e43759730615a392c31c80e23176\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"ext-dom\": \"*\",\n                \"ext-libxml\": \"*\",\n                \"ext-phar\": \"*\",\n                \"ext-xmlwriter\": \"*\",\n                \"phar-io/version\": \"^3.0.1\",\n                \"php\": \"^7.2 || ^8.0\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-master\": \"2.0.x-dev\"\n                }\n            },\n            \"autoload\": {\n                \"classmap\": [\n                    \"src/\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"BSD-3-Clause\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Arne Blankerts\",\n                    \"email\": \"arne@blankerts.de\",\n                    \"role\": \"Developer\"\n                },\n                {\n                    \"name\": \"Sebastian Heuer\",\n                    \"email\": \"sebastian@phpeople.de\",\n                    \"role\": \"Developer\"\n                },\n                {\n                    \"name\": \"Sebastian Bergmann\",\n                    \"email\": \"sebastian@phpunit.de\",\n                    \"role\": \"Developer\"\n                }\n            ],\n            \"description\": \"Component for reading phar.io manifest information from a PHP Archive (PHAR)\",\n            \"support\": {\n                \"issues\": \"https://github.com/phar-io/manifest/issues\",\n                \"source\": \"https://github.com/phar-io/manifest/tree/2.0.4\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://github.com/theseer\",\n                    \"type\": \"github\"\n                }\n            ],\n            \"time\": \"2024-03-03T12:33:53+00:00\"\n        },\n        {\n            \"name\": \"phar-io/version\",\n            \"version\": \"3.2.1\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/phar-io/version.git\",\n                \"reference\": \"4f7fd7836c6f332bb2933569e566a0d6c4cbed74\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74\",\n                \"reference\": \"4f7fd7836c6f332bb2933569e566a0d6c4cbed74\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \"^7.2 || ^8.0\"\n            },\n            \"type\": \"library\",\n            \"autoload\": {\n                \"classmap\": [\n                    \"src/\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"BSD-3-Clause\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Arne Blankerts\",\n                    \"email\": \"arne@blankerts.de\",\n                    \"role\": \"Developer\"\n                },\n                {\n                    \"name\": \"Sebastian Heuer\",\n                    \"email\": \"sebastian@phpeople.de\",\n                    \"role\": \"Developer\"\n                },\n                {\n                    \"name\": \"Sebastian Bergmann\",\n                    \"email\": \"sebastian@phpunit.de\",\n                    \"role\": \"Developer\"\n                }\n            ],\n            \"description\": \"Library for handling version information and constraints\",\n            \"support\": {\n                \"issues\": \"https://github.com/phar-io/version/issues\",\n                \"source\": \"https://github.com/phar-io/version/tree/3.2.1\"\n            },\n            \"time\": \"2022-02-21T01:04:05+00:00\"\n        },\n        {\n            \"name\": \"phpoption/phpoption\",\n            \"version\": \"1.10.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/schmittjoh/php-option.git\",\n                \"reference\": \"67b192b6a42ec03944b972d6e633ddec78ad2c6d\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/schmittjoh/php-option/zipball/67b192b6a42ec03944b972d6e633ddec78ad2c6d\",\n                \"reference\": \"67b192b6a42ec03944b972d6e633ddec78ad2c6d\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \"^7.2.5 || ^8.0\"\n            },\n            \"require-dev\": {\n                \"bamarni/composer-bin-plugin\": \"^1.8.2\",\n                \"phpunit/phpunit\": \"^8.5.54 || ^9.6.36 || ^10.5.64 || ^11.5.56 || ^12.5.33\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"bamarni-bin\": {\n                    \"bin-links\": true,\n                    \"forward-command\": false\n                },\n                \"branch-alias\": {\n                    \"dev-master\": \"1.9-dev\"\n                }\n            },\n            \"autoload\": {\n                \"psr-4\": {\n                    \"PhpOption\\\\\": \"src/PhpOption/\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"Apache-2.0\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Johannes M. Schmitt\",\n                    \"email\": \"schmittjoh@gmail.com\",\n                    \"homepage\": \"https://github.com/schmittjoh\"\n                },\n                {\n                    \"name\": \"Graham Campbell\",\n                    \"email\": \"hello@gjcampbell.co.uk\",\n                    \"homepage\": \"https://github.com/GrahamCampbell\"\n                }\n            ],\n            \"description\": \"Option Type for PHP\",\n            \"keywords\": [\n                \"language\",\n                \"option\",\n                \"php\",\n                \"type\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/schmittjoh/php-option/issues\",\n                \"source\": \"https://github.com/schmittjoh/php-option/tree/1.10.0\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://github.com/GrahamCampbell\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/phpoption/phpoption\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"time\": \"2026-08-24T00:54:40+00:00\"\n        },\n        {\n            \"name\": \"phpstan/phpstan\",\n            \"version\": \"2.2.13\",\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/phpstan/phpstan/zipball/9ba9ac76ee9c5cf5b56d58eb5deec6315b7a0260\",\n                \"reference\": \"9ba9ac76ee9c5cf5b56d58eb5deec6315b7a0260\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \"^7.4|^8.0\"\n            },\n            \"conflict\": {\n                \"phpstan/phpstan-shim\": \"*\"\n            },\n            \"bin\": [\n                \"phpstan\",\n                \"phpstan.phar\"\n            ],\n            \"type\": \"library\",\n            \"autoload\": {\n                \"files\": [\n                    \"bootstrap.php\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Ondřej Mirtes\"\n                },\n                {\n                    \"name\": \"Markus Staab\"\n                },\n                {\n                    \"name\": \"Vincent Langlet\"\n                }\n            ],\n            \"description\": \"PHPStan - PHP Static Analysis Tool\",\n            \"keywords\": [\n                \"dev\",\n                \"static analysis\"\n            ],\n            \"support\": {\n                \"docs\": \"https://phpstan.org/user-guide/getting-started\",\n                \"forum\": \"https://github.com/phpstan/phpstan/discussions\",\n                \"issues\": \"https://github.com/phpstan/phpstan/issues\",\n                \"security\": \"https://github.com/phpstan/phpstan/security/policy\",\n                \"source\": \"https://github.com/phpstan/phpstan-src\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://github.com/ondrejmirtes\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://github.com/phpstan\",\n                    \"type\": \"github\"\n                }\n            ],\n            \"time\": \"2026-09-03T20:38:19+00:00\"\n        },\n        {\n            \"name\": \"phpunit/php-code-coverage\",\n            \"version\": \"11.0.12\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/sebastianbergmann/php-code-coverage.git\",\n                \"reference\": \"2c1ed04922802c15e1de5d7447b4856de949cf56\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/2c1ed04922802c15e1de5d7447b4856de949cf56\",\n                \"reference\": \"2c1ed04922802c15e1de5d7447b4856de949cf56\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"ext-dom\": \"*\",\n                \"ext-libxml\": \"*\",\n                \"ext-xmlwriter\": \"*\",\n                \"nikic/php-parser\": \"^5.7.0\",\n                \"php\": \">=8.2\",\n                \"phpunit/php-file-iterator\": \"^5.1.0\",\n                \"phpunit/php-text-template\": \"^4.0.1\",\n                \"sebastian/code-unit-reverse-lookup\": \"^4.0.1\",\n                \"sebastian/complexity\": \"^4.0.1\",\n                \"sebastian/environment\": \"^7.2.1\",\n                \"sebastian/lines-of-code\": \"^3.0.1\",\n                \"sebastian/version\": \"^5.0.2\",\n                \"theseer/tokenizer\": \"^1.3.1\"\n            },\n            \"require-dev\": {\n                \"phpunit/phpunit\": \"^11.5.46\"\n            },\n            \"suggest\": {\n                \"ext-pcov\": \"PHP extension that provides line coverage\",\n                \"ext-xdebug\": \"PHP extension that provides line coverage as well as branch and path coverage\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-main\": \"11.0.x-dev\"\n                }\n            },\n            \"autoload\": {\n                \"classmap\": [\n                    \"src/\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"BSD-3-Clause\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Sebastian Bergmann\",\n                    \"email\": \"sebastian@phpunit.de\",\n                    \"role\": \"lead\"\n                }\n            ],\n            \"description\": \"Library that provides collection, processing, and rendering functionality for PHP code coverage information.\",\n            \"homepage\": \"https://github.com/sebastianbergmann/php-code-coverage\",\n            \"keywords\": [\n                \"coverage\",\n                \"testing\",\n                \"xunit\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/sebastianbergmann/php-code-coverage/issues\",\n                \"security\": \"https://github.com/sebastianbergmann/php-code-coverage/security/policy\",\n                \"source\": \"https://github.com/sebastianbergmann/php-code-coverage/tree/11.0.12\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://github.com/sebastianbergmann\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://liberapay.com/sebastianbergmann\",\n                    \"type\": \"liberapay\"\n                },\n                {\n                    \"url\": \"https://thanks.dev/u/gh/sebastianbergmann\",\n                    \"type\": \"thanks_dev\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/phpunit/php-code-coverage\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"time\": \"2025-12-24T07:01:01+00:00\"\n        },\n        {\n            \"name\": \"phpunit/php-file-iterator\",\n            \"version\": \"5.1.1\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/sebastianbergmann/php-file-iterator.git\",\n                \"reference\": \"2f3a64888c814fc235386b7387dd5b5ed92ad903\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/2f3a64888c814fc235386b7387dd5b5ed92ad903\",\n                \"reference\": \"2f3a64888c814fc235386b7387dd5b5ed92ad903\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=8.2\"\n            },\n            \"require-dev\": {\n                \"phpunit/phpunit\": \"^11.3\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-main\": \"5.1-dev\"\n                }\n            },\n            \"autoload\": {\n                \"classmap\": [\n                    \"src/\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"BSD-3-Clause\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Sebastian Bergmann\",\n                    \"email\": \"sebastian@phpunit.de\",\n                    \"role\": \"lead\"\n                }\n            ],\n            \"description\": \"FilterIterator implementation that filters files based on a list of suffixes.\",\n            \"homepage\": \"https://github.com/sebastianbergmann/php-file-iterator/\",\n            \"keywords\": [\n                \"filesystem\",\n                \"iterator\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/sebastianbergmann/php-file-iterator/issues\",\n                \"security\": \"https://github.com/sebastianbergmann/php-file-iterator/security/policy\",\n                \"source\": \"https://github.com/sebastianbergmann/php-file-iterator/tree/5.1.1\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://github.com/sebastianbergmann\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://liberapay.com/sebastianbergmann\",\n                    \"type\": \"liberapay\"\n                },\n                {\n                    \"url\": \"https://thanks.dev/u/gh/sebastianbergmann\",\n                    \"type\": \"thanks_dev\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/phpunit/php-file-iterator\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"time\": \"2026-02-02T13:52:54+00:00\"\n        },\n        {\n            \"name\": \"phpunit/php-invoker\",\n            \"version\": \"5.0.1\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/sebastianbergmann/php-invoker.git\",\n                \"reference\": \"c1ca3814734c07492b3d4c5f794f4b0995333da2\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/c1ca3814734c07492b3d4c5f794f4b0995333da2\",\n                \"reference\": \"c1ca3814734c07492b3d4c5f794f4b0995333da2\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=8.2\"\n            },\n            \"require-dev\": {\n                \"ext-pcntl\": \"*\",\n                \"phpunit/phpunit\": \"^11.0\"\n            },\n            \"suggest\": {\n                \"ext-pcntl\": \"*\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-main\": \"5.0-dev\"\n                }\n            },\n            \"autoload\": {\n                \"classmap\": [\n                    \"src/\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"BSD-3-Clause\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Sebastian Bergmann\",\n                    \"email\": \"sebastian@phpunit.de\",\n                    \"role\": \"lead\"\n                }\n            ],\n            \"description\": \"Invoke callables with a timeout\",\n            \"homepage\": \"https://github.com/sebastianbergmann/php-invoker/\",\n            \"keywords\": [\n                \"process\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/sebastianbergmann/php-invoker/issues\",\n                \"security\": \"https://github.com/sebastianbergmann/php-invoker/security/policy\",\n                \"source\": \"https://github.com/sebastianbergmann/php-invoker/tree/5.0.1\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://github.com/sebastianbergmann\",\n                    \"type\": \"github\"\n                }\n            ],\n            \"time\": \"2024-07-03T05:07:44+00:00\"\n        },\n        {\n            \"name\": \"phpunit/php-text-template\",\n            \"version\": \"4.0.1\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/sebastianbergmann/php-text-template.git\",\n                \"reference\": \"3e0404dc6b300e6bf56415467ebcb3fe4f33e964\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/3e0404dc6b300e6bf56415467ebcb3fe4f33e964\",\n                \"reference\": \"3e0404dc6b300e6bf56415467ebcb3fe4f33e964\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=8.2\"\n            },\n            \"require-dev\": {\n                \"phpunit/phpunit\": \"^11.0\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-main\": \"4.0-dev\"\n                }\n            },\n            \"autoload\": {\n                \"classmap\": [\n                    \"src/\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"BSD-3-Clause\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Sebastian Bergmann\",\n                    \"email\": \"sebastian@phpunit.de\",\n                    \"role\": \"lead\"\n                }\n            ],\n            \"description\": \"Simple template engine.\",\n            \"homepage\": \"https://github.com/sebastianbergmann/php-text-template/\",\n            \"keywords\": [\n                \"template\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/sebastianbergmann/php-text-template/issues\",\n                \"security\": \"https://github.com/sebastianbergmann/php-text-template/security/policy\",\n                \"source\": \"https://github.com/sebastianbergmann/php-text-template/tree/4.0.1\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://github.com/sebastianbergmann\",\n                    \"type\": \"github\"\n                }\n            ],\n            \"time\": \"2024-07-03T05:08:43+00:00\"\n        },\n        {\n            \"name\": \"phpunit/php-timer\",\n            \"version\": \"7.0.1\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/sebastianbergmann/php-timer.git\",\n                \"reference\": \"3b415def83fbcb41f991d9ebf16ae4ad8b7837b3\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3b415def83fbcb41f991d9ebf16ae4ad8b7837b3\",\n                \"reference\": \"3b415def83fbcb41f991d9ebf16ae4ad8b7837b3\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=8.2\"\n            },\n            \"require-dev\": {\n                \"phpunit/phpunit\": \"^11.0\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-main\": \"7.0-dev\"\n                }\n            },\n            \"autoload\": {\n                \"classmap\": [\n                    \"src/\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"BSD-3-Clause\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Sebastian Bergmann\",\n                    \"email\": \"sebastian@phpunit.de\",\n                    \"role\": \"lead\"\n                }\n            ],\n            \"description\": \"Utility class for timing\",\n            \"homepage\": \"https://github.com/sebastianbergmann/php-timer/\",\n            \"keywords\": [\n                \"timer\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/sebastianbergmann/php-timer/issues\",\n                \"security\": \"https://github.com/sebastianbergmann/php-timer/security/policy\",\n                \"source\": \"https://github.com/sebastianbergmann/php-timer/tree/7.0.1\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://github.com/sebastianbergmann\",\n                    \"type\": \"github\"\n                }\n            ],\n            \"time\": \"2024-07-03T05:09:35+00:00\"\n        },\n        {\n            \"name\": \"phpunit/phpunit\",\n            \"version\": \"11.5.56\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/sebastianbergmann/phpunit.git\",\n                \"reference\": \"5f83edffa6967c3db468d48a695ec7bcb02e9256\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/sebastianbergmann/phpunit/zipball/5f83edffa6967c3db468d48a695ec7bcb02e9256\",\n                \"reference\": \"5f83edffa6967c3db468d48a695ec7bcb02e9256\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"ext-dom\": \"*\",\n                \"ext-filter\": \"*\",\n                \"ext-json\": \"*\",\n                \"ext-libxml\": \"*\",\n                \"ext-mbstring\": \"*\",\n                \"ext-xmlwriter\": \"*\",\n                \"myclabs/deep-copy\": \"^1.13.4\",\n                \"phar-io/manifest\": \"^2.0.4\",\n                \"phar-io/version\": \"^3.2.1\",\n                \"php\": \">=8.2\",\n                \"phpunit/php-code-coverage\": \"^11.0.12\",\n                \"phpunit/php-file-iterator\": \"^5.1.1\",\n                \"phpunit/php-invoker\": \"^5.0.1\",\n                \"phpunit/php-text-template\": \"^4.0.1\",\n                \"phpunit/php-timer\": \"^7.0.1\",\n                \"sebastian/cli-parser\": \"^3.0.2\",\n                \"sebastian/code-unit\": \"^3.0.3\",\n                \"sebastian/comparator\": \"^6.3.3\",\n                \"sebastian/diff\": \"^6.0.2\",\n                \"sebastian/environment\": \"^7.2.1\",\n                \"sebastian/exporter\": \"^6.3.2\",\n                \"sebastian/global-state\": \"^7.0.2\",\n                \"sebastian/object-enumerator\": \"^6.0.1\",\n                \"sebastian/recursion-context\": \"^6.0.3\",\n                \"sebastian/type\": \"^5.1.3\",\n                \"sebastian/version\": \"^5.0.2\",\n                \"staabm/side-effects-detector\": \"^1.0.5\"\n            },\n            \"suggest\": {\n                \"ext-soap\": \"To be able to generate mocks based on WSDL files\"\n            },\n            \"bin\": [\n                \"phpunit\"\n            ],\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-main\": \"11.5-dev\"\n                }\n            },\n            \"autoload\": {\n                \"files\": [\n                    \"src/Framework/Assert/Functions.php\"\n                ],\n                \"classmap\": [\n                    \"src/\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"BSD-3-Clause\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Sebastian Bergmann\",\n                    \"email\": \"sebastian@phpunit.de\",\n                    \"role\": \"lead\"\n                }\n            ],\n            \"description\": \"The PHP Unit Testing framework.\",\n            \"homepage\": \"https://phpunit.de/\",\n            \"keywords\": [\n                \"phpunit\",\n                \"testing\",\n                \"xunit\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/sebastianbergmann/phpunit/issues\",\n                \"security\": \"https://github.com/sebastianbergmann/phpunit/security/policy\",\n                \"source\": \"https://github.com/sebastianbergmann/phpunit/tree/11.5.56\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://phpunit.de/sponsoring.html\",\n                    \"type\": \"other\"\n                }\n            ],\n            \"time\": \"2026-07-06T14:52:39+00:00\"\n        },\n        {\n            \"name\": \"psr/clock\",\n            \"version\": \"1.0.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/php-fig/clock.git\",\n                \"reference\": \"e41a24703d4560fd0acb709162f73b8adfc3aa0d\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d\",\n                \"reference\": \"e41a24703d4560fd0acb709162f73b8adfc3aa0d\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \"^7.0 || ^8.0\"\n            },\n            \"type\": \"library\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Psr\\\\Clock\\\\\": \"src/\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"PHP-FIG\",\n                    \"homepage\": \"https://www.php-fig.org/\"\n                }\n            ],\n            \"description\": \"Common interface for reading the clock.\",\n            \"homepage\": \"https://github.com/php-fig/clock\",\n            \"keywords\": [\n                \"clock\",\n                \"now\",\n                \"psr\",\n                \"psr-20\",\n                \"time\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/php-fig/clock/issues\",\n                \"source\": \"https://github.com/php-fig/clock/tree/1.0.0\"\n            },\n            \"time\": \"2022-11-25T14:36:26+00:00\"\n        },\n        {\n            \"name\": \"psr/event-dispatcher\",\n            \"version\": \"1.0.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/php-fig/event-dispatcher.git\",\n                \"reference\": \"dbefd12671e8a14ec7f180cab83036ed26714bb0\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0\",\n                \"reference\": \"dbefd12671e8a14ec7f180cab83036ed26714bb0\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=7.2.0\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-master\": \"1.0.x-dev\"\n                }\n            },\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Psr\\\\EventDispatcher\\\\\": \"src/\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"PHP-FIG\",\n                    \"homepage\": \"http://www.php-fig.org/\"\n                }\n            ],\n            \"description\": \"Standard interfaces for event handling.\",\n            \"keywords\": [\n                \"events\",\n                \"psr\",\n                \"psr-14\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/php-fig/event-dispatcher/issues\",\n                \"source\": \"https://github.com/php-fig/event-dispatcher/tree/1.0.0\"\n            },\n            \"time\": \"2019-01-08T18:20:26+00:00\"\n        },\n        {\n            \"name\": \"psr/http-client\",\n            \"version\": \"1.0.3\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/php-fig/http-client.git\",\n                \"reference\": \"bb5906edc1c324c9a05aa0873d40117941e5fa90\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90\",\n                \"reference\": \"bb5906edc1c324c9a05aa0873d40117941e5fa90\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \"^7.0 || ^8.0\",\n                \"psr/http-message\": \"^1.0 || ^2.0\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-master\": \"1.0.x-dev\"\n                }\n            },\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Psr\\\\Http\\\\Client\\\\\": \"src/\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"PHP-FIG\",\n                    \"homepage\": \"https://www.php-fig.org/\"\n                }\n            ],\n            \"description\": \"Common interface for HTTP clients\",\n            \"homepage\": \"https://github.com/php-fig/http-client\",\n            \"keywords\": [\n                \"http\",\n                \"http-client\",\n                \"psr\",\n                \"psr-18\"\n            ],\n            \"support\": {\n                \"source\": \"https://github.com/php-fig/http-client\"\n            },\n            \"time\": \"2023-09-23T14:17:50+00:00\"\n        },\n        {\n            \"name\": \"psr/http-factory\",\n            \"version\": \"1.1.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/php-fig/http-factory.git\",\n                \"reference\": \"2b4765fddfe3b508ac62f829e852b1501d3f6e8a\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a\",\n                \"reference\": \"2b4765fddfe3b508ac62f829e852b1501d3f6e8a\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=7.1\",\n                \"psr/http-message\": \"^1.0 || ^2.0\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-master\": \"1.0.x-dev\"\n                }\n            },\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Psr\\\\Http\\\\Message\\\\\": \"src/\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"PHP-FIG\",\n                    \"homepage\": \"https://www.php-fig.org/\"\n                }\n            ],\n            \"description\": \"PSR-17: Common interfaces for PSR-7 HTTP message factories\",\n            \"keywords\": [\n                \"factory\",\n                \"http\",\n                \"message\",\n                \"psr\",\n                \"psr-17\",\n                \"psr-7\",\n                \"request\",\n                \"response\"\n            ],\n            \"support\": {\n                \"source\": \"https://github.com/php-fig/http-factory\"\n            },\n            \"time\": \"2024-04-15T12:06:14+00:00\"\n        },\n        {\n            \"name\": \"psr/http-message\",\n            \"version\": \"2.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/php-fig/http-message.git\",\n                \"reference\": \"402d35bcb92c70c026d1a6a9883f06b2ead23d71\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71\",\n                \"reference\": \"402d35bcb92c70c026d1a6a9883f06b2ead23d71\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \"^7.2 || ^8.0\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-master\": \"2.0.x-dev\"\n                }\n            },\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Psr\\\\Http\\\\Message\\\\\": \"src/\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"PHP-FIG\",\n                    \"homepage\": \"https://www.php-fig.org/\"\n                }\n            ],\n            \"description\": \"Common interface for HTTP messages\",\n            \"homepage\": \"https://github.com/php-fig/http-message\",\n            \"keywords\": [\n                \"http\",\n                \"http-message\",\n                \"psr\",\n                \"psr-7\",\n                \"request\",\n                \"response\"\n            ],\n            \"support\": {\n                \"source\": \"https://github.com/php-fig/http-message/tree/2.0\"\n            },\n            \"time\": \"2023-04-04T09:54:51+00:00\"\n        },\n        {\n            \"name\": \"psr/log\",\n            \"version\": \"3.0.2\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/php-fig/log.git\",\n                \"reference\": \"f16e1d5863e37f8d8c2a01719f5b34baa2b714d3\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3\",\n                \"reference\": \"f16e1d5863e37f8d8c2a01719f5b34baa2b714d3\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=8.0.0\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-master\": \"3.x-dev\"\n                }\n            },\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Psr\\\\Log\\\\\": \"src\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"PHP-FIG\",\n                    \"homepage\": \"https://www.php-fig.org/\"\n                }\n            ],\n            \"description\": \"Common interface for logging libraries\",\n            \"homepage\": \"https://github.com/php-fig/log\",\n            \"keywords\": [\n                \"log\",\n                \"psr\",\n                \"psr-3\"\n            ],\n            \"support\": {\n                \"source\": \"https://github.com/php-fig/log/tree/3.0.2\"\n            },\n            \"time\": \"2024-09-11T13:17:53+00:00\"\n        },\n        {\n            \"name\": \"psr/simple-cache\",\n            \"version\": \"3.0.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/php-fig/simple-cache.git\",\n                \"reference\": \"764e0b3939f5ca87cb904f570ef9be2d78a07865\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865\",\n                \"reference\": \"764e0b3939f5ca87cb904f570ef9be2d78a07865\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=8.0.0\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-master\": \"3.0.x-dev\"\n                }\n            },\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Psr\\\\SimpleCache\\\\\": \"src/\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"PHP-FIG\",\n                    \"homepage\": \"https://www.php-fig.org/\"\n                }\n            ],\n            \"description\": \"Common interfaces for simple caching\",\n            \"keywords\": [\n                \"cache\",\n                \"caching\",\n                \"psr\",\n                \"psr-16\",\n                \"simple-cache\"\n            ],\n            \"support\": {\n                \"source\": \"https://github.com/php-fig/simple-cache/tree/3.0.0\"\n            },\n            \"time\": \"2021-10-29T13:26:27+00:00\"\n        },\n        {\n            \"name\": \"ralouphie/getallheaders\",\n            \"version\": \"3.0.3\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/ralouphie/getallheaders.git\",\n                \"reference\": \"120b605dfeb996808c31b6477290a714d356e822\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822\",\n                \"reference\": \"120b605dfeb996808c31b6477290a714d356e822\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=5.6\"\n            },\n            \"require-dev\": {\n                \"php-coveralls/php-coveralls\": \"^2.1\",\n                \"phpunit/phpunit\": \"^5 || ^6.5\"\n            },\n            \"type\": \"library\",\n            \"autoload\": {\n                \"files\": [\n                    \"src/getallheaders.php\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Ralph Khattar\",\n                    \"email\": \"ralph.khattar@gmail.com\"\n                }\n            ],\n            \"description\": \"A polyfill for getallheaders.\",\n            \"support\": {\n                \"issues\": \"https://github.com/ralouphie/getallheaders/issues\",\n                \"source\": \"https://github.com/ralouphie/getallheaders/tree/develop\"\n            },\n            \"time\": \"2019-03-08T08:55:37+00:00\"\n        },\n        {\n            \"name\": \"ramsey/collection\",\n            \"version\": \"2.1.1\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/ramsey/collection.git\",\n                \"reference\": \"344572933ad0181accbf4ba763e85a0306a8c5e2\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/ramsey/collection/zipball/344572933ad0181accbf4ba763e85a0306a8c5e2\",\n                \"reference\": \"344572933ad0181accbf4ba763e85a0306a8c5e2\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \"^8.1\"\n            },\n            \"require-dev\": {\n                \"captainhook/plugin-composer\": \"^5.3\",\n                \"ergebnis/composer-normalize\": \"^2.45\",\n                \"fakerphp/faker\": \"^1.24\",\n                \"hamcrest/hamcrest-php\": \"^2.0\",\n                \"jangregor/phpstan-prophecy\": \"^2.1\",\n                \"mockery/mockery\": \"^1.6\",\n                \"php-parallel-lint/php-console-highlighter\": \"^1.0\",\n                \"php-parallel-lint/php-parallel-lint\": \"^1.4\",\n                \"phpspec/prophecy-phpunit\": \"^2.3\",\n                \"phpstan/extension-installer\": \"^1.4\",\n                \"phpstan/phpstan\": \"^2.1\",\n                \"phpstan/phpstan-mockery\": \"^2.0\",\n                \"phpstan/phpstan-phpunit\": \"^2.0\",\n                \"phpunit/phpunit\": \"^10.5\",\n                \"ramsey/coding-standard\": \"^2.3\",\n                \"ramsey/conventional-commits\": \"^1.6\",\n                \"roave/security-advisories\": \"dev-latest\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"captainhook\": {\n                    \"force-install\": true\n                },\n                \"ramsey/conventional-commits\": {\n                    \"configFile\": \"conventional-commits.json\"\n                }\n            },\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Ramsey\\\\Collection\\\\\": \"src/\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Ben Ramsey\",\n                    \"email\": \"ben@benramsey.com\",\n                    \"homepage\": \"https://benramsey.com\"\n                }\n            ],\n            \"description\": \"A PHP library for representing and manipulating collections.\",\n            \"keywords\": [\n                \"array\",\n                \"collection\",\n                \"hash\",\n                \"map\",\n                \"queue\",\n                \"set\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/ramsey/collection/issues\",\n                \"source\": \"https://github.com/ramsey/collection/tree/2.1.1\"\n            },\n            \"time\": \"2025-03-22T05:38:12+00:00\"\n        },\n        {\n            \"name\": \"ramsey/uuid\",\n            \"version\": \"4.9.3\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/ramsey/uuid.git\",\n                \"reference\": \"1df15849d00943a67d677dc9cfd80795f038c9f8\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/ramsey/uuid/zipball/1df15849d00943a67d677dc9cfd80795f038c9f8\",\n                \"reference\": \"1df15849d00943a67d677dc9cfd80795f038c9f8\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"brick/math\": \">=0.8.16 <=0.18\",\n                \"php\": \"^8.0\",\n                \"ramsey/collection\": \"^1.2 || ^2.0\"\n            },\n            \"replace\": {\n                \"rhumsaa/uuid\": \"self.version\"\n            },\n            \"require-dev\": {\n                \"captainhook/captainhook\": \"^5.25\",\n                \"captainhook/plugin-composer\": \"^5.3\",\n                \"dealerdirect/phpcodesniffer-composer-installer\": \"^1.0\",\n                \"ergebnis/composer-normalize\": \"^2.47\",\n                \"mockery/mockery\": \"^1.6\",\n                \"paragonie/random-lib\": \"^2\",\n                \"php-mock/php-mock\": \"^2.6\",\n                \"php-mock/php-mock-mockery\": \"^1.5\",\n                \"php-parallel-lint/php-parallel-lint\": \"^1.4.0\",\n                \"phpbench/phpbench\": \"^1.2.14\",\n                \"phpstan/extension-installer\": \"^1.4\",\n                \"phpstan/phpstan\": \"^2.1\",\n                \"phpstan/phpstan-mockery\": \"^2.0\",\n                \"phpstan/phpstan-phpunit\": \"^2.0\",\n                \"phpunit/phpunit\": \"^9.6\",\n                \"slevomat/coding-standard\": \"^8.18\",\n                \"squizlabs/php_codesniffer\": \"^3.13\"\n            },\n            \"suggest\": {\n                \"ext-bcmath\": \"Enables faster math with arbitrary-precision integers using BCMath.\",\n                \"ext-gmp\": \"Enables faster math with arbitrary-precision integers using GMP.\",\n                \"ext-uuid\": \"Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.\",\n                \"paragonie/random-lib\": \"Provides RandomLib for use with the RandomLibAdapter\",\n                \"ramsey/uuid-doctrine\": \"Allows the use of Ramsey\\\\Uuid\\\\Uuid as Doctrine field type.\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"captainhook\": {\n                    \"force-install\": true\n                }\n            },\n            \"autoload\": {\n                \"files\": [\n                    \"src/functions.php\"\n                ],\n                \"psr-4\": {\n                    \"Ramsey\\\\Uuid\\\\\": \"src/\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"description\": \"A PHP library for generating and working with universally unique identifiers (UUIDs).\",\n            \"keywords\": [\n                \"guid\",\n                \"identifier\",\n                \"uuid\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/ramsey/uuid/issues\",\n                \"source\": \"https://github.com/ramsey/uuid/tree/4.9.3\"\n            },\n            \"time\": \"2026-06-18T03:57:49+00:00\"\n        },\n        {\n            \"name\": \"react/cache\",\n            \"version\": \"v1.2.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/reactphp/cache.git\",\n                \"reference\": \"d47c472b64aa5608225f47965a484b75c7817d5b\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/reactphp/cache/zipball/d47c472b64aa5608225f47965a484b75c7817d5b\",\n                \"reference\": \"d47c472b64aa5608225f47965a484b75c7817d5b\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=5.3.0\",\n                \"react/promise\": \"^3.0 || ^2.0 || ^1.1\"\n            },\n            \"require-dev\": {\n                \"phpunit/phpunit\": \"^9.5 || ^5.7 || ^4.8.35\"\n            },\n            \"type\": \"library\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"React\\\\Cache\\\\\": \"src/\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Christian Lück\",\n                    \"email\": \"christian@clue.engineering\",\n                    \"homepage\": \"https://clue.engineering/\"\n                },\n                {\n                    \"name\": \"Cees-Jan Kiewiet\",\n                    \"email\": \"reactphp@ceesjankiewiet.nl\",\n                    \"homepage\": \"https://wyrihaximus.net/\"\n                },\n                {\n                    \"name\": \"Jan Sorgalla\",\n                    \"email\": \"jsorgalla@gmail.com\",\n                    \"homepage\": \"https://sorgalla.com/\"\n                },\n                {\n                    \"name\": \"Chris Boden\",\n                    \"email\": \"cboden@gmail.com\",\n                    \"homepage\": \"https://cboden.dev/\"\n                }\n            ],\n            \"description\": \"Async, Promise-based cache interface for ReactPHP\",\n            \"keywords\": [\n                \"cache\",\n                \"caching\",\n                \"promise\",\n                \"reactphp\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/reactphp/cache/issues\",\n                \"source\": \"https://github.com/reactphp/cache/tree/v1.2.0\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://opencollective.com/reactphp\",\n                    \"type\": \"open_collective\"\n                }\n            ],\n            \"time\": \"2022-11-30T15:59:55+00:00\"\n        },\n        {\n            \"name\": \"react/child-process\",\n            \"version\": \"v0.6.7\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/reactphp/child-process.git\",\n                \"reference\": \"970f0e71945556422ee4570ccbabaedc3cf04ad3\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/reactphp/child-process/zipball/970f0e71945556422ee4570ccbabaedc3cf04ad3\",\n                \"reference\": \"970f0e71945556422ee4570ccbabaedc3cf04ad3\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"evenement/evenement\": \"^3.0 || ^2.0 || ^1.0\",\n                \"php\": \">=5.3.0\",\n                \"react/event-loop\": \"^1.2\",\n                \"react/stream\": \"^1.4\"\n            },\n            \"require-dev\": {\n                \"phpunit/phpunit\": \"^9.6 || ^5.7 || ^4.8.36\",\n                \"react/socket\": \"^1.16\",\n                \"sebastian/environment\": \"^5.0 || ^3.0 || ^2.0 || ^1.0\"\n            },\n            \"type\": \"library\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"React\\\\ChildProcess\\\\\": \"src/\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Christian Lück\",\n                    \"email\": \"christian@clue.engineering\",\n                    \"homepage\": \"https://clue.engineering/\"\n                },\n                {\n                    \"name\": \"Cees-Jan Kiewiet\",\n                    \"email\": \"reactphp@ceesjankiewiet.nl\",\n                    \"homepage\": \"https://wyrihaximus.net/\"\n                },\n                {\n                    \"name\": \"Jan Sorgalla\",\n                    \"email\": \"jsorgalla@gmail.com\",\n                    \"homepage\": \"https://sorgalla.com/\"\n                },\n                {\n                    \"name\": \"Chris Boden\",\n                    \"email\": \"cboden@gmail.com\",\n                    \"homepage\": \"https://cboden.dev/\"\n                }\n            ],\n            \"description\": \"Event-driven library for executing child processes with ReactPHP.\",\n            \"keywords\": [\n                \"event-driven\",\n                \"process\",\n                \"reactphp\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/reactphp/child-process/issues\",\n                \"source\": \"https://github.com/reactphp/child-process/tree/v0.6.7\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://opencollective.com/reactphp\",\n                    \"type\": \"open_collective\"\n                }\n            ],\n            \"time\": \"2025-12-23T15:25:20+00:00\"\n        },\n        {\n            \"name\": \"react/dns\",\n            \"version\": \"v1.14.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/reactphp/dns.git\",\n                \"reference\": \"7562c05391f42701c1fccf189c8225fece1cd7c3\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/reactphp/dns/zipball/7562c05391f42701c1fccf189c8225fece1cd7c3\",\n                \"reference\": \"7562c05391f42701c1fccf189c8225fece1cd7c3\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=5.3.0\",\n                \"react/cache\": \"^1.0 || ^0.6 || ^0.5\",\n                \"react/event-loop\": \"^1.2\",\n                \"react/promise\": \"^3.2 || ^2.7 || ^1.2.1\"\n            },\n            \"require-dev\": {\n                \"phpunit/phpunit\": \"^9.6 || ^5.7 || ^4.8.36\",\n                \"react/async\": \"^4.3 || ^3 || ^2\",\n                \"react/promise-timer\": \"^1.11\"\n            },\n            \"type\": \"library\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"React\\\\Dns\\\\\": \"src/\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Christian Lück\",\n                    \"email\": \"christian@clue.engineering\",\n                    \"homepage\": \"https://clue.engineering/\"\n                },\n                {\n                    \"name\": \"Cees-Jan Kiewiet\",\n                    \"email\": \"reactphp@ceesjankiewiet.nl\",\n                    \"homepage\": \"https://wyrihaximus.net/\"\n                },\n                {\n                    \"name\": \"Jan Sorgalla\",\n                    \"email\": \"jsorgalla@gmail.com\",\n                    \"homepage\": \"https://sorgalla.com/\"\n                },\n                {\n                    \"name\": \"Chris Boden\",\n                    \"email\": \"cboden@gmail.com\",\n                    \"homepage\": \"https://cboden.dev/\"\n                }\n            ],\n            \"description\": \"Async DNS resolver for ReactPHP\",\n            \"keywords\": [\n                \"async\",\n                \"dns\",\n                \"dns-resolver\",\n                \"reactphp\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/reactphp/dns/issues\",\n                \"source\": \"https://github.com/reactphp/dns/tree/v1.14.0\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://opencollective.com/reactphp\",\n                    \"type\": \"open_collective\"\n                }\n            ],\n            \"time\": \"2025-11-18T19:34:28+00:00\"\n        },\n        {\n            \"name\": \"react/event-loop\",\n            \"version\": \"v1.6.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/reactphp/event-loop.git\",\n                \"reference\": \"ba276bda6083df7e0050fd9b33f66ad7a4ac747a\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/reactphp/event-loop/zipball/ba276bda6083df7e0050fd9b33f66ad7a4ac747a\",\n                \"reference\": \"ba276bda6083df7e0050fd9b33f66ad7a4ac747a\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=5.3.0\"\n            },\n            \"require-dev\": {\n                \"phpunit/phpunit\": \"^9.6 || ^5.7 || ^4.8.36\"\n            },\n            \"suggest\": {\n                \"ext-pcntl\": \"For signal handling support when using the StreamSelectLoop\"\n            },\n            \"type\": \"library\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"React\\\\EventLoop\\\\\": \"src/\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Christian Lück\",\n                    \"email\": \"christian@clue.engineering\",\n                    \"homepage\": \"https://clue.engineering/\"\n                },\n                {\n                    \"name\": \"Cees-Jan Kiewiet\",\n                    \"email\": \"reactphp@ceesjankiewiet.nl\",\n                    \"homepage\": \"https://wyrihaximus.net/\"\n                },\n                {\n                    \"name\": \"Jan Sorgalla\",\n                    \"email\": \"jsorgalla@gmail.com\",\n                    \"homepage\": \"https://sorgalla.com/\"\n                },\n                {\n                    \"name\": \"Chris Boden\",\n                    \"email\": \"cboden@gmail.com\",\n                    \"homepage\": \"https://cboden.dev/\"\n                }\n            ],\n            \"description\": \"ReactPHP's core reactor event loop that libraries can use for evented I/O.\",\n            \"keywords\": [\n                \"asynchronous\",\n                \"event-loop\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/reactphp/event-loop/issues\",\n                \"source\": \"https://github.com/reactphp/event-loop/tree/v1.6.0\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://opencollective.com/reactphp\",\n                    \"type\": \"open_collective\"\n                }\n            ],\n            \"time\": \"2025-11-17T20:46:25+00:00\"\n        },\n        {\n            \"name\": \"react/promise\",\n            \"version\": \"v3.3.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/reactphp/promise.git\",\n                \"reference\": \"23444f53a813a3296c1368bb104793ce8d88f04a\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/reactphp/promise/zipball/23444f53a813a3296c1368bb104793ce8d88f04a\",\n                \"reference\": \"23444f53a813a3296c1368bb104793ce8d88f04a\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=7.1.0\"\n            },\n            \"require-dev\": {\n                \"phpstan/phpstan\": \"1.12.28 || 1.4.10\",\n                \"phpunit/phpunit\": \"^9.6 || ^7.5\"\n            },\n            \"type\": \"library\",\n            \"autoload\": {\n                \"files\": [\n                    \"src/functions_include.php\"\n                ],\n                \"psr-4\": {\n                    \"React\\\\Promise\\\\\": \"src/\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Jan Sorgalla\",\n                    \"email\": \"jsorgalla@gmail.com\",\n                    \"homepage\": \"https://sorgalla.com/\"\n                },\n                {\n                    \"name\": \"Christian Lück\",\n                    \"email\": \"christian@clue.engineering\",\n                    \"homepage\": \"https://clue.engineering/\"\n                },\n                {\n                    \"name\": \"Cees-Jan Kiewiet\",\n                    \"email\": \"reactphp@ceesjankiewiet.nl\",\n                    \"homepage\": \"https://wyrihaximus.net/\"\n                },\n                {\n                    \"name\": \"Chris Boden\",\n                    \"email\": \"cboden@gmail.com\",\n                    \"homepage\": \"https://cboden.dev/\"\n                }\n            ],\n            \"description\": \"A lightweight implementation of CommonJS Promises/A for PHP\",\n            \"keywords\": [\n                \"promise\",\n                \"promises\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/reactphp/promise/issues\",\n                \"source\": \"https://github.com/reactphp/promise/tree/v3.3.0\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://opencollective.com/reactphp\",\n                    \"type\": \"open_collective\"\n                }\n            ],\n            \"time\": \"2025-08-19T18:57:03+00:00\"\n        },\n        {\n            \"name\": \"react/socket\",\n            \"version\": \"v1.17.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/reactphp/socket.git\",\n                \"reference\": \"ef5b17b81f6f60504c539313f94f2d826c5faa08\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/reactphp/socket/zipball/ef5b17b81f6f60504c539313f94f2d826c5faa08\",\n                \"reference\": \"ef5b17b81f6f60504c539313f94f2d826c5faa08\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"evenement/evenement\": \"^3.0 || ^2.0 || ^1.0\",\n                \"php\": \">=5.3.0\",\n                \"react/dns\": \"^1.13\",\n                \"react/event-loop\": \"^1.2\",\n                \"react/promise\": \"^3.2 || ^2.6 || ^1.2.1\",\n                \"react/stream\": \"^1.4\"\n            },\n            \"require-dev\": {\n                \"phpunit/phpunit\": \"^9.6 || ^5.7 || ^4.8.36\",\n                \"react/async\": \"^4.3 || ^3.3 || ^2\",\n                \"react/promise-stream\": \"^1.4\",\n                \"react/promise-timer\": \"^1.11\"\n            },\n            \"type\": \"library\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"React\\\\Socket\\\\\": \"src/\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Christian Lück\",\n                    \"email\": \"christian@clue.engineering\",\n                    \"homepage\": \"https://clue.engineering/\"\n                },\n                {\n                    \"name\": \"Cees-Jan Kiewiet\",\n                    \"email\": \"reactphp@ceesjankiewiet.nl\",\n                    \"homepage\": \"https://wyrihaximus.net/\"\n                },\n                {\n                    \"name\": \"Jan Sorgalla\",\n                    \"email\": \"jsorgalla@gmail.com\",\n                    \"homepage\": \"https://sorgalla.com/\"\n                },\n                {\n                    \"name\": \"Chris Boden\",\n                    \"email\": \"cboden@gmail.com\",\n                    \"homepage\": \"https://cboden.dev/\"\n                }\n            ],\n            \"description\": \"Async, streaming plaintext TCP/IP and secure TLS socket server and client connections for ReactPHP\",\n            \"keywords\": [\n                \"Connection\",\n                \"Socket\",\n                \"async\",\n                \"reactphp\",\n                \"stream\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/reactphp/socket/issues\",\n                \"source\": \"https://github.com/reactphp/socket/tree/v1.17.0\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://opencollective.com/reactphp\",\n                    \"type\": \"open_collective\"\n                }\n            ],\n            \"time\": \"2025-11-19T20:47:34+00:00\"\n        },\n        {\n            \"name\": \"react/stream\",\n            \"version\": \"v1.4.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/reactphp/stream.git\",\n                \"reference\": \"1e5b0acb8fe55143b5b426817155190eb6f5b18d\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/reactphp/stream/zipball/1e5b0acb8fe55143b5b426817155190eb6f5b18d\",\n                \"reference\": \"1e5b0acb8fe55143b5b426817155190eb6f5b18d\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"evenement/evenement\": \"^3.0 || ^2.0 || ^1.0\",\n                \"php\": \">=5.3.8\",\n                \"react/event-loop\": \"^1.2\"\n            },\n            \"require-dev\": {\n                \"clue/stream-filter\": \"~1.2\",\n                \"phpunit/phpunit\": \"^9.6 || ^5.7 || ^4.8.36\"\n            },\n            \"type\": \"library\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"React\\\\Stream\\\\\": \"src/\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Christian Lück\",\n                    \"email\": \"christian@clue.engineering\",\n                    \"homepage\": \"https://clue.engineering/\"\n                },\n                {\n                    \"name\": \"Cees-Jan Kiewiet\",\n                    \"email\": \"reactphp@ceesjankiewiet.nl\",\n                    \"homepage\": \"https://wyrihaximus.net/\"\n                },\n                {\n                    \"name\": \"Jan Sorgalla\",\n                    \"email\": \"jsorgalla@gmail.com\",\n                    \"homepage\": \"https://sorgalla.com/\"\n                },\n                {\n                    \"name\": \"Chris Boden\",\n                    \"email\": \"cboden@gmail.com\",\n                    \"homepage\": \"https://cboden.dev/\"\n                }\n            ],\n            \"description\": \"Event-driven readable and writable streams for non-blocking I/O in ReactPHP\",\n            \"keywords\": [\n                \"event-driven\",\n                \"io\",\n                \"non-blocking\",\n                \"pipe\",\n                \"reactphp\",\n                \"readable\",\n                \"stream\",\n                \"writable\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/reactphp/stream/issues\",\n                \"source\": \"https://github.com/reactphp/stream/tree/v1.4.0\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://opencollective.com/reactphp\",\n                    \"type\": \"open_collective\"\n                }\n            ],\n            \"time\": \"2024-06-11T12:45:25+00:00\"\n        },\n        {\n            \"name\": \"sebastian/cli-parser\",\n            \"version\": \"3.0.2\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/sebastianbergmann/cli-parser.git\",\n                \"reference\": \"15c5dd40dc4f38794d383bb95465193f5e0ae180\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/15c5dd40dc4f38794d383bb95465193f5e0ae180\",\n                \"reference\": \"15c5dd40dc4f38794d383bb95465193f5e0ae180\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=8.2\"\n            },\n            \"require-dev\": {\n                \"phpunit/phpunit\": \"^11.0\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-main\": \"3.0-dev\"\n                }\n            },\n            \"autoload\": {\n                \"classmap\": [\n                    \"src/\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"BSD-3-Clause\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Sebastian Bergmann\",\n                    \"email\": \"sebastian@phpunit.de\",\n                    \"role\": \"lead\"\n                }\n            ],\n            \"description\": \"Library for parsing CLI options\",\n            \"homepage\": \"https://github.com/sebastianbergmann/cli-parser\",\n            \"support\": {\n                \"issues\": \"https://github.com/sebastianbergmann/cli-parser/issues\",\n                \"security\": \"https://github.com/sebastianbergmann/cli-parser/security/policy\",\n                \"source\": \"https://github.com/sebastianbergmann/cli-parser/tree/3.0.2\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://github.com/sebastianbergmann\",\n                    \"type\": \"github\"\n                }\n            ],\n            \"time\": \"2024-07-03T04:41:36+00:00\"\n        },\n        {\n            \"name\": \"sebastian/code-unit\",\n            \"version\": \"3.0.3\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/sebastianbergmann/code-unit.git\",\n                \"reference\": \"54391c61e4af8078e5b276ab082b6d3c54c9ad64\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/sebastianbergmann/code-unit/zipball/54391c61e4af8078e5b276ab082b6d3c54c9ad64\",\n                \"reference\": \"54391c61e4af8078e5b276ab082b6d3c54c9ad64\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=8.2\"\n            },\n            \"require-dev\": {\n                \"phpunit/phpunit\": \"^11.5\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-main\": \"3.0-dev\"\n                }\n            },\n            \"autoload\": {\n                \"classmap\": [\n                    \"src/\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"BSD-3-Clause\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Sebastian Bergmann\",\n                    \"email\": \"sebastian@phpunit.de\",\n                    \"role\": \"lead\"\n                }\n            ],\n            \"description\": \"Collection of value objects that represent the PHP code units\",\n            \"homepage\": \"https://github.com/sebastianbergmann/code-unit\",\n            \"support\": {\n                \"issues\": \"https://github.com/sebastianbergmann/code-unit/issues\",\n                \"security\": \"https://github.com/sebastianbergmann/code-unit/security/policy\",\n                \"source\": \"https://github.com/sebastianbergmann/code-unit/tree/3.0.3\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://github.com/sebastianbergmann\",\n                    \"type\": \"github\"\n                }\n            ],\n            \"time\": \"2025-03-19T07:56:08+00:00\"\n        },\n        {\n            \"name\": \"sebastian/code-unit-reverse-lookup\",\n            \"version\": \"4.0.1\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/sebastianbergmann/code-unit-reverse-lookup.git\",\n                \"reference\": \"183a9b2632194febd219bb9246eee421dad8d45e\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/183a9b2632194febd219bb9246eee421dad8d45e\",\n                \"reference\": \"183a9b2632194febd219bb9246eee421dad8d45e\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=8.2\"\n            },\n            \"require-dev\": {\n                \"phpunit/phpunit\": \"^11.0\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-main\": \"4.0-dev\"\n                }\n            },\n            \"autoload\": {\n                \"classmap\": [\n                    \"src/\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"BSD-3-Clause\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Sebastian Bergmann\",\n                    \"email\": \"sebastian@phpunit.de\"\n                }\n            ],\n            \"description\": \"Looks up which function or method a line of code belongs to\",\n            \"homepage\": \"https://github.com/sebastianbergmann/code-unit-reverse-lookup/\",\n            \"support\": {\n                \"issues\": \"https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues\",\n                \"security\": \"https://github.com/sebastianbergmann/code-unit-reverse-lookup/security/policy\",\n                \"source\": \"https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/4.0.1\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://github.com/sebastianbergmann\",\n                    \"type\": \"github\"\n                }\n            ],\n            \"time\": \"2024-07-03T04:45:54+00:00\"\n        },\n        {\n            \"name\": \"sebastian/comparator\",\n            \"version\": \"6.3.3\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/sebastianbergmann/comparator.git\",\n                \"reference\": \"2c95e1e86cb8dd41beb8d502057d1081ccc8eca9\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/sebastianbergmann/comparator/zipball/2c95e1e86cb8dd41beb8d502057d1081ccc8eca9\",\n                \"reference\": \"2c95e1e86cb8dd41beb8d502057d1081ccc8eca9\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"ext-dom\": \"*\",\n                \"ext-mbstring\": \"*\",\n                \"php\": \">=8.2\",\n                \"sebastian/diff\": \"^6.0\",\n                \"sebastian/exporter\": \"^6.0\"\n            },\n            \"require-dev\": {\n                \"phpunit/phpunit\": \"^11.4\"\n            },\n            \"suggest\": {\n                \"ext-bcmath\": \"For comparing BcMath\\\\Number objects\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-main\": \"6.3-dev\"\n                }\n            },\n            \"autoload\": {\n                \"classmap\": [\n                    \"src/\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"BSD-3-Clause\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Sebastian Bergmann\",\n                    \"email\": \"sebastian@phpunit.de\"\n                },\n                {\n                    \"name\": \"Jeff Welch\",\n                    \"email\": \"whatthejeff@gmail.com\"\n                },\n                {\n                    \"name\": \"Volker Dusch\",\n                    \"email\": \"github@wallbash.com\"\n                },\n                {\n                    \"name\": \"Bernhard Schussek\",\n                    \"email\": \"bschussek@2bepublished.at\"\n                }\n            ],\n            \"description\": \"Provides the functionality to compare PHP values for equality\",\n            \"homepage\": \"https://github.com/sebastianbergmann/comparator\",\n            \"keywords\": [\n                \"comparator\",\n                \"compare\",\n                \"equality\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/sebastianbergmann/comparator/issues\",\n                \"security\": \"https://github.com/sebastianbergmann/comparator/security/policy\",\n                \"source\": \"https://github.com/sebastianbergmann/comparator/tree/6.3.3\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://github.com/sebastianbergmann\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://liberapay.com/sebastianbergmann\",\n                    \"type\": \"liberapay\"\n                },\n                {\n                    \"url\": \"https://thanks.dev/u/gh/sebastianbergmann\",\n                    \"type\": \"thanks_dev\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/sebastian/comparator\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"time\": \"2026-01-24T09:26:40+00:00\"\n        },\n        {\n            \"name\": \"sebastian/complexity\",\n            \"version\": \"4.0.1\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/sebastianbergmann/complexity.git\",\n                \"reference\": \"ee41d384ab1906c68852636b6de493846e13e5a0\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/sebastianbergmann/complexity/zipball/ee41d384ab1906c68852636b6de493846e13e5a0\",\n                \"reference\": \"ee41d384ab1906c68852636b6de493846e13e5a0\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"nikic/php-parser\": \"^5.0\",\n                \"php\": \">=8.2\"\n            },\n            \"require-dev\": {\n                \"phpunit/phpunit\": \"^11.0\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-main\": \"4.0-dev\"\n                }\n            },\n            \"autoload\": {\n                \"classmap\": [\n                    \"src/\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"BSD-3-Clause\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Sebastian Bergmann\",\n                    \"email\": \"sebastian@phpunit.de\",\n                    \"role\": \"lead\"\n                }\n            ],\n            \"description\": \"Library for calculating the complexity of PHP code units\",\n            \"homepage\": \"https://github.com/sebastianbergmann/complexity\",\n            \"support\": {\n                \"issues\": \"https://github.com/sebastianbergmann/complexity/issues\",\n                \"security\": \"https://github.com/sebastianbergmann/complexity/security/policy\",\n                \"source\": \"https://github.com/sebastianbergmann/complexity/tree/4.0.1\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://github.com/sebastianbergmann\",\n                    \"type\": \"github\"\n                }\n            ],\n            \"time\": \"2024-07-03T04:49:50+00:00\"\n        },\n        {\n            \"name\": \"sebastian/diff\",\n            \"version\": \"6.0.2\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/sebastianbergmann/diff.git\",\n                \"reference\": \"b4ccd857127db5d41a5b676f24b51371d76d8544\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/sebastianbergmann/diff/zipball/b4ccd857127db5d41a5b676f24b51371d76d8544\",\n                \"reference\": \"b4ccd857127db5d41a5b676f24b51371d76d8544\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=8.2\"\n            },\n            \"require-dev\": {\n                \"phpunit/phpunit\": \"^11.0\",\n                \"symfony/process\": \"^4.2 || ^5\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-main\": \"6.0-dev\"\n                }\n            },\n            \"autoload\": {\n                \"classmap\": [\n                    \"src/\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"BSD-3-Clause\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Sebastian Bergmann\",\n                    \"email\": \"sebastian@phpunit.de\"\n                },\n                {\n                    \"name\": \"Kore Nordmann\",\n                    \"email\": \"mail@kore-nordmann.de\"\n                }\n            ],\n            \"description\": \"Diff implementation\",\n            \"homepage\": \"https://github.com/sebastianbergmann/diff\",\n            \"keywords\": [\n                \"diff\",\n                \"udiff\",\n                \"unidiff\",\n                \"unified diff\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/sebastianbergmann/diff/issues\",\n                \"security\": \"https://github.com/sebastianbergmann/diff/security/policy\",\n                \"source\": \"https://github.com/sebastianbergmann/diff/tree/6.0.2\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://github.com/sebastianbergmann\",\n                    \"type\": \"github\"\n                }\n            ],\n            \"time\": \"2024-07-03T04:53:05+00:00\"\n        },\n        {\n            \"name\": \"sebastian/environment\",\n            \"version\": \"7.2.1\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/sebastianbergmann/environment.git\",\n                \"reference\": \"a5c75038693ad2e8d4b6c15ba2403532647830c4\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/sebastianbergmann/environment/zipball/a5c75038693ad2e8d4b6c15ba2403532647830c4\",\n                \"reference\": \"a5c75038693ad2e8d4b6c15ba2403532647830c4\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=8.2\"\n            },\n            \"require-dev\": {\n                \"phpunit/phpunit\": \"^11.3\"\n            },\n            \"suggest\": {\n                \"ext-posix\": \"*\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-main\": \"7.2-dev\"\n                }\n            },\n            \"autoload\": {\n                \"classmap\": [\n                    \"src/\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"BSD-3-Clause\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Sebastian Bergmann\",\n                    \"email\": \"sebastian@phpunit.de\"\n                }\n            ],\n            \"description\": \"Provides functionality to handle HHVM/PHP environments\",\n            \"homepage\": \"https://github.com/sebastianbergmann/environment\",\n            \"keywords\": [\n                \"Xdebug\",\n                \"environment\",\n                \"hhvm\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/sebastianbergmann/environment/issues\",\n                \"security\": \"https://github.com/sebastianbergmann/environment/security/policy\",\n                \"source\": \"https://github.com/sebastianbergmann/environment/tree/7.2.1\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://github.com/sebastianbergmann\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://liberapay.com/sebastianbergmann\",\n                    \"type\": \"liberapay\"\n                },\n                {\n                    \"url\": \"https://thanks.dev/u/gh/sebastianbergmann\",\n                    \"type\": \"thanks_dev\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/sebastian/environment\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"time\": \"2025-05-21T11:55:47+00:00\"\n        },\n        {\n            \"name\": \"sebastian/exporter\",\n            \"version\": \"6.3.2\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/sebastianbergmann/exporter.git\",\n                \"reference\": \"70a298763b40b213ec087c51c739efcaa90bcd74\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/sebastianbergmann/exporter/zipball/70a298763b40b213ec087c51c739efcaa90bcd74\",\n                \"reference\": \"70a298763b40b213ec087c51c739efcaa90bcd74\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"ext-mbstring\": \"*\",\n                \"php\": \">=8.2\",\n                \"sebastian/recursion-context\": \"^6.0\"\n            },\n            \"require-dev\": {\n                \"phpunit/phpunit\": \"^11.3\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-main\": \"6.3-dev\"\n                }\n            },\n            \"autoload\": {\n                \"classmap\": [\n                    \"src/\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"BSD-3-Clause\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Sebastian Bergmann\",\n                    \"email\": \"sebastian@phpunit.de\"\n                },\n                {\n                    \"name\": \"Jeff Welch\",\n                    \"email\": \"whatthejeff@gmail.com\"\n                },\n                {\n                    \"name\": \"Volker Dusch\",\n                    \"email\": \"github@wallbash.com\"\n                },\n                {\n                    \"name\": \"Adam Harvey\",\n                    \"email\": \"aharvey@php.net\"\n                },\n                {\n                    \"name\": \"Bernhard Schussek\",\n                    \"email\": \"bschussek@gmail.com\"\n                }\n            ],\n            \"description\": \"Provides the functionality to export PHP variables for visualization\",\n            \"homepage\": \"https://www.github.com/sebastianbergmann/exporter\",\n            \"keywords\": [\n                \"export\",\n                \"exporter\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/sebastianbergmann/exporter/issues\",\n                \"security\": \"https://github.com/sebastianbergmann/exporter/security/policy\",\n                \"source\": \"https://github.com/sebastianbergmann/exporter/tree/6.3.2\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://github.com/sebastianbergmann\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://liberapay.com/sebastianbergmann\",\n                    \"type\": \"liberapay\"\n                },\n                {\n                    \"url\": \"https://thanks.dev/u/gh/sebastianbergmann\",\n                    \"type\": \"thanks_dev\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/sebastian/exporter\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"time\": \"2025-09-24T06:12:51+00:00\"\n        },\n        {\n            \"name\": \"sebastian/global-state\",\n            \"version\": \"7.0.2\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/sebastianbergmann/global-state.git\",\n                \"reference\": \"3be331570a721f9a4b5917f4209773de17f747d7\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/sebastianbergmann/global-state/zipball/3be331570a721f9a4b5917f4209773de17f747d7\",\n                \"reference\": \"3be331570a721f9a4b5917f4209773de17f747d7\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=8.2\",\n                \"sebastian/object-reflector\": \"^4.0\",\n                \"sebastian/recursion-context\": \"^6.0\"\n            },\n            \"require-dev\": {\n                \"ext-dom\": \"*\",\n                \"phpunit/phpunit\": \"^11.0\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-main\": \"7.0-dev\"\n                }\n            },\n            \"autoload\": {\n                \"classmap\": [\n                    \"src/\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"BSD-3-Clause\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Sebastian Bergmann\",\n                    \"email\": \"sebastian@phpunit.de\"\n                }\n            ],\n            \"description\": \"Snapshotting of global state\",\n            \"homepage\": \"https://www.github.com/sebastianbergmann/global-state\",\n            \"keywords\": [\n                \"global state\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/sebastianbergmann/global-state/issues\",\n                \"security\": \"https://github.com/sebastianbergmann/global-state/security/policy\",\n                \"source\": \"https://github.com/sebastianbergmann/global-state/tree/7.0.2\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://github.com/sebastianbergmann\",\n                    \"type\": \"github\"\n                }\n            ],\n            \"time\": \"2024-07-03T04:57:36+00:00\"\n        },\n        {\n            \"name\": \"sebastian/lines-of-code\",\n            \"version\": \"3.0.1\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/sebastianbergmann/lines-of-code.git\",\n                \"reference\": \"d36ad0d782e5756913e42ad87cb2890f4ffe467a\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/d36ad0d782e5756913e42ad87cb2890f4ffe467a\",\n                \"reference\": \"d36ad0d782e5756913e42ad87cb2890f4ffe467a\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"nikic/php-parser\": \"^5.0\",\n                \"php\": \">=8.2\"\n            },\n            \"require-dev\": {\n                \"phpunit/phpunit\": \"^11.0\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-main\": \"3.0-dev\"\n                }\n            },\n            \"autoload\": {\n                \"classmap\": [\n                    \"src/\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"BSD-3-Clause\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Sebastian Bergmann\",\n                    \"email\": \"sebastian@phpunit.de\",\n                    \"role\": \"lead\"\n                }\n            ],\n            \"description\": \"Library for counting the lines of code in PHP source code\",\n            \"homepage\": \"https://github.com/sebastianbergmann/lines-of-code\",\n            \"support\": {\n                \"issues\": \"https://github.com/sebastianbergmann/lines-of-code/issues\",\n                \"security\": \"https://github.com/sebastianbergmann/lines-of-code/security/policy\",\n                \"source\": \"https://github.com/sebastianbergmann/lines-of-code/tree/3.0.1\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://github.com/sebastianbergmann\",\n                    \"type\": \"github\"\n                }\n            ],\n            \"time\": \"2024-07-03T04:58:38+00:00\"\n        },\n        {\n            \"name\": \"sebastian/object-enumerator\",\n            \"version\": \"6.0.1\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/sebastianbergmann/object-enumerator.git\",\n                \"reference\": \"f5b498e631a74204185071eb41f33f38d64608aa\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/f5b498e631a74204185071eb41f33f38d64608aa\",\n                \"reference\": \"f5b498e631a74204185071eb41f33f38d64608aa\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=8.2\",\n                \"sebastian/object-reflector\": \"^4.0\",\n                \"sebastian/recursion-context\": \"^6.0\"\n            },\n            \"require-dev\": {\n                \"phpunit/phpunit\": \"^11.0\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-main\": \"6.0-dev\"\n                }\n            },\n            \"autoload\": {\n                \"classmap\": [\n                    \"src/\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"BSD-3-Clause\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Sebastian Bergmann\",\n                    \"email\": \"sebastian@phpunit.de\"\n                }\n            ],\n            \"description\": \"Traverses array structures and object graphs to enumerate all referenced objects\",\n            \"homepage\": \"https://github.com/sebastianbergmann/object-enumerator/\",\n            \"support\": {\n                \"issues\": \"https://github.com/sebastianbergmann/object-enumerator/issues\",\n                \"security\": \"https://github.com/sebastianbergmann/object-enumerator/security/policy\",\n                \"source\": \"https://github.com/sebastianbergmann/object-enumerator/tree/6.0.1\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://github.com/sebastianbergmann\",\n                    \"type\": \"github\"\n                }\n            ],\n            \"time\": \"2024-07-03T05:00:13+00:00\"\n        },\n        {\n            \"name\": \"sebastian/object-reflector\",\n            \"version\": \"4.0.1\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/sebastianbergmann/object-reflector.git\",\n                \"reference\": \"6e1a43b411b2ad34146dee7524cb13a068bb35f9\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/6e1a43b411b2ad34146dee7524cb13a068bb35f9\",\n                \"reference\": \"6e1a43b411b2ad34146dee7524cb13a068bb35f9\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=8.2\"\n            },\n            \"require-dev\": {\n                \"phpunit/phpunit\": \"^11.0\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-main\": \"4.0-dev\"\n                }\n            },\n            \"autoload\": {\n                \"classmap\": [\n                    \"src/\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"BSD-3-Clause\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Sebastian Bergmann\",\n                    \"email\": \"sebastian@phpunit.de\"\n                }\n            ],\n            \"description\": \"Allows reflection of object attributes, including inherited and non-public ones\",\n            \"homepage\": \"https://github.com/sebastianbergmann/object-reflector/\",\n            \"support\": {\n                \"issues\": \"https://github.com/sebastianbergmann/object-reflector/issues\",\n                \"security\": \"https://github.com/sebastianbergmann/object-reflector/security/policy\",\n                \"source\": \"https://github.com/sebastianbergmann/object-reflector/tree/4.0.1\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://github.com/sebastianbergmann\",\n                    \"type\": \"github\"\n                }\n            ],\n            \"time\": \"2024-07-03T05:01:32+00:00\"\n        },\n        {\n            \"name\": \"sebastian/recursion-context\",\n            \"version\": \"6.0.3\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/sebastianbergmann/recursion-context.git\",\n                \"reference\": \"f6458abbf32a6c8174f8f26261475dc133b3d9dc\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/f6458abbf32a6c8174f8f26261475dc133b3d9dc\",\n                \"reference\": \"f6458abbf32a6c8174f8f26261475dc133b3d9dc\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=8.2\"\n            },\n            \"require-dev\": {\n                \"phpunit/phpunit\": \"^11.3\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-main\": \"6.0-dev\"\n                }\n            },\n            \"autoload\": {\n                \"classmap\": [\n                    \"src/\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"BSD-3-Clause\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Sebastian Bergmann\",\n                    \"email\": \"sebastian@phpunit.de\"\n                },\n                {\n                    \"name\": \"Jeff Welch\",\n                    \"email\": \"whatthejeff@gmail.com\"\n                },\n                {\n                    \"name\": \"Adam Harvey\",\n                    \"email\": \"aharvey@php.net\"\n                }\n            ],\n            \"description\": \"Provides functionality to recursively process PHP variables\",\n            \"homepage\": \"https://github.com/sebastianbergmann/recursion-context\",\n            \"support\": {\n                \"issues\": \"https://github.com/sebastianbergmann/recursion-context/issues\",\n                \"security\": \"https://github.com/sebastianbergmann/recursion-context/security/policy\",\n                \"source\": \"https://github.com/sebastianbergmann/recursion-context/tree/6.0.3\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://github.com/sebastianbergmann\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://liberapay.com/sebastianbergmann\",\n                    \"type\": \"liberapay\"\n                },\n                {\n                    \"url\": \"https://thanks.dev/u/gh/sebastianbergmann\",\n                    \"type\": \"thanks_dev\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/sebastian/recursion-context\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"time\": \"2025-08-13T04:42:22+00:00\"\n        },\n        {\n            \"name\": \"sebastian/type\",\n            \"version\": \"5.1.3\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/sebastianbergmann/type.git\",\n                \"reference\": \"f77d2d4e78738c98d9a68d2596fe5e8fa380f449\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/sebastianbergmann/type/zipball/f77d2d4e78738c98d9a68d2596fe5e8fa380f449\",\n                \"reference\": \"f77d2d4e78738c98d9a68d2596fe5e8fa380f449\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=8.2\"\n            },\n            \"require-dev\": {\n                \"phpunit/phpunit\": \"^11.3\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-main\": \"5.1-dev\"\n                }\n            },\n            \"autoload\": {\n                \"classmap\": [\n                    \"src/\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"BSD-3-Clause\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Sebastian Bergmann\",\n                    \"email\": \"sebastian@phpunit.de\",\n                    \"role\": \"lead\"\n                }\n            ],\n            \"description\": \"Collection of value objects that represent the types of the PHP type system\",\n            \"homepage\": \"https://github.com/sebastianbergmann/type\",\n            \"support\": {\n                \"issues\": \"https://github.com/sebastianbergmann/type/issues\",\n                \"security\": \"https://github.com/sebastianbergmann/type/security/policy\",\n                \"source\": \"https://github.com/sebastianbergmann/type/tree/5.1.3\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://github.com/sebastianbergmann\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://liberapay.com/sebastianbergmann\",\n                    \"type\": \"liberapay\"\n                },\n                {\n                    \"url\": \"https://thanks.dev/u/gh/sebastianbergmann\",\n                    \"type\": \"thanks_dev\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/sebastian/type\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"time\": \"2025-08-09T06:55:48+00:00\"\n        },\n        {\n            \"name\": \"sebastian/version\",\n            \"version\": \"5.0.2\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/sebastianbergmann/version.git\",\n                \"reference\": \"c687e3387b99f5b03b6caa64c74b63e2936ff874\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/sebastianbergmann/version/zipball/c687e3387b99f5b03b6caa64c74b63e2936ff874\",\n                \"reference\": \"c687e3387b99f5b03b6caa64c74b63e2936ff874\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=8.2\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-main\": \"5.0-dev\"\n                }\n            },\n            \"autoload\": {\n                \"classmap\": [\n                    \"src/\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"BSD-3-Clause\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Sebastian Bergmann\",\n                    \"email\": \"sebastian@phpunit.de\",\n                    \"role\": \"lead\"\n                }\n            ],\n            \"description\": \"Library that helps with managing the version number of Git-hosted PHP projects\",\n            \"homepage\": \"https://github.com/sebastianbergmann/version\",\n            \"support\": {\n                \"issues\": \"https://github.com/sebastianbergmann/version/issues\",\n                \"security\": \"https://github.com/sebastianbergmann/version/security/policy\",\n                \"source\": \"https://github.com/sebastianbergmann/version/tree/5.0.2\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://github.com/sebastianbergmann\",\n                    \"type\": \"github\"\n                }\n            ],\n            \"time\": \"2024-10-09T05:16:32+00:00\"\n        },\n        {\n            \"name\": \"staabm/side-effects-detector\",\n            \"version\": \"1.0.5\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/staabm/side-effects-detector.git\",\n                \"reference\": \"d8334211a140ce329c13726d4a715adbddd0a163\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/staabm/side-effects-detector/zipball/d8334211a140ce329c13726d4a715adbddd0a163\",\n                \"reference\": \"d8334211a140ce329c13726d4a715adbddd0a163\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"ext-tokenizer\": \"*\",\n                \"php\": \"^7.4 || ^8.0\"\n            },\n            \"require-dev\": {\n                \"phpstan/extension-installer\": \"^1.4.3\",\n                \"phpstan/phpstan\": \"^1.12.6\",\n                \"phpunit/phpunit\": \"^9.6.21\",\n                \"symfony/var-dumper\": \"^5.4.43\",\n                \"tomasvotruba/type-coverage\": \"1.0.0\",\n                \"tomasvotruba/unused-public\": \"1.0.0\"\n            },\n            \"type\": \"library\",\n            \"autoload\": {\n                \"classmap\": [\n                    \"lib/\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"description\": \"A static analysis tool to detect side effects in PHP code\",\n            \"keywords\": [\n                \"static analysis\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/staabm/side-effects-detector/issues\",\n                \"source\": \"https://github.com/staabm/side-effects-detector/tree/1.0.5\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://github.com/staabm\",\n                    \"type\": \"github\"\n                }\n            ],\n            \"time\": \"2024-10-20T05:08:20+00:00\"\n        },\n        {\n            \"name\": \"symfony/clock\",\n            \"version\": \"v7.4.8\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/symfony/clock.git\",\n                \"reference\": \"674fa3b98e21531dd040e613479f5f6fa8f32111\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/symfony/clock/zipball/674fa3b98e21531dd040e613479f5f6fa8f32111\",\n                \"reference\": \"674fa3b98e21531dd040e613479f5f6fa8f32111\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=8.2\",\n                \"psr/clock\": \"^1.0\",\n                \"symfony/polyfill-php83\": \"^1.28\"\n            },\n            \"provide\": {\n                \"psr/clock-implementation\": \"1.0\"\n            },\n            \"type\": \"library\",\n            \"autoload\": {\n                \"files\": [\n                    \"Resources/now.php\"\n                ],\n                \"psr-4\": {\n                    \"Symfony\\\\Component\\\\Clock\\\\\": \"\"\n                },\n                \"exclude-from-classmap\": [\n                    \"/Tests/\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Nicolas Grekas\",\n                    \"email\": \"p@tchwork.com\"\n                },\n                {\n                    \"name\": \"Symfony Community\",\n                    \"homepage\": \"https://symfony.com/contributors\"\n                }\n            ],\n            \"description\": \"Decouples applications from the system clock\",\n            \"homepage\": \"https://symfony.com\",\n            \"keywords\": [\n                \"clock\",\n                \"psr20\",\n                \"time\"\n            ],\n            \"support\": {\n                \"source\": \"https://github.com/symfony/clock/tree/v7.4.8\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://symfony.com/sponsor\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://github.com/fabpot\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://github.com/nicolas-grekas\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"time\": \"2026-03-24T13:12:05+00:00\"\n        },\n        {\n            \"name\": \"symfony/css-selector\",\n            \"version\": \"v7.4.18\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/symfony/css-selector.git\",\n                \"reference\": \"fecf40067fc8d8880ea87b8ac227600b9aadd1d0\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/symfony/css-selector/zipball/fecf40067fc8d8880ea87b8ac227600b9aadd1d0\",\n                \"reference\": \"fecf40067fc8d8880ea87b8ac227600b9aadd1d0\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=8.2\"\n            },\n            \"type\": \"library\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Symfony\\\\Component\\\\CssSelector\\\\\": \"\"\n                },\n                \"exclude-from-classmap\": [\n                    \"/Tests/\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Fabien Potencier\",\n                    \"email\": \"fabien@symfony.com\"\n                },\n                {\n                    \"name\": \"Jean-François Simon\",\n                    \"email\": \"jeanfrancois.simon@sensiolabs.com\"\n                },\n                {\n                    \"name\": \"Symfony Community\",\n                    \"homepage\": \"https://symfony.com/contributors\"\n                }\n            ],\n            \"description\": \"Converts CSS selectors to XPath expressions\",\n            \"homepage\": \"https://symfony.com\",\n            \"support\": {\n                \"source\": \"https://github.com/symfony/css-selector/tree/v7.4.18\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://symfony.com/sponsor\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://github.com/fabpot\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://github.com/nicolas-grekas\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"time\": \"2026-08-23T10:03:40+00:00\"\n        },\n        {\n            \"name\": \"symfony/error-handler\",\n            \"version\": \"v7.4.17\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/symfony/error-handler.git\",\n                \"reference\": \"8373921e231e190a88e2ad526951bbaa791576fa\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/symfony/error-handler/zipball/8373921e231e190a88e2ad526951bbaa791576fa\",\n                \"reference\": \"8373921e231e190a88e2ad526951bbaa791576fa\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=8.2\",\n                \"psr/log\": \"^1|^2|^3\",\n                \"symfony/polyfill-php85\": \"^1.32\",\n                \"symfony/var-dumper\": \"^6.4|^7.0|^8.0\"\n            },\n            \"conflict\": {\n                \"symfony/deprecation-contracts\": \"<2.5\",\n                \"symfony/http-kernel\": \"<6.4\"\n            },\n            \"require-dev\": {\n                \"symfony/console\": \"^6.4|^7.0|^8.0\",\n                \"symfony/deprecation-contracts\": \"^2.5|^3\",\n                \"symfony/http-kernel\": \"^6.4|^7.0|^8.0\",\n                \"symfony/serializer\": \"^6.4|^7.0|^8.0\",\n                \"symfony/webpack-encore-bundle\": \"^1.0|^2.0\"\n            },\n            \"bin\": [\n                \"Resources/bin/patch-type-declarations\"\n            ],\n            \"type\": \"library\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Symfony\\\\Component\\\\ErrorHandler\\\\\": \"\"\n                },\n                \"exclude-from-classmap\": [\n                    \"/Tests/\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Fabien Potencier\",\n                    \"email\": \"fabien@symfony.com\"\n                },\n                {\n                    \"name\": \"Symfony Community\",\n                    \"homepage\": \"https://symfony.com/contributors\"\n                }\n            ],\n            \"description\": \"Provides tools to manage errors and ease debugging PHP code\",\n            \"homepage\": \"https://symfony.com\",\n            \"support\": {\n                \"source\": \"https://github.com/symfony/error-handler/tree/v7.4.17\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://symfony.com/sponsor\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://github.com/fabpot\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://github.com/nicolas-grekas\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"time\": \"2026-08-21T17:40:08+00:00\"\n        },\n        {\n            \"name\": \"symfony/event-dispatcher\",\n            \"version\": \"v7.4.17\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/symfony/event-dispatcher.git\",\n                \"reference\": \"d269974ee93c61d03620ffee358355bfdb471d66\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/symfony/event-dispatcher/zipball/d269974ee93c61d03620ffee358355bfdb471d66\",\n                \"reference\": \"d269974ee93c61d03620ffee358355bfdb471d66\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=8.2\",\n                \"symfony/event-dispatcher-contracts\": \"^2.5|^3\"\n            },\n            \"conflict\": {\n                \"symfony/dependency-injection\": \"<6.4\",\n                \"symfony/service-contracts\": \"<2.5\"\n            },\n            \"provide\": {\n                \"psr/event-dispatcher-implementation\": \"1.0\",\n                \"symfony/event-dispatcher-implementation\": \"2.0|3.0\"\n            },\n            \"require-dev\": {\n                \"psr/log\": \"^1|^2|^3\",\n                \"symfony/config\": \"^6.4|^7.0|^8.0\",\n                \"symfony/dependency-injection\": \"^6.4|^7.0|^8.0\",\n                \"symfony/error-handler\": \"^6.4|^7.0|^8.0\",\n                \"symfony/expression-language\": \"^6.4|^7.0|^8.0\",\n                \"symfony/framework-bundle\": \"^6.4|^7.0|^8.0\",\n                \"symfony/http-foundation\": \"^6.4|^7.0|^8.0\",\n                \"symfony/service-contracts\": \"^2.5|^3\",\n                \"symfony/stopwatch\": \"^6.4|^7.0|^8.0\"\n            },\n            \"type\": \"library\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Symfony\\\\Component\\\\EventDispatcher\\\\\": \"\"\n                },\n                \"exclude-from-classmap\": [\n                    \"/Tests/\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Fabien Potencier\",\n                    \"email\": \"fabien@symfony.com\"\n                },\n                {\n                    \"name\": \"Symfony Community\",\n                    \"homepage\": \"https://symfony.com/contributors\"\n                }\n            ],\n            \"description\": \"Provides tools that allow your application components to communicate with each other by dispatching events and listening to them\",\n            \"homepage\": \"https://symfony.com\",\n            \"support\": {\n                \"source\": \"https://github.com/symfony/event-dispatcher/tree/v7.4.17\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://symfony.com/sponsor\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://github.com/fabpot\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://github.com/nicolas-grekas\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"time\": \"2026-08-21T17:40:08+00:00\"\n        },\n        {\n            \"name\": \"symfony/event-dispatcher-contracts\",\n            \"version\": \"v3.7.1\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/symfony/event-dispatcher-contracts.git\",\n                \"reference\": \"c7de7a00ffb67842132da02ea92988a39ccd9f4e\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/c7de7a00ffb67842132da02ea92988a39ccd9f4e\",\n                \"reference\": \"c7de7a00ffb67842132da02ea92988a39ccd9f4e\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=8.1\",\n                \"psr/event-dispatcher\": \"^1\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"thanks\": {\n                    \"url\": \"https://github.com/symfony/contracts\",\n                    \"name\": \"symfony/contracts\"\n                },\n                \"branch-alias\": {\n                    \"dev-main\": \"3.7-dev\"\n                }\n            },\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Symfony\\\\Contracts\\\\EventDispatcher\\\\\": \"\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Nicolas Grekas\",\n                    \"email\": \"p@tchwork.com\"\n                },\n                {\n                    \"name\": \"Symfony Community\",\n                    \"homepage\": \"https://symfony.com/contributors\"\n                }\n            ],\n            \"description\": \"Generic abstractions related to dispatching event\",\n            \"homepage\": \"https://symfony.com\",\n            \"keywords\": [\n                \"abstractions\",\n                \"contracts\",\n                \"decoupling\",\n                \"interfaces\",\n                \"interoperability\",\n                \"standards\"\n            ],\n            \"support\": {\n                \"source\": \"https://github.com/symfony/event-dispatcher-contracts/tree/v3.7.1\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://symfony.com/sponsor\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://github.com/fabpot\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://github.com/nicolas-grekas\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"time\": \"2026-06-05T06:23:12+00:00\"\n        },\n        {\n            \"name\": \"symfony/filesystem\",\n            \"version\": \"v7.4.18\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/symfony/filesystem.git\",\n                \"reference\": \"90d412aa5277c6819db39e7605aa46b1019e3232\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/symfony/filesystem/zipball/90d412aa5277c6819db39e7605aa46b1019e3232\",\n                \"reference\": \"90d412aa5277c6819db39e7605aa46b1019e3232\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=8.2\",\n                \"symfony/polyfill-ctype\": \"~1.8\",\n                \"symfony/polyfill-mbstring\": \"~1.8\"\n            },\n            \"require-dev\": {\n                \"symfony/process\": \"^6.4|^7.0|^8.0\"\n            },\n            \"type\": \"library\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Symfony\\\\Component\\\\Filesystem\\\\\": \"\"\n                },\n                \"exclude-from-classmap\": [\n                    \"/Tests/\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Fabien Potencier\",\n                    \"email\": \"fabien@symfony.com\"\n                },\n                {\n                    \"name\": \"Symfony Community\",\n                    \"homepage\": \"https://symfony.com/contributors\"\n                }\n            ],\n            \"description\": \"Provides basic utilities for the filesystem\",\n            \"homepage\": \"https://symfony.com\",\n            \"support\": {\n                \"source\": \"https://github.com/symfony/filesystem/tree/v7.4.18\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://symfony.com/sponsor\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://github.com/fabpot\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://github.com/nicolas-grekas\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"time\": \"2026-08-23T10:03:40+00:00\"\n        },\n        {\n            \"name\": \"symfony/finder\",\n            \"version\": \"v7.4.17\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/symfony/finder.git\",\n                \"reference\": \"5ce28827081f6d1f0c32eaf3882750f19cb5bbe6\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/symfony/finder/zipball/5ce28827081f6d1f0c32eaf3882750f19cb5bbe6\",\n                \"reference\": \"5ce28827081f6d1f0c32eaf3882750f19cb5bbe6\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=8.2\"\n            },\n            \"require-dev\": {\n                \"symfony/filesystem\": \"^6.4|^7.0|^8.0\"\n            },\n            \"type\": \"library\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Symfony\\\\Component\\\\Finder\\\\\": \"\"\n                },\n                \"exclude-from-classmap\": [\n                    \"/Tests/\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Fabien Potencier\",\n                    \"email\": \"fabien@symfony.com\"\n                },\n                {\n                    \"name\": \"Symfony Community\",\n                    \"homepage\": \"https://symfony.com/contributors\"\n                }\n            ],\n            \"description\": \"Finds files and directories via an intuitive fluent interface\",\n            \"homepage\": \"https://symfony.com\",\n            \"support\": {\n                \"source\": \"https://github.com/symfony/finder/tree/v7.4.17\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://symfony.com/sponsor\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://github.com/fabpot\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://github.com/nicolas-grekas\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"time\": \"2026-08-21T12:09:28+00:00\"\n        },\n        {\n            \"name\": \"symfony/http-foundation\",\n            \"version\": \"v7.4.18\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/symfony/http-foundation.git\",\n                \"reference\": \"d070b716a32fbe3bf04204db0f58ace73b86d133\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/symfony/http-foundation/zipball/d070b716a32fbe3bf04204db0f58ace73b86d133\",\n                \"reference\": \"d070b716a32fbe3bf04204db0f58ace73b86d133\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=8.2\",\n                \"symfony/deprecation-contracts\": \"^2.5|^3\",\n                \"symfony/polyfill-mbstring\": \"^1.1\"\n            },\n            \"conflict\": {\n                \"doctrine/dbal\": \"<3.6\",\n                \"symfony/cache\": \"<6.4.12|>=7.0,<7.1.5\"\n            },\n            \"require-dev\": {\n                \"doctrine/dbal\": \"^3.6|^4\",\n                \"predis/predis\": \"^1.1|^2.0\",\n                \"symfony/cache\": \"^6.4.12|^7.1.5|^8.0\",\n                \"symfony/clock\": \"^6.4|^7.0|^8.0\",\n                \"symfony/dependency-injection\": \"^6.4|^7.0|^8.0\",\n                \"symfony/expression-language\": \"^6.4|^7.0|^8.0\",\n                \"symfony/http-kernel\": \"^6.4|^7.0|^8.0\",\n                \"symfony/mime\": \"^6.4|^7.0|^8.0\",\n                \"symfony/rate-limiter\": \"^6.4|^7.0|^8.0\"\n            },\n            \"type\": \"library\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Symfony\\\\Component\\\\HttpFoundation\\\\\": \"\"\n                },\n                \"exclude-from-classmap\": [\n                    \"/Tests/\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Fabien Potencier\",\n                    \"email\": \"fabien@symfony.com\"\n                },\n                {\n                    \"name\": \"Symfony Community\",\n                    \"homepage\": \"https://symfony.com/contributors\"\n                }\n            ],\n            \"description\": \"Defines an object-oriented layer for the HTTP specification\",\n            \"homepage\": \"https://symfony.com\",\n            \"support\": {\n                \"source\": \"https://github.com/symfony/http-foundation/tree/v7.4.18\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://symfony.com/sponsor\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://github.com/fabpot\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://github.com/nicolas-grekas\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"time\": \"2026-08-30T20:10:52+00:00\"\n        },\n        {\n            \"name\": \"symfony/http-kernel\",\n            \"version\": \"v7.4.18\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/symfony/http-kernel.git\",\n                \"reference\": \"275d2d2d24530f2a0eaf17704a3a93860a036351\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/symfony/http-kernel/zipball/275d2d2d24530f2a0eaf17704a3a93860a036351\",\n                \"reference\": \"275d2d2d24530f2a0eaf17704a3a93860a036351\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=8.2\",\n                \"psr/log\": \"^1|^2|^3\",\n                \"symfony/deprecation-contracts\": \"^2.5|^3\",\n                \"symfony/error-handler\": \"^6.4|^7.0|^8.0\",\n                \"symfony/event-dispatcher\": \"^7.3|^8.0\",\n                \"symfony/http-foundation\": \"^7.4|^8.0\",\n                \"symfony/polyfill-ctype\": \"^1.8\"\n            },\n            \"conflict\": {\n                \"symfony/browser-kit\": \"<6.4\",\n                \"symfony/cache\": \"<6.4\",\n                \"symfony/config\": \"<6.4\",\n                \"symfony/console\": \"<6.4\",\n                \"symfony/dependency-injection\": \"<6.4\",\n                \"symfony/doctrine-bridge\": \"<6.4\",\n                \"symfony/flex\": \"<2.10\",\n                \"symfony/form\": \"<6.4\",\n                \"symfony/http-client\": \"<6.4\",\n                \"symfony/http-client-contracts\": \"<2.5\",\n                \"symfony/mailer\": \"<6.4\",\n                \"symfony/messenger\": \"<6.4\",\n                \"symfony/translation\": \"<6.4\",\n                \"symfony/translation-contracts\": \"<2.5\",\n                \"symfony/twig-bridge\": \"<6.4\",\n                \"symfony/validator\": \"<6.4\",\n                \"symfony/var-dumper\": \"<6.4\",\n                \"twig/twig\": \"<3.12\"\n            },\n            \"provide\": {\n                \"psr/log-implementation\": \"1.0|2.0|3.0\"\n            },\n            \"require-dev\": {\n                \"psr/cache\": \"^1.0|^2.0|^3.0\",\n                \"symfony/browser-kit\": \"^6.4|^7.0|^8.0\",\n                \"symfony/clock\": \"^6.4|^7.0|^8.0\",\n                \"symfony/config\": \"^6.4|^7.0|^8.0\",\n                \"symfony/console\": \"^6.4|^7.0|^8.0\",\n                \"symfony/css-selector\": \"^6.4|^7.0|^8.0\",\n                \"symfony/dependency-injection\": \"^6.4.1|^7.0.1|^8.0\",\n                \"symfony/dom-crawler\": \"^6.4|^7.0|^8.0\",\n                \"symfony/expression-language\": \"^6.4|^7.0|^8.0\",\n                \"symfony/finder\": \"^6.4|^7.0|^8.0\",\n                \"symfony/http-client-contracts\": \"^2.5|^3\",\n                \"symfony/process\": \"^6.4|^7.0|^8.0\",\n                \"symfony/property-access\": \"^7.1|^8.0\",\n                \"symfony/routing\": \"^6.4|^7.0|^8.0\",\n                \"symfony/serializer\": \"^7.1|^8.0\",\n                \"symfony/stopwatch\": \"^6.4|^7.0|^8.0\",\n                \"symfony/translation\": \"^6.4|^7.0|^8.0\",\n                \"symfony/translation-contracts\": \"^2.5|^3\",\n                \"symfony/uid\": \"^6.4|^7.0|^8.0\",\n                \"symfony/validator\": \"^6.4|^7.0|^8.0\",\n                \"symfony/var-dumper\": \"^6.4|^7.0|^8.0\",\n                \"symfony/var-exporter\": \"^6.4|^7.0|^8.0\",\n                \"twig/twig\": \"^3.12|^4.0\"\n            },\n            \"type\": \"library\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Symfony\\\\Component\\\\HttpKernel\\\\\": \"\"\n                },\n                \"exclude-from-classmap\": [\n                    \"/Tests/\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Fabien Potencier\",\n                    \"email\": \"fabien@symfony.com\"\n                },\n                {\n                    \"name\": \"Symfony Community\",\n                    \"homepage\": \"https://symfony.com/contributors\"\n                }\n            ],\n            \"description\": \"Provides a structured process for converting a Request into a Response\",\n            \"homepage\": \"https://symfony.com\",\n            \"support\": {\n                \"source\": \"https://github.com/symfony/http-kernel/tree/v7.4.18\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://symfony.com/sponsor\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://github.com/fabpot\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://github.com/nicolas-grekas\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"time\": \"2026-08-30T21:24:29+00:00\"\n        },\n        {\n            \"name\": \"symfony/mailer\",\n            \"version\": \"v7.4.17\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/symfony/mailer.git\",\n                \"reference\": \"b17c9bf3a551d5f635638a3b6c05f06c4dc87584\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/symfony/mailer/zipball/b17c9bf3a551d5f635638a3b6c05f06c4dc87584\",\n                \"reference\": \"b17c9bf3a551d5f635638a3b6c05f06c4dc87584\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"egulias/email-validator\": \"^2.1.10|^3|^4\",\n                \"php\": \">=8.2\",\n                \"psr/event-dispatcher\": \"^1\",\n                \"psr/log\": \"^1|^2|^3\",\n                \"symfony/event-dispatcher\": \"^6.4|^7.0|^8.0\",\n                \"symfony/mime\": \"^7.2|^8.0\",\n                \"symfony/service-contracts\": \"^2.5|^3\"\n            },\n            \"conflict\": {\n                \"symfony/http-client-contracts\": \"<2.5\",\n                \"symfony/http-kernel\": \"<6.4\",\n                \"symfony/messenger\": \"<6.4\",\n                \"symfony/mime\": \"<6.4\",\n                \"symfony/twig-bridge\": \"<6.4\"\n            },\n            \"require-dev\": {\n                \"symfony/console\": \"^6.4|^7.0|^8.0\",\n                \"symfony/http-client\": \"^6.4|^7.0|^8.0\",\n                \"symfony/messenger\": \"^6.4|^7.0|^8.0\",\n                \"symfony/twig-bridge\": \"^6.4|^7.0|^8.0\"\n            },\n            \"type\": \"library\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Symfony\\\\Component\\\\Mailer\\\\\": \"\"\n                },\n                \"exclude-from-classmap\": [\n                    \"/Tests/\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Fabien Potencier\",\n                    \"email\": \"fabien@symfony.com\"\n                },\n                {\n                    \"name\": \"Symfony Community\",\n                    \"homepage\": \"https://symfony.com/contributors\"\n                }\n            ],\n            \"description\": \"Helps sending emails\",\n            \"homepage\": \"https://symfony.com\",\n            \"support\": {\n                \"source\": \"https://github.com/symfony/mailer/tree/v7.4.17\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://symfony.com/sponsor\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://github.com/fabpot\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://github.com/nicolas-grekas\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"time\": \"2026-08-21T17:40:08+00:00\"\n        },\n        {\n            \"name\": \"symfony/mime\",\n            \"version\": \"v7.4.18\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/symfony/mime.git\",\n                \"reference\": \"bf328d82105831db3e409195db0540ff57f27c80\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/symfony/mime/zipball/bf328d82105831db3e409195db0540ff57f27c80\",\n                \"reference\": \"bf328d82105831db3e409195db0540ff57f27c80\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=8.2\",\n                \"symfony/deprecation-contracts\": \"^2.5|^3\",\n                \"symfony/polyfill-intl-idn\": \"^1.10\",\n                \"symfony/polyfill-mbstring\": \"^1.0\"\n            },\n            \"conflict\": {\n                \"egulias/email-validator\": \"~3.0.0\",\n                \"phpdocumentor/reflection-docblock\": \"<5.2|>=7\",\n                \"phpdocumentor/type-resolver\": \"<1.5.1\",\n                \"symfony/mailer\": \"<6.4\",\n                \"symfony/serializer\": \"<6.4.3|>7.0,<7.0.3\"\n            },\n            \"require-dev\": {\n                \"egulias/email-validator\": \"^2.1.10|^3.1|^4\",\n                \"league/html-to-markdown\": \"^5.0\",\n                \"phpdocumentor/reflection-docblock\": \"^5.2|^6.0\",\n                \"symfony/dependency-injection\": \"^6.4|^7.0|^8.0\",\n                \"symfony/process\": \"^6.4|^7.0|^8.0\",\n                \"symfony/property-access\": \"^6.4|^7.0|^8.0\",\n                \"symfony/property-info\": \"^6.4|^7.0|^8.0\",\n                \"symfony/serializer\": \"^6.4.44|^7.4.17|^8.1.5\"\n            },\n            \"type\": \"library\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Symfony\\\\Component\\\\Mime\\\\\": \"\"\n                },\n                \"exclude-from-classmap\": [\n                    \"/Tests/\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Fabien Potencier\",\n                    \"email\": \"fabien@symfony.com\"\n                },\n                {\n                    \"name\": \"Symfony Community\",\n                    \"homepage\": \"https://symfony.com/contributors\"\n                }\n            ],\n            \"description\": \"Allows manipulating MIME messages\",\n            \"homepage\": \"https://symfony.com\",\n            \"keywords\": [\n                \"mime\",\n                \"mime-type\"\n            ],\n            \"support\": {\n                \"source\": \"https://github.com/symfony/mime/tree/v7.4.18\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://symfony.com/sponsor\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://github.com/fabpot\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://github.com/nicolas-grekas\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"time\": \"2026-08-22T09:04:42+00:00\"\n        },\n        {\n            \"name\": \"symfony/options-resolver\",\n            \"version\": \"v7.4.8\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/symfony/options-resolver.git\",\n                \"reference\": \"2888fcdc4dc2fd5f7c7397be78631e8af12e02b4\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/symfony/options-resolver/zipball/2888fcdc4dc2fd5f7c7397be78631e8af12e02b4\",\n                \"reference\": \"2888fcdc4dc2fd5f7c7397be78631e8af12e02b4\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=8.2\",\n                \"symfony/deprecation-contracts\": \"^2.5|^3\"\n            },\n            \"type\": \"library\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Symfony\\\\Component\\\\OptionsResolver\\\\\": \"\"\n                },\n                \"exclude-from-classmap\": [\n                    \"/Tests/\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Fabien Potencier\",\n                    \"email\": \"fabien@symfony.com\"\n                },\n                {\n                    \"name\": \"Symfony Community\",\n                    \"homepage\": \"https://symfony.com/contributors\"\n                }\n            ],\n            \"description\": \"Provides an improved replacement for the array_replace PHP function\",\n            \"homepage\": \"https://symfony.com\",\n            \"keywords\": [\n                \"config\",\n                \"configuration\",\n                \"options\"\n            ],\n            \"support\": {\n                \"source\": \"https://github.com/symfony/options-resolver/tree/v7.4.8\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://symfony.com/sponsor\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://github.com/fabpot\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://github.com/nicolas-grekas\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"time\": \"2026-03-24T13:12:05+00:00\"\n        },\n        {\n            \"name\": \"symfony/polyfill-intl-idn\",\n            \"version\": \"v1.42.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/symfony/polyfill-intl-idn.git\",\n                \"reference\": \"51b5ff5ba85452b31ec6f55490b08148612339d9\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/51b5ff5ba85452b31ec6f55490b08148612339d9\",\n                \"reference\": \"51b5ff5ba85452b31ec6f55490b08148612339d9\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=7.2\",\n                \"symfony/polyfill-intl-normalizer\": \"^1.10\"\n            },\n            \"suggest\": {\n                \"ext-intl\": \"For best performance\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"thanks\": {\n                    \"url\": \"https://github.com/symfony/polyfill\",\n                    \"name\": \"symfony/polyfill\"\n                }\n            },\n            \"autoload\": {\n                \"files\": [\n                    \"bootstrap.php\"\n                ],\n                \"psr-4\": {\n                    \"Symfony\\\\Polyfill\\\\Intl\\\\Idn\\\\\": \"\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Laurent Bassin\",\n                    \"email\": \"laurent@bassin.info\"\n                },\n                {\n                    \"name\": \"Trevor Rowbotham\",\n                    \"email\": \"trevor.rowbotham@pm.me\"\n                },\n                {\n                    \"name\": \"Symfony Community\",\n                    \"homepage\": \"https://symfony.com/contributors\"\n                }\n            ],\n            \"description\": \"Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions\",\n            \"homepage\": \"https://symfony.com\",\n            \"keywords\": [\n                \"compatibility\",\n                \"idn\",\n                \"intl\",\n                \"polyfill\",\n                \"portable\",\n                \"shim\"\n            ],\n            \"support\": {\n                \"source\": \"https://github.com/symfony/polyfill-intl-idn/tree/v1.42.0\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://symfony.com/sponsor\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://github.com/fabpot\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://github.com/nicolas-grekas\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"time\": \"2026-08-24T10:51:20+00:00\"\n        },\n        {\n            \"name\": \"symfony/polyfill-php80\",\n            \"version\": \"v1.37.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/symfony/polyfill-php80.git\",\n                \"reference\": \"dfb55726c3a76ea3b6459fcfda1ec2d80a682411\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/symfony/polyfill-php80/zipball/dfb55726c3a76ea3b6459fcfda1ec2d80a682411\",\n                \"reference\": \"dfb55726c3a76ea3b6459fcfda1ec2d80a682411\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=7.2\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"thanks\": {\n                    \"url\": \"https://github.com/symfony/polyfill\",\n                    \"name\": \"symfony/polyfill\"\n                }\n            },\n            \"autoload\": {\n                \"files\": [\n                    \"bootstrap.php\"\n                ],\n                \"psr-4\": {\n                    \"Symfony\\\\Polyfill\\\\Php80\\\\\": \"\"\n                },\n                \"classmap\": [\n                    \"Resources/stubs\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Ion Bazan\",\n                    \"email\": \"ion.bazan@gmail.com\"\n                },\n                {\n                    \"name\": \"Nicolas Grekas\",\n                    \"email\": \"p@tchwork.com\"\n                },\n                {\n                    \"name\": \"Symfony Community\",\n                    \"homepage\": \"https://symfony.com/contributors\"\n                }\n            ],\n            \"description\": \"Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions\",\n            \"homepage\": \"https://symfony.com\",\n            \"keywords\": [\n                \"compatibility\",\n                \"polyfill\",\n                \"portable\",\n                \"shim\"\n            ],\n            \"support\": {\n                \"source\": \"https://github.com/symfony/polyfill-php80/tree/v1.37.0\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://symfony.com/sponsor\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://github.com/fabpot\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://github.com/nicolas-grekas\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"time\": \"2026-04-10T16:19:22+00:00\"\n        },\n        {\n            \"name\": \"symfony/polyfill-php81\",\n            \"version\": \"v1.38.1\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/symfony/polyfill-php81.git\",\n                \"reference\": \"6bfb9c766cacffbc8e118cb87217d08ed84e5cd7\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/symfony/polyfill-php81/zipball/6bfb9c766cacffbc8e118cb87217d08ed84e5cd7\",\n                \"reference\": \"6bfb9c766cacffbc8e118cb87217d08ed84e5cd7\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=7.2\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"thanks\": {\n                    \"url\": \"https://github.com/symfony/polyfill\",\n                    \"name\": \"symfony/polyfill\"\n                }\n            },\n            \"autoload\": {\n                \"files\": [\n                    \"bootstrap.php\"\n                ],\n                \"psr-4\": {\n                    \"Symfony\\\\Polyfill\\\\Php81\\\\\": \"\"\n                },\n                \"classmap\": [\n                    \"Resources/stubs\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Nicolas Grekas\",\n                    \"email\": \"p@tchwork.com\"\n                },\n                {\n                    \"name\": \"Symfony Community\",\n                    \"homepage\": \"https://symfony.com/contributors\"\n                }\n            ],\n            \"description\": \"Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions\",\n            \"homepage\": \"https://symfony.com\",\n            \"keywords\": [\n                \"compatibility\",\n                \"polyfill\",\n                \"portable\",\n                \"shim\"\n            ],\n            \"support\": {\n                \"source\": \"https://github.com/symfony/polyfill-php81/tree/v1.38.1\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://symfony.com/sponsor\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://github.com/fabpot\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://github.com/nicolas-grekas\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"time\": \"2026-05-26T12:45:58+00:00\"\n        },\n        {\n            \"name\": \"symfony/polyfill-php83\",\n            \"version\": \"v1.41.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/symfony/polyfill-php83.git\",\n                \"reference\": \"5ea99087fb99c273a9b9236ed4c31e78b16103c6\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/symfony/polyfill-php83/zipball/5ea99087fb99c273a9b9236ed4c31e78b16103c6\",\n                \"reference\": \"5ea99087fb99c273a9b9236ed4c31e78b16103c6\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=7.2\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"thanks\": {\n                    \"url\": \"https://github.com/symfony/polyfill\",\n                    \"name\": \"symfony/polyfill\"\n                }\n            },\n            \"autoload\": {\n                \"files\": [\n                    \"bootstrap.php\"\n                ],\n                \"psr-4\": {\n                    \"Symfony\\\\Polyfill\\\\Php83\\\\\": \"\"\n                },\n                \"classmap\": [\n                    \"Resources/stubs\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Nicolas Grekas\",\n                    \"email\": \"p@tchwork.com\"\n                },\n                {\n                    \"name\": \"Symfony Community\",\n                    \"homepage\": \"https://symfony.com/contributors\"\n                }\n            ],\n            \"description\": \"Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions\",\n            \"homepage\": \"https://symfony.com\",\n            \"keywords\": [\n                \"compatibility\",\n                \"polyfill\",\n                \"portable\",\n                \"shim\"\n            ],\n            \"support\": {\n                \"source\": \"https://github.com/symfony/polyfill-php83/tree/v1.41.0\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://symfony.com/sponsor\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://github.com/fabpot\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://github.com/nicolas-grekas\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"time\": \"2026-07-01T12:47:55+00:00\"\n        },\n        {\n            \"name\": \"symfony/polyfill-php84\",\n            \"version\": \"v1.38.1\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/symfony/polyfill-php84.git\",\n                \"reference\": \"f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/symfony/polyfill-php84/zipball/f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa\",\n                \"reference\": \"f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=7.2\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"thanks\": {\n                    \"url\": \"https://github.com/symfony/polyfill\",\n                    \"name\": \"symfony/polyfill\"\n                }\n            },\n            \"autoload\": {\n                \"files\": [\n                    \"bootstrap.php\"\n                ],\n                \"psr-4\": {\n                    \"Symfony\\\\Polyfill\\\\Php84\\\\\": \"\"\n                },\n                \"classmap\": [\n                    \"Resources/stubs\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Nicolas Grekas\",\n                    \"email\": \"p@tchwork.com\"\n                },\n                {\n                    \"name\": \"Symfony Community\",\n                    \"homepage\": \"https://symfony.com/contributors\"\n                }\n            ],\n            \"description\": \"Symfony polyfill backporting some PHP 8.4+ features to lower PHP versions\",\n            \"homepage\": \"https://symfony.com\",\n            \"keywords\": [\n                \"compatibility\",\n                \"polyfill\",\n                \"portable\",\n                \"shim\"\n            ],\n            \"support\": {\n                \"source\": \"https://github.com/symfony/polyfill-php84/tree/v1.38.1\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://symfony.com/sponsor\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://github.com/fabpot\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://github.com/nicolas-grekas\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"time\": \"2026-05-26T12:51:13+00:00\"\n        },\n        {\n            \"name\": \"symfony/polyfill-php85\",\n            \"version\": \"v1.41.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/symfony/polyfill-php85.git\",\n                \"reference\": \"255fab485aaa1006ed411040c42aecd7b5302d7a\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/symfony/polyfill-php85/zipball/255fab485aaa1006ed411040c42aecd7b5302d7a\",\n                \"reference\": \"255fab485aaa1006ed411040c42aecd7b5302d7a\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=7.2\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"thanks\": {\n                    \"url\": \"https://github.com/symfony/polyfill\",\n                    \"name\": \"symfony/polyfill\"\n                }\n            },\n            \"autoload\": {\n                \"files\": [\n                    \"bootstrap.php\"\n                ],\n                \"psr-4\": {\n                    \"Symfony\\\\Polyfill\\\\Php85\\\\\": \"\"\n                },\n                \"classmap\": [\n                    \"Resources/stubs\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Nicolas Grekas\",\n                    \"email\": \"p@tchwork.com\"\n                },\n                {\n                    \"name\": \"Symfony Community\",\n                    \"homepage\": \"https://symfony.com/contributors\"\n                }\n            ],\n            \"description\": \"Symfony polyfill backporting some PHP 8.5+ features to lower PHP versions\",\n            \"homepage\": \"https://symfony.com\",\n            \"keywords\": [\n                \"compatibility\",\n                \"polyfill\",\n                \"portable\",\n                \"shim\"\n            ],\n            \"support\": {\n                \"source\": \"https://github.com/symfony/polyfill-php85/tree/v1.41.0\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://symfony.com/sponsor\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://github.com/fabpot\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://github.com/nicolas-grekas\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"time\": \"2026-07-01T12:47:55+00:00\"\n        },\n        {\n            \"name\": \"symfony/polyfill-uuid\",\n            \"version\": \"v1.37.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/symfony/polyfill-uuid.git\",\n                \"reference\": \"26dfec253c4cf3e51b541b52ddf7e42cb0908e94\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/symfony/polyfill-uuid/zipball/26dfec253c4cf3e51b541b52ddf7e42cb0908e94\",\n                \"reference\": \"26dfec253c4cf3e51b541b52ddf7e42cb0908e94\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=7.2\"\n            },\n            \"provide\": {\n                \"ext-uuid\": \"*\"\n            },\n            \"suggest\": {\n                \"ext-uuid\": \"For best performance\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"thanks\": {\n                    \"url\": \"https://github.com/symfony/polyfill\",\n                    \"name\": \"symfony/polyfill\"\n                }\n            },\n            \"autoload\": {\n                \"files\": [\n                    \"bootstrap.php\"\n                ],\n                \"psr-4\": {\n                    \"Symfony\\\\Polyfill\\\\Uuid\\\\\": \"\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Grégoire Pineau\",\n                    \"email\": \"lyrixx@lyrixx.info\"\n                },\n                {\n                    \"name\": \"Symfony Community\",\n                    \"homepage\": \"https://symfony.com/contributors\"\n                }\n            ],\n            \"description\": \"Symfony polyfill for uuid functions\",\n            \"homepage\": \"https://symfony.com\",\n            \"keywords\": [\n                \"compatibility\",\n                \"polyfill\",\n                \"portable\",\n                \"uuid\"\n            ],\n            \"support\": {\n                \"source\": \"https://github.com/symfony/polyfill-uuid/tree/v1.37.0\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://symfony.com/sponsor\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://github.com/fabpot\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://github.com/nicolas-grekas\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"time\": \"2026-04-10T16:19:22+00:00\"\n        },\n        {\n            \"name\": \"symfony/process\",\n            \"version\": \"v7.4.18\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/symfony/process.git\",\n                \"reference\": \"058d17fc284cce14efb2385783b55014a461b176\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/symfony/process/zipball/058d17fc284cce14efb2385783b55014a461b176\",\n                \"reference\": \"058d17fc284cce14efb2385783b55014a461b176\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=8.2\"\n            },\n            \"type\": \"library\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Symfony\\\\Component\\\\Process\\\\\": \"\"\n                },\n                \"exclude-from-classmap\": [\n                    \"/Tests/\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Fabien Potencier\",\n                    \"email\": \"fabien@symfony.com\"\n                },\n                {\n                    \"name\": \"Symfony Community\",\n                    \"homepage\": \"https://symfony.com/contributors\"\n                }\n            ],\n            \"description\": \"Executes commands in sub-processes\",\n            \"homepage\": \"https://symfony.com\",\n            \"support\": {\n                \"source\": \"https://github.com/symfony/process/tree/v7.4.18\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://symfony.com/sponsor\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://github.com/fabpot\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://github.com/nicolas-grekas\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"time\": \"2026-08-21T17:40:08+00:00\"\n        },\n        {\n            \"name\": \"symfony/routing\",\n            \"version\": \"v7.4.18\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/symfony/routing.git\",\n                \"reference\": \"ddd558991e98f693ae6bf5063cc1b0362c6bbec3\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/symfony/routing/zipball/ddd558991e98f693ae6bf5063cc1b0362c6bbec3\",\n                \"reference\": \"ddd558991e98f693ae6bf5063cc1b0362c6bbec3\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=8.2\",\n                \"symfony/deprecation-contracts\": \"^2.5|^3\"\n            },\n            \"conflict\": {\n                \"symfony/config\": \"<6.4\",\n                \"symfony/dependency-injection\": \"<6.4\",\n                \"symfony/yaml\": \"<6.4\"\n            },\n            \"require-dev\": {\n                \"psr/log\": \"^1|^2|^3\",\n                \"symfony/config\": \"^6.4|^7.0|^8.0\",\n                \"symfony/dependency-injection\": \"^6.4|^7.0|^8.0\",\n                \"symfony/expression-language\": \"^6.4|^7.0|^8.0\",\n                \"symfony/http-foundation\": \"^6.4|^7.0|^8.0\",\n                \"symfony/yaml\": \"^6.4|^7.0|^8.0\"\n            },\n            \"type\": \"library\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Symfony\\\\Component\\\\Routing\\\\\": \"\"\n                },\n                \"exclude-from-classmap\": [\n                    \"/Tests/\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Fabien Potencier\",\n                    \"email\": \"fabien@symfony.com\"\n                },\n                {\n                    \"name\": \"Symfony Community\",\n                    \"homepage\": \"https://symfony.com/contributors\"\n                }\n            ],\n            \"description\": \"Maps an HTTP request to a set of configuration variables\",\n            \"homepage\": \"https://symfony.com\",\n            \"keywords\": [\n                \"router\",\n                \"routing\",\n                \"uri\",\n                \"url\"\n            ],\n            \"support\": {\n                \"source\": \"https://github.com/symfony/routing/tree/v7.4.18\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://symfony.com/sponsor\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://github.com/fabpot\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://github.com/nicolas-grekas\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"time\": \"2026-08-17T13:12:36+00:00\"\n        },\n        {\n            \"name\": \"symfony/stopwatch\",\n            \"version\": \"v7.4.8\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/symfony/stopwatch.git\",\n                \"reference\": \"70a852d72fec4d51efb1f48dcd968efcaf5ccb89\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/symfony/stopwatch/zipball/70a852d72fec4d51efb1f48dcd968efcaf5ccb89\",\n                \"reference\": \"70a852d72fec4d51efb1f48dcd968efcaf5ccb89\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=8.2\",\n                \"symfony/service-contracts\": \"^2.5|^3\"\n            },\n            \"type\": \"library\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Symfony\\\\Component\\\\Stopwatch\\\\\": \"\"\n                },\n                \"exclude-from-classmap\": [\n                    \"/Tests/\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Fabien Potencier\",\n                    \"email\": \"fabien@symfony.com\"\n                },\n                {\n                    \"name\": \"Symfony Community\",\n                    \"homepage\": \"https://symfony.com/contributors\"\n                }\n            ],\n            \"description\": \"Provides a way to profile code\",\n            \"homepage\": \"https://symfony.com\",\n            \"support\": {\n                \"source\": \"https://github.com/symfony/stopwatch/tree/v7.4.8\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://symfony.com/sponsor\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://github.com/fabpot\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://github.com/nicolas-grekas\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"time\": \"2026-03-24T13:12:05+00:00\"\n        },\n        {\n            \"name\": \"symfony/translation\",\n            \"version\": \"v7.4.17\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/symfony/translation.git\",\n                \"reference\": \"2ee1e4a3b32a528a642babe041ff7c440b213b4b\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/symfony/translation/zipball/2ee1e4a3b32a528a642babe041ff7c440b213b4b\",\n                \"reference\": \"2ee1e4a3b32a528a642babe041ff7c440b213b4b\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=8.2\",\n                \"symfony/deprecation-contracts\": \"^2.5|^3\",\n                \"symfony/polyfill-mbstring\": \"~1.0\",\n                \"symfony/translation-contracts\": \"^2.5.3|^3.3\"\n            },\n            \"conflict\": {\n                \"nikic/php-parser\": \"<5.0\",\n                \"symfony/config\": \"<6.4\",\n                \"symfony/console\": \"<6.4\",\n                \"symfony/dependency-injection\": \"<6.4\",\n                \"symfony/http-client-contracts\": \"<2.5\",\n                \"symfony/http-kernel\": \"<6.4\",\n                \"symfony/service-contracts\": \"<2.5\",\n                \"symfony/twig-bundle\": \"<6.4\",\n                \"symfony/yaml\": \"<6.4\"\n            },\n            \"provide\": {\n                \"symfony/translation-implementation\": \"2.3|3.0\"\n            },\n            \"require-dev\": {\n                \"nikic/php-parser\": \"^5.0\",\n                \"psr/log\": \"^1|^2|^3\",\n                \"symfony/config\": \"^6.4|^7.0|^8.0\",\n                \"symfony/console\": \"^6.4|^7.0|^8.0\",\n                \"symfony/dependency-injection\": \"^6.4|^7.0|^8.0\",\n                \"symfony/finder\": \"^6.4|^7.0|^8.0\",\n                \"symfony/http-client-contracts\": \"^2.5|^3.0\",\n                \"symfony/http-kernel\": \"^6.4|^7.0|^8.0\",\n                \"symfony/intl\": \"^6.4|^7.0|^8.0\",\n                \"symfony/polyfill-intl-icu\": \"^1.21\",\n                \"symfony/routing\": \"^6.4|^7.0|^8.0\",\n                \"symfony/service-contracts\": \"^2.5|^3\",\n                \"symfony/yaml\": \"^6.4|^7.0|^8.0\"\n            },\n            \"type\": \"library\",\n            \"autoload\": {\n                \"files\": [\n                    \"Resources/functions.php\"\n                ],\n                \"psr-4\": {\n                    \"Symfony\\\\Component\\\\Translation\\\\\": \"\"\n                },\n                \"exclude-from-classmap\": [\n                    \"/Tests/\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Fabien Potencier\",\n                    \"email\": \"fabien@symfony.com\"\n                },\n                {\n                    \"name\": \"Symfony Community\",\n                    \"homepage\": \"https://symfony.com/contributors\"\n                }\n            ],\n            \"description\": \"Provides tools to internationalize your application\",\n            \"homepage\": \"https://symfony.com\",\n            \"support\": {\n                \"source\": \"https://github.com/symfony/translation/tree/v7.4.17\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://symfony.com/sponsor\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://github.com/fabpot\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://github.com/nicolas-grekas\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"time\": \"2026-08-21T17:40:08+00:00\"\n        },\n        {\n            \"name\": \"symfony/translation-contracts\",\n            \"version\": \"v3.7.1\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/symfony/translation-contracts.git\",\n                \"reference\": \"ccb206b98faccc511ebae8e5fad50f2dc0b30621\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/symfony/translation-contracts/zipball/ccb206b98faccc511ebae8e5fad50f2dc0b30621\",\n                \"reference\": \"ccb206b98faccc511ebae8e5fad50f2dc0b30621\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=8.1\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"thanks\": {\n                    \"url\": \"https://github.com/symfony/contracts\",\n                    \"name\": \"symfony/contracts\"\n                },\n                \"branch-alias\": {\n                    \"dev-main\": \"3.7-dev\"\n                }\n            },\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Symfony\\\\Contracts\\\\Translation\\\\\": \"\"\n                },\n                \"exclude-from-classmap\": [\n                    \"/Test/\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Nicolas Grekas\",\n                    \"email\": \"p@tchwork.com\"\n                },\n                {\n                    \"name\": \"Symfony Community\",\n                    \"homepage\": \"https://symfony.com/contributors\"\n                }\n            ],\n            \"description\": \"Generic abstractions related to translation\",\n            \"homepage\": \"https://symfony.com\",\n            \"keywords\": [\n                \"abstractions\",\n                \"contracts\",\n                \"decoupling\",\n                \"interfaces\",\n                \"interoperability\",\n                \"standards\"\n            ],\n            \"support\": {\n                \"source\": \"https://github.com/symfony/translation-contracts/tree/v3.7.1\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://symfony.com/sponsor\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://github.com/fabpot\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://github.com/nicolas-grekas\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"time\": \"2026-06-05T06:23:12+00:00\"\n        },\n        {\n            \"name\": \"symfony/uid\",\n            \"version\": \"v7.4.17\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/symfony/uid.git\",\n                \"reference\": \"69d732355a139c6f8881337d28515aa01f12b8be\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/symfony/uid/zipball/69d732355a139c6f8881337d28515aa01f12b8be\",\n                \"reference\": \"69d732355a139c6f8881337d28515aa01f12b8be\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=8.2\",\n                \"symfony/polyfill-uuid\": \"^1.15\"\n            },\n            \"require-dev\": {\n                \"symfony/console\": \"^6.4|^7.0|^8.0\"\n            },\n            \"type\": \"library\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Symfony\\\\Component\\\\Uid\\\\\": \"\"\n                },\n                \"exclude-from-classmap\": [\n                    \"/Tests/\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Grégoire Pineau\",\n                    \"email\": \"lyrixx@lyrixx.info\"\n                },\n                {\n                    \"name\": \"Nicolas Grekas\",\n                    \"email\": \"p@tchwork.com\"\n                },\n                {\n                    \"name\": \"Symfony Community\",\n                    \"homepage\": \"https://symfony.com/contributors\"\n                }\n            ],\n            \"description\": \"Provides an object-oriented API to generate and represent UIDs\",\n            \"homepage\": \"https://symfony.com\",\n            \"keywords\": [\n                \"UID\",\n                \"ulid\",\n                \"uuid\"\n            ],\n            \"support\": {\n                \"source\": \"https://github.com/symfony/uid/tree/v7.4.17\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://symfony.com/sponsor\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://github.com/fabpot\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://github.com/nicolas-grekas\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"time\": \"2026-08-11T07:38:58+00:00\"\n        },\n        {\n            \"name\": \"symfony/var-dumper\",\n            \"version\": \"v7.4.18\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/symfony/var-dumper.git\",\n                \"reference\": \"e088da50b813f32473a76871616cbb8fa54653a8\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/symfony/var-dumper/zipball/e088da50b813f32473a76871616cbb8fa54653a8\",\n                \"reference\": \"e088da50b813f32473a76871616cbb8fa54653a8\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=8.2\",\n                \"symfony/deprecation-contracts\": \"^2.5|^3\",\n                \"symfony/polyfill-mbstring\": \"~1.0\"\n            },\n            \"conflict\": {\n                \"symfony/console\": \"<6.4\"\n            },\n            \"require-dev\": {\n                \"symfony/console\": \"^6.4|^7.0|^8.0\",\n                \"symfony/http-kernel\": \"^6.4|^7.0|^8.0\",\n                \"symfony/process\": \"^6.4|^7.0|^8.0\",\n                \"symfony/uid\": \"^6.4|^7.0|^8.0\",\n                \"twig/twig\": \"^3.12|^4.0\"\n            },\n            \"bin\": [\n                \"Resources/bin/var-dump-server\"\n            ],\n            \"type\": \"library\",\n            \"autoload\": {\n                \"files\": [\n                    \"Resources/functions/dump.php\"\n                ],\n                \"psr-4\": {\n                    \"Symfony\\\\Component\\\\VarDumper\\\\\": \"\"\n                },\n                \"exclude-from-classmap\": [\n                    \"/Tests/\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Nicolas Grekas\",\n                    \"email\": \"p@tchwork.com\"\n                },\n                {\n                    \"name\": \"Symfony Community\",\n                    \"homepage\": \"https://symfony.com/contributors\"\n                }\n            ],\n            \"description\": \"Provides mechanisms for walking through any arbitrary PHP variable\",\n            \"homepage\": \"https://symfony.com\",\n            \"keywords\": [\n                \"debug\",\n                \"dump\"\n            ],\n            \"support\": {\n                \"source\": \"https://github.com/symfony/var-dumper/tree/v7.4.18\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://symfony.com/sponsor\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://github.com/fabpot\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://github.com/nicolas-grekas\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"time\": \"2026-08-30T20:10:52+00:00\"\n        },\n        {\n            \"name\": \"theseer/tokenizer\",\n            \"version\": \"1.3.1\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/theseer/tokenizer.git\",\n                \"reference\": \"b7489ce515e168639d17feec34b8847c326b0b3c\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/theseer/tokenizer/zipball/b7489ce515e168639d17feec34b8847c326b0b3c\",\n                \"reference\": \"b7489ce515e168639d17feec34b8847c326b0b3c\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"ext-dom\": \"*\",\n                \"ext-tokenizer\": \"*\",\n                \"ext-xmlwriter\": \"*\",\n                \"php\": \"^7.2 || ^8.0\"\n            },\n            \"type\": \"library\",\n            \"autoload\": {\n                \"classmap\": [\n                    \"src/\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"BSD-3-Clause\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Arne Blankerts\",\n                    \"email\": \"arne@blankerts.de\",\n                    \"role\": \"Developer\"\n                }\n            ],\n            \"description\": \"A small library for converting tokenized PHP source code into XML and potentially other formats\",\n            \"support\": {\n                \"issues\": \"https://github.com/theseer/tokenizer/issues\",\n                \"source\": \"https://github.com/theseer/tokenizer/tree/1.3.1\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://github.com/theseer\",\n                    \"type\": \"github\"\n                }\n            ],\n            \"time\": \"2025-11-17T20:03:58+00:00\"\n        },\n        {\n            \"name\": \"tijsverkoyen/css-to-inline-styles\",\n            \"version\": \"v2.4.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/tijsverkoyen/CssToInlineStyles.git\",\n                \"reference\": \"f0292ccf0ec75843d65027214426b6b163b48b41\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/f0292ccf0ec75843d65027214426b6b163b48b41\",\n                \"reference\": \"f0292ccf0ec75843d65027214426b6b163b48b41\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"ext-dom\": \"*\",\n                \"ext-libxml\": \"*\",\n                \"php\": \"^7.4 || ^8.0\",\n                \"symfony/css-selector\": \"^5.4 || ^6.0 || ^7.0 || ^8.0\"\n            },\n            \"require-dev\": {\n                \"phpstan/phpstan\": \"^2.0\",\n                \"phpstan/phpstan-phpunit\": \"^2.0\",\n                \"phpunit/phpunit\": \"^8.5.21 || ^9.5.10\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-master\": \"2.x-dev\"\n                }\n            },\n            \"autoload\": {\n                \"psr-4\": {\n                    \"TijsVerkoyen\\\\CssToInlineStyles\\\\\": \"src\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"BSD-3-Clause\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Tijs Verkoyen\",\n                    \"email\": \"css_to_inline_styles@verkoyen.eu\",\n                    \"role\": \"Developer\"\n                }\n            ],\n            \"description\": \"CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.\",\n            \"homepage\": \"https://github.com/tijsverkoyen/CssToInlineStyles\",\n            \"support\": {\n                \"issues\": \"https://github.com/tijsverkoyen/CssToInlineStyles/issues\",\n                \"source\": \"https://github.com/tijsverkoyen/CssToInlineStyles/tree/v2.4.0\"\n            },\n            \"time\": \"2025-12-02T11:56:42+00:00\"\n        },\n        {\n            \"name\": \"vlucas/phpdotenv\",\n            \"version\": \"v5.7.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/vlucas/phpdotenv.git\",\n                \"reference\": \"301c07936b16d88628b126b01d082ba153cf4c40\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/vlucas/phpdotenv/zipball/301c07936b16d88628b126b01d082ba153cf4c40\",\n                \"reference\": \"301c07936b16d88628b126b01d082ba153cf4c40\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"ext-pcre\": \"*\",\n                \"graham-campbell/result-type\": \"^1.2\",\n                \"php\": \"^7.2.5 || ^8.0\",\n                \"phpoption/phpoption\": \"^1.10\",\n                \"symfony/polyfill-ctype\": \"^1.26\",\n                \"symfony/polyfill-mbstring\": \"^1.26\",\n                \"symfony/polyfill-php80\": \"^1.26\"\n            },\n            \"require-dev\": {\n                \"bamarni/composer-bin-plugin\": \"^1.8.2\",\n                \"ext-filter\": \"*\",\n                \"phpunit/phpunit\": \"^8.5.34 || ^9.6.13 || ^10.4.2\"\n            },\n            \"suggest\": {\n                \"ext-filter\": \"Required to use the boolean validator.\"\n            },\n            \"type\": \"library\",\n            \"extra\": {\n                \"bamarni-bin\": {\n                    \"bin-links\": true,\n                    \"forward-command\": false\n                },\n                \"branch-alias\": {\n                    \"dev-master\": \"5.6-dev\"\n                }\n            },\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Dotenv\\\\\": \"src/\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"BSD-3-Clause\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Graham Campbell\",\n                    \"email\": \"hello@gjcampbell.co.uk\",\n                    \"homepage\": \"https://github.com/GrahamCampbell\"\n                },\n                {\n                    \"name\": \"Vance Lucas\",\n                    \"email\": \"vance@vancelucas.com\",\n                    \"homepage\": \"https://github.com/vlucas\"\n                }\n            ],\n            \"description\": \"Loads environment variables from `.env` to `$_ENV` and `$_SERVER` automagically, and optionally to `getenv()`.\",\n            \"keywords\": [\n                \"dotenv\",\n                \"env\",\n                \"environment\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/vlucas/phpdotenv/issues\",\n                \"source\": \"https://github.com/vlucas/phpdotenv/tree/v5.7.0\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://github.com/GrahamCampbell\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/vlucas/phpdotenv\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"time\": \"2026-08-24T18:07:49+00:00\"\n        },\n        {\n            \"name\": \"voku/portable-ascii\",\n            \"version\": \"2.1.1\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/voku/portable-ascii.git\",\n                \"reference\": \"8e1051fe39379367aecf014f41744ce7539a856f\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/voku/portable-ascii/zipball/8e1051fe39379367aecf014f41744ce7539a856f\",\n                \"reference\": \"8e1051fe39379367aecf014f41744ce7539a856f\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=7.1.0\"\n            },\n            \"require-dev\": {\n                \"phpunit/phpunit\": \"~8.5 || ~9.6 || ~10.5 || ~11.5\"\n            },\n            \"suggest\": {\n                \"ext-intl\": \"Use Intl for transliterator_transliterate() support\"\n            },\n            \"type\": \"library\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"voku\\\\\": \"src/voku/\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Lars Moelleken\",\n                    \"homepage\": \"https://www.moelleken.org/\"\n                }\n            ],\n            \"description\": \"Portable ASCII library - performance optimized (ascii) string functions for php.\",\n            \"homepage\": \"https://github.com/voku/portable-ascii\",\n            \"keywords\": [\n                \"ascii\",\n                \"clean\",\n                \"php\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/voku/portable-ascii/issues\",\n                \"source\": \"https://github.com/voku/portable-ascii/tree/2.1.1\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://www.paypal.me/moelleken\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://github.com/voku\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://opencollective.com/portable-ascii\",\n                    \"type\": \"open_collective\"\n                },\n                {\n                    \"url\": \"https://www.patreon.com/voku\",\n                    \"type\": \"patreon\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/voku/portable-ascii\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"time\": \"2026-04-26T05:33:54+00:00\"\n        }\n    ],\n    \"aliases\": [],\n    \"minimum-stability\": \"stable\",\n    \"stability-flags\": {},\n    \"prefer-stable\": true,\n    \"prefer-lowest\": false,\n    \"platform\": {\n        \"php\": \"^8.2\",\n        \"ext-json\": \"*\",\n        \"ext-mbstring\": \"*\"\n    },\n    \"platform-dev\": {},\n    \"platform-overrides\": {\n        \"php\": \"8.2.0\"\n    },\n    \"plugin-api-version\": \"2.9.0\"\n}\n","src/Analyzer/AnalysisRequest.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Analyzer;\n\nuse WorkerSafety\\Ast\\Index\\ContainerBindingCollector;\nuse WorkerSafety\\Config\\Configuration;\nuse WorkerSafety\\Framework\\DetectedFramework;\nuse WorkerSafety\\Rule\\Rule;\nuse WorkerSafety\\Runtime\\RuntimeTargetSet;\n\n/**\n * Everything an analyzer needs for one run.\n */\nfinal class AnalysisRequest\n{\n    /**\n     * @param list<string> $files absolute paths\n     * @param list<Rule> $rules\n     * @param list<ContainerBindingCollector> $bindingCollectors\n     */\n    public function __construct(\n        public readonly string $projectRoot,\n        public readonly array $files,\n        public readonly Configuration $configuration,\n        public readonly DetectedFramework $framework,\n        public readonly RuntimeTargetSet $runtimes,\n        public readonly array $rules,\n        public readonly array $bindingCollectors = [],\n    ) {\n    }\n}\n","src/Analyzer/AnalysisResult.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Analyzer;\n\nuse WorkerSafety\\Ast\\Index\\ProjectIndex;\nuse WorkerSafety\\Ast\\ParseFailure;\nuse WorkerSafety\\Finding\\FindingCollection;\n\n/**\n * Outcome of an analysis run.\n *\n * Produced by the static analyzer today; a runtime analyzer would produce the\n * same object, which is what keeps the reporting layer reusable.\n */\nfinal class AnalysisResult\n{\n    /**\n     * @param list<ParseFailure> $parseFailures\n     */\n    public function __construct(\n        public readonly FindingCollection $findings,\n        public readonly int $filesScanned,\n        public readonly array $parseFailures,\n        public readonly int $suppressedCount,\n        public readonly ProjectIndex $index,\n        public readonly float $durationSeconds,\n    ) {\n    }\n\n    public function parseFailureCount(): int\n    {\n        return count($this->parseFailures);\n    }\n}\n","src/Analyzer/Analyzer.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Analyzer;\n\n/**\n * Produces findings for a project.\n *\n * The static implementation is {@see ProjectAnalyzer}. A future runtime\n * analyzer (driving a real FrankenPHP/Octane worker) can implement the same\n * contract so that configuration, baselines and reporting stay shared.\n */\ninterface Analyzer\n{\n    /**\n     * @param (callable(int, int, string): void)|null $onFile invoked before each file\n     */\n    public function analyze(AnalysisRequest $request, ?callable $onFile = null): AnalysisResult;\n}\n","src/Analyzer/FileAnalysisResult.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Analyzer;\n\nuse WorkerSafety\\Ast\\ParseFailure;\nuse WorkerSafety\\Finding\\Finding;\nuse WorkerSafety\\Ignore\\SuppressionIndex;\n\n/**\n * Outcome of analyzing a single file.\n */\nfinal class FileAnalysisResult\n{\n    /**\n     * @param list<Finding> $findings\n     * @param list<ParseFailure> $parseFailures\n     */\n    public function __construct(\n        public readonly array $findings,\n        public readonly array $parseFailures,\n        public readonly SuppressionIndex $suppressions,\n        public readonly bool $analyzed,\n    ) {\n    }\n}\n","src/Analyzer/FileAnalyzer.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Analyzer;\n\nuse PhpParser\\NodeTraverser;\nuse WorkerSafety\\Ast\\AstParser;\nuse WorkerSafety\\Ast\\Index\\ContainerBindingCollector;\nuse WorkerSafety\\Ast\\Visitor\\IndexCollectingVisitor;\nuse WorkerSafety\\Ast\\Visitor\\RuleDispatchVisitor;\nuse WorkerSafety\\Ignore\\IgnoreAttributeVisitor;\nuse WorkerSafety\\Ignore\\IgnoreDirectiveParser;\nuse WorkerSafety\\Rule\\ProjectContext;\nuse WorkerSafety\\Rule\\Rule;\nuse WorkerSafety\\Rule\\RuleContext;\nuse WorkerSafety\\Rule\\Scope;\nuse WorkerSafety\\Support\\SourceFile;\n\n/**\n * Analyzes one file: parse once, then walk the AST once.\n *\n * The single walk drives three visitors — semantic index collection, ignore\n * attribute collection and rule dispatch — so adding a rule never costs\n * another pass over the tree.\n */\nfinal class FileAnalyzer\n{\n    public function __construct(\n        private readonly AstParser $parser = new AstParser(),\n        private readonly IgnoreDirectiveParser $ignoreParser = new IgnoreDirectiveParser(),\n    ) {\n    }\n\n    /**\n     * @param list<Rule> $rules\n     * @param list<ContainerBindingCollector> $bindingCollectors\n     */\n    public function analyze(\n        SourceFile $file,\n        array $rules,\n        ProjectContext $project,\n        array $bindingCollectors = [],\n    ): FileAnalysisResult {\n        $suppressions = $this->ignoreParser->parse($file);\n        $parsed = $this->parser->parse($file);\n\n        if (!$parsed->usable) {\n            return new FileAnalysisResult([], $parsed->failures, $suppressions, false);\n        }\n\n        $scope = new Scope();\n        $context = new RuleContext($file, $scope, $project);\n\n        foreach ($rules as $rule) {\n            $rule->beginFile($context);\n        }\n\n        $dispatcher = new RuleDispatchVisitor($rules, $scope);\n        $dispatcher->startFile($context);\n\n        $traverser = new NodeTraverser(\n            new IndexCollectingVisitor($project->index(), $file, $bindingCollectors),\n            new IgnoreAttributeVisitor($suppressions),\n            $dispatcher,\n        );\n\n        $traverser->traverse($parsed->statements);\n\n        $findings = $dispatcher->findings();\n\n        foreach ($rules as $rule) {\n            foreach ($rule->finishFile($context) as $finding) {\n                $findings[] = $finding;\n            }\n        }\n\n        return new FileAnalysisResult($findings, $parsed->failures, $suppressions, true);\n    }\n}\n","src/Analyzer/ProjectAnalyzer.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Analyzer;\n\nuse WorkerSafety\\Ast\\Index\\ProjectIndex;\nuse WorkerSafety\\Ast\\ParseFailure;\nuse WorkerSafety\\Finding\\Finding;\nuse WorkerSafety\\Finding\\FindingCollection;\nuse WorkerSafety\\Ignore\\FindingSuppressor;\nuse WorkerSafety\\Rule\\ProjectContext;\nuse WorkerSafety\\Support\\Paths;\nuse WorkerSafety\\Support\\SourceFile;\n\n/**\n * Static analyzer: walks every discovered file once, then lets the rules that\n * need whole-project knowledge emit their findings.\n *\n * Files are read and released one at a time, so peak memory is bounded by the\n * largest single file plus the semantic index — not by the project size in\n * bytes.\n */\nfinal class ProjectAnalyzer implements Analyzer\n{\n    public function __construct(private readonly FileAnalyzer $fileAnalyzer = new FileAnalyzer())\n    {\n    }\n\n    public function analyze(AnalysisRequest $request, ?callable $onFile = null): AnalysisResult\n    {\n        $startedAt = microtime(true);\n\n        $index = new ProjectIndex();\n        $project = new ProjectContext($index, $request->framework, $request->runtimes, $request->projectRoot);\n        $suppressor = new FindingSuppressor($request->configuration);\n\n        /** @var list<Finding> $findings */\n        $findings = [];\n        /** @var list<ParseFailure> $parseFailures */\n        $parseFailures = [];\n\n        $total = count($request->files);\n        $scanned = 0;\n        $position = 0;\n\n        foreach ($request->files as $path) {\n            ++$position;\n            $relative = Paths::makeRelative($path, $request->projectRoot);\n\n            if ($onFile !== null) {\n                $onFile($position, $total, $relative);\n            }\n\n            $source = $this->read($path);\n\n            if ($source === null) {\n                // Treating an unreadable file as an empty one would report a\n                // clean scan for code nobody looked at.\n                $parseFailures[] = new ParseFailure(\n                    $relative,\n                    $path,\n                    1,\n                    'File could not be read (check permissions, or it was removed during the scan).',\n                    true,\n                );\n\n                continue;\n            }\n\n            $file = new SourceFile($path, $relative, $source);\n            $result = $this->fileAnalyzer->analyze($file, $request->rules, $project, $request->bindingCollectors);\n\n            foreach ($result->parseFailures as $failure) {\n                $parseFailures[] = $failure;\n            }\n\n            $suppressor->addFileIndex($path, $result->suppressions);\n\n            foreach ($result->findings as $finding) {\n                $findings[] = $finding;\n            }\n\n            if ($result->analyzed) {\n                ++$scanned;\n            }\n        }\n\n        foreach ($request->rules as $rule) {\n            foreach ($rule->finishProject($project) as $finding) {\n                $findings[] = $finding;\n            }\n        }\n\n        $suppressed = 0;\n        $kept = [];\n\n        foreach ($findings as $finding) {\n            // The configured severity always wins over the severity the rule computed.\n            $finding = $finding->withSeverity(\n                $request->configuration->severityFor($finding->ruleId, $finding->severity),\n            );\n\n            if ($suppressor->isSuppressed($finding)) {\n                ++$suppressed;\n\n                continue;\n            }\n\n            $kept[] = $finding;\n        }\n\n        return new AnalysisResult(\n            (new FindingCollection($kept))->sorted(),\n            $scanned,\n            $parseFailures,\n            $suppressed,\n            $index,\n            microtime(true) - $startedAt,\n        );\n    }\n\n    /**\n     * File contents, or null when the file cannot be read.\n     */\n    private function read(string $path): ?string\n    {\n        if (!is_file($path) || !is_readable($path)) {\n            return null;\n        }\n\n        $source = @file_get_contents($path);\n\n        return $source === false ? null : $source;\n    }\n}\n","src/Analyzer/ScanOptions.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Analyzer;\n\nuse WorkerSafety\\Runtime\\RuntimeTargetSet;\n\n/**\n * CLI-level overrides for a scan.\n *\n * Every override is nullable so that \"not given on the command line\" stays\n * distinguishable from \"explicitly set to the default\".\n */\nfinal class ScanOptions\n{\n    /**\n     * @param list<string> $paths\n     */\n    public function __construct(\n        public readonly string $projectRoot,\n        public readonly array $paths = [],\n        public readonly ?string $configPath = null,\n        public readonly ?RuntimeTargetSet $runtimes = null,\n        public readonly ?string $failOn = null,\n        public readonly bool $ignoreBaseline = false,\n        public readonly ?string $baselinePath = null,\n        public readonly bool $allowParseErrors = false,\n    ) {\n    }\n}\n","src/Analyzer/ScanOutcome.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Analyzer;\n\nuse WorkerSafety\\Config\\Configuration;\nuse WorkerSafety\\Finding\\FindingCollection;\nuse WorkerSafety\\Reporting\\ScanReport;\nuse WorkerSafety\\Rule\\RuleRegistry;\n\n/**\n * Everything a caller might need after a scan.\n */\nfinal class ScanOutcome\n{\n    public function __construct(\n        public readonly ScanReport $report,\n        public readonly FindingCollection $findingsBeforeBaseline,\n        public readonly RuleRegistry $registry,\n        public readonly Configuration $configuration,\n    ) {\n    }\n}\n","src/Analyzer/ScanPathResolver.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Analyzer;\n\nuse WorkerSafety\\Exception\\AnalysisException;\nuse WorkerSafety\\Framework\\FrameworkAdapter;\nuse WorkerSafety\\Support\\Paths;\n\n/**\n * Decides what to scan.\n *\n * Precedence: CLI arguments, then the configuration file, then the framework\n * adapter's defaults (only those that exist), then the project root.\n */\nfinal class ScanPathResolver\n{\n    /**\n     * @param list<string> $cliPaths\n     * @param list<string> $configuredPaths\n     *\n     * @return list<string> absolute, existing paths\n     */\n    public function resolve(\n        array $cliPaths,\n        array $configuredPaths,\n        FrameworkAdapter $adapter,\n        string $projectRoot,\n    ): array {\n        $candidates = $cliPaths !== [] ? $cliPaths : $configuredPaths;\n\n        if ($candidates !== []) {\n            return $this->absolute($candidates, $projectRoot, false);\n        }\n\n        $defaults = $this->absolute($adapter->defaultPaths(), $projectRoot, true);\n\n        if ($defaults !== []) {\n            return $defaults;\n        }\n\n        if (!is_dir($projectRoot)) {\n            throw AnalysisException::pathNotFound($projectRoot);\n        }\n\n        return [Paths::normalize($projectRoot)];\n    }\n\n    /**\n     * @param list<string> $paths\n     *\n     * @return list<string>\n     */\n    private function absolute(array $paths, string $projectRoot, bool $skipMissing): array\n    {\n        $resolved = [];\n\n        foreach ($paths as $path) {\n            $absolute = Paths::makeAbsolute($path, $projectRoot);\n\n            if (!file_exists($absolute)) {\n                if ($skipMissing) {\n                    continue;\n                }\n\n                throw AnalysisException::pathNotFound($path);\n            }\n\n            if (!in_array($absolute, $resolved, true)) {\n                $resolved[] = $absolute;\n            }\n        }\n\n        return $resolved;\n    }\n}\n","src/Analyzer/ScanService.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Analyzer;\n\nuse WorkerSafety\\Baseline\\Baseline;\nuse WorkerSafety\\Baseline\\BaselineFilter;\nuse WorkerSafety\\Baseline\\BaselineRepository;\nuse WorkerSafety\\Config\\Configuration;\nuse WorkerSafety\\Config\\ConfigurationLoader;\nuse WorkerSafety\\Finding\\Severity;\nuse WorkerSafety\\Framework\\FrameworkAdapter;\nuse WorkerSafety\\Framework\\FrameworkAdapterRegistry;\nuse WorkerSafety\\Framework\\FrameworkDetector;\nuse WorkerSafety\\Reporting\\ScanReport;\nuse WorkerSafety\\Rule\\RuleRegistry;\nuse WorkerSafety\\Rule\\RuleRegistryFactory;\nuse WorkerSafety\\Runtime\\RuntimeTargetSet;\nuse WorkerSafety\\Support\\ExcludeMatcher;\nuse WorkerSafety\\Support\\FileFinder;\nuse WorkerSafety\\Support\\Paths;\n\n/**\n * Wires configuration, framework detection, file discovery, the rule registry,\n * the analyzer and the baseline into one call.\n *\n * The CLI commands are thin shells around this, which is what makes the whole\n * pipeline testable without a terminal.\n */\nfinal class ScanService\n{\n    /**\n     * Directories that are excluded even if the configuration replaces the\n     * exclude list, unless the user explicitly asks to scan inside them.\n     *\n     * @var list<string>\n     */\n    public const MANDATORY_EXCLUDES = ['vendor', 'node_modules', '.git'];\n\n    public function __construct(\n        private readonly ConfigurationLoader $configurationLoader = new ConfigurationLoader(),\n        private readonly FrameworkDetector $frameworkDetector = new FrameworkDetector(),\n        private readonly FrameworkAdapterRegistry $adapters = new FrameworkAdapterRegistry(),\n        private readonly RuleRegistryFactory $ruleRegistryFactory = new RuleRegistryFactory(),\n        private readonly ScanPathResolver $pathResolver = new ScanPathResolver(),\n        private readonly Analyzer $analyzer = new ProjectAnalyzer(),\n        private readonly BaselineRepository $baselines = new BaselineRepository(),\n        private readonly BaselineFilter $baselineFilter = new BaselineFilter(),\n    ) {\n    }\n\n    /**\n     * @param (callable(int, int, string): void)|null $onFile\n     */\n    public function scan(ScanOptions $options, ?callable $onFile = null): ScanOutcome\n    {\n        $projectRoot = Paths::normalize($options->projectRoot);\n\n        $registry = $this->ruleRegistryFactory->create();\n        $configuration = $this->configurationLoader->load($options->configPath, $projectRoot, $registry->ids());\n\n        $framework = $this->frameworkDetector->detect($projectRoot);\n        $adapter = $this->adapters->for($framework);\n\n        $runtimes = $options->runtimes ?? $configuration->runtimes;\n\n        if ($runtimes->isEmpty()) {\n            $runtimes = RuntimeTargetSet::all();\n        }\n\n        $failOn = $this->resolveFailOn($options->failOn, $configuration);\n\n        $paths = $this->pathResolver->resolve(\n            $options->paths,\n            $configuration->paths,\n            $adapter,\n            $projectRoot,\n        );\n\n        $excludes = $this->resolveExcludes($configuration, $adapter, $paths, $projectRoot);\n\n        $files = (new FileFinder($projectRoot, new ExcludeMatcher($excludes), $configuration->extensions))\n            ->find($paths);\n\n        $rules = $registry->enabledFor($configuration, $framework, $runtimes);\n\n        $result = $this->analyzer->analyze(\n            new AnalysisRequest(\n                $projectRoot,\n                $files,\n                $configuration,\n                $framework,\n                $runtimes,\n                $rules,\n                $adapter->bindingCollectors(),\n            ),\n            $onFile,\n        );\n\n        $baselinePath = $this->resolveBaselinePath($options, $configuration);\n        $baseline = Baseline::empty();\n\n        if ($baselinePath !== null && $this->baselines->exists($baselinePath)) {\n            $baseline = $this->baselines->load($baselinePath);\n        } else {\n            $baselinePath = null;\n        }\n\n        [$findings, $baselineFiltered] = $this->baselineFilter->apply($result->findings, $baseline);\n\n        $report = new ScanReport(\n            $projectRoot,\n            $framework,\n            $runtimes,\n            $findings,\n            $result->filesScanned,\n            $result->parseFailures,\n            $result->suppressedCount,\n            $baselineFiltered,\n            $result->durationSeconds,\n            $failOn,\n            $configuration->sourcePath === null\n                ? null\n                : Paths::makeRelative($configuration->sourcePath, $projectRoot),\n            $baselinePath === null ? null : Paths::makeRelative($baselinePath, $projectRoot),\n            array_map(\n                static fn (string $path): string => Paths::makeRelative($path, $projectRoot),\n                $paths,\n            ),\n            PHP_VERSION,\n            \\WorkerSafety\\Application\\ApplicationInfo::VERSION,\n            !$options->allowParseErrors && $configuration->failOnParseError,\n        );\n\n        return new ScanOutcome($report, $result->findings, $registry, $configuration);\n    }\n\n    public function registry(): RuleRegistry\n    {\n        return $this->ruleRegistryFactory->create();\n    }\n\n    public function detectFramework(string $projectRoot): \\WorkerSafety\\Framework\\DetectedFramework\n    {\n        return $this->frameworkDetector->detect(Paths::normalize($projectRoot));\n    }\n\n    public function adapterFor(\\WorkerSafety\\Framework\\DetectedFramework $framework): FrameworkAdapter\n    {\n        return $this->adapters->for($framework);\n    }\n\n    private function resolveFailOn(?string $raw, Configuration $configuration): ?Severity\n    {\n        if ($raw === null) {\n            return $configuration->failOn;\n        }\n\n        $normalized = strtolower(trim($raw));\n\n        if ($normalized === 'never' || $normalized === 'none') {\n            return null;\n        }\n\n        return Severity::fromString($normalized);\n    }\n\n    /**\n     * @param list<string> $paths\n     *\n     * @return list<string>\n     */\n    private function resolveExcludes(\n        Configuration $configuration,\n        FrameworkAdapter $adapter,\n        array $paths,\n        string $projectRoot,\n    ): array {\n        $excludes = $configuration->exclude;\n\n        foreach ($adapter->defaultExcludes() as $pattern) {\n            if (!in_array($pattern, $excludes, true)) {\n                $excludes[] = $pattern;\n            }\n        }\n\n        foreach (self::MANDATORY_EXCLUDES as $pattern) {\n            if (in_array($pattern, $excludes, true) || $this->pathsEnter($pattern, $paths, $projectRoot)) {\n                continue;\n            }\n\n            $excludes[] = $pattern;\n        }\n\n        return $excludes;\n    }\n\n    /**\n     * True when one of the requested scan paths lies inside the given directory,\n     * i.e. the user explicitly asked for it.\n     *\n     * @param list<string> $paths\n     */\n    private function pathsEnter(string $directory, array $paths, string $projectRoot): bool\n    {\n        foreach ($paths as $path) {\n            $relative = Paths::makeRelative($path, $projectRoot);\n\n            if ($relative === $directory || str_starts_with($relative, $directory . '/')) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n\n    private function resolveBaselinePath(ScanOptions $options, Configuration $configuration): ?string\n    {\n        if ($options->ignoreBaseline) {\n            return null;\n        }\n\n        if ($options->baselinePath !== null) {\n            return Paths::makeAbsolute($options->baselinePath, $options->projectRoot);\n        }\n\n        // `baseline: false` in the configuration is an explicit opt-out.\n        if ($configuration->baselineDisabled) {\n            return null;\n        }\n\n        return $configuration->baseline;\n    }\n}\n","src/Application/ApplicationInfo.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Application;\n\n/**\n * Single source of truth for the package identity.\n *\n * Renaming the vendor/package only requires editing the constants here, the\n * `name` field in composer.json and the PSR-4 namespace prefix.\n */\nfinal class ApplicationInfo\n{\n    public const NAME = 'Worker Safety';\n\n    public const BINARY = 'worker-safety';\n\n    public const VERSION = '1.1.0';\n\n    public const PACKAGE = 'goktugcy/worker-safety';\n\n    public const HOMEPAGE = 'https://github.com/goktugcy/worker-safety';\n\n    /**\n     * Base name used for the generated configuration file.\n     */\n    public const CONFIG_FILE = 'worker-safety.yaml';\n\n    public const BASELINE_FILE = 'worker-safety-baseline.json';\n\n    /**\n     * Prefix used by inline suppression comments.\n     */\n    public const IGNORE_MARKER = 'worker-safety-ignore';\n\n    public const IGNORE_ATTRIBUTE = 'WorkerSafetyIgnore';\n\n    private function __construct()\n    {\n    }\n}\n","src/Application/ExitCode.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Application;\n\n/**\n * The contract CI relies on.\n */\nenum ExitCode: int\n{\n    /** Scan completed and nothing reached the failure threshold. */\n    case Success = 0;\n\n    /** Scan completed but findings reached the `--fail-on` threshold. */\n    case FindingsAboveThreshold = 1;\n\n    /** The configuration or a CLI option was invalid; nothing was analyzed. */\n    case InvalidConfiguration = 2;\n\n    /** An internal error aborted the run. */\n    case InternalError = 3;\n\n    public function describe(): string\n    {\n        return match ($this) {\n            self::Success => 'success',\n            self::FindingsAboveThreshold => 'findings above threshold',\n            self::InvalidConfiguration => 'invalid configuration',\n            self::InternalError => 'internal error',\n        };\n    }\n}\n","src/Application/WorkerSafetyApplication.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Application;\n\nuse Symfony\\Component\\Console\\Application;\nuse WorkerSafety\\Command\\BaselineCommand;\nuse WorkerSafety\\Command\\InitCommand;\nuse WorkerSafety\\Command\\RulesCommand;\nuse WorkerSafety\\Command\\ScanCommand;\n\n/**\n * The console application.\n */\nfinal class WorkerSafetyApplication extends Application\n{\n    public function __construct()\n    {\n        parent::__construct(ApplicationInfo::NAME, ApplicationInfo::VERSION);\n\n        $this->addCommands([\n            new ScanCommand(),\n            new RulesCommand(),\n            new InitCommand(),\n            new BaselineCommand(),\n        ]);\n    }\n\n    public function getLongVersion(): string\n    {\n        return sprintf(\n            '<info>%s</info> version <comment>%s</comment> (%s)',\n            ApplicationInfo::NAME,\n            ApplicationInfo::VERSION,\n            ApplicationInfo::PACKAGE,\n        );\n    }\n}\n","src/Ast/AstHelper.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Ast;\n\nuse PhpParser\\Node;\nuse PhpParser\\Node\\ComplexType;\nuse PhpParser\\Node\\Expr;\nuse PhpParser\\Node\\Identifier;\nuse PhpParser\\Node\\IntersectionType;\nuse PhpParser\\Node\\Name;\nuse PhpParser\\Node\\NullableType;\nuse PhpParser\\Node\\Scalar;\nuse PhpParser\\Node\\UnionType;\nuse WorkerSafety\\Ast\\Index\\DefaultValueKind;\nuse WorkerSafety\\Finding\\Location;\nuse WorkerSafety\\Support\\SourceFile;\n\n/**\n * Small, dependency free helpers on top of the php-parser node tree.\n */\nfinal class AstHelper\n{\n    /**\n     * @var list<string>\n     */\n    private const SCALAR_TYPES = ['int', 'float', 'string', 'bool', 'true', 'false', 'null', 'void', 'never'];\n\n    private function __construct()\n    {\n    }\n\n    /**\n     * Fully qualified name for a declaration or a referenced name node.\n     */\n    public static function nameToString(Name $name): string\n    {\n        $resolved = $name->getAttribute('resolvedName');\n\n        if ($resolved instanceof Name) {\n            return $resolved->toString();\n        }\n\n        $namespaced = $name->getAttribute('namespacedName');\n\n        if ($namespaced instanceof Name) {\n            return $namespaced->toString();\n        }\n\n        return $name->toString();\n    }\n\n    /**\n     * Resolve the class part of a static fetch/call.\n     *\n     * Returns null for dynamic references such as `$class::$prop`.\n     */\n    public static function resolveClassReference(\n        Node $classNode,\n        ?string $currentClass,\n        ?string $parentClass,\n    ): ?string {\n        if (!$classNode instanceof Name) {\n            return null;\n        }\n\n        $lower = strtolower($classNode->toString());\n\n        if ($lower === 'self' || $lower === 'static') {\n            return $currentClass;\n        }\n\n        if ($lower === 'parent') {\n            return $parentClass;\n        }\n\n        return self::nameToString($classNode);\n    }\n\n    /**\n     * True when the class reference is `self`, `static` or the declaring class itself.\n     */\n    public static function refersToSelf(Node $classNode, ?string $currentClass): bool\n    {\n        if (!$classNode instanceof Name) {\n            return false;\n        }\n\n        $lower = strtolower($classNode->toString());\n\n        if ($lower === 'self' || $lower === 'static') {\n            return true;\n        }\n\n        return $currentClass !== null && strtolower(self::nameToString($classNode)) === strtolower($currentClass);\n    }\n\n    public static function location(Node $node, SourceFile $file): Location\n    {\n        $line = $node->getStartLine();\n        $line = $line > 0 ? $line : 1;\n\n        return new Location(\n            $file->absolutePath,\n            $file->relativePath,\n            $line,\n            self::column($file, $node->getStartFilePos()),\n            $node->getEndLine() > 0 ? $node->getEndLine() : null,\n        );\n    }\n\n    /**\n     * 1-indexed column for a byte offset in the file.\n     */\n    public static function column(SourceFile $file, int $filePos): ?int\n    {\n        if ($filePos < 0) {\n            return null;\n        }\n\n        $lineStart = strrpos(substr($file->source, 0, $filePos), \"\\n\");\n\n        if ($lineStart === false) {\n            return $filePos + 1;\n        }\n\n        return $filePos - $lineStart;\n    }\n\n    /**\n     * Render a type declaration back to source-ish text.\n     */\n    public static function typeToString(null|Identifier|Name|ComplexType $type): ?string\n    {\n        if ($type === null) {\n            return null;\n        }\n\n        if ($type instanceof Identifier) {\n            return $type->toString();\n        }\n\n        if ($type instanceof Name) {\n            return self::nameToString($type);\n        }\n\n        if ($type instanceof NullableType) {\n            return '?' . (self::typeToString($type->type) ?? 'mixed');\n        }\n\n        if ($type instanceof UnionType) {\n            return implode('|', array_map(\n                static fn (Node $part): string => self::typeToString(self::asTypeNode($part)) ?? 'mixed',\n                $type->types,\n            ));\n        }\n\n        if ($type instanceof IntersectionType) {\n            return implode('&', array_map(\n                static fn (Node $part): string => self::typeToString(self::asTypeNode($part)) ?? 'mixed',\n                $type->types,\n            ));\n        }\n\n        return null;\n    }\n\n    /**\n     * Every class-like name mentioned by a type declaration.\n     *\n     * @return list<string>\n     */\n    public static function typeClassNames(null|Identifier|Name|ComplexType $type): array\n    {\n        if ($type === null || $type instanceof Identifier) {\n            return [];\n        }\n\n        if ($type instanceof Name) {\n            return [self::nameToString($type)];\n        }\n\n        if ($type instanceof NullableType) {\n            return self::typeClassNames($type->type);\n        }\n\n        if ($type instanceof UnionType || $type instanceof IntersectionType) {\n            $names = [];\n\n            foreach ($type->types as $part) {\n                foreach (self::typeClassNames(self::asTypeNode($part)) as $name) {\n                    $names[] = $name;\n                }\n            }\n\n            return $names;\n        }\n\n        return [];\n    }\n\n    /**\n     * True when the declared type can only ever hold scalars (or null).\n     */\n    public static function typeIsScalarOnly(null|Identifier|Name|ComplexType $type): bool\n    {\n        if ($type === null) {\n            return false;\n        }\n\n        if ($type instanceof Identifier) {\n            return in_array(strtolower($type->toString()), self::SCALAR_TYPES, true);\n        }\n\n        if ($type instanceof NullableType) {\n            return self::typeIsScalarOnly($type->type);\n        }\n\n        if ($type instanceof UnionType) {\n            foreach ($type->types as $part) {\n                if (!self::typeIsScalarOnly(self::asTypeNode($part))) {\n                    return false;\n                }\n            }\n\n            return true;\n        }\n\n        return false;\n    }\n\n    public static function typeIsArray(null|Identifier|Name|ComplexType $type): bool\n    {\n        if ($type instanceof Identifier) {\n            return strtolower($type->toString()) === 'array';\n        }\n\n        if ($type instanceof NullableType) {\n            return self::typeIsArray($type->type);\n        }\n\n        if ($type instanceof UnionType) {\n            foreach ($type->types as $part) {\n                if (self::typeIsArray(self::asTypeNode($part))) {\n                    return true;\n                }\n            }\n        }\n\n        return false;\n    }\n\n    public static function defaultValueKind(?Expr $default): DefaultValueKind\n    {\n        if ($default === null) {\n            return DefaultValueKind::None;\n        }\n\n        if (self::isNullConstant($default)) {\n            return DefaultValueKind::Null;\n        }\n\n        if ($default instanceof Expr\\Array_) {\n            return $default->items === [] ? DefaultValueKind::EmptyArray : DefaultValueKind::NonEmptyArray;\n        }\n\n        if ($default instanceof Scalar) {\n            return DefaultValueKind::Scalar;\n        }\n\n        if ($default instanceof Expr\\New_) {\n            return DefaultValueKind::NewObject;\n        }\n\n        if ($default instanceof Expr\\ConstFetch || $default instanceof Expr\\ClassConstFetch) {\n            return DefaultValueKind::ConstantExpression;\n        }\n\n        if ($default instanceof Expr\\UnaryMinus || $default instanceof Expr\\UnaryPlus) {\n            return self::defaultValueKind($default->expr) === DefaultValueKind::Scalar\n                ? DefaultValueKind::Scalar\n                : DefaultValueKind::Other;\n        }\n\n        if ($default instanceof Expr\\BinaryOp) {\n            $left = self::defaultValueKind($default->left);\n            $right = self::defaultValueKind($default->right);\n\n            return $left->isConstantScalar() && $right->isConstantScalar()\n                ? DefaultValueKind::ConstantExpression\n                : DefaultValueKind::Other;\n        }\n\n        return DefaultValueKind::Other;\n    }\n\n    public static function isNullConstant(Expr $expr): bool\n    {\n        return $expr instanceof Expr\\ConstFetch && strtolower($expr->name->toString()) === 'null';\n    }\n\n    public static function isEmptyArray(Expr $expr): bool\n    {\n        return $expr instanceof Expr\\Array_ && $expr->items === [];\n    }\n\n    /**\n     * Peel `$x['a']['b']` down to `$x`.\n     */\n    public static function unwrapArrayDim(Expr $expr): Expr\n    {\n        while ($expr instanceof Expr\\ArrayDimFetch) {\n            $expr = $expr->var;\n        }\n\n        return $expr;\n    }\n\n    /**\n     * Static text of a string literal, or null when it is not a plain literal.\n     */\n    public static function stringValue(Expr $expr): ?string\n    {\n        return $expr instanceof Scalar\\String_ ? $expr->value : null;\n    }\n\n    /**\n     * Resolve `Foo::class`, `self::class` or a plain string literal to a class name.\n     */\n    public static function classNameFromExpr(Expr $expr, ?string $currentClass, ?string $parentClass): ?string\n    {\n        if ($expr instanceof Expr\\ClassConstFetch\n            && $expr->name instanceof Identifier\n            && strtolower($expr->name->toString()) === 'class'\n        ) {\n            return self::resolveClassReference($expr->class, $currentClass, $parentClass);\n        }\n\n        $literal = self::stringValue($expr);\n\n        if ($literal !== null && $literal !== '' && preg_match('/^\\\\\\\\?[A-Za-z_\\x80-\\xff][A-Za-z0-9_\\x80-\\xff]*(\\\\\\\\[A-Za-z_\\x80-\\xff][A-Za-z0-9_\\x80-\\xff]*)*$/', $literal) === 1) {\n            return ltrim($literal, '\\\\');\n        }\n\n        return null;\n    }\n\n    /**\n     * A service-container key: either a class reference (`X::class`, or a\n     * string spelled like a class) or a free-form string id such as\n     * `'auth.context'`.\n     *\n     * @return array{0: string, 1: bool}|null the key and whether it names a class\n     */\n    public static function containerKeyFromExpr(Expr $expr, ?string $currentClass, ?string $parentClass): ?array\n    {\n        $className = self::classNameFromExpr($expr, $currentClass, $parentClass);\n\n        if ($className !== null) {\n            return [$className, true];\n        }\n\n        $literal = self::stringValue($expr);\n\n        if ($literal !== null && trim($literal) !== '') {\n            return [$literal, false];\n        }\n\n        return null;\n    }\n\n    public static function identifierName(Node $node): ?string\n    {\n        if ($node instanceof Identifier) {\n            return $node->toString();\n        }\n\n        if ($node instanceof Name) {\n            return $node->toString();\n        }\n\n        return null;\n    }\n\n    /**\n     * Lowercased, resolved name of a plain function call, or null for dynamic calls.\n     *\n     * Uses the name the resolver worked out rather than the source spelling, so\n     * `use function putenv as changeEnv;` is still recognised as `putenv`.\n     */\n    public static function functionName(Expr\\FuncCall $call): ?string\n    {\n        if (!$call->name instanceof Name) {\n            return null;\n        }\n\n        $resolved = $call->name->getAttribute('resolvedName');\n\n        if ($resolved instanceof Name) {\n            return strtolower(ltrim($resolved->toString(), '\\\\'));\n        }\n\n        return strtolower(ltrim($call->name->toString(), '\\\\'));\n    }\n\n    private static function asTypeNode(Node $node): null|Identifier|Name|ComplexType\n    {\n        if ($node instanceof Identifier || $node instanceof Name || $node instanceof ComplexType) {\n            return $node;\n        }\n\n        return null;\n    }\n}\n","src/Ast/AstParser.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Ast;\n\nuse PhpParser\\ErrorHandler\\Collecting;\nuse PhpParser\\NodeTraverser;\nuse PhpParser\\NodeVisitor\\NameResolver;\nuse PhpParser\\Parser;\nuse PhpParser\\ParserFactory;\nuse WorkerSafety\\Support\\SourceFile;\n\n/**\n * Parses PHP source into a name-resolved AST.\n *\n * Nothing in this package ever includes, evaluates or autoloads analyzed code:\n * files are only ever turned into an abstract syntax tree.\n */\nfinal class AstParser\n{\n    private readonly Parser $parser;\n\n    private readonly NodeTraverser $nameResolvingTraverser;\n\n    public function __construct()\n    {\n        $this->parser = (new ParserFactory())->createForNewestSupportedVersion();\n\n        // replaceNodes: false keeps the source-level names intact (useful for\n        // reporting) while adding a `resolvedName` attribute we can rely on.\n        $this->nameResolvingTraverser = new NodeTraverser(\n            new NameResolver(null, ['replaceNodes' => false]),\n        );\n    }\n\n    public function parse(SourceFile $file): ParseResult\n    {\n        $errorHandler = new Collecting();\n\n        try {\n            $statements = $this->parser->parse($file->source, $errorHandler);\n        } catch (\\Throwable $exception) {\n            // Defensive: php-parser normally routes everything through the\n            // error handler, but a broken file must never kill the scan.\n            return new ParseResult([], [\n                new ParseFailure($file->relativePath, $file->absolutePath, 1, $exception->getMessage(), true),\n            ], false);\n        }\n\n        $failures = [];\n\n        foreach ($errorHandler->getErrors() as $error) {\n            $line = $error->getStartLine();\n\n            $failures[] = new ParseFailure(\n                $file->relativePath,\n                $file->absolutePath,\n                $line > 0 ? $line : 1,\n                $error->getRawMessage(),\n                $statements === null,\n            );\n        }\n\n        if ($statements === null) {\n            if ($failures === []) {\n                $failures[] = new ParseFailure($file->relativePath, $file->absolutePath, 1, 'Unknown parse error', true);\n            }\n\n            return new ParseResult([], $failures, false);\n        }\n\n        $this->nameResolvingTraverser->traverse($statements);\n\n        return new ParseResult(array_values($statements), $failures, true);\n    }\n}\n","src/Ast/Index/BindingContext.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Ast\\Index;\n\nuse WorkerSafety\\Support\\SourceFile;\n\n/**\n * Where in the source a potential container binding was seen.\n */\nfinal class BindingContext\n{\n    public function __construct(\n        public readonly SourceFile $file,\n        public readonly ?string $currentClass = null,\n        public readonly ?string $parentClass = null,\n        public readonly ?string $currentMethod = null,\n    ) {\n    }\n}\n","src/Ast/Index/ClassKind.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Ast\\Index;\n\nenum ClassKind: string\n{\n    case ClassType = 'class';\n    case Interface = 'interface';\n    case Trait = 'trait';\n    case Enum = 'enum';\n}\n","src/Ast/Index/ClassShape.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Ast\\Index;\n\nuse WorkerSafety\\Finding\\Location;\n\n/**\n * The analysis-relevant shape of one class-like declaration.\n */\nfinal class ClassShape\n{\n    /**\n     * @param list<string> $interfaces\n     * @param array<string, PropertyShape> $staticProperties keyed by property name\n     * @param array<string, PropertyShape> $instanceProperties keyed by property name\n     * @param array<string, MethodShape> $methods keyed by lowercase method name\n     * @param list<string> $traits\n     */\n    public function __construct(\n        public readonly string $name,\n        public readonly string $shortName,\n        public readonly ClassKind $kind,\n        public readonly bool $isFinal,\n        public readonly bool $isAbstract,\n        public readonly ?string $parent,\n        public readonly array $interfaces,\n        public readonly array $traits,\n        public readonly array $staticProperties,\n        public readonly array $instanceProperties,\n        public readonly array $methods,\n        public readonly Location $location,\n    ) {\n    }\n\n    public function method(string $name): ?MethodShape\n    {\n        return $this->methods[strtolower($name)] ?? null;\n    }\n\n    public function hasResetMethod(): bool\n    {\n        foreach ($this->methods as $method) {\n            if ($method->looksLikeReset) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n\n    /**\n     * @return list<MethodShape>\n     */\n    public function resetMethods(): array\n    {\n        return array_values(array_filter(\n            $this->methods,\n            static fn (MethodShape $method): bool => $method->looksLikeReset,\n        ));\n    }\n\n    /**\n     * Instance properties that can change after construction.\n     *\n     * A property counts as mutable when it is not readonly and is either\n     * publicly writable or assigned somewhere outside the constructor.\n     *\n     * @return list<PropertyShape>\n     */\n    public function mutableInstanceProperties(): array\n    {\n        $mutable = [];\n\n        foreach ($this->instanceProperties as $property) {\n            if ($property->isReadonly) {\n                continue;\n            }\n\n            if ($property->isPublic() || $this->isAssignedOutsideConstructor($property->name)) {\n                $mutable[] = $property;\n            }\n        }\n\n        return $mutable;\n    }\n\n    public function isAssignedOutsideConstructor(string $propertyName): bool\n    {\n        foreach ($this->methods as $method) {\n            if ($method->isConstructor()) {\n                continue;\n            }\n\n            if (in_array($propertyName, $method->assignedInstanceProperties, true)) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n\n    /**\n     * True when the class is a plain data holder with no behaviour that could\n     * reset it — the shape of a request context object.\n     */\n    public function looksImmutable(): bool\n    {\n        return $this->mutableInstanceProperties() === [];\n    }\n\n    public function extendsName(string $suffix): bool\n    {\n        return $this->parent !== null && str_ends_with($this->parent, $suffix);\n    }\n}\n","src/Ast/Index/ContainerBinding.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Ast\\Index;\n\nuse WorkerSafety\\Finding\\Location;\n\n/**\n * A service-container registration discovered in the source.\n *\n * Framework agnostic on purpose: the Laravel collector fills it in today, a\n * Symfony collector could fill in the same object tomorrow.\n */\nfinal class ContainerBinding\n{\n    public function __construct(\n        public readonly string $method,\n        public readonly ?string $abstract,\n        public readonly ?string $concrete,\n        public readonly bool $shared,\n        public readonly bool $scoped,\n        public readonly Location $location,\n        public readonly ?string $snippet = null,\n        public readonly ?string $inClass = null,\n        public readonly ?string $inMethod = null,\n        public readonly bool $abstractIsClass = true,\n        public readonly ?string $excerpt = null,\n    ) {\n    }\n\n    /**\n     * The class whose shape determines the risk: the closure's concrete type\n     * when known, otherwise the abstract identifier.\n     */\n    /**\n     * The class whose shape decides the risk. A free-form service id such as\n     * `'auth.context'` is not one, so only the concrete type counts there.\n     */\n    public function resolvedClass(): ?string\n    {\n        if ($this->concrete !== null) {\n            return $this->concrete;\n        }\n\n        return $this->abstractIsClass ? $this->abstract : null;\n    }\n\n    public function describeTarget(): string\n    {\n        $target = $this->resolvedClass() ?? $this->abstract ?? 'binding';\n\n        return str_contains($target, '\\\\')\n            ? substr($target, (int) strrpos($target, '\\\\') + 1)\n            : $target;\n    }\n}\n","src/Ast/Index/ContainerBindingCollector.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Ast\\Index;\n\nuse PhpParser\\Node;\n\n/**\n * Recognises service-container registrations for one framework.\n *\n * The core indexer knows nothing about Laravel or Symfony; framework adapters\n * contribute collectors, which is the seam a Symfony implementation plugs into.\n */\ninterface ContainerBindingCollector\n{\n    /**\n     * @return iterable<ContainerBinding>\n     */\n    public function collect(Node $node, BindingContext $context): iterable;\n}\n","src/Ast/Index/DefaultValueKind.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Ast\\Index;\n\n/**\n * Shape of a property's declared default value.\n *\n * Used to tell configuration-ish state (`private static string $version = '1.0'`)\n * apart from request-ish state (`public static ?User $user = null`).\n */\nenum DefaultValueKind: string\n{\n    case None = 'none';\n    case Null = 'null';\n    case Scalar = 'scalar';\n    case EmptyArray = 'empty-array';\n    case NonEmptyArray = 'non-empty-array';\n    case ConstantExpression = 'constant-expression';\n    case NewObject = 'new-object';\n    case Other = 'other';\n\n    /**\n     * True when the default is a compile-time constant scalar, i.e. the sort of\n     * value that reads as configuration rather than as runtime state.\n     */\n    public function isConstantScalar(): bool\n    {\n        return $this === self::Scalar || $this === self::ConstantExpression;\n    }\n}\n","src/Ast/Index/MethodShape.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Ast\\Index;\n\nuse WorkerSafety\\Finding\\Location;\n\n/**\n * A declared method, reduced to the facts the rules care about.\n */\nfinal class MethodShape\n{\n    /**\n     * @param list<string> $assignedStaticProperties\n     * @param list<string> $assignedInstanceProperties\n     */\n    public function __construct(\n        public readonly string $name,\n        public readonly string $declaringClass,\n        public readonly bool $isStatic,\n        public readonly string $visibility,\n        public readonly ?string $returnType,\n        public readonly bool $returnsSelf,\n        public readonly bool $instantiatesSelf,\n        public readonly bool $looksLikeReset,\n        public readonly array $assignedStaticProperties,\n        public readonly array $assignedInstanceProperties,\n        public readonly Location $location,\n    ) {\n    }\n\n    public function isConstructor(): bool\n    {\n        return strtolower($this->name) === '__construct';\n    }\n}\n","src/Ast/Index/ProjectIndex.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Ast\\Index;\n\n/**\n * Whole-project semantic model built during the single AST pass.\n *\n * Rules that need cross-file knowledge (a container binding in a service\n * provider plus the bound class declared in another file) read from here in\n * their `finishProject()` hook, which is what lets the scan parse every file\n * exactly once.\n */\nfinal class ProjectIndex\n{\n    /**\n     * @var array<string, ClassShape> keyed by lowercase FQCN\n     */\n    private array $classes = [];\n\n    /**\n     * @var array<string, list<string>> lowercase short name => list of lowercase FQCNs\n     */\n    private array $shortNames = [];\n\n    /**\n     * @var list<ContainerBinding>\n     */\n    private array $bindings = [];\n\n    /**\n     * @var array<string, list<StateWrite>> keyed by PropertyShape::makeWriteKey()\n     */\n    private array $staticWrites = [];\n\n    /**\n     * @var list<StaticLocalVariable>\n     */\n    private array $staticLocals = [];\n\n    public function addClass(ClassShape $class): void\n    {\n        $key = self::key($class->name);\n\n        $this->classes[$key] = $class;\n\n        $short = strtolower($class->shortName);\n        $existing = $this->shortNames[$short] ?? [];\n\n        if (!in_array($key, $existing, true)) {\n            $existing[] = $key;\n            $this->shortNames[$short] = $existing;\n        }\n    }\n\n    public function addBinding(ContainerBinding $binding): void\n    {\n        $this->bindings[] = $binding;\n    }\n\n    public function addStaticWrite(string $class, string $property, StateWrite $write): void\n    {\n        $key = PropertyShape::makeWriteKey($class, $property);\n        $this->staticWrites[$key][] = $write;\n    }\n\n    public function addStaticLocal(StaticLocalVariable $variable): void\n    {\n        $this->staticLocals[] = $variable;\n    }\n\n    public function class(string $fqcn): ?ClassShape\n    {\n        return $this->classes[self::key($fqcn)] ?? null;\n    }\n\n    /**\n     * Resolve by FQCN, falling back to an unambiguous short-name match only for\n     * names that carry no namespace of their own.\n     *\n     * A qualified name that is not declared in the analyzed paths must resolve\n     * to nothing: matching `External\\Context` against a local `Local\\Context`\n     * would attribute one class's risk to another.\n     */\n    public function findClass(string $name): ?ClassShape\n    {\n        $exact = $this->class($name);\n\n        if ($exact instanceof ClassShape) {\n            return $exact;\n        }\n\n        if (str_contains(ltrim($name, '\\\\'), '\\\\')) {\n            return null;\n        }\n\n        $short = strtolower($name);\n\n        $candidates = $this->shortNames[$short] ?? [];\n\n        if (count($candidates) === 1) {\n            return $this->classes[$candidates[0]] ?? null;\n        }\n\n        return null;\n    }\n\n    /**\n     * @return list<ClassShape>\n     */\n    public function classes(): array\n    {\n        return array_values($this->classes);\n    }\n\n    /**\n     * @return list<ContainerBinding>\n     */\n    public function bindings(): array\n    {\n        return $this->bindings;\n    }\n\n    /**\n     * Every binding that targets the given class, across the whole project.\n     *\n     * @return list<ContainerBinding>\n     */\n    public function bindingsFor(string $class): array\n    {\n        $needle = self::key($class);\n\n        return array_values(array_filter($this->bindings, static function (ContainerBinding $binding) use ($needle): bool {\n            foreach ([$binding->abstract, $binding->concrete] as $candidate) {\n                if ($candidate !== null && strtolower(ltrim($candidate, '\\\\')) === $needle) {\n                    return true;\n                }\n            }\n\n            return false;\n        }));\n    }\n\n    /**\n     * @return list<StaticLocalVariable>\n     */\n    public function staticLocals(): array\n    {\n        return $this->staticLocals;\n    }\n\n    /**\n     * @return list<StateWrite>\n     */\n    public function writesFor(string $class, string $property): array\n    {\n        return $this->staticWrites[PropertyShape::makeWriteKey($class, $property)] ?? [];\n    }\n\n    /**\n     * @return list<StateWrite>\n     */\n    public function writesForProperty(PropertyShape $property): array\n    {\n        return $this->staticWrites[$property->writeKey()] ?? [];\n    }\n\n    public function classCount(): int\n    {\n        return count($this->classes);\n    }\n\n    private static function key(string $fqcn): string\n    {\n        return strtolower(ltrim($fqcn, '\\\\'));\n    }\n}\n","src/Ast/Index/PropertyShape.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Ast\\Index;\n\nuse WorkerSafety\\Finding\\Location;\nuse WorkerSafety\\Support\\NameHeuristics;\n\n/**\n * A declared property, static or instance.\n */\nfinal class PropertyShape\n{\n    /**\n     * @param list<string> $typeClassNames\n     */\n    public function __construct(\n        public readonly string $name,\n        public readonly string $declaringClass,\n        public readonly bool $isStatic,\n        public readonly bool $isReadonly,\n        public readonly bool $isPromoted,\n        public readonly string $visibility,\n        public readonly ?string $typeString,\n        public readonly array $typeClassNames,\n        public readonly bool $typeIsScalarOnly,\n        public readonly bool $typeIsArray,\n        public readonly DefaultValueKind $default,\n        public readonly Location $location,\n        public readonly ?string $snippet,\n        public readonly ?string $excerpt = null,\n    ) {\n    }\n\n    /**\n     * Key used to look writes up in the project index.\n     */\n    public function writeKey(): string\n    {\n        return self::makeWriteKey($this->declaringClass, $this->name);\n    }\n\n    public static function makeWriteKey(string $class, string $property): string\n    {\n        return strtolower(ltrim($class, '\\\\')) . '::$' . $property;\n    }\n\n    public function isPublic(): bool\n    {\n        return $this->visibility === 'public';\n    }\n\n    /**\n     * True when nothing about the declaration itself suggests mutable runtime\n     * state: a scalar typed property holding a literal default.\n     */\n    public function looksLikeConfiguration(): bool\n    {\n        return $this->typeIsScalarOnly && $this->default->isConstantScalar();\n    }\n\n    /**\n     * Request vocabulary found in the property name or in its declared type.\n     *\n     * @return list<string>\n     */\n    public function requestTokens(): array\n    {\n        $tokens = NameHeuristics::requestTokens($this->name);\n\n        foreach ($this->typeClassNames as $className) {\n            $short = str_contains($className, '\\\\')\n                ? substr($className, (int) strrpos($className, '\\\\') + 1)\n                : $className;\n\n            foreach (NameHeuristics::requestTokens($short) as $token) {\n                if (!in_array($token, $tokens, true)) {\n                    $tokens[] = $token;\n                }\n            }\n        }\n\n        return $tokens;\n    }\n\n    public function looksRequestScoped(): bool\n    {\n        return $this->requestTokens() !== [];\n    }\n}\n","src/Ast/Index/SingletonAnalyzer.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Ast\\Index;\n\n/**\n * Recognises the self-instantiating singleton shape.\n *\n * Shared by WS004, which reports the pattern, and by WS001, which stays quiet\n * about the instance holder so that one line never carries two contradictory\n * severities.\n */\nfinal class SingletonAnalyzer\n{\n    private function __construct()\n    {\n    }\n\n    /**\n     * The static property holding the single instance, if the class has one.\n     */\n    public static function instanceHolder(ClassShape $class): ?PropertyShape\n    {\n        foreach ($class->staticProperties as $property) {\n            if (!self::canHoldInstance($property, $class)) {\n                continue;\n            }\n\n            foreach ($class->methods as $method) {\n                if (self::assignsInstance($method, $property)) {\n                    return $property;\n                }\n            }\n        }\n\n        return null;\n    }\n\n    public static function isInstanceHolder(ClassShape $class, PropertyShape $property): bool\n    {\n        $holder = self::instanceHolder($class);\n\n        return $holder instanceof PropertyShape && $holder->name === $property->name;\n    }\n\n    private static function canHoldInstance(PropertyShape $property, ClassShape $class): bool\n    {\n        $type = $property->typeString;\n\n        if ($type !== null) {\n            $normalized = strtolower(ltrim($type, '?'));\n\n            if ($normalized === 'self' || $normalized === 'static') {\n                return true;\n            }\n\n            foreach ($property->typeClassNames as $className) {\n                if (strtolower($className) === strtolower($class->name)) {\n                    return true;\n                }\n            }\n\n            // A property typed as something else cannot be the instance holder.\n            return false;\n        }\n\n        // Untyped holders are only accepted when they start out empty, which is\n        // what `private static $instance;` and `= null` look like.\n        return $property->default === DefaultValueKind::None || $property->default === DefaultValueKind::Null;\n    }\n\n    private static function assignsInstance(MethodShape $method, PropertyShape $property): bool\n    {\n        return $method->isStatic\n            && $method->instantiatesSelf\n            && in_array($property->name, $method->assignedStaticProperties, true);\n    }\n}\n","src/Ast/Index/StateWrite.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Ast\\Index;\n\nuse WorkerSafety\\Finding\\Location;\n\n/**\n * A single observed mutation of a static property or static local variable.\n */\nfinal class StateWrite\n{\n    public function __construct(\n        public readonly WriteKind $kind,\n        public readonly Location $location,\n        public readonly ?string $snippet = null,\n        public readonly ?string $inClass = null,\n        public readonly ?string $inMethod = null,\n        public readonly bool $inConstructor = false,\n        public readonly bool $inResetMethod = false,\n        public readonly bool $literalKey = false,\n        public readonly bool $guaranteed = true,\n    ) {\n    }\n\n    public function isClearing(): bool\n    {\n        return $this->kind->isClearing();\n    }\n\n    public function isGrowth(): bool\n    {\n        return $this->kind->isGrowth();\n    }\n\n    /**\n     * True when the write can add an unpredictable number of entries.\n     *\n     * A keyed write whose every dimension is a compile-time constant always\n     * targets the same slot, so it grows the collection to a fixed size rather\n     * than without bound.\n     */\n    public function growsUnbounded(): bool\n    {\n        if (!$this->isGrowth()) {\n            return false;\n        }\n\n        return !($this->kind === WriteKind::KeyedWrite && $this->literalKey);\n    }\n}\n","src/Ast/Index/StaticLocalVariable.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Ast\\Index;\n\nuse WorkerSafety\\Finding\\Location;\n\n/**\n * A `static $x = …;` declaration inside a function or method.\n *\n * Function-scoped statics survive for the whole worker lifetime exactly like\n * static properties do, so they get the same treatment.\n */\nfinal class StaticLocalVariable\n{\n    /**\n     * @param list<StateWrite> $writes\n     */\n    public function __construct(\n        public readonly string $name,\n        public readonly ?string $inClass,\n        public readonly ?string $inFunction,\n        public readonly DefaultValueKind $default,\n        public readonly Location $location,\n        public readonly ?string $snippet,\n        public readonly array $writes,\n        public readonly ?string $excerpt = null,\n    ) {\n    }\n\n    public function describeScope(): string\n    {\n        if ($this->inClass !== null && $this->inFunction !== null) {\n            return $this->inClass . '::' . $this->inFunction . '()';\n        }\n\n        if ($this->inFunction !== null) {\n            return $this->inFunction . '()';\n        }\n\n        return 'file scope';\n    }\n\n    /**\n     * @return list<StateWrite>\n     */\n    public function growthWrites(): array\n    {\n        return array_values(array_filter($this->writes, static fn (StateWrite $w): bool => $w->isGrowth()));\n    }\n\n    public function hasClearingWrite(): bool\n    {\n        foreach ($this->writes as $write) {\n            if ($write->isClearing()) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n}\n","src/Ast/Index/WriteKind.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Ast\\Index;\n\n/**\n * How a piece of persistent state was mutated.\n */\nenum WriteKind: string\n{\n    /** `self::$x = $value` with a value that is not obviously empty. */\n    case Assign = 'assign';\n\n    /** `self::$x[] = $value` — unbounded growth. */\n    case Append = 'append';\n\n    /** `self::$x[$key] = $value` — growth bounded only by the key space. */\n    case KeyedWrite = 'keyed-write';\n\n    /** `self::$x .= …`, `self::$x += …` */\n    case Compound = 'compound';\n\n    /**\n     * `self::$x ??= …` — assigns only while the slot is null or unset.\n     *\n     * Tracked apart from Compound because the reuse is conditional rather than\n     * unconditional: a plain assignment replaces the value on every pass, while\n     * this one writes only into an empty slot, so a non-null value already\n     * there is reused instead.\n     *\n     * That is all it establishes. It is *not* evidence that the initializer\n     * runs once: an initializer that yields null leaves the slot empty and runs\n     * again on the next pass, and any reset — including one outside the scanned\n     * paths — re-opens it. Nor does it say anything about whether the stored\n     * value is request-specific.\n     */\n    case CoalesceAssign = 'coalesce-assign';\n\n    /** `self::$x++`, `--self::$x` */\n    case IncDec = 'inc-dec';\n\n    /** `$ref = &self::$x` — the value escapes and can be mutated elsewhere. */\n    case Reference = 'reference';\n\n    /** `self::$x = []`, `self::$x = null` — releases the retained value. */\n    case Clear = 'clear';\n\n    /** `unset(self::$x)`, `unset(self::$x[$key])` */\n    case Unset = 'unset';\n\n    /** `array_shift(self::$x)`, `array_pop(self::$x)`, `array_splice(...)` */\n    case Shrink = 'shrink';\n\n    /** `array_push(self::$x, …)`, `array_unshift(self::$x, …)` */\n    case Grow = 'grow';\n\n    public function isClearing(): bool\n    {\n        return $this === self::Clear || $this === self::Unset || $this === self::Shrink;\n    }\n\n    /**\n     * True when the operation empties the collection rather than removing one\n     * entry from it.\n     */\n    public function isFullRelease(): bool\n    {\n        return $this === self::Clear || $this === self::Unset;\n    }\n\n    public function isGrowth(): bool\n    {\n        return $this === self::Append || $this === self::KeyedWrite || $this === self::Grow;\n    }\n\n    /**\n     * True when the operation writes only into an empty slot.\n     *\n     * A statement about the assignment, not about the value or how often it is\n     * evaluated: reuse of a stored value is deliberate memoization when every\n     * input is fixed, and a cross-request leak when it is not. Nothing in the\n     * syntax separates the two.\n     */\n    public function isConditionalAssignment(): bool\n    {\n        return $this === self::CoalesceAssign;\n    }\n}\n","src/Ast/ParseFailure.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Ast;\n\n/**\n * A syntax error encountered while parsing one file.\n *\n * Parse failures never abort a scan; they are collected and reported.\n */\nfinal class ParseFailure\n{\n    public function __construct(\n        public readonly string $relativePath,\n        public readonly string $absolutePath,\n        public readonly int $line,\n        public readonly string $message,\n        public readonly bool $fatal,\n    ) {\n    }\n\n    public function describe(): string\n    {\n        return sprintf('%s:%d %s', $this->relativePath, $this->line, $this->message);\n    }\n}\n","src/Ast/ParseResult.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Ast;\n\nuse PhpParser\\Node\\Stmt;\n\n/**\n * Outcome of parsing a single file.\n *\n * php-parser can recover from many syntax errors, so `statements` may be a\n * usable (partial) AST even when `failures` is not empty.\n */\nfinal class ParseResult\n{\n    /**\n     * @param list<Stmt> $statements\n     * @param list<ParseFailure> $failures\n     */\n    public function __construct(\n        public readonly array $statements,\n        public readonly array $failures,\n        public readonly bool $usable,\n    ) {\n    }\n\n    public function hasFailures(): bool\n    {\n        return $this->failures !== [];\n    }\n}\n","src/Ast/Visitor/ClassShapeBuilder.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Ast\\Visitor;\n\nuse WorkerSafety\\Ast\\Index\\ClassKind;\nuse WorkerSafety\\Ast\\Index\\ClassShape;\nuse WorkerSafety\\Ast\\Index\\MethodShape;\nuse WorkerSafety\\Ast\\Index\\PropertyShape;\nuse WorkerSafety\\Finding\\Location;\n\n/**\n * Mutable accumulator used while walking one class-like declaration.\n *\n * @internal\n */\nfinal class ClassShapeBuilder\n{\n    /**\n     * @var array<string, PropertyShape>\n     */\n    private array $staticProperties = [];\n\n    /**\n     * @var array<string, PropertyShape>\n     */\n    private array $instanceProperties = [];\n\n    /**\n     * @var array<string, MethodShape>\n     */\n    private array $methods = [];\n\n    /**\n     * @var list<string>\n     */\n    private array $traits = [];\n\n    /**\n     * @param list<string> $interfaces\n     */\n    public function __construct(\n        public readonly string $name,\n        public readonly string $shortName,\n        public readonly ClassKind $kind,\n        public readonly bool $isFinal,\n        public readonly bool $isAbstract,\n        public readonly ?string $parent,\n        public readonly array $interfaces,\n        public readonly Location $location,\n        public readonly bool $isAnonymous,\n        public readonly bool $isReadonly = false,\n    ) {\n    }\n\n    public function addProperty(PropertyShape $property): void\n    {\n        if ($property->isStatic) {\n            $this->staticProperties[$property->name] = $property;\n\n            return;\n        }\n\n        $this->instanceProperties[$property->name] = $property;\n    }\n\n    public function addMethod(MethodShape $method): void\n    {\n        $this->methods[strtolower($method->name)] = $method;\n    }\n\n    /**\n     * @param list<string> $traits\n     */\n    public function addTraits(array $traits): void\n    {\n        foreach ($traits as $trait) {\n            if (!in_array($trait, $this->traits, true)) {\n                $this->traits[] = $trait;\n            }\n        }\n    }\n\n    public function build(): ClassShape\n    {\n        return new ClassShape(\n            $this->name,\n            $this->shortName,\n            $this->kind,\n            $this->isFinal,\n            $this->isAbstract,\n            $this->parent,\n            $this->interfaces,\n            $this->traits,\n            $this->staticProperties,\n            $this->instanceProperties,\n            $this->methods,\n            $this->location,\n        );\n    }\n}\n","src/Ast/Visitor/FirstInstantiationFinder.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Ast\\Visitor;\n\nuse PhpParser\\Node;\nuse PhpParser\\Node\\Expr;\nuse PhpParser\\Node\\Stmt;\nuse PhpParser\\NodeTraverser;\nuse PhpParser\\NodeVisitorAbstract;\nuse WorkerSafety\\Ast\\AstHelper;\n\n/**\n * Works out which class a container factory actually produces.\n *\n * Only the *returned* expression counts. A factory that builds a dependency\n * before returning the service — `$dep = new SafeDep(); return new Ctx();` —\n * must resolve to `Ctx`, and anything less obvious resolves to nothing at all:\n * a wrong answer here attributes one class's mutability to another.\n */\nfinal class FirstInstantiationFinder extends NodeVisitorAbstract\n{\n    private ?string $className = null;\n\n    private bool $ambiguous = false;\n\n    private int $depth = 0;\n\n    public function __construct(\n        private readonly ?string $currentClass,\n        private readonly ?string $parentClass,\n    ) {\n    }\n\n    /**\n     * The class a closure or arrow function returns, or null when it cannot be\n     * determined with confidence.\n     */\n    public static function find(Node $subject, ?string $currentClass, ?string $parentClass): ?string\n    {\n        if ($subject instanceof Expr\\ArrowFunction) {\n            // `fn () => new Ctx()` — the body is the returned expression.\n            return self::classOf($subject->expr, $currentClass, $parentClass);\n        }\n\n        if (!$subject instanceof Expr\\Closure && !$subject instanceof Stmt\\Function_) {\n            return self::classOf($subject instanceof Expr ? $subject : null, $currentClass, $parentClass);\n        }\n\n        $finder = new self($currentClass, $parentClass);\n        (new NodeTraverser($finder))->traverse($subject->stmts);\n\n        return $finder->ambiguous ? null : $finder->className;\n    }\n\n    public function enterNode(Node $node): ?int\n    {\n        // Returns inside a nested function belong to that function, not to ours.\n        if ($node instanceof Expr\\Closure || $node instanceof Expr\\ArrowFunction || $node instanceof Stmt\\Function_) {\n            ++$this->depth;\n\n            return null;\n        }\n\n        if ($this->depth > 0 || !$node instanceof Stmt\\Return_ || $node->expr === null) {\n            return null;\n        }\n\n        $class = self::classOf($node->expr, $this->currentClass, $this->parentClass);\n\n        if ($class === null) {\n            // A return we cannot read means we cannot claim to know the type.\n            $this->ambiguous = true;\n\n            return null;\n        }\n\n        if ($this->className !== null && strtolower($this->className) !== strtolower($class)) {\n            $this->ambiguous = true;\n\n            return null;\n        }\n\n        $this->className = $class;\n\n        return null;\n    }\n\n    public function leaveNode(Node $node): null\n    {\n        if ($node instanceof Expr\\Closure || $node instanceof Expr\\ArrowFunction || $node instanceof Stmt\\Function_) {\n            --$this->depth;\n        }\n\n        return null;\n    }\n\n    private static function classOf(?Expr $expr, ?string $currentClass, ?string $parentClass): ?string\n    {\n        if (!$expr instanceof Expr\\New_ || !$expr->class instanceof Node\\Name) {\n            return null;\n        }\n\n        return AstHelper::resolveClassReference($expr->class, $currentClass, $parentClass);\n    }\n}\n","src/Ast/Visitor/FunctionScope.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Ast\\Visitor;\n\nuse WorkerSafety\\Ast\\Index\\DefaultValueKind;\nuse WorkerSafety\\Ast\\Index\\StateWrite;\nuse WorkerSafety\\Finding\\Location;\n\n/**\n * Mutable accumulator for one function-like scope.\n *\n * @internal\n */\nfinal class FunctionScope\n{\n    /**\n     * @var list<string>\n     */\n    public array $assignedStaticProperties = [];\n\n    /**\n     * @var list<string>\n     */\n    public array $assignedInstanceProperties = [];\n\n    public bool $instantiatesSelf = false;\n\n    /**\n     * True once a return/throw/exit has been passed in this scope, after which\n     * no later statement is guaranteed to run.\n     */\n    public bool $sawEarlyExit = false;\n\n    /**\n     * Static locals declared directly in this scope.\n     *\n     * @var array<string, array{location: Location, snippet: string|null, default: DefaultValueKind, writes: list<StateWrite>, excerpt: string|null}>\n     */\n    public array $staticLocals = [];\n\n    public function __construct(\n        public readonly ?string $name,\n        public readonly bool $isMethod,\n        public readonly bool $isStatic,\n        public readonly ?ClassShapeBuilder $class,\n        public readonly ?self $methodScope,\n    ) {\n    }\n\n    public function recordStaticPropertyAssignment(string $property): void\n    {\n        $target = $this->methodScope ?? $this;\n\n        if (!in_array($property, $target->assignedStaticProperties, true)) {\n            $target->assignedStaticProperties[] = $property;\n        }\n    }\n\n    public function recordInstancePropertyAssignment(string $property): void\n    {\n        $target = $this->methodScope ?? $this;\n\n        if (!in_array($property, $target->assignedInstanceProperties, true)) {\n            $target->assignedInstanceProperties[] = $property;\n        }\n    }\n\n    public function markInstantiatesSelf(): void\n    {\n        $target = $this->methodScope ?? $this;\n        $target->instantiatesSelf = true;\n    }\n\n    public function declareStaticLocal(\n        string $name,\n        Location $location,\n        ?string $snippet,\n        DefaultValueKind $default,\n        ?string $excerpt = null,\n    ): void {\n        $this->staticLocals[$name] = [\n            'location' => $location,\n            'snippet' => $snippet,\n            'default' => $default,\n            'writes' => [],\n            'excerpt' => $excerpt,\n        ];\n    }\n\n    public function hasStaticLocal(string $name): bool\n    {\n        return isset($this->staticLocals[$name]);\n    }\n\n    public function recordStaticLocalWrite(string $name, StateWrite $write): void\n    {\n        if (!isset($this->staticLocals[$name])) {\n            return;\n        }\n\n        $this->staticLocals[$name]['writes'][] = $write;\n    }\n}\n","src/Ast/Visitor/IndexCollectingVisitor.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Ast\\Visitor;\n\nuse PhpParser\\Node;\nuse PhpParser\\Node\\Expr;\nuse PhpParser\\Node\\Identifier;\nuse PhpParser\\Node\\Stmt;\nuse PhpParser\\NodeVisitorAbstract;\nuse WorkerSafety\\Ast\\AstHelper;\nuse WorkerSafety\\Ast\\Index\\BindingContext;\nuse WorkerSafety\\Ast\\Index\\ClassKind;\nuse WorkerSafety\\Ast\\Index\\ContainerBindingCollector;\nuse WorkerSafety\\Ast\\Index\\MethodShape;\nuse WorkerSafety\\Ast\\Index\\ProjectIndex;\nuse WorkerSafety\\Ast\\Index\\PropertyShape;\nuse WorkerSafety\\Ast\\Index\\StateWrite;\nuse WorkerSafety\\Ast\\Index\\StaticLocalVariable;\nuse WorkerSafety\\Ast\\Index\\WriteKind;\nuse WorkerSafety\\Support\\NameHeuristics;\nuse WorkerSafety\\Support\\SourceFile;\n\n/**\n * Builds the project-wide semantic model from one file's AST.\n *\n * Everything the naming, mutability and lifetime heuristics need is derived\n * here so that the rules themselves stay small and testable.\n */\nfinal class IndexCollectingVisitor extends NodeVisitorAbstract\n{\n    /**\n     * Functions that make an array grow.\n     *\n     * @var array<string, true>\n     */\n    private const GROWING_FUNCTIONS = ['array_push' => true, 'array_unshift' => true];\n\n    /**\n     * Functions that make an array shrink; seeing one counts as a release path.\n     *\n     * @var array<string, true>\n     */\n    private const SHRINKING_FUNCTIONS = [\n        'array_shift' => true,\n        'array_pop' => true,\n        // array_splice() takes its subject by reference; array_slice() returns\n        // a copy and leaves the source untouched, so it is not a release path.\n        'array_splice' => true,\n    ];\n\n    /**\n     * @var list<ClassShapeBuilder>\n     */\n    private array $classStack = [];\n\n    /**\n     * @var list<FunctionScope>\n     */\n    private array $functionStack = [];\n\n    private int $loopDepth = 0;\n\n    private int $conditionalDepth = 0;\n\n    /**\n     * The expression each enclosing `Stmt\\Expression` consists of.\n     *\n     * A write is only \"statement level\" when it *is* one of these, which is\n     * what tells a reset apart from an assignment buried in some other\n     * expression.\n     *\n     * @var list<Expr>\n     */\n    private array $statementExpressions = [];\n\n    /**\n     * @param list<ContainerBindingCollector> $bindingCollectors\n     */\n    public function __construct(\n        private readonly ProjectIndex $index,\n        private readonly SourceFile $file,\n        private readonly array $bindingCollectors = [],\n    ) {\n    }\n\n    public function beforeTraverse(array $nodes): ?array\n    {\n        $this->classStack = [];\n        $this->functionStack = [];\n        $this->loopDepth = 0;\n        $this->conditionalDepth = 0;\n        $this->statementExpressions = [];\n\n        return null;\n    }\n\n    public function enterNode(Node $node): null\n    {\n        $this->enterControlFlow($node);\n\n        if ($node instanceof Stmt\\ClassLike) {\n            $this->enterClassLike($node);\n\n            return null;\n        }\n\n        if ($node instanceof Stmt\\TraitUse) {\n            $this->currentClass()?->addTraits(array_values(array_map(\n                static fn (Node\\Name $name): string => AstHelper::nameToString($name),\n                $node->traits,\n            )));\n\n            return null;\n        }\n\n        if ($node instanceof Stmt\\Property) {\n            $this->collectProperty($node);\n\n            return null;\n        }\n\n        if ($node instanceof Stmt\\ClassMethod) {\n            $this->pushFunctionScope($node->name->toString(), true, $node->isStatic());\n            $this->collectPromotedProperties($node);\n\n            return null;\n        }\n\n        if ($node instanceof Stmt\\Function_) {\n            $this->pushFunctionScope($node->name->toString(), false, false);\n\n            return null;\n        }\n\n        if ($node instanceof Expr\\Closure || $node instanceof Expr\\ArrowFunction) {\n            $this->pushFunctionScope(null, false, $node->static);\n\n            return null;\n        }\n\n        if ($node instanceof Stmt\\Static_) {\n            $this->collectStaticLocals($node);\n\n            return null;\n        }\n\n        if ($node instanceof Expr\\New_) {\n            $this->collectInstantiation($node);\n\n            return null;\n        }\n\n        $this->collectWrites($node);\n        $this->collectBindings($node);\n\n        return null;\n    }\n\n    public function leaveNode(Node $node): null\n    {\n        $this->leaveControlFlow($node);\n\n        if ($node instanceof Stmt\\ClassLike) {\n            $builder = array_pop($this->classStack);\n\n            if ($builder instanceof ClassShapeBuilder) {\n                $this->index->addClass($builder->build());\n            }\n\n            return null;\n        }\n\n        if ($node instanceof Stmt\\ClassMethod) {\n            $scope = $this->popFunctionScope();\n\n            if ($scope instanceof FunctionScope) {\n                $this->currentClass()?->addMethod($this->buildMethodShape($node, $scope));\n            }\n\n            return null;\n        }\n\n        if ($node instanceof Stmt\\Function_ || $node instanceof Expr\\Closure || $node instanceof Expr\\ArrowFunction) {\n            $this->popFunctionScope();\n        }\n\n        return null;\n    }\n\n    /**\n     * Nodes that make a statement conditional, repeated, or unreachable.\n     */\n    private function enterControlFlow(Node $node): void\n    {\n        if ($node instanceof Stmt\\Expression) {\n            $this->statementExpressions[] = $node->expr;\n        }\n\n        if (self::isLoop($node)) {\n            ++$this->loopDepth;\n        } elseif (self::isBranch($node)) {\n            ++$this->conditionalDepth;\n        }\n\n    }\n\n    private function leaveControlFlow(Node $node): void\n    {\n        if ($node instanceof Stmt\\Expression) {\n            array_pop($this->statementExpressions);\n        }\n\n        if (self::isLoop($node)) {\n            --$this->loopDepth;\n        } elseif (self::isBranch($node)) {\n            --$this->conditionalDepth;\n        }\n\n        // Set on leave, so the returned expression itself still counts as\n        // reached while everything after it does not. `goto` belongs here too:\n        // it can jump over the statements that follow.\n        if ($node instanceof Stmt\\Return_\n            || $node instanceof Stmt\\Goto_\n            || $node instanceof Expr\\Throw_\n            || $node instanceof Expr\\Exit_\n        ) {\n            $scope = $this->currentFunction();\n\n            if ($scope instanceof FunctionScope) {\n                $scope->sawEarlyExit = true;\n            }\n        }\n    }\n\n    private static function isLoop(Node $node): bool\n    {\n        return $node instanceof Stmt\\For_\n            || $node instanceof Stmt\\Foreach_\n            || $node instanceof Stmt\\While_\n            || $node instanceof Stmt\\Do_;\n    }\n\n    private static function isBranch(Node $node): bool\n    {\n        return $node instanceof Stmt\\If_\n            || $node instanceof Stmt\\ElseIf_\n            || $node instanceof Stmt\\Else_\n            || $node instanceof Stmt\\Switch_\n            || $node instanceof Stmt\\TryCatch\n            || $node instanceof Stmt\\Catch_\n            || $node instanceof Expr\\Match_\n            || $node instanceof Expr\\Ternary\n            // `$evict && array_pop(...)` only evaluates its right operand\n            // sometimes, so nothing inside is guaranteed to run.\n            || $node instanceof Expr\\BinaryOp\\BooleanAnd\n            || $node instanceof Expr\\BinaryOp\\BooleanOr\n            || $node instanceof Expr\\BinaryOp\\LogicalAnd\n            || $node instanceof Expr\\BinaryOp\\LogicalOr\n            || $node instanceof Expr\\BinaryOp\\Coalesce\n            // `$v ??= self::$x = []` only evaluates the right-hand side when\n            // the target is unset — which also makes the `??=` write itself\n            // conditional.\n            || $node instanceof Expr\\AssignOp\\Coalesce;\n    }\n\n    private function enterClassLike(Stmt\\ClassLike $node): void\n    {\n        $shortName = $node->name?->toString();\n        $isAnonymous = $shortName === null;\n\n        if ($isAnonymous) {\n            $shortName = 'class@anonymous';\n            $name = sprintf('class@anonymous:%s:%d', $this->file->relativePath, $node->getStartLine());\n        } else {\n            $namespaced = $node->namespacedName;\n            $name = $namespaced instanceof Node\\Name ? $namespaced->toString() : $shortName;\n        }\n\n        $parent = null;\n        $interfaces = [];\n\n        if ($node instanceof Stmt\\Class_) {\n            $parent = $node->extends instanceof Node\\Name ? AstHelper::nameToString($node->extends) : null;\n            $interfaces = self::namesToStrings($node->implements);\n        } elseif ($node instanceof Stmt\\Interface_) {\n            $interfaces = self::namesToStrings($node->extends);\n        } elseif ($node instanceof Stmt\\Enum_) {\n            $interfaces = self::namesToStrings($node->implements);\n        }\n\n        $this->classStack[] = new ClassShapeBuilder(\n            $name,\n            $shortName,\n            $this->classKind($node),\n            $node instanceof Stmt\\Class_ && $node->isFinal(),\n            $node instanceof Stmt\\Class_ && $node->isAbstract(),\n            $parent,\n            $interfaces,\n            AstHelper::location($node, $this->file),\n            $isAnonymous,\n            // PHP 8.2 `readonly class`: every declared property is readonly,\n            // including promoted constructor parameters.\n            $node instanceof Stmt\\Class_ && $node->isReadonly(),\n        );\n    }\n\n    /**\n     * @param array<array-key, Node\\Name> $names\n     *\n     * @return list<string>\n     */\n    private static function namesToStrings(array $names): array\n    {\n        return array_values(array_map(\n            static fn (Node\\Name $name): string => AstHelper::nameToString($name),\n            $names,\n        ));\n    }\n\n    private function classKind(Stmt\\ClassLike $node): ClassKind\n    {\n        return match (true) {\n            $node instanceof Stmt\\Interface_ => ClassKind::Interface,\n            $node instanceof Stmt\\Trait_ => ClassKind::Trait,\n            $node instanceof Stmt\\Enum_ => ClassKind::Enum,\n            default => ClassKind::ClassType,\n        };\n    }\n\n    private function collectProperty(Stmt\\Property $node): void\n    {\n        $class = $this->currentClass();\n\n        if (!$class instanceof ClassShapeBuilder) {\n            return;\n        }\n\n        $visibility = match (true) {\n            $node->isPrivate() => 'private',\n            $node->isProtected() => 'protected',\n            default => 'public',\n        };\n\n        foreach ($node->props as $prop) {\n            $location = AstHelper::location($node, $this->file);\n\n            $class->addProperty(new PropertyShape(\n                $prop->name->toString(),\n                $class->name,\n                $node->isStatic(),\n                $node->isReadonly() || $class->isReadonly,\n                false,\n                $visibility,\n                AstHelper::typeToString($node->type),\n                AstHelper::typeClassNames($node->type),\n                AstHelper::typeIsScalarOnly($node->type),\n                AstHelper::typeIsArray($node->type),\n                AstHelper::defaultValueKind($prop->default),\n                $location,\n                $this->file->snippet($location->line),\n                $this->file->identitySource($node->getStartFilePos(), $node->getEndFilePos()),\n            ));\n        }\n    }\n\n    private function collectPromotedProperties(Stmt\\ClassMethod $node): void\n    {\n        $class = $this->currentClass();\n\n        if (!$class instanceof ClassShapeBuilder || strtolower($node->name->toString()) !== '__construct') {\n            return;\n        }\n\n        foreach ($node->params as $param) {\n            if (!$param->isPromoted() || !$param->var instanceof Expr\\Variable || !is_string($param->var->name)) {\n                continue;\n            }\n\n            $visibility = match (true) {\n                $param->isPrivate() => 'private',\n                $param->isProtected() => 'protected',\n                default => 'public',\n            };\n\n            $location = AstHelper::location($param, $this->file);\n\n            $class->addProperty(new PropertyShape(\n                $param->var->name,\n                $class->name,\n                false,\n                $param->isReadonly() || $class->isReadonly,\n                true,\n                $visibility,\n                AstHelper::typeToString($param->type),\n                AstHelper::typeClassNames($param->type),\n                AstHelper::typeIsScalarOnly($param->type),\n                AstHelper::typeIsArray($param->type),\n                AstHelper::defaultValueKind($param->default),\n                $location,\n                $this->file->snippet($location->line),\n                $this->file->identitySource($param->getStartFilePos(), $param->getEndFilePos()),\n            ));\n        }\n    }\n\n    private function collectStaticLocals(Stmt\\Static_ $node): void\n    {\n        $scope = $this->currentFunction();\n\n        if (!$scope instanceof FunctionScope) {\n            return;\n        }\n\n        foreach ($node->vars as $staticVar) {\n            if (!is_string($staticVar->var->name)) {\n                continue;\n            }\n\n            $location = AstHelper::location($node, $this->file);\n\n            $scope->declareStaticLocal(\n                $staticVar->var->name,\n                $location,\n                $this->file->snippet($location->line),\n                AstHelper::defaultValueKind($staticVar->default),\n                $this->file->identitySource($node->getStartFilePos(), $node->getEndFilePos()),\n            );\n        }\n    }\n\n    private function collectInstantiation(Expr\\New_ $node): void\n    {\n        $scope = $this->currentFunction();\n\n        if (!$scope instanceof FunctionScope) {\n            return;\n        }\n\n        if ($node->class instanceof Node\\Name && AstHelper::refersToSelf($node->class, $this->currentClassName())) {\n            $scope->markInstantiatesSelf();\n        }\n    }\n\n    private function collectWrites(Node $node): void\n    {\n        if ($node instanceof Expr\\Assign) {\n            $kind = AstHelper::isEmptyArray($node->expr) || AstHelper::isNullConstant($node->expr)\n                ? WriteKind::Clear\n                : WriteKind::Assign;\n\n            $this->recordWrite($node->var, $kind, $node);\n\n            return;\n        }\n\n        if ($node instanceof Expr\\AssignRef) {\n            $this->recordWrite($node->var, WriteKind::Assign, $node);\n            $this->recordWrite($node->expr, WriteKind::Reference, $node);\n\n            return;\n        }\n\n        if ($node instanceof Expr\\AssignOp) {\n            $this->recordWrite(\n                $node->var,\n                $node instanceof Expr\\AssignOp\\Coalesce ? WriteKind::CoalesceAssign : WriteKind::Compound,\n                $node,\n            );\n\n            return;\n        }\n\n        if ($node instanceof Expr\\PreInc || $node instanceof Expr\\PostInc\n            || $node instanceof Expr\\PreDec || $node instanceof Expr\\PostDec\n        ) {\n            $this->recordWrite($node->var, WriteKind::IncDec, $node);\n\n            return;\n        }\n\n        if ($node instanceof Stmt\\Unset_) {\n            foreach ($node->vars as $var) {\n                $this->recordWrite($var, WriteKind::Unset, $node);\n            }\n\n            return;\n        }\n\n        if ($node instanceof Expr\\FuncCall) {\n            $this->collectArrayFunctionWrite($node);\n        }\n    }\n\n    private function collectArrayFunctionWrite(Expr\\FuncCall $node): void\n    {\n        $name = AstHelper::functionName($node);\n\n        if ($name === null) {\n            return;\n        }\n\n        $kind = match (true) {\n            isset(self::GROWING_FUNCTIONS[$name]) => WriteKind::Grow,\n            isset(self::SHRINKING_FUNCTIONS[$name]) => WriteKind::Shrink,\n            default => null,\n        };\n\n        if ($kind === null) {\n            return;\n        }\n\n        $first = $node->args[0] ?? null;\n\n        if (!$first instanceof Node\\Arg) {\n            return;\n        }\n\n        // The function decides the effect; the dimension only says which\n        // collection it lands on.\n        $this->recordWrite($first->value, $kind, $node, true);\n    }\n\n    /**\n     * Attribute a mutation to a static property, an instance property or a\n     * static local variable.\n     */\n    private function recordWrite(Expr $target, WriteKind $kind, Node $node, bool $kindIsEffect = false): void\n    {\n        $base = AstHelper::unwrapArrayDim($target);\n        $dimension = $target instanceof Expr\\ArrayDimFetch\n            ? $this->dimensionWrite($target, $base)\n            : null;\n\n        // A write through a dimension addresses one entry, never the whole\n        // collection: `unset(self::$x[$k])` removes a single entry, and\n        // `self::$x['last'] = []` assigns an empty array *into* a key, which\n        // can even add one. Only a write to the property itself can clear it.\n        //\n        // A call such as `array_push(self::$x['bucket'], $v)` is different: the\n        // function already states the effect, and the dimension only says which\n        // collection it applies to. The fixed outer key bounds how many keys\n        // `$x` has, not how large the array under `bucket` grows.\n        if ($dimension === null || $kindIsEffect) {\n            $effective = $kind;\n            $literalKey = false;\n        } else {\n            $effective = $kind === WriteKind::Unset ? WriteKind::Shrink : $dimension['kind'];\n            $literalKey = $dimension['literalKey'];\n        }\n\n        if ($base instanceof Expr\\StaticPropertyFetch) {\n            $this->recordStaticPropertyWrite($base, $effective, $node, $literalKey);\n\n            return;\n        }\n\n        if ($base instanceof Expr\\PropertyFetch) {\n            $this->recordInstancePropertyWrite($base);\n\n            return;\n        }\n\n        if ($base instanceof Expr\\Variable && is_string($base->name)) {\n            $scope = $this->currentFunction();\n\n            if ($scope instanceof FunctionScope && $scope->hasStaticLocal($base->name)) {\n                $scope->recordStaticLocalWrite($base->name, $this->makeWrite($effective, $node, $literalKey));\n            }\n        }\n    }\n\n    /**\n     * Classify a write through one or more array dimensions.\n     *\n     * `self::$x[] = …` appends; `self::$x[$k] = …` is a keyed write. The key is\n     * only \"literal\" when *every* dimension in the chain is a compile-time\n     * constant: `self::$x['bucket'][] = …` writes a fixed outer key but still\n     * grows the nested array without bound.\n     *\n     * @return array{kind: WriteKind, literalKey: bool}|null\n     */\n    private function dimensionWrite(Expr\\ArrayDimFetch $target, Expr $base): ?array\n    {\n        /** @var list<Expr|null> $dimensions outermost first */\n        $dimensions = [];\n        $current = $target;\n\n        while (true) {\n            $dimensions[] = $current->dim;\n            $var = $current->var;\n\n            if ($var === $base) {\n                break;\n            }\n\n            if (!$var instanceof Expr\\ArrayDimFetch) {\n                return null;\n            }\n\n            $current = $var;\n        }\n\n        // The dimension closest to the property decides how the property\n        // itself is written.\n        $rootDimension = $dimensions[count($dimensions) - 1];\n\n        $literalKey = true;\n\n        foreach ($dimensions as $dimension) {\n            if (!self::isFixedKey($dimension)) {\n                $literalKey = false;\n\n                break;\n            }\n        }\n\n        return [\n            'kind' => $rootDimension === null ? WriteKind::Append : WriteKind::KeyedWrite,\n            'literalKey' => $literalKey,\n        ];\n    }\n\n    /**\n     * A key that is fixed at compile time, so writing through it cannot add an\n     * unpredictable number of entries.\n     *\n     * An interpolated string (\"row_$id\") is a scalar node but not a fixed key.\n     */\n    private static function isFixedKey(?Expr $dimension): bool\n    {\n        if ($dimension === null) {\n            return false;\n        }\n\n        return $dimension instanceof Node\\Scalar\\String_\n            || $dimension instanceof Node\\Scalar\\Int_\n            || $dimension instanceof Node\\Scalar\\Float_\n            || $dimension instanceof Expr\\ClassConstFetch\n            || $dimension instanceof Expr\\ConstFetch;\n    }\n\n    private function recordStaticPropertyWrite(\n        Expr\\StaticPropertyFetch $fetch,\n        WriteKind $kind,\n        Node $node,\n        bool $literalKey = false,\n    ): void {\n        if (!$fetch->name instanceof Node\\VarLikeIdentifier) {\n            return;\n        }\n\n        $class = AstHelper::resolveClassReference(\n            $fetch->class,\n            $this->currentClassName(),\n            $this->currentParentName(),\n        );\n\n        if ($class === null) {\n            return;\n        }\n\n        $property = $fetch->name->toString();\n\n        $this->index->addStaticWrite($class, $property, $this->makeWrite($kind, $node, $literalKey));\n        $this->currentFunction()?->recordStaticPropertyAssignment($property);\n    }\n\n    private function recordInstancePropertyWrite(Expr\\PropertyFetch $fetch): void\n    {\n        if (!$fetch->var instanceof Expr\\Variable || $fetch->var->name !== 'this') {\n            return;\n        }\n\n        if (!$fetch->name instanceof Identifier) {\n            return;\n        }\n\n        $this->currentFunction()?->recordInstancePropertyAssignment($fetch->name->toString());\n    }\n\n    private function makeWrite(WriteKind $kind, Node $node, bool $literalKey = false): StateWrite\n    {\n        $location = AstHelper::location($node, $this->file);\n        $scope = $this->currentFunction();\n        $methodScope = $scope instanceof FunctionScope ? ($scope->methodScope ?? $scope) : null;\n        $methodName = $methodScope?->name;\n\n        // A write is attributed to the function it is *declared* in, but a\n        // closure body is not executed by that function — `$reset = function ()\n        // { self::$x = []; };` never runs on its own. Declaration scope is not\n        // execution scope, so nothing inside a closure is guaranteed.\n        $inClosure = $scope instanceof FunctionScope && $scope->name === null;\n\n        // Only a write that is a statement in its own right can be reasoned\n        // about from its position. Whether a *sub*-expression is evaluated\n        // depends on everything around it — nullsafe chains in any of their\n        // forms, short-circuit operators, arguments of a call that never\n        // happens — so an assignment nested inside another expression is never\n        // treated as guaranteed.\n        $statementLevel = $node instanceof Stmt\n            || ($this->statementExpressions !== []\n                && $this->statementExpressions[count($this->statementExpressions) - 1] === $node);\n\n        return new StateWrite(\n            $kind,\n            $location,\n            $this->file->snippet($location->line),\n            $this->currentClassName(),\n            $methodName,\n            $methodName !== null && strtolower($methodName) === '__construct',\n            $methodName !== null && NameHeuristics::looksLikeReset($methodName),\n            $literalKey,\n            $statementLevel\n                && !$inClosure\n                && $this->loopDepth === 0\n                && $this->conditionalDepth === 0\n                && !($scope instanceof FunctionScope && $scope->sawEarlyExit),\n        );\n    }\n\n    private function collectBindings(Node $node): void\n    {\n        if ($this->bindingCollectors === []) {\n            return;\n        }\n\n        if (!$node instanceof Expr\\MethodCall && !$node instanceof Expr\\StaticCall) {\n            return;\n        }\n\n        $scope = $this->currentFunction();\n        $methodScope = $scope instanceof FunctionScope ? ($scope->methodScope ?? $scope) : null;\n\n        $context = new BindingContext(\n            $this->file,\n            $this->currentClassName(),\n            $this->currentParentName(),\n            $methodScope?->name,\n        );\n\n        foreach ($this->bindingCollectors as $collector) {\n            foreach ($collector->collect($node, $context) as $binding) {\n                $this->index->addBinding($binding);\n            }\n        }\n    }\n\n    private function buildMethodShape(Stmt\\ClassMethod $node, FunctionScope $scope): MethodShape\n    {\n        $class = $this->currentClass();\n        $className = $class instanceof ClassShapeBuilder ? $class->name : '';\n        $returnType = AstHelper::typeToString($node->returnType);\n\n        $visibility = match (true) {\n            $node->isPrivate() => 'private',\n            $node->isProtected() => 'protected',\n            default => 'public',\n        };\n\n        return new MethodShape(\n            $node->name->toString(),\n            $className,\n            $node->isStatic(),\n            $visibility,\n            $returnType,\n            $this->returnsSelf($node, $className),\n            $scope->instantiatesSelf,\n            NameHeuristics::looksLikeReset($node->name->toString()),\n            $scope->assignedStaticProperties,\n            $scope->assignedInstanceProperties,\n            AstHelper::location($node, $this->file),\n        );\n    }\n\n    private function returnsSelf(Stmt\\ClassMethod $node, string $className): bool\n    {\n        $type = $node->returnType;\n\n        if ($type instanceof Node\\NullableType) {\n            $type = $type->type;\n        }\n\n        if ($type instanceof Identifier) {\n            return in_array(strtolower($type->toString()), ['self', 'static'], true);\n        }\n\n        if ($type instanceof Node\\Name) {\n            $resolved = AstHelper::nameToString($type);\n\n            return $className !== '' && strtolower($resolved) === strtolower($className);\n        }\n\n        return false;\n    }\n\n    private function pushFunctionScope(?string $name, bool $isMethod, bool $isStatic): void\n    {\n        $current = $this->currentFunction();\n        $methodScope = null;\n\n        if (!$isMethod && $current instanceof FunctionScope) {\n            // Closures attribute their writes to the method that declares them.\n            $methodScope = $current->methodScope ?? $current;\n        }\n\n        $this->functionStack[] = new FunctionScope(\n            $name,\n            $isMethod,\n            $isStatic,\n            $this->currentClass(),\n            $methodScope,\n        );\n    }\n\n    private function popFunctionScope(): ?FunctionScope\n    {\n        $scope = array_pop($this->functionStack);\n\n        if (!$scope instanceof FunctionScope) {\n            return null;\n        }\n\n        foreach ($scope->staticLocals as $name => $local) {\n            $this->index->addStaticLocal(new StaticLocalVariable(\n                $name,\n                $this->currentClassName(),\n                $scope->name,\n                $local['default'],\n                $local['location'],\n                $local['snippet'],\n                $local['writes'],\n                $local['excerpt'],\n            ));\n        }\n\n        return $scope;\n    }\n\n    private function currentClass(): ?ClassShapeBuilder\n    {\n        return $this->classStack === [] ? null : $this->classStack[count($this->classStack) - 1];\n    }\n\n    private function currentClassName(): ?string\n    {\n        return $this->currentClass()?->name;\n    }\n\n    private function currentParentName(): ?string\n    {\n        return $this->currentClass()?->parent;\n    }\n\n    private function currentFunction(): ?FunctionScope\n    {\n        return $this->functionStack === [] ? null : $this->functionStack[count($this->functionStack) - 1];\n    }\n}\n","src/Ast/Visitor/RuleDispatchVisitor.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Ast\\Visitor;\n\nuse PhpParser\\Node;\nuse PhpParser\\Node\\Expr;\nuse PhpParser\\Node\\Stmt;\nuse PhpParser\\NodeVisitorAbstract;\nuse WorkerSafety\\Ast\\AstHelper;\nuse WorkerSafety\\Ast\\Index\\ClassKind;\nuse WorkerSafety\\Finding\\Finding;\nuse WorkerSafety\\Rule\\Rule;\nuse WorkerSafety\\Rule\\RuleContext;\nuse WorkerSafety\\Rule\\Scope;\n\n/**\n * Feeds nodes to the rules that asked for them and keeps the class/function\n * scope in sync.\n *\n * Rules declare node types by class name; because a rule may legitimately ask\n * for an abstract type (`Expr\\AssignOp`) or an interface, the mapping from a\n * concrete node class to interested rules is resolved once per node class and\n * then cached for the rest of the scan.\n */\nfinal class RuleDispatchVisitor extends NodeVisitorAbstract\n{\n    /**\n     * @var list<Rule>\n     */\n    private array $rules;\n\n    /**\n     * @var array<class-string<Node>, list<Rule>>\n     */\n    private array $dispatchCache = [];\n\n    /**\n     * @var list<Finding>\n     */\n    private array $findings = [];\n\n    private RuleContext $context;\n\n    /**\n     * @param list<Rule> $rules\n     */\n    public function __construct(array $rules, private readonly Scope $scope)\n    {\n        // Rules that request no node types are driven purely by the project\n        // index, so they never take part in dispatch.\n        $this->rules = array_values(array_filter(\n            $rules,\n            static fn (Rule $rule): bool => $rule->nodeTypes() !== [],\n        ));\n    }\n\n    public function startFile(RuleContext $context): void\n    {\n        $this->context = $context;\n        $this->findings = [];\n        $this->scope->reset();\n    }\n\n    /**\n     * @return list<Finding>\n     */\n    public function findings(): array\n    {\n        return $this->findings;\n    }\n\n    public function enterNode(Node $node): null\n    {\n        $this->pushScope($node);\n\n        foreach ($this->rulesFor($node) as $rule) {\n            foreach ($rule->enterNode($node, $this->context) as $finding) {\n                $this->findings[] = $finding;\n            }\n        }\n\n        return null;\n    }\n\n    public function leaveNode(Node $node): null\n    {\n        if ($node instanceof Stmt\\ClassLike) {\n            $this->scope->leaveClass();\n\n            return null;\n        }\n\n        if ($node instanceof Node\\FunctionLike) {\n            $this->scope->leaveFunction();\n        }\n\n        return null;\n    }\n\n    private function pushScope(Node $node): void\n    {\n        if ($node instanceof Stmt\\ClassLike) {\n            $shortName = $node->name?->toString();\n\n            if ($shortName === null) {\n                $shortName = 'class@anonymous';\n                $name = sprintf(\n                    'class@anonymous:%s:%d',\n                    $this->context->file()->relativePath,\n                    $node->getStartLine(),\n                );\n            } else {\n                $namespaced = $node->namespacedName;\n                $name = $namespaced instanceof Node\\Name ? $namespaced->toString() : $shortName;\n            }\n\n            $parent = $node instanceof Stmt\\Class_ && $node->extends instanceof Node\\Name\n                ? AstHelper::nameToString($node->extends)\n                : null;\n\n            $this->scope->enterClass($node, $name, $shortName, $parent, $this->classKind($node));\n\n            return;\n        }\n\n        if ($node instanceof Stmt\\ClassMethod) {\n            $this->scope->enterFunction($node, $node->name->toString(), true, $node->isStatic());\n\n            return;\n        }\n\n        if ($node instanceof Stmt\\Function_) {\n            $this->scope->enterFunction($node, $node->name->toString(), false, false);\n\n            return;\n        }\n\n        if ($node instanceof Expr\\Closure || $node instanceof Expr\\ArrowFunction) {\n            $this->scope->enterFunction($node, null, false, $node->static);\n        }\n    }\n\n    private function classKind(Stmt\\ClassLike $node): ClassKind\n    {\n        return match (true) {\n            $node instanceof Stmt\\Interface_ => ClassKind::Interface,\n            $node instanceof Stmt\\Trait_ => ClassKind::Trait,\n            $node instanceof Stmt\\Enum_ => ClassKind::Enum,\n            default => ClassKind::ClassType,\n        };\n    }\n\n    /**\n     * @return list<Rule>\n     */\n    private function rulesFor(Node $node): array\n    {\n        $nodeClass = $node::class;\n\n        if (isset($this->dispatchCache[$nodeClass])) {\n            return $this->dispatchCache[$nodeClass];\n        }\n\n        $interested = [];\n\n        foreach ($this->rules as $rule) {\n            foreach ($rule->nodeTypes() as $type) {\n                if ($nodeClass === $type || is_a($nodeClass, $type, true)) {\n                    $interested[] = $rule;\n\n                    break;\n                }\n            }\n        }\n\n        return $this->dispatchCache[$nodeClass] = $interested;\n    }\n}\n","src/Ast/Visitor/VariableWriteFinder.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Ast\\Visitor;\n\nuse PhpParser\\Node;\nuse PhpParser\\Node\\Expr;\nuse PhpParser\\Node\\Stmt;\nuse PhpParser\\NodeTraverser;\nuse PhpParser\\NodeVisitorAbstract;\nuse WorkerSafety\\Ast\\AstHelper;\n\n/**\n * Answers \"is this local variable written anywhere in this subtree?\".\n *\n * Used for the small, bounded lookups a node-driven rule needs, such as\n * deciding whether a `global $user;` declaration is followed by an assignment.\n */\nfinal class VariableWriteFinder extends NodeVisitorAbstract\n{\n    private bool $found = false;\n\n    /**\n     * @param list<string> $names variable names without the leading `$`\n     */\n    public function __construct(private readonly array $names)\n    {\n    }\n\n    /**\n     * @param list<string> $names\n     * @param Node|list<Node> $subject\n     */\n    public static function writesAny(Node|array $subject, array $names): bool\n    {\n        if ($names === []) {\n            return false;\n        }\n\n        $finder = new self($names);\n        (new NodeTraverser($finder))->traverse(is_array($subject) ? $subject : [$subject]);\n\n        return $finder->found;\n    }\n\n    public function enterNode(Node $node): null\n    {\n        if ($this->found) {\n            return null;\n        }\n\n        if ($node instanceof Expr\\Assign || $node instanceof Expr\\AssignOp || $node instanceof Expr\\AssignRef) {\n            $this->check($node->var);\n\n            return null;\n        }\n\n        if ($node instanceof Expr\\PreInc || $node instanceof Expr\\PostInc\n            || $node instanceof Expr\\PreDec || $node instanceof Expr\\PostDec\n        ) {\n            $this->check($node->var);\n\n            return null;\n        }\n\n        if ($node instanceof Stmt\\Unset_) {\n            foreach ($node->vars as $var) {\n                $this->check($var);\n            }\n\n            return null;\n        }\n\n        if ($node instanceof Stmt\\Foreach_) {\n            $this->check($node->valueVar);\n\n            if ($node->keyVar instanceof Expr) {\n                $this->check($node->keyVar);\n            }\n        }\n\n        return null;\n    }\n\n    private function check(Expr $target): void\n    {\n        $base = AstHelper::unwrapArrayDim($target);\n\n        if ($base instanceof Expr\\Variable && is_string($base->name) && in_array($base->name, $this->names, true)) {\n            $this->found = true;\n        }\n    }\n}\n","src/Attribute/WorkerSafetyIgnore.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Attribute;\n\nuse Attribute;\n\n/**\n * Suppresses the given rules for the annotated declaration.\n *\n * The scanner recognises the attribute by its short name, so importing it is\n * optional — but shipping the class means editors and static analysers do not\n * complain about an undefined attribute.\n *\n * ```php\n * #[WorkerSafetyIgnore('WS001', 'WS008')]\n * private static array $cache = [];\n * ```\n */\n#[\\Attribute(\\Attribute::TARGET_ALL | \\Attribute::IS_REPEATABLE)]\nfinal class WorkerSafetyIgnore\n{\n    /**\n     * @var list<string>\n     */\n    public readonly array $ruleIds;\n\n    public function __construct(string ...$ruleIds)\n    {\n        $this->ruleIds = array_values($ruleIds);\n    }\n}\n","src/Baseline/Baseline.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Baseline;\n\nuse WorkerSafety\\Application\\ApplicationInfo;\nuse WorkerSafety\\Finding\\Finding;\nuse WorkerSafety\\Finding\\FindingCollection;\n\n/**\n * A snapshot of accepted findings.\n *\n * Matching is by {@see Finding::fingerprint()}, which deliberately excludes the\n * line number: editing code above a baselined finding must not resurrect it,\n * while changing the finding itself must.\n */\nfinal class Baseline\n{\n    public const SCHEMA_VERSION = '1';\n\n    /**\n     * @var array<string, true>\n     */\n    private readonly array $fingerprints;\n\n    /**\n     * @param list<string> $fingerprints\n     * @param list<array<string, mixed>> $entries human readable records\n     */\n    public function __construct(\n        array $fingerprints,\n        public readonly array $entries = [],\n        public readonly ?string $generatedAt = null,\n        public readonly ?string $generatedBy = null,\n    ) {\n        $index = [];\n\n        foreach ($fingerprints as $fingerprint) {\n            $index[$fingerprint] = true;\n        }\n\n        $this->fingerprints = $index;\n    }\n\n    public static function empty(): self\n    {\n        return new self([]);\n    }\n\n    public static function fromFindings(FindingCollection $findings): self\n    {\n        $fingerprints = [];\n        $entries = [];\n\n        foreach ($findings->sorted() as $finding) {\n            $fingerprint = $finding->fingerprint();\n\n            if (isset($entries[$fingerprint])) {\n                continue;\n            }\n\n            $fingerprints[] = $fingerprint;\n            $entries[$fingerprint] = [\n                'rule' => $finding->ruleId,\n                'severity' => $finding->severity->value,\n                'file' => $finding->location->relativePath,\n                'line' => $finding->location->line,\n                'symbol' => $finding->symbol->describe(),\n                'fingerprint' => $fingerprint,\n            ];\n        }\n\n        return new self(\n            $fingerprints,\n            array_values($entries),\n            (new \\DateTimeImmutable('now', new \\DateTimeZone('UTC')))->format(\\DateTimeInterface::ATOM),\n            ApplicationInfo::NAME . ' ' . ApplicationInfo::VERSION,\n        );\n    }\n\n    public function contains(Finding $finding): bool\n    {\n        return isset($this->fingerprints[$finding->fingerprint()]);\n    }\n\n    public function count(): int\n    {\n        return count($this->fingerprints);\n    }\n\n    public function isEmpty(): bool\n    {\n        return $this->fingerprints === [];\n    }\n\n    /**\n     * @return array<string, mixed>\n     */\n    public function toArray(): array\n    {\n        return [\n            'version' => self::SCHEMA_VERSION,\n            'generated_at' => $this->generatedAt,\n            'generated_by' => $this->generatedBy,\n            'count' => $this->count(),\n            'findings' => $this->entries,\n        ];\n    }\n}\n","src/Baseline/BaselineFilter.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Baseline;\n\nuse WorkerSafety\\Finding\\Finding;\nuse WorkerSafety\\Finding\\FindingCollection;\n\n/**\n * Removes baselined findings while counting what was removed.\n */\nfinal class BaselineFilter\n{\n    /**\n     * @return array{0: FindingCollection, 1: int}\n     */\n    public function apply(FindingCollection $findings, Baseline $baseline): array\n    {\n        if ($baseline->isEmpty()) {\n            return [$findings, 0];\n        }\n\n        $kept = $findings->filter(static fn (Finding $finding): bool => !$baseline->contains($finding));\n\n        return [$kept, $findings->count() - $kept->count()];\n    }\n}\n","src/Baseline/BaselineRepository.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Baseline;\n\nuse WorkerSafety\\Exception\\ConfigurationException;\n\n/**\n * Reads and writes the baseline file.\n */\nfinal class BaselineRepository\n{\n    public function exists(string $path): bool\n    {\n        return is_file($path);\n    }\n\n    public function load(string $path): Baseline\n    {\n        if (!is_file($path) || !is_readable($path)) {\n            throw ConfigurationException::unreadable($path);\n        }\n\n        $contents = @file_get_contents($path);\n\n        if ($contents === false) {\n            throw ConfigurationException::unreadable($path);\n        }\n\n        try {\n            /** @var mixed $decoded */\n            $decoded = json_decode($contents, true, 512, JSON_THROW_ON_ERROR);\n        } catch (\\JsonException $exception) {\n            throw new ConfigurationException(\n                sprintf('Baseline file \"%s\" is not valid JSON: %s', $path, $exception->getMessage()),\n                0,\n                $exception,\n            );\n        }\n\n        if (!is_array($decoded)) {\n            throw ConfigurationException::invalidValue($path, 'the baseline file must contain a JSON object.');\n        }\n\n        $findings = $decoded['findings'] ?? [];\n\n        if (!is_array($findings)) {\n            throw ConfigurationException::invalidValue($path, '\"findings\" must be a list.');\n        }\n\n        $fingerprints = [];\n        $entries = [];\n\n        foreach ($findings as $entry) {\n            if (!is_array($entry)) {\n                throw ConfigurationException::invalidValue($path, 'every baseline entry must be an object.');\n            }\n\n            $fingerprint = $entry['fingerprint'] ?? null;\n\n            if (!is_string($fingerprint) || $fingerprint === '') {\n                throw ConfigurationException::invalidValue($path, 'every baseline entry needs a \"fingerprint\" string.');\n            }\n\n            $fingerprints[] = $fingerprint;\n            $entries[] = self::withStringKeys($entry);\n        }\n\n        $generatedAt = $decoded['generated_at'] ?? null;\n        $generatedBy = $decoded['generated_by'] ?? null;\n\n        return new Baseline(\n            $fingerprints,\n            $entries,\n            is_string($generatedAt) ? $generatedAt : null,\n            is_string($generatedBy) ? $generatedBy : null,\n        );\n    }\n\n    /**\n     * Drop non-string keys so the entry matches the documented shape.\n     *\n     * @param array<mixed, mixed> $entry\n     *\n     * @return array<string, mixed>\n     */\n    private static function withStringKeys(array $entry): array\n    {\n        $result = [];\n\n        foreach ($entry as $key => $value) {\n            if (is_string($key)) {\n                $result[$key] = $value;\n            }\n        }\n\n        return $result;\n    }\n\n    public function save(string $path, Baseline $baseline): void\n    {\n        $json = json_encode(\n            $baseline->toArray(),\n            JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR,\n        );\n\n        $directory = dirname($path);\n\n        if (!is_dir($directory) && !@mkdir($directory, 0o775, true) && !is_dir($directory)) {\n            throw new ConfigurationException(sprintf('Could not create directory \"%s\" for the baseline file.', $directory));\n        }\n\n        if (@file_put_contents($path, $json . \"\\n\") === false) {\n            throw new ConfigurationException(sprintf('Could not write the baseline file \"%s\".', $path));\n        }\n    }\n}\n","src/Command/AbstractCommand.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Command;\n\nuse Symfony\\Component\\Console\\Command\\Command;\nuse Symfony\\Component\\Console\\Input\\InputInterface;\nuse Symfony\\Component\\Console\\Output\\ConsoleOutputInterface;\nuse Symfony\\Component\\Console\\Output\\OutputInterface;\nuse WorkerSafety\\Application\\ExitCode;\nuse WorkerSafety\\Exception\\AnalysisException;\nuse WorkerSafety\\Exception\\ConfigurationException;\nuse WorkerSafety\\Support\\Paths;\n\n/**\n * Turns exceptions into the documented exit codes and keeps diagnostics off\n * stdout so that `--format=json` output stays parseable.\n */\nabstract class AbstractCommand extends Command\n{\n    abstract protected function handle(InputInterface $input, OutputInterface $output): ExitCode;\n\n    protected function execute(InputInterface $input, OutputInterface $output): int\n    {\n        try {\n            return $this->handle($input, $output)->value;\n        } catch (ConfigurationException $exception) {\n            $this->writeError($output, 'Configuration error', $exception->getMessage());\n\n            return ExitCode::InvalidConfiguration->value;\n        } catch (AnalysisException $exception) {\n            $this->writeError($output, 'Analysis error', $exception->getMessage());\n\n            return ExitCode::InternalError->value;\n        } catch (\\Throwable $exception) {\n            $this->writeError(\n                $output,\n                'Internal error',\n                sprintf('%s: %s', $exception::class, $exception->getMessage()),\n            );\n\n            if ($output->isVerbose()) {\n                $this->errorOutput($output)->writeln($exception->getTraceAsString());\n            }\n\n            return ExitCode::InternalError->value;\n        }\n    }\n\n    protected function writeError(OutputInterface $output, string $heading, string $message): void\n    {\n        $error = $this->errorOutput($output);\n        $error->writeln('');\n        $error->writeln(sprintf('<error> %s </error>', $heading));\n        $error->writeln('');\n        $error->writeln('  ' . $message);\n        $error->writeln('');\n    }\n\n    protected function errorOutput(OutputInterface $output): OutputInterface\n    {\n        return $output instanceof ConsoleOutputInterface ? $output->getErrorOutput() : $output;\n    }\n\n    /**\n     * The directory the analyzed project lives in.\n     */\n    protected function projectRoot(InputInterface $input): string\n    {\n        $option = $input->hasOption('project-dir') ? $input->getOption('project-dir') : null;\n\n        if (is_string($option) && $option !== '') {\n            return Paths::makeAbsolute($option, $this->workingDirectory());\n        }\n\n        return $this->workingDirectory();\n    }\n\n    protected function workingDirectory(): string\n    {\n        $cwd = getcwd();\n\n        return Paths::normalize($cwd === false ? '.' : $cwd);\n    }\n\n    /**\n     * Flatten an array option that also accepts comma separated values.\n     *\n     * @return list<string>\n     */\n    protected function listOption(InputInterface $input, string $name): array\n    {\n        if (!$input->hasOption($name)) {\n            return [];\n        }\n\n        $raw = $input->getOption($name);\n\n        if ($raw === null || $raw === false || $raw === []) {\n            return [];\n        }\n\n        $values = is_array($raw) ? $raw : [$raw];\n        $result = [];\n\n        foreach ($values as $value) {\n            if (!is_string($value)) {\n                continue;\n            }\n\n            foreach (explode(',', $value) as $part) {\n                $part = trim($part);\n\n                if ($part !== '') {\n                    $result[] = $part;\n                }\n            }\n        }\n\n        return $result;\n    }\n\n    /**\n     * @return list<string>\n     */\n    protected function stringArrayArgument(InputInterface $input, string $name): array\n    {\n        $raw = $input->getArgument($name);\n\n        if (!is_array($raw)) {\n            return is_string($raw) && $raw !== '' ? [$raw] : [];\n        }\n\n        $result = [];\n\n        foreach ($raw as $value) {\n            if (is_string($value) && $value !== '') {\n                $result[] = $value;\n            }\n        }\n\n        return $result;\n    }\n}\n","src/Command/BaselineCommand.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Command;\n\nuse Symfony\\Component\\Console\\Attribute\\AsCommand;\nuse Symfony\\Component\\Console\\Input\\InputArgument;\nuse Symfony\\Component\\Console\\Input\\InputInterface;\nuse Symfony\\Component\\Console\\Input\\InputOption;\nuse Symfony\\Component\\Console\\Output\\OutputInterface;\nuse WorkerSafety\\Analyzer\\ScanOptions;\nuse WorkerSafety\\Analyzer\\ScanService;\nuse WorkerSafety\\Application\\ApplicationInfo;\nuse WorkerSafety\\Application\\ExitCode;\nuse WorkerSafety\\Baseline\\Baseline;\nuse WorkerSafety\\Baseline\\BaselineRepository;\nuse WorkerSafety\\Exception\\AnalysisException;\nuse WorkerSafety\\Runtime\\RuntimeTargetSet;\nuse WorkerSafety\\Support\\Paths;\n\n#[AsCommand(\n    name: 'baseline',\n    description: 'Record the current findings so that only new ones fail the build',\n)]\nfinal class BaselineCommand extends AbstractCommand\n{\n    public function __construct(\n        private readonly ScanService $scanService = new ScanService(),\n        private readonly BaselineRepository $baselines = new BaselineRepository(),\n    ) {\n        parent::__construct();\n    }\n\n    protected function configure(): void\n    {\n        $this\n            ->addArgument(\n                'paths',\n                InputArgument::IS_ARRAY | InputArgument::OPTIONAL,\n                'Files or directories to scan (defaults to the configured paths)',\n            )\n            ->addOption('config', 'c', InputOption::VALUE_REQUIRED, 'Path to a configuration file')\n            ->addOption('project-dir', null, InputOption::VALUE_REQUIRED, 'Project root (defaults to the working directory)')\n            ->addOption('runtime', 'r', InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Runtime target(s) to analyze for')\n            ->addOption('baseline', null, InputOption::VALUE_REQUIRED, 'Where to write the baseline file')\n            ->addOption(\n                'allow-parse-errors',\n                null,\n                InputOption::VALUE_NONE,\n                'Write the baseline even though some files could not be analyzed',\n            )\n            ->setHelp(sprintf(\n                'Runs a full scan and stores a fingerprint of every finding in %s. Existing findings then stop failing the build while new ones still do. Fingerprints do not include line numbers, so edits above a baselined finding do not resurrect it.',\n                ApplicationInfo::BASELINE_FILE,\n            ));\n    }\n\n    protected function handle(InputInterface $input, OutputInterface $output): ExitCode\n    {\n        $projectRoot = $this->projectRoot($input);\n        $runtimeValues = $this->listOption($input, 'runtime');\n\n        $outcome = $this->scanService->scan(new ScanOptions(\n            $projectRoot,\n            $this->stringArrayArgument($input, 'paths'),\n            $this->stringOption($input, 'config'),\n            $runtimeValues === [] ? null : RuntimeTargetSet::fromStrings($runtimeValues),\n            'never',\n            true,\n            null,\n            (bool) $input->getOption('allow-parse-errors'),\n        ));\n\n        if ($outcome->report->isIncomplete() && !(bool) $input->getOption('allow-parse-errors')) {\n            throw new AnalysisException(sprintf(\n                'Refusing to write a baseline from an incomplete scan: %d file(s) could not be analyzed (%s). '\n                . 'Fix them, or pass --allow-parse-errors to accept the gap.',\n                $outcome->report->unanalyzedFileCount(),\n                implode(', ', array_slice($outcome->report->unanalyzedFiles(), 0, 3)),\n            ));\n        }\n\n        $path = Paths::makeAbsolute(\n            $this->stringOption($input, 'baseline')\n                ?? $outcome->configuration->baseline\n                ?? ApplicationInfo::BASELINE_FILE,\n            $projectRoot,\n        );\n\n        $previous = $this->baselines->exists($path) ? $this->baselines->load($path)->count() : null;\n        $baseline = Baseline::fromFindings($outcome->findingsBeforeBaseline);\n\n        $this->baselines->save($path, $baseline);\n\n        $relative = Paths::makeRelative($path, $projectRoot);\n\n        $output->writeln('');\n        $output->writeln(sprintf('Wrote %s', $relative));\n        $output->writeln('');\n        $output->writeln(sprintf(\n            '  %d finding(s) recorded from %d file(s).',\n            $baseline->count(),\n            $outcome->report->filesScanned,\n        ));\n\n        if ($previous !== null) {\n            $output->writeln(sprintf('  Previous baseline contained %d finding(s).', $previous));\n        }\n\n        $output->writeln('');\n        $output->writeln('Commit this file. New findings will still fail the build.');\n        $output->writeln('');\n\n        return ExitCode::Success;\n    }\n\n    private function stringOption(InputInterface $input, string $name): ?string\n    {\n        $value = $input->getOption($name);\n\n        return is_string($value) && $value !== '' ? $value : null;\n    }\n}\n","src/Command/InitCommand.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Command;\n\nuse Symfony\\Component\\Console\\Attribute\\AsCommand;\nuse Symfony\\Component\\Console\\Input\\InputInterface;\nuse Symfony\\Component\\Console\\Input\\InputOption;\nuse Symfony\\Component\\Console\\Output\\OutputInterface;\nuse WorkerSafety\\Application\\ApplicationInfo;\nuse WorkerSafety\\Application\\ExitCode;\nuse WorkerSafety\\Config\\ConfigurationTemplate;\nuse WorkerSafety\\Exception\\ConfigurationException;\nuse WorkerSafety\\Framework\\FrameworkDetector;\nuse WorkerSafety\\Support\\Paths;\n\n#[AsCommand(\n    name: 'init',\n    description: 'Create a commented ' . ApplicationInfo::CONFIG_FILE . ' in the project root',\n)]\nfinal class InitCommand extends AbstractCommand\n{\n    public function __construct(private readonly FrameworkDetector $detector = new FrameworkDetector())\n    {\n        parent::__construct();\n    }\n\n    protected function configure(): void\n    {\n        $this\n            ->addOption('project-dir', null, InputOption::VALUE_REQUIRED, 'Project root (defaults to the working directory)')\n            ->addOption('force', null, InputOption::VALUE_NONE, 'Overwrite an existing configuration file')\n            ->setHelp('Writes a configuration file with defaults matching the detected framework. Never overwrites an existing file unless --force is given, so it is safe to run in CI.');\n    }\n\n    protected function handle(InputInterface $input, OutputInterface $output): ExitCode\n    {\n        $projectRoot = $this->projectRoot($input);\n        $path = Paths::normalize($projectRoot . '/' . ApplicationInfo::CONFIG_FILE);\n        $relative = Paths::makeRelative($path, $projectRoot);\n\n        if (is_file($path) && !(bool) $input->getOption('force')) {\n            throw new ConfigurationException(sprintf(\n                '%s already exists. Delete it or pass --force to overwrite it.',\n                $relative,\n            ));\n        }\n\n        $framework = $this->detector->detect($projectRoot);\n        $contents = ConfigurationTemplate::render($framework);\n\n        if (@file_put_contents($path, $contents) === false) {\n            throw new ConfigurationException(sprintf('Could not write %s.', $relative));\n        }\n\n        $output->writeln(sprintf('Created %s', $relative));\n\n        if ($framework->isKnown()) {\n            $output->writeln(sprintf('Detected %s, so the default paths were set accordingly.', $framework->describe()));\n        }\n\n        return ExitCode::Success;\n    }\n}\n","src/Command/RulesCommand.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Command;\n\nuse Symfony\\Component\\Console\\Attribute\\AsCommand;\nuse Symfony\\Component\\Console\\Helper\\Table;\nuse Symfony\\Component\\Console\\Helper\\TableSeparator;\nuse Symfony\\Component\\Console\\Input\\InputArgument;\nuse Symfony\\Component\\Console\\Input\\InputInterface;\nuse Symfony\\Component\\Console\\Input\\InputOption;\nuse Symfony\\Component\\Console\\Output\\OutputInterface;\nuse WorkerSafety\\Application\\ExitCode;\nuse WorkerSafety\\Exception\\ConfigurationException;\nuse WorkerSafety\\Reporting\\ConsoleStyles;\nuse WorkerSafety\\Rule\\Rule;\nuse WorkerSafety\\Rule\\RuleRegistry;\nuse WorkerSafety\\Rule\\RuleRegistryFactory;\n\n#[AsCommand(\n    name: 'rules',\n    description: 'List the available rules, or show the details of one rule',\n)]\nfinal class RulesCommand extends AbstractCommand\n{\n    public function __construct(private readonly RuleRegistryFactory $factory = new RuleRegistryFactory())\n    {\n        parent::__construct();\n    }\n\n    protected function configure(): void\n    {\n        $this\n            ->addArgument('rule', InputArgument::OPTIONAL, 'Show the details of a single rule, e.g. WS001')\n            ->addOption('format', 'f', InputOption::VALUE_REQUIRED, 'Output format: table, json', 'table');\n    }\n\n    protected function handle(InputInterface $input, OutputInterface $output): ExitCode\n    {\n        $registry = $this->factory->create();\n        $formatOption = $input->getOption('format');\n        $format = strtolower(is_string($formatOption) ? $formatOption : 'table');\n\n        if (!in_array($format, ['table', 'json'], true)) {\n            throw ConfigurationException::invalidValue('format', sprintf('\"%s\" is not one of table, json.', $format));\n        }\n\n        $requested = $input->getArgument('rule');\n\n        if (is_string($requested) && $requested !== '') {\n            return $this->showOne($registry, $requested, $format, $output);\n        }\n\n        return $format === 'json'\n            ? $this->listJson($registry, $output)\n            : $this->listTable($registry, $output);\n    }\n\n    private function showOne(RuleRegistry $registry, string $ruleId, string $format, OutputInterface $output): ExitCode\n    {\n        $rule = $registry->get($ruleId);\n\n        if (!$rule instanceof Rule) {\n            throw ConfigurationException::invalidValue(\n                'rule',\n                sprintf('unknown rule \"%s\". Known rules: %s.', $ruleId, implode(', ', $registry->ids())),\n            );\n        }\n\n        if ($format === 'json') {\n            $output->writeln((string) json_encode(\n                $this->describe($rule),\n                JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR,\n            ));\n\n            return ExitCode::Success;\n        }\n\n        ConsoleStyles::register($output);\n        $definition = $rule->definition();\n        $style = $definition->defaultSeverity->consoleStyle();\n\n        $output->writeln('');\n        $output->writeln(sprintf(\n            '<ws-rule>%s</ws-rule>  %s  <%s>%s</%s>',\n            $definition->id,\n            $definition->title,\n            $style,\n            $definition->defaultSeverity->label(),\n            $style,\n        ));\n        $output->writeln('');\n        $output->writeln(wordwrap($definition->description, 76));\n        $output->writeln('');\n        $output->writeln(sprintf('  Category   %s', $definition->category->label()));\n        $output->writeln(sprintf('  Runtimes   %s', $definition->runtimes->describe()));\n        $output->writeln(sprintf('  Framework  %s', $definition->requiresFramework ?? 'any'));\n        $output->writeln('');\n\n        if ($definition->remediation !== []) {\n            $output->writeln('<ws-heading>How to fix</ws-heading>');\n            $output->writeln('');\n\n            foreach ($definition->remediation as $suggestion) {\n                $output->writeln('  - ' . wordwrap($suggestion, 72, \"\\n    \"));\n            }\n\n            $output->writeln('');\n        }\n\n        return ExitCode::Success;\n    }\n\n    private function listTable(RuleRegistry $registry, OutputInterface $output): ExitCode\n    {\n        ConsoleStyles::register($output);\n\n        $table = new Table($output);\n        $table->setHeaders(['ID', 'Severity', 'Category', 'Framework', 'Title']);\n\n        $rules = $registry->all();\n        $last = count($rules) - 1;\n\n        foreach ($rules as $index => $rule) {\n            $definition = $rule->definition();\n            $style = $definition->defaultSeverity->consoleStyle();\n\n            $table->addRow([\n                $definition->id,\n                sprintf('<%s>%s</%s>', $style, $definition->defaultSeverity->label(), $style),\n                $definition->category->label(),\n                $definition->requiresFramework ?? '-',\n                $definition->title,\n            ]);\n\n            if ($index !== $last && $this->frameworkChanges($rules, $index)) {\n                $table->addRow(new TableSeparator());\n            }\n        }\n\n        $output->writeln('');\n        $table->render();\n        $output->writeln('');\n        $output->writeln(sprintf(\n            '<ws-muted>%d rules. Run `%s rules WS001` for the details of one rule.</ws-muted>',\n            count($rules),\n            'worker-safety',\n        ));\n        $output->writeln('');\n\n        return ExitCode::Success;\n    }\n\n    private function listJson(RuleRegistry $registry, OutputInterface $output): ExitCode\n    {\n        $output->writeln((string) json_encode(\n            [\n                'rules' => array_map(fn (Rule $rule): array => $this->describe($rule), $registry->all()),\n            ],\n            JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR,\n        ));\n\n        return ExitCode::Success;\n    }\n\n    /**\n     * @return array<string, mixed>\n     */\n    private function describe(Rule $rule): array\n    {\n        $definition = $rule->definition();\n\n        return [\n            'id' => $definition->id,\n            'title' => $definition->title,\n            'description' => $definition->description,\n            'severity' => $definition->defaultSeverity->value,\n            'category' => $definition->category->value,\n            'runtimes' => $definition->runtimes->values(),\n            'framework' => $definition->requiresFramework,\n            'remediation' => $definition->remediation,\n        ];\n    }\n\n    /**\n     * @param list<Rule> $rules\n     */\n    private function frameworkChanges(array $rules, int $index): bool\n    {\n        $current = $rules[$index]->definition()->requiresFramework;\n        $next = $rules[$index + 1]->definition()->requiresFramework;\n\n        return $current !== $next;\n    }\n}\n","src/Command/ScanCommand.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Command;\n\nuse Symfony\\Component\\Console\\Attribute\\AsCommand;\nuse Symfony\\Component\\Console\\Helper\\ProgressBar;\nuse Symfony\\Component\\Console\\Input\\InputArgument;\nuse Symfony\\Component\\Console\\Input\\InputInterface;\nuse Symfony\\Component\\Console\\Input\\InputOption;\nuse Symfony\\Component\\Console\\Output\\OutputInterface;\nuse WorkerSafety\\Analyzer\\ScanOptions;\nuse WorkerSafety\\Analyzer\\ScanOutcome;\nuse WorkerSafety\\Analyzer\\ScanService;\nuse WorkerSafety\\Application\\ApplicationInfo;\nuse WorkerSafety\\Application\\ExitCode;\nuse WorkerSafety\\Baseline\\Baseline;\nuse WorkerSafety\\Baseline\\BaselineRepository;\nuse WorkerSafety\\Exception\\AnalysisException;\nuse WorkerSafety\\Reporting\\OutputFormat;\nuse WorkerSafety\\Reporting\\ReporterFactory;\nuse WorkerSafety\\Runtime\\RuntimeTargetSet;\nuse WorkerSafety\\Support\\Paths;\n\n/**\n * Not final: the Laravel integration subclasses this so that\n * `php artisan worker-safety:scan` reuses these option definitions and this\n * implementation rather than restating them.\n */\n#[AsCommand(\n    name: 'scan',\n    description: 'Analyze a project for cross-request state risks under persistent workers',\n)]\nclass ScanCommand extends AbstractCommand\n{\n    /**\n     * Below this many files a progress bar is more noise than help.\n     */\n    private const PROGRESS_THRESHOLD = 50;\n\n    public function __construct(\n        private readonly ScanService $scanService = new ScanService(),\n        private readonly BaselineRepository $baselines = new BaselineRepository(),\n    ) {\n        parent::__construct();\n    }\n\n    protected function configure(): void\n    {\n        $this\n            ->addArgument(\n                'paths',\n                InputArgument::IS_ARRAY | InputArgument::OPTIONAL,\n                'Files or directories to scan (defaults to the configured paths)',\n            )\n            ->addOption('config', 'c', InputOption::VALUE_REQUIRED, 'Path to a configuration file')\n            ->addOption(\n                'format',\n                'f',\n                InputOption::VALUE_REQUIRED,\n                'Output format: ' . implode(', ', OutputFormat::names()),\n                OutputFormat::Console->value,\n            )\n            ->addOption(\n                'runtime',\n                'r',\n                InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY,\n                'Runtime target(s) to analyze for: frankenphp, octane, roadrunner, swoole, all',\n            )\n            ->addOption(\n                'fail-on',\n                null,\n                InputOption::VALUE_REQUIRED,\n                'Exit with code 1 when a finding reaches this severity: critical, high, medium, low, info, never',\n            )\n            ->addOption('project-dir', null, InputOption::VALUE_REQUIRED, 'Project root (defaults to the working directory)')\n            ->addOption('baseline', null, InputOption::VALUE_REQUIRED, 'Path to the baseline file')\n            ->addOption('no-baseline', null, InputOption::VALUE_NONE, 'Ignore an existing baseline file')\n            ->addOption(\n                'generate-baseline',\n                null,\n                InputOption::VALUE_NONE,\n                'Write the current findings to the baseline file instead of reporting a failure',\n            )\n            ->addOption('no-progress', null, InputOption::VALUE_NONE, 'Do not render a progress bar')\n            ->addOption(\n                'allow-parse-errors',\n                null,\n                InputOption::VALUE_NONE,\n                'Report files that could not be analyzed as warnings instead of failing the scan',\n            )\n            ->setHelp($this->help());\n    }\n\n    protected function handle(InputInterface $input, OutputInterface $output): ExitCode\n    {\n        $format = OutputFormat::fromString($this->stringOption($input, 'format') ?? OutputFormat::Console->value);\n        $projectRoot = $this->projectRoot($input);\n        $generateBaseline = (bool) $input->getOption('generate-baseline');\n\n        $runtimeValues = $this->listOption($input, 'runtime');\n\n        $options = new ScanOptions(\n            $projectRoot,\n            $this->stringArrayArgument($input, 'paths'),\n            $this->stringOption($input, 'config'),\n            $runtimeValues === [] ? null : RuntimeTargetSet::fromStrings($runtimeValues),\n            $this->stringOption($input, 'fail-on'),\n            (bool) $input->getOption('no-baseline') || $generateBaseline,\n            $this->stringOption($input, 'baseline'),\n            (bool) $input->getOption('allow-parse-errors'),\n        );\n\n        $outcome = $this->scanService->scan(\n            $options,\n            $this->progressCallback($input, $output, $format),\n        );\n\n        if ($generateBaseline) {\n            return $this->writeBaseline($outcome, $input, $output, $projectRoot);\n        }\n\n        $reporter = (new ReporterFactory($outcome->registry))->create($format);\n        $reporter->report($outcome->report, $output);\n\n        return $outcome->report->exitCode();\n    }\n\n    private function writeBaseline(\n        ScanOutcome $outcome,\n        InputInterface $input,\n        OutputInterface $output,\n        string $projectRoot,\n    ): ExitCode {\n        $path = $this->stringOption($input, 'baseline')\n            ?? $outcome->configuration->baseline\n            ?? Paths::normalize($projectRoot . '/' . ApplicationInfo::BASELINE_FILE);\n\n        $path = Paths::makeAbsolute($path, $projectRoot);\n\n        if ($outcome->report->isIncomplete() && !(bool) $input->getOption('allow-parse-errors')) {\n            throw new AnalysisException(sprintf(\n                'Refusing to write a baseline from an incomplete scan: %d file(s) could not be analyzed (%s). '\n                . 'Fix them, or pass --allow-parse-errors to accept the gap.',\n                $outcome->report->unanalyzedFileCount(),\n                implode(', ', array_slice($outcome->report->unanalyzedFiles(), 0, 3)),\n            ));\n        }\n\n        $baseline = Baseline::fromFindings($outcome->findingsBeforeBaseline);\n\n        $this->baselines->save($path, $baseline);\n\n        $target = $this->errorOutput($output);\n        $target->writeln('');\n        $target->writeln(sprintf(\n            '<info>Wrote %d finding(s) to %s</info>',\n            $baseline->count(),\n            Paths::makeRelative($path, $projectRoot),\n        ));\n        $target->writeln('');\n        $target->writeln('These findings will no longer fail the build. New findings still will.');\n        $target->writeln('');\n\n        return ExitCode::Success;\n    }\n\n    /**\n     * A progress bar is only useful for a large scan, and it always goes to\n     * stderr so that machine-readable output on stdout stays clean.\n     *\n     * @return (callable(int, int, string): void)|null\n     */\n    private function progressCallback(\n        InputInterface $input,\n        OutputInterface $output,\n        OutputFormat $format,\n    ): ?callable {\n        if ((bool) $input->getOption('no-progress') || $format->isMachineReadable()) {\n            return null;\n        }\n\n        if ($output->isQuiet() || !$output->isDecorated()) {\n            return null;\n        }\n\n        $error = $this->errorOutput($output);\n        $bar = null;\n\n        return static function (int $position, int $total, string $relativePath) use (&$bar, $error): void {\n            if ($total < self::PROGRESS_THRESHOLD) {\n                return;\n            }\n\n            if (!$bar instanceof ProgressBar) {\n                $bar = new ProgressBar($error, $total);\n                $bar->setFormat(' %current%/%max% [%bar%] %message%');\n                $bar->setMessage('');\n                $bar->start();\n            }\n\n            $bar->setMessage(strlen($relativePath) > 48 ? '…' . substr($relativePath, -47) : $relativePath);\n            $bar->setProgress($position);\n\n            if ($position === $total) {\n                $bar->finish();\n                $bar->clear();\n            }\n        };\n    }\n\n    private function stringOption(InputInterface $input, string $name): ?string\n    {\n        $value = $input->getOption($name);\n\n        return is_string($value) && $value !== '' ? $value : null;\n    }\n\n    private function help(): string\n    {\n        $binary = ApplicationInfo::BINARY;\n\n        return <<<HELP\n            Statically analyzes PHP source for state that survives a request when the\n            application runs on a persistent worker (FrankenPHP, Octane, RoadRunner, Swoole).\n\n            <comment>Examples</comment>\n\n              <info>{$binary} scan</info>\n                Scan the configured paths, or the framework defaults.\n\n              <info>{$binary} scan app src</info>\n                Scan specific directories.\n\n              <info>{$binary} scan --runtime=frankenphp --fail-on=high</info>\n                Analyze for one runtime and fail the build on HIGH findings.\n\n              <info>{$binary} scan --format=sarif > worker-safety.sarif</info>\n                Produce SARIF for GitHub code scanning.\n\n              <info>{$binary} scan --generate-baseline</info>\n                Accept every current finding so only new ones fail the build.\n\n            <comment>Exit codes</comment>\n\n              0  no findings at or above the failure threshold\n              1  findings reached the threshold, or a file could not be analyzed\n              2  invalid configuration or CLI option\n              3  internal error\n            HELP;\n    }\n}\n","src/Config/Configuration.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Config;\n\nuse WorkerSafety\\Finding\\Severity;\nuse WorkerSafety\\Runtime\\RuntimeTargetSet;\nuse WorkerSafety\\Support\\ExcludeMatcher;\n\n/**\n * Immutable, fully resolved scan configuration.\n */\nfinal class Configuration\n{\n    /**\n     * Never scanned unless the user overrides `exclude` entirely.\n     *\n     * @var list<string>\n     */\n    public const DEFAULT_EXCLUDES = [\n        '.git',\n        'cache',\n        'node_modules',\n        'storage',\n        'vendor',\n    ];\n\n    /**\n     * @var list<string>\n     */\n    public const DEFAULT_EXTENSIONS = ['php'];\n\n    /**\n     * @param list<string> $paths project-relative or absolute scan roots\n     * @param list<string> $exclude exclude patterns\n     * @param list<string> $extensions file extensions without the dot\n     * @param array<string, RuleSetting> $rules keyed by rule id\n     * @param array<string, list<string>> $ignore rule id => path patterns to ignore\n     */\n    public function __construct(\n        public readonly array $paths = [],\n        public readonly array $exclude = self::DEFAULT_EXCLUDES,\n        public readonly array $extensions = self::DEFAULT_EXTENSIONS,\n        public readonly RuntimeTargetSet $runtimes = new RuntimeTargetSet([]),\n        public readonly array $rules = [],\n        public readonly ?Severity $failOn = Severity::High,\n        public readonly ?string $baseline = null,\n        public readonly array $ignore = [],\n        public readonly ?string $sourcePath = null,\n        public readonly bool $failOnParseError = true,\n        public readonly bool $baselineDisabled = false,\n    ) {\n    }\n\n    public static function defaults(): self\n    {\n        return new self(runtimes: RuntimeTargetSet::all());\n    }\n\n    public function ruleSetting(string $ruleId): RuleSetting\n    {\n        return $this->rules[strtoupper($ruleId)] ?? RuleSetting::default();\n    }\n\n    public function isRuleEnabled(string $ruleId): bool\n    {\n        return $this->ruleSetting($ruleId)->enabled;\n    }\n\n    /**\n     * The configured severity wins over whatever the rule computed.\n     */\n    public function severityFor(string $ruleId, Severity $reported): Severity\n    {\n        return $this->ruleSetting($ruleId)->severity ?? $reported;\n    }\n\n    /**\n     * Path patterns for which the given rule is suppressed.\n     */\n    public function ignoreMatcherFor(string $ruleId): ?ExcludeMatcher\n    {\n        $patterns = $this->ignore[strtoupper($ruleId)] ?? null;\n\n        if ($patterns === null || $patterns === []) {\n            return null;\n        }\n\n        return new ExcludeMatcher($patterns);\n    }\n\n    /**\n     * @param list<string> $paths\n     */\n    public function withPaths(array $paths): self\n    {\n        return $this->copyWith(paths: $paths);\n    }\n\n    /**\n     * @param list<string> $exclude\n     */\n    public function withExclude(array $exclude): self\n    {\n        return $this->copyWith(exclude: $exclude);\n    }\n\n    /**\n     * Adds patterns without dropping the configured ones.\n     *\n     * @param list<string> $patterns\n     */\n    public function withAdditionalExcludes(array $patterns): self\n    {\n        $merged = $this->exclude;\n\n        foreach ($patterns as $pattern) {\n            if (!in_array($pattern, $merged, true)) {\n                $merged[] = $pattern;\n            }\n        }\n\n        return $this->copyWith(exclude: $merged);\n    }\n\n    public function withRuntimes(RuntimeTargetSet $runtimes): self\n    {\n        return $this->copyWith(runtimes: $runtimes);\n    }\n\n    /**\n     * @param ?Severity $failOn null disables the failure threshold\n     */\n    public function withFailOn(?Severity $failOn): self\n    {\n        return new self(\n            $this->paths,\n            $this->exclude,\n            $this->extensions,\n            $this->runtimes,\n            $this->rules,\n            $failOn,\n            $this->baseline,\n            $this->ignore,\n            $this->sourcePath,\n            $this->failOnParseError,\n            $this->baselineDisabled,\n        );\n    }\n\n    public function withBaseline(?string $baseline): self\n    {\n        return new self(\n            $this->paths,\n            $this->exclude,\n            $this->extensions,\n            $this->runtimes,\n            $this->rules,\n            $this->failOn,\n            $baseline,\n            $this->ignore,\n            $this->sourcePath,\n            $this->failOnParseError,\n            $this->baselineDisabled,\n        );\n    }\n\n    public function withSourcePath(?string $sourcePath): self\n    {\n        return new self(\n            $this->paths,\n            $this->exclude,\n            $this->extensions,\n            $this->runtimes,\n            $this->rules,\n            $this->failOn,\n            $this->baseline,\n            $this->ignore,\n            $sourcePath,\n            $this->failOnParseError,\n            $this->baselineDisabled,\n        );\n    }\n\n    /**\n     * @param list<string>|null $paths\n     * @param list<string>|null $exclude\n     * @param array<string, RuleSetting>|null $rules\n     */\n    private function copyWith(\n        ?array $paths = null,\n        ?array $exclude = null,\n        ?RuntimeTargetSet $runtimes = null,\n        ?array $rules = null,\n    ): self {\n        return new self(\n            $paths ?? $this->paths,\n            $exclude ?? $this->exclude,\n            $this->extensions,\n            $runtimes ?? $this->runtimes,\n            $rules ?? $this->rules,\n            $this->failOn,\n            $this->baseline,\n            $this->ignore,\n            $this->sourcePath,\n            $this->failOnParseError,\n            $this->baselineDisabled,\n        );\n    }\n}\n","src/Config/ConfigurationLoader.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Config;\n\nuse Symfony\\Component\\Yaml\\Exception\\ParseException;\nuse Symfony\\Component\\Yaml\\Yaml;\nuse WorkerSafety\\Application\\ApplicationInfo;\nuse WorkerSafety\\Exception\\ConfigurationException;\nuse WorkerSafety\\Finding\\Severity;\nuse WorkerSafety\\Runtime\\RuntimeTargetSet;\nuse WorkerSafety\\Support\\Paths;\n\n/**\n * Loads and strictly validates the YAML configuration.\n *\n * Unknown keys and malformed values are hard errors rather than silently\n * ignored typos, and the YAML is parsed without object or custom-tag support\n * so a configuration file can never execute code.\n */\nfinal class ConfigurationLoader\n{\n    /**\n     * @var list<string>\n     */\n    private const TOP_LEVEL_KEYS = [\n        'paths',\n        'exclude',\n        'extensions',\n        'runtime',\n        'rules',\n        'fail_on',\n        'fail_on_parse_error',\n        'baseline',\n        'ignore',\n    ];\n\n    /**\n     * @var list<string>\n     */\n    private const RULE_KEYS = ['enabled', 'severity'];\n\n    /**\n     * Candidate file names, in priority order.\n     *\n     * @var list<string>\n     */\n    private const CANDIDATES = [\n        'worker-safety.yaml',\n        'worker-safety.yml',\n        'worker-safety.dist.yaml',\n        'worker-safety.dist.yml',\n        '.worker-safety.yaml',\n    ];\n\n    /**\n     * @param list<string> $knownRuleIds when non-empty, unknown rule ids are rejected\n     */\n    public function load(?string $explicitPath, string $projectRoot, array $knownRuleIds = []): Configuration\n    {\n        $path = $explicitPath !== null\n            ? Paths::makeAbsolute($explicitPath, $projectRoot)\n            : $this->discover($projectRoot);\n\n        if ($path === null) {\n            return $this->applyBaselineDefault(Configuration::defaults(), $projectRoot);\n        }\n\n        if (!is_file($path) || !is_readable($path)) {\n            throw ConfigurationException::unreadable($explicitPath ?? $path);\n        }\n\n        try {\n            /** @var mixed $parsed */\n            $parsed = Yaml::parseFile($path);\n        } catch (ParseException $exception) {\n            throw new ConfigurationException(sprintf(\n                'Could not parse configuration file \"%s\": %s',\n                $path,\n                $exception->getMessage(),\n            ), 0, $exception);\n        }\n\n        if ($parsed === null) {\n            return $this->applyBaselineDefault(Configuration::defaults()->withSourcePath($path), $projectRoot);\n        }\n\n        // A scalar or a sequence at the root is a mapping mistake, not a set of\n        // unknown keys, so say so plainly.\n        if (!is_array($parsed) || ($parsed !== [] && array_is_list($parsed))) {\n            throw ConfigurationException::invalidValue('<root>', 'the configuration file must contain a YAML mapping.');\n        }\n\n        return $this->applyBaselineDefault(\n            $this->build($parsed, $path, $projectRoot, $knownRuleIds),\n            $projectRoot,\n        );\n    }\n\n    public function discover(string $projectRoot): ?string\n    {\n        foreach (self::CANDIDATES as $candidate) {\n            $path = Paths::normalize($projectRoot . '/' . $candidate);\n\n            if (is_file($path)) {\n                return $path;\n            }\n        }\n\n        return null;\n    }\n\n    /**\n     * @param array<mixed, mixed> $data\n     * @param list<string> $knownRuleIds\n     */\n    private function build(array $data, string $path, string $projectRoot, array $knownRuleIds): Configuration\n    {\n        foreach (array_keys($data) as $key) {\n            if (!is_string($key) || !in_array($key, self::TOP_LEVEL_KEYS, true)) {\n                throw ConfigurationException::unknownKey(\n                    is_string($key) ? $key : (string) json_encode($key),\n                    'the configuration root',\n                    self::TOP_LEVEL_KEYS,\n                );\n            }\n        }\n\n        $paths = $this->stringList($data, 'paths');\n        $exclude = array_key_exists('exclude', $data)\n            ? $this->stringList($data, 'exclude')\n            : Configuration::DEFAULT_EXCLUDES;\n        $extensions = array_key_exists('extensions', $data)\n            ? $this->extensions($this->stringList($data, 'extensions'))\n            : Configuration::DEFAULT_EXTENSIONS;\n\n        return new Configuration(\n            $paths,\n            $exclude,\n            $extensions,\n            $this->runtimes($data),\n            $this->rules($data, $knownRuleIds),\n            $this->failOn($data),\n            $this->baseline($data, $projectRoot),\n            $this->ignore($data, $knownRuleIds),\n            $path,\n            $this->failOnParseError($data),\n            $this->baselineDisabled($data),\n        );\n    }\n\n    /**\n     * @param array<mixed, mixed> $data\n     *\n     * @return list<string>\n     */\n    private function stringList(array $data, string $key): array\n    {\n        if (!array_key_exists($key, $data)) {\n            return [];\n        }\n\n        $value = $data[$key];\n\n        if (is_string($value)) {\n            $value = [$value];\n        }\n\n        if (!is_array($value)) {\n            throw ConfigurationException::invalidValue($key, 'expected a list of strings.');\n        }\n\n        $result = [];\n\n        foreach ($value as $item) {\n            if (!is_string($item)) {\n                throw ConfigurationException::invalidValue($key, 'every entry must be a string.');\n            }\n\n            $trimmed = trim($item);\n\n            if ($trimmed !== '') {\n                $result[] = $trimmed;\n            }\n        }\n\n        return $result;\n    }\n\n    /**\n     * @param list<string> $extensions\n     *\n     * @return list<string>\n     */\n    private function extensions(array $extensions): array\n    {\n        $normalized = [];\n\n        foreach ($extensions as $extension) {\n            $normalized[] = strtolower(ltrim($extension, '.'));\n        }\n\n        if ($normalized === []) {\n            throw ConfigurationException::invalidValue('extensions', 'at least one file extension is required.');\n        }\n\n        return $normalized;\n    }\n\n    /**\n     * @param array<mixed, mixed> $data\n     */\n    private function runtimes(array $data): RuntimeTargetSet\n    {\n        if (!array_key_exists('runtime', $data)) {\n            return RuntimeTargetSet::all();\n        }\n\n        $values = $this->stringList($data, 'runtime');\n\n        if ($values === []) {\n            return RuntimeTargetSet::all();\n        }\n\n        $set = RuntimeTargetSet::fromStrings($values);\n\n        if ($set->isEmpty()) {\n            throw ConfigurationException::invalidValue('runtime', 'at least one runtime target is required.');\n        }\n\n        return $set;\n    }\n\n    /**\n     * @param array<mixed, mixed> $data\n     * @param list<string> $knownRuleIds\n     *\n     * @return array<string, RuleSetting>\n     */\n    private function rules(array $data, array $knownRuleIds): array\n    {\n        if (!array_key_exists('rules', $data)) {\n            return [];\n        }\n\n        $rules = $data['rules'];\n\n        if (!is_array($rules)) {\n            throw ConfigurationException::invalidValue('rules', 'expected a mapping of rule id to settings.');\n        }\n\n        $result = [];\n\n        foreach ($rules as $ruleId => $settings) {\n            $id = $this->normalizeRuleId($ruleId, 'rules', $knownRuleIds);\n\n            if (is_bool($settings)) {\n                $result[$id] = new RuleSetting($settings);\n\n                continue;\n            }\n\n            if (!is_array($settings)) {\n                throw ConfigurationException::invalidValue(\n                    'rules.' . $id,\n                    'expected a boolean or a mapping with \"enabled\" and/or \"severity\".',\n                );\n            }\n\n            foreach (array_keys($settings) as $key) {\n                if (!is_string($key) || !in_array($key, self::RULE_KEYS, true)) {\n                    throw ConfigurationException::unknownKey(\n                        is_string($key) ? $key : (string) json_encode($key),\n                        'rules.' . $id,\n                        self::RULE_KEYS,\n                    );\n                }\n            }\n\n            $enabled = $settings['enabled'] ?? true;\n\n            if (!is_bool($enabled)) {\n                throw ConfigurationException::invalidValue('rules.' . $id . '.enabled', 'expected a boolean.');\n            }\n\n            $severity = null;\n\n            if (array_key_exists('severity', $settings) && $settings['severity'] !== null) {\n                if (!is_string($settings['severity'])) {\n                    throw ConfigurationException::invalidValue('rules.' . $id . '.severity', 'expected a string.');\n                }\n\n                $severity = Severity::tryFromString($settings['severity']);\n\n                if (!$severity instanceof Severity) {\n                    throw ConfigurationException::invalidValue(\n                        'rules.' . $id . '.severity',\n                        sprintf('\"%s\" is not one of %s.', $settings['severity'], implode(', ', Severity::names())),\n                    );\n                }\n            }\n\n            $result[$id] = new RuleSetting($enabled, $severity);\n        }\n\n        return $result;\n    }\n\n    /**\n     * @param array<mixed, mixed> $data\n     */\n    private function failOn(array $data): ?Severity\n    {\n        if (!array_key_exists('fail_on', $data)) {\n            return Severity::High;\n        }\n\n        $value = $data['fail_on'];\n\n        if ($value === null || $value === false) {\n            return null;\n        }\n\n        if (!is_string($value)) {\n            throw ConfigurationException::invalidValue('fail_on', 'expected a severity name or \"never\".');\n        }\n\n        $normalized = strtolower(trim($value));\n\n        if ($normalized === 'never' || $normalized === 'none') {\n            return null;\n        }\n\n        $severity = Severity::tryFromString($normalized);\n\n        if (!$severity instanceof Severity) {\n            throw ConfigurationException::invalidValue(\n                'fail_on',\n                sprintf('\"%s\" is not one of %s, never.', $value, implode(', ', Severity::names())),\n            );\n        }\n\n        return $severity;\n    }\n\n    /**\n     * @param array<mixed, mixed> $data\n     */\n    private function failOnParseError(array $data): bool\n    {\n        if (!array_key_exists('fail_on_parse_error', $data)) {\n            return true;\n        }\n\n        $value = $data['fail_on_parse_error'];\n\n        if (!is_bool($value)) {\n            throw ConfigurationException::invalidValue('fail_on_parse_error', 'expected a boolean.');\n        }\n\n        return $value;\n    }\n\n    /**\n     * `baseline: false` means \"explicitly off\", which is different from an\n     * absent setting: only the latter may pick up a baseline file automatically.\n     *\n     * @param array<mixed, mixed> $data\n     */\n    private function baselineDisabled(array $data): bool\n    {\n        if (!array_key_exists('baseline', $data)) {\n            return false;\n        }\n\n        $value = $data['baseline'];\n\n        return $value === false || $value === null;\n    }\n\n    /**\n     * @param array<mixed, mixed> $data\n     */\n    private function baseline(array $data, string $projectRoot): ?string\n    {\n        if (!array_key_exists('baseline', $data)) {\n            return null;\n        }\n\n        $value = $data['baseline'];\n\n        if ($value === null || $value === false) {\n            return null;\n        }\n\n        if (!is_string($value) || trim($value) === '') {\n            throw ConfigurationException::invalidValue('baseline', 'expected a file path or false.');\n        }\n\n        return Paths::makeAbsolute(trim($value), $projectRoot);\n    }\n\n    /**\n     * @param array<mixed, mixed> $data\n     * @param list<string> $knownRuleIds\n     *\n     * @return array<string, list<string>>\n     */\n    private function ignore(array $data, array $knownRuleIds): array\n    {\n        if (!array_key_exists('ignore', $data)) {\n            return [];\n        }\n\n        $ignore = $data['ignore'];\n\n        if (!is_array($ignore)) {\n            throw ConfigurationException::invalidValue('ignore', 'expected a mapping of rule id to path patterns.');\n        }\n\n        $result = [];\n\n        foreach ($ignore as $ruleId => $patterns) {\n            $id = $this->normalizeRuleId($ruleId, 'ignore', $knownRuleIds);\n\n            if (is_string($patterns)) {\n                $patterns = [$patterns];\n            }\n\n            if (!is_array($patterns)) {\n                throw ConfigurationException::invalidValue('ignore.' . $id, 'expected a list of path patterns.');\n            }\n\n            $list = [];\n\n            foreach ($patterns as $pattern) {\n                if (!is_string($pattern)) {\n                    throw ConfigurationException::invalidValue('ignore.' . $id, 'every pattern must be a string.');\n                }\n\n                $list[] = trim($pattern);\n            }\n\n            $result[$id] = $list;\n        }\n\n        return $result;\n    }\n\n    /**\n     * @param list<string> $knownRuleIds\n     */\n    private function normalizeRuleId(mixed $ruleId, string $section, array $knownRuleIds): string\n    {\n        if (!is_string($ruleId) && !is_int($ruleId)) {\n            throw ConfigurationException::invalidValue($section, 'rule ids must be strings such as \"WS001\".');\n        }\n\n        $id = strtoupper(trim((string) $ruleId));\n\n        if (preg_match('/^WS\\d{3}$/', $id) !== 1) {\n            throw ConfigurationException::invalidValue(\n                $section . '.' . $id,\n                'rule ids must look like \"WS001\".',\n            );\n        }\n\n        if ($knownRuleIds !== [] && !in_array($id, $knownRuleIds, true)) {\n            throw ConfigurationException::invalidValue(\n                $section . '.' . $id,\n                sprintf('unknown rule. Run `%s rules` to list the available rules.', ApplicationInfo::BINARY),\n            );\n        }\n\n        return $id;\n    }\n\n    /**\n     * Pick up an existing baseline file automatically when none is configured.\n     */\n    private function applyBaselineDefault(Configuration $configuration, string $projectRoot): Configuration\n    {\n        if ($configuration->baseline !== null || $configuration->baselineDisabled) {\n            return $configuration;\n        }\n\n        $default = Paths::normalize($projectRoot . '/' . ApplicationInfo::BASELINE_FILE);\n\n        return is_file($default) ? $configuration->withBaseline($default) : $configuration;\n    }\n}\n","src/Config/ConfigurationTemplate.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Config;\n\nuse WorkerSafety\\Application\\ApplicationInfo;\nuse WorkerSafety\\Framework\\DetectedFramework;\n\n/**\n * Renders the commented configuration file created by `worker-safety init`.\n *\n * The same template is committed as worker-safety.example.yaml so the two can\n * never drift apart.\n */\nfinal class ConfigurationTemplate\n{\n    private function __construct()\n    {\n    }\n\n    public static function render(?DetectedFramework $framework = null): string\n    {\n        $paths = ['src'];\n\n        if ($framework !== null && $framework->isLaravel()) {\n            $paths = ['app', 'bootstrap', 'config', 'routes'];\n        } elseif ($framework !== null && $framework->isSymfony()) {\n            $paths = ['src', 'config'];\n        }\n\n        $pathLines = implode(\"\\n\", array_map(static fn (string $path): string => '  - ' . $path, $paths));\n        $name = ApplicationInfo::NAME;\n        $binary = ApplicationInfo::BINARY;\n        $homepage = ApplicationInfo::HOMEPAGE;\n        $baseline = ApplicationInfo::BASELINE_FILE;\n\n        $lines = [\n            '# ' . $name . ' configuration',\n            '# ' . $homepage,\n            '',\n            '# Directories or files to analyze, relative to this file.',\n            'paths:',\n            $pathLines,\n            '',\n            '# Paths that are never analyzed. A bare name matches any path segment,',\n            '# a value containing \"/\" matches a path prefix, and globs are supported.',\n            'exclude:',\n            '  - vendor',\n            '  - node_modules',\n            '  - storage',\n            '  - cache',\n            '  - .git',\n            '',\n            '# Persistent worker runtimes to analyze for.',\n            '# One or more of: frankenphp, octane, roadrunner, swoole - or \"all\".',\n            'runtime:',\n            '  - frankenphp',\n            '  - octane',\n            '',\n            '# Per-rule overrides. Run `' . $binary . ' rules` for the full list.',\n            'rules:',\n            '  WS001:',\n            '    enabled: true',\n            '    severity: high',\n            '',\n            '  # Event listener detection is heuristic; turn it off if it is noisy.',\n            '  WS009:',\n            '    enabled: true',\n            '',\n            '# Suppress a rule for specific paths, in addition to inline',\n            '# `// ' . ApplicationInfo::IGNORE_MARKER . ' WS001` comments.',\n            'ignore:',\n            '  WS008:',\n            '    - app/Legacy',\n            '',\n            '# Exit with code 1 when a finding at or above this severity remains.',\n            '# One of: critical, high, medium, low, info, never.',\n            'fail_on: high',\n            '',\n            '# Also fail when a file cannot be analyzed at all: a skipped file is a',\n            '# gap in the evidence, not a clean result.',\n            'fail_on_parse_error: true',\n            '',\n            '# Path to the baseline file. Set to false to ignore an existing baseline.',\n            'baseline: ' . $baseline,\n            '',\n        ];\n\n        return implode(\"\\n\", $lines);\n    }\n}\n","src/Config/RuleSetting.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Config;\n\nuse WorkerSafety\\Finding\\Severity;\n\n/**\n * Per-rule configuration overrides.\n */\nfinal class RuleSetting\n{\n    public function __construct(\n        public readonly bool $enabled = true,\n        public readonly ?Severity $severity = null,\n    ) {\n    }\n\n    public static function default(): self\n    {\n        return new self();\n    }\n}\n","src/Exception/AnalysisException.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Exception;\n\n/**\n * Thrown when the analyzer cannot continue at all.\n *\n * Surfaces as exit code 3.\n */\nfinal class AnalysisException extends WorkerSafetyException\n{\n    public static function pathNotFound(string $path): self\n    {\n        return new self(sprintf('Path \"%s\" does not exist.', $path));\n    }\n\n    public static function noPaths(): self\n    {\n        return new self('No scan paths resolved. Provide a path argument or configure \"paths\" in the configuration file.');\n    }\n}\n","src/Exception/ConfigurationException.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Exception;\n\n/**\n * Thrown when a configuration file (or CLI option) is invalid.\n *\n * Surfaces as exit code 2.\n */\nfinal class ConfigurationException extends WorkerSafetyException\n{\n    public static function invalidValue(string $key, string $reason): self\n    {\n        return new self(sprintf('Invalid configuration value for \"%s\": %s', $key, $reason));\n    }\n\n    /**\n     * @param list<string> $allowed\n     */\n    public static function unknownKey(string $key, string $context, array $allowed): self\n    {\n        sort($allowed);\n\n        return new self(sprintf(\n            'Unknown configuration key \"%s\" in %s. Allowed keys: %s.',\n            $key,\n            $context,\n            implode(', ', $allowed),\n        ));\n    }\n\n    public static function unreadable(string $path): self\n    {\n        return new self(sprintf('Configuration file \"%s\" does not exist or is not readable.', $path));\n    }\n}\n","src/Exception/WorkerSafetyException.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Exception;\n\n/**\n * Base class for every exception thrown by the package.\n */\nabstract class WorkerSafetyException extends \\RuntimeException\n{\n}\n","src/Finding/Finding.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Finding;\n\nuse WorkerSafety\\Runtime\\RuntimeTargetSet;\n\n/**\n * An immutable, transport agnostic analysis result.\n *\n * Static rules build these from AST nodes; a future runtime probe can build the\n * exact same object from an observed request, which is why nothing here refers\n * to php-parser.\n */\nfinal class Finding\n{\n    /**\n     * @param list<string> $remediation\n     */\n    public function __construct(\n        public readonly string $ruleId,\n        public readonly string $title,\n        public readonly Severity $severity,\n        public readonly RuleCategory $category,\n        public readonly Location $location,\n        public readonly string $message,\n        public readonly ?string $details = null,\n        public readonly array $remediation = [],\n        public readonly SymbolContext $symbol = new SymbolContext(),\n        public readonly ?string $snippet = null,\n        public readonly RuntimeTargetSet $runtimes = new RuntimeTargetSet([]),\n        public readonly ?string $framework = null,\n        public readonly ?string $excerpt = null,\n    ) {\n    }\n\n    public function withSeverity(Severity $severity): self\n    {\n        if ($severity === $this->severity) {\n            return $this;\n        }\n\n        return new self(\n            $this->ruleId,\n            $this->title,\n            $severity,\n            $this->category,\n            $this->location,\n            $this->message,\n            $this->details,\n            $this->remediation,\n            $this->symbol,\n            $this->snippet,\n            $this->runtimes,\n            $this->framework,\n            $this->excerpt,\n        );\n    }\n\n    public function withRuntimes(RuntimeTargetSet $runtimes): self\n    {\n        return new self(\n            $this->ruleId,\n            $this->title,\n            $this->severity,\n            $this->category,\n            $this->location,\n            $this->message,\n            $this->details,\n            $this->remediation,\n            $this->symbol,\n            $this->snippet,\n            $runtimes,\n            $this->framework,\n            $this->excerpt,\n        );\n    }\n\n    /**\n     * Line independent identity, used by the baseline so that unrelated edits\n     * above a finding do not resurrect it.\n     */\n    /**\n     * Line independent identity, used by the baseline so that unrelated edits\n     * above a finding do not resurrect it.\n     *\n     * The code component is the whole reported construct, not the single line\n     * shown in reports and with no length limit: two calls that differ only on\n     * a continuation line must not share an identity, or a baseline would\n     * accept the changed one without review.\n     */\n    public function fingerprint(): string\n    {\n        return substr(hash('sha256', implode(\"\\0\", [\n            $this->ruleId,\n            $this->location->relativePath,\n            $this->symbol->describe() ?? '',\n            // The excerpt is already canonical; collapsing it again would\n            // erase whitespace that is meaningful inside a string literal.\n            $this->excerpt ?? self::normalizeSnippet($this->snippet ?? $this->message),\n        ])), 0, 32);\n    }\n\n    /**\n     * Identity including the position, used to drop duplicate reports.\n     */\n    public function dedupeKey(): string\n    {\n        return implode(\"\\0\", [\n            $this->ruleId,\n            $this->location->absolutePath,\n            (string) $this->location->line,\n            (string) ($this->location->column ?? 0),\n            $this->message,\n        ]);\n    }\n\n    private static function normalizeSnippet(string $snippet): string\n    {\n        $normalized = preg_replace('/\\s+/', ' ', $snippet);\n\n        return trim($normalized ?? $snippet);\n    }\n}\n","src/Finding/FindingCollection.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Finding;\n\n/**\n * Immutable, de-duplicated list of findings.\n *\n * @implements \\IteratorAggregate<int, Finding>\n */\nfinal class FindingCollection implements \\Countable, \\IteratorAggregate\n{\n    /**\n     * @var list<Finding>\n     */\n    private readonly array $findings;\n\n    /**\n     * @param iterable<Finding> $findings\n     */\n    public function __construct(iterable $findings = [])\n    {\n        $unique = [];\n\n        foreach ($findings as $finding) {\n            $unique[$finding->dedupeKey()] = $finding;\n        }\n\n        $this->findings = array_values($unique);\n    }\n\n    /**\n     * @param iterable<Finding> $findings\n     */\n    public function merge(iterable $findings): self\n    {\n        $merged = $this->findings;\n\n        foreach ($findings as $finding) {\n            $merged[] = $finding;\n        }\n\n        return new self($merged);\n    }\n\n    /**\n     * Canonical report order: severity desc, then file, then line, then rule id.\n     */\n    public function sorted(): self\n    {\n        $sorted = $this->findings;\n\n        usort($sorted, static function (Finding $a, Finding $b): int {\n            return $b->severity->rank() <=> $a->severity->rank()\n                ?: strcmp($a->location->relativePath, $b->location->relativePath)\n                ?: $a->location->line <=> $b->location->line\n                ?: ($a->location->column ?? 0) <=> ($b->location->column ?? 0)\n                ?: strcmp($a->ruleId, $b->ruleId);\n        });\n\n        return new self($sorted);\n    }\n\n    /**\n     * @param callable(Finding): bool $predicate\n     */\n    public function filter(callable $predicate): self\n    {\n        return new self(array_filter($this->findings, $predicate));\n    }\n\n    public function withSeverityAtLeast(Severity $threshold): self\n    {\n        return $this->filter(static fn (Finding $finding): bool => $finding->severity->isAtLeast($threshold));\n    }\n\n    public function hasSeverityAtLeast(Severity $threshold): bool\n    {\n        foreach ($this->findings as $finding) {\n            if ($finding->severity->isAtLeast($threshold)) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n\n    /**\n     * @return array<string, int> keyed by severity value, always contains every severity\n     */\n    public function countsBySeverity(): array\n    {\n        $counts = [\n            Severity::Critical->value => 0,\n            Severity::High->value => 0,\n            Severity::Medium->value => 0,\n            Severity::Low->value => 0,\n            Severity::Info->value => 0,\n        ];\n\n        foreach ($this->findings as $finding) {\n            ++$counts[$finding->severity->value];\n        }\n\n        return $counts;\n    }\n\n    /**\n     * @return array<string, int> keyed by rule id, ordered by rule id\n     */\n    public function countsByRule(): array\n    {\n        $counts = [];\n\n        foreach ($this->findings as $finding) {\n            $counts[$finding->ruleId] = ($counts[$finding->ruleId] ?? 0) + 1;\n        }\n\n        ksort($counts);\n\n        return $counts;\n    }\n\n    /**\n     * @return list<Finding>\n     */\n    public function toArray(): array\n    {\n        return $this->findings;\n    }\n\n    public function isEmpty(): bool\n    {\n        return $this->findings === [];\n    }\n\n    public function count(): int\n    {\n        return count($this->findings);\n    }\n\n    public function getIterator(): \\Traversable\n    {\n        return new \\ArrayIterator($this->findings);\n    }\n}\n","src/Finding/Location.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Finding;\n\n/**\n * Where a finding was produced.\n *\n * Deliberately free of any AST types so runtime analyzers can build one too.\n */\nfinal class Location\n{\n    public function __construct(\n        public readonly string $absolutePath,\n        public readonly string $relativePath,\n        public readonly int $line,\n        public readonly ?int $column = null,\n        public readonly ?int $endLine = null,\n    ) {\n    }\n\n    public function __toString(): string\n    {\n        return $this->relativePath . ':' . $this->line;\n    }\n\n    public function equals(self $other): bool\n    {\n        return $this->absolutePath === $other->absolutePath\n            && $this->line === $other->line\n            && $this->column === $other->column;\n    }\n}\n","src/Finding/RuleCategory.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Finding;\n\n/**\n * Coarse grouping used for reporting and SARIF tags.\n */\nenum RuleCategory: string\n{\n    case StaticState = 'static-state';\n    case GlobalState = 'global-state';\n    case EnvironmentMutation = 'environment-mutation';\n    case Singleton = 'singleton';\n    case ContainerBinding = 'container-binding';\n    case MemoryRetention = 'memory-retention';\n    case EventRegistration = 'event-registration';\n    case Lifecycle = 'lifecycle';\n\n    public function label(): string\n    {\n        return match ($this) {\n            self::StaticState => 'Static state',\n            self::GlobalState => 'Global state',\n            self::EnvironmentMutation => 'Environment mutation',\n            self::Singleton => 'Singleton',\n            self::ContainerBinding => 'Container binding',\n            self::MemoryRetention => 'Memory retention',\n            self::EventRegistration => 'Event registration',\n            self::Lifecycle => 'Process lifecycle',\n        };\n    }\n}\n","src/Finding/Severity.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Finding;\n\nuse WorkerSafety\\Exception\\ConfigurationException;\n\nenum Severity: string\n{\n    case Info = 'info';\n    case Low = 'low';\n    case Medium = 'medium';\n    case High = 'high';\n    case Critical = 'critical';\n\n    /**\n     * Higher is more severe. Used for sorting and threshold comparison.\n     */\n    public function rank(): int\n    {\n        return match ($this) {\n            self::Info => 0,\n            self::Low => 1,\n            self::Medium => 2,\n            self::High => 3,\n            self::Critical => 4,\n        };\n    }\n\n    public function label(): string\n    {\n        return strtoupper($this->value);\n    }\n\n    public function isAtLeast(self $threshold): bool\n    {\n        return $this->rank() >= $threshold->rank();\n    }\n\n    /**\n     * SARIF 2.1.0 `result.level`.\n     */\n    public function sarifLevel(): string\n    {\n        return match ($this) {\n            self::Critical, self::High => 'error',\n            self::Medium => 'warning',\n            self::Low, self::Info => 'note',\n        };\n    }\n\n    /**\n     * Symfony Console style tag used by the console reporter.\n     */\n    public function consoleStyle(): string\n    {\n        return match ($this) {\n            self::Critical => 'ws-critical',\n            self::High => 'ws-high',\n            self::Medium => 'ws-medium',\n            self::Low => 'ws-low',\n            self::Info => 'ws-info',\n        };\n    }\n\n    public static function fromString(string $value): self\n    {\n        $severity = self::tryFromString($value);\n\n        if (!$severity instanceof self) {\n            throw ConfigurationException::invalidValue(\n                'severity',\n                sprintf('\"%s\" is not a known severity (%s).', $value, implode(', ', self::names())),\n            );\n        }\n\n        return $severity;\n    }\n\n    public static function tryFromString(string $value): ?self\n    {\n        return self::tryFrom(strtolower(trim($value)));\n    }\n\n    /**\n     * Most severe first — the canonical report ordering.\n     *\n     * @return list<self>\n     */\n    public static function ordered(): array\n    {\n        return [self::Critical, self::High, self::Medium, self::Low, self::Info];\n    }\n\n    /**\n     * @return list<string>\n     */\n    public static function names(): array\n    {\n        return array_map(static fn (self $case): string => $case->value, self::cases());\n    }\n}\n","src/Finding/SymbolContext.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Finding;\n\n/**\n * The code symbol a finding belongs to.\n *\n * Every field is optional: a finding can be reported at file level.\n */\nfinal class SymbolContext\n{\n    public function __construct(\n        public readonly ?string $class = null,\n        public readonly ?string $method = null,\n        public readonly ?string $property = null,\n        public readonly ?string $variable = null,\n    ) {\n    }\n\n    public static function empty(): self\n    {\n        return new self();\n    }\n\n    public function isEmpty(): bool\n    {\n        return $this->class === null\n            && $this->method === null\n            && $this->property === null\n            && $this->variable === null;\n    }\n\n    /**\n     * Human readable symbol path, e.g. `App\\Ctx::setUser()` or `App\\Ctx::$user`.\n     */\n    public function describe(): ?string\n    {\n        if ($this->class !== null && $this->property !== null) {\n            return $this->class . '::$' . $this->property;\n        }\n\n        if ($this->class !== null && $this->method !== null) {\n            return $this->class . '::' . $this->method . '()';\n        }\n\n        if ($this->class !== null) {\n            return $this->class;\n        }\n\n        if ($this->method !== null) {\n            return $this->method . '()';\n        }\n\n        if ($this->variable !== null) {\n            return '$' . $this->variable;\n        }\n\n        return null;\n    }\n\n    /**\n     * @return array<string, string>\n     */\n    public function toArray(): array\n    {\n        return array_filter([\n            'class' => $this->class,\n            'method' => $this->method,\n            'property' => $this->property,\n            'variable' => $this->variable,\n        ], static fn (?string $value): bool => $value !== null);\n    }\n}\n","src/Framework/DetectedFramework.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Framework;\n\n/**\n * Result of framework detection.\n */\nfinal class DetectedFramework\n{\n    public function __construct(\n        public readonly Framework $framework,\n        public readonly ?string $version = null,\n        public readonly ?string $package = null,\n    ) {\n    }\n\n    public static function none(): self\n    {\n        return new self(Framework::None);\n    }\n\n    public function identifier(): string\n    {\n        return $this->framework->value;\n    }\n\n    public function isLaravel(): bool\n    {\n        return $this->framework === Framework::Laravel;\n    }\n\n    public function isSymfony(): bool\n    {\n        return $this->framework === Framework::Symfony;\n    }\n\n    public function isKnown(): bool\n    {\n        return $this->framework !== Framework::None;\n    }\n\n    /**\n     * e.g. `Laravel 12`, `Symfony 7`, `plain PHP`.\n     */\n    public function describe(): string\n    {\n        if ($this->version === null) {\n            return $this->framework->label();\n        }\n\n        return $this->framework->label() . ' ' . $this->version;\n    }\n\n    /**\n     * Framework label suitable for storing on a finding.\n     */\n    public function findingLabel(): ?string\n    {\n        return $this->isKnown() ? $this->framework->label() : null;\n    }\n}\n","src/Framework/Framework.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Framework;\n\nenum Framework: string\n{\n    case Laravel = 'laravel';\n    case Symfony = 'symfony';\n    case None = 'none';\n\n    public function label(): string\n    {\n        return match ($this) {\n            self::Laravel => 'Laravel',\n            self::Symfony => 'Symfony',\n            self::None => 'plain PHP',\n        };\n    }\n}\n","src/Framework/FrameworkAdapter.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Framework;\n\nuse WorkerSafety\\Ast\\Index\\ContainerBindingCollector;\nuse WorkerSafety\\Rule\\Rule;\n\n/**\n * Framework specific extension point.\n *\n * An adapter contributes rules, container-binding collectors and sensible\n * default scan paths, without the core analyzer knowing the framework exists.\n */\ninterface FrameworkAdapter\n{\n    public function identifier(): string;\n\n    public function supports(DetectedFramework $framework): bool;\n\n    /**\n     * @return list<Rule>\n     */\n    public function rules(): array;\n\n    /**\n     * @return list<ContainerBindingCollector>\n     */\n    public function bindingCollectors(): array;\n\n    /**\n     * Paths scanned when neither the CLI nor the config file names any.\n     *\n     * @return list<string>\n     */\n    public function defaultPaths(): array;\n\n    /**\n     * Framework specific directories that should never be scanned.\n     *\n     * @return list<string>\n     */\n    public function defaultExcludes(): array;\n}\n","src/Framework/FrameworkAdapterRegistry.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Framework;\n\nuse WorkerSafety\\Framework\\Laravel\\LaravelAdapter;\nuse WorkerSafety\\Framework\\Symfony\\SymfonyAdapter;\n\n/**\n * Holds the framework adapters and picks the one matching the detection result.\n */\nfinal class FrameworkAdapterRegistry\n{\n    /**\n     * @var list<FrameworkAdapter>\n     */\n    private array $adapters;\n\n    private readonly FrameworkAdapter $fallback;\n\n    /**\n     * @param list<FrameworkAdapter>|null $adapters defaults to the shipped adapters\n     */\n    public function __construct(?array $adapters = null, ?FrameworkAdapter $fallback = null)\n    {\n        $this->adapters = $adapters ?? [\n            new LaravelAdapter(),\n            new SymfonyAdapter(),\n        ];\n\n        $this->fallback = $fallback ?? new PlainPhpAdapter();\n    }\n\n    public function for(DetectedFramework $framework): FrameworkAdapter\n    {\n        foreach ($this->adapters as $adapter) {\n            if ($adapter->supports($framework)) {\n                return $adapter;\n            }\n        }\n\n        return $this->fallback;\n    }\n\n    /**\n     * Every adapter, including the plain-PHP fallback.\n     *\n     * @return list<FrameworkAdapter>\n     */\n    public function all(): array\n    {\n        return [...$this->adapters, $this->fallback];\n    }\n}\n","src/Framework/FrameworkDetector.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Framework;\n\n/**\n * Detects the framework from Composer metadata only.\n *\n * The analyzed application is never bootstrapped or autoloaded: detection is a\n * pure read of composer.json and composer.lock.\n */\nfinal class FrameworkDetector\n{\n    /**\n     * Package name => framework, most specific first.\n     *\n     * @var array<string, Framework>\n     */\n    private const SIGNATURES = [\n        'laravel/framework' => Framework::Laravel,\n        'laravel/lumen-framework' => Framework::Laravel,\n        'illuminate/support' => Framework::Laravel,\n        'symfony/framework-bundle' => Framework::Symfony,\n        'symfony/symfony' => Framework::Symfony,\n    ];\n\n    public function detect(string $projectRoot): DetectedFramework\n    {\n        $composer = $this->readJson($projectRoot . '/composer.json');\n\n        if ($composer === null) {\n            return DetectedFramework::none();\n        }\n\n        $requirements = $this->requirements($composer);\n        $lockVersions = $this->lockVersions($projectRoot . '/composer.lock');\n\n        foreach (self::SIGNATURES as $package => $framework) {\n            if (!array_key_exists($package, $requirements)) {\n                continue;\n            }\n\n            $version = $lockVersions[$package] ?? $requirements[$package];\n\n            return new DetectedFramework($framework, $this->majorVersion($version), $package);\n        }\n\n        return DetectedFramework::none();\n    }\n\n    /**\n     * @param array<string, mixed> $composer\n     *\n     * @return array<string, string>\n     */\n    private function requirements(array $composer): array\n    {\n        $requirements = [];\n\n        foreach (['require', 'require-dev'] as $section) {\n            $packages = $composer[$section] ?? null;\n\n            if (!is_array($packages)) {\n                continue;\n            }\n\n            foreach ($packages as $name => $constraint) {\n                if (is_string($name) && is_string($constraint)) {\n                    $requirements[strtolower($name)] = $constraint;\n                }\n            }\n        }\n\n        return $requirements;\n    }\n\n    /**\n     * @return array<string, string>\n     */\n    private function lockVersions(string $lockPath): array\n    {\n        $lock = $this->readJson($lockPath);\n\n        if ($lock === null) {\n            return [];\n        }\n\n        $versions = [];\n\n        foreach (['packages', 'packages-dev'] as $section) {\n            $packages = $lock[$section] ?? null;\n\n            if (!is_array($packages)) {\n                continue;\n            }\n\n            foreach ($packages as $package) {\n                if (!is_array($package)) {\n                    continue;\n                }\n\n                $name = $package['name'] ?? null;\n                $version = $package['version'] ?? null;\n\n                if (is_string($name) && is_string($version)) {\n                    $versions[strtolower($name)] = $version;\n                }\n            }\n        }\n\n        return $versions;\n    }\n\n    /**\n     * Reduce `v12.20.1` or `^12.0` to `12`.\n     */\n    private function majorVersion(string $version): ?string\n    {\n        if (preg_match('/(\\d+)/', $version, $matches) === 1) {\n            return $matches[1];\n        }\n\n        return null;\n    }\n\n    /**\n     * @return array<string, mixed>|null\n     */\n    private function readJson(string $path): ?array\n    {\n        if (!is_file($path) || !is_readable($path)) {\n            return null;\n        }\n\n        $contents = @file_get_contents($path);\n\n        if ($contents === false) {\n            return null;\n        }\n\n        try {\n            $decoded = json_decode($contents, true, 512, JSON_THROW_ON_ERROR);\n        } catch (\\JsonException) {\n            return null;\n        }\n\n        if (!is_array($decoded)) {\n            return null;\n        }\n\n        $result = [];\n\n        foreach ($decoded as $key => $value) {\n            if (is_string($key)) {\n                $result[$key] = $value;\n            }\n        }\n\n        return $result;\n    }\n}\n","src/Framework/Laravel/LaravelAdapter.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Framework\\Laravel;\n\nuse WorkerSafety\\Framework\\DetectedFramework;\nuse WorkerSafety\\Framework\\Framework;\nuse WorkerSafety\\Framework\\FrameworkAdapter;\nuse WorkerSafety\\Framework\\Laravel\\Rule\\ContainerSingletonMutableStateRule;\nuse WorkerSafety\\Framework\\Laravel\\Rule\\ScopedBindingCandidateRule;\n\n/**\n * Laravel awareness: container binding collection, the two container rules and\n * scan defaults that match the standard skeleton.\n */\nfinal class LaravelAdapter implements FrameworkAdapter\n{\n    public function identifier(): string\n    {\n        return Framework::Laravel->value;\n    }\n\n    public function supports(DetectedFramework $framework): bool\n    {\n        return $framework->isLaravel();\n    }\n\n    public function rules(): array\n    {\n        $inspector = new SharedBindingInspector();\n\n        return [\n            new ContainerSingletonMutableStateRule($inspector),\n            new ScopedBindingCandidateRule($inspector),\n        ];\n    }\n\n    public function bindingCollectors(): array\n    {\n        return [new LaravelContainerBindingCollector()];\n    }\n\n    public function defaultPaths(): array\n    {\n        return ['app', 'bootstrap', 'config', 'database', 'routes'];\n    }\n\n    public function defaultExcludes(): array\n    {\n        return [\n            'bootstrap/cache',\n            'public',\n            'resources/views',\n            '*.blade.php',\n        ];\n    }\n}\n","src/Framework/Laravel/LaravelContainerBindingCollector.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Framework\\Laravel;\n\nuse PhpParser\\Node;\nuse PhpParser\\Node\\Arg;\nuse PhpParser\\Node\\Expr;\nuse PhpParser\\Node\\Identifier;\nuse WorkerSafety\\Ast\\AstHelper;\nuse WorkerSafety\\Ast\\Index\\BindingContext;\nuse WorkerSafety\\Ast\\Index\\ContainerBinding;\nuse WorkerSafety\\Ast\\Index\\ContainerBindingCollector;\nuse WorkerSafety\\Ast\\Visitor\\FirstInstantiationFinder;\n\n/**\n * Recognises Illuminate container registrations.\n *\n * Both the receiver and the method name have to match, so a `->bind()` on some\n * unrelated object is not mistaken for a container binding.\n */\nfinal class LaravelContainerBindingCollector implements ContainerBindingCollector\n{\n    /**\n     * Method name => [shared, scoped, sharedFromThirdArgument].\n     *\n     * @var array<string, array{0: bool, 1: bool, 2: bool}>\n     */\n    private const BINDING_METHODS = [\n        'singleton' => [true, false, false],\n        'singletonif' => [true, false, false],\n        'scoped' => [true, true, false],\n        'scopedif' => [true, true, false],\n        'instance' => [true, false, false],\n        'bind' => [false, false, true],\n        'bindif' => [false, false, true],\n    ];\n\n    /**\n     * Facades and container classes that expose the binding methods statically.\n     *\n     * @var list<string>\n     */\n    private const CONTAINER_CLASSES = ['app', 'container', 'facade'];\n\n    /**\n     * Variable and property names that hold a container.\n     *\n     * @var list<string>\n     */\n    private const CONTAINER_NAMES = ['app', 'container'];\n\n    public function collect(Node $node, BindingContext $context): iterable\n    {\n        if ($node instanceof Expr\\MethodCall) {\n            $binding = $this->fromMethodCall($node, $context);\n        } elseif ($node instanceof Expr\\StaticCall) {\n            $binding = $this->fromStaticCall($node, $context);\n        } else {\n            return;\n        }\n\n        if ($binding instanceof ContainerBinding) {\n            yield $binding;\n        }\n    }\n\n    private function fromMethodCall(Expr\\MethodCall $node, BindingContext $context): ?ContainerBinding\n    {\n        if (!$node->name instanceof Identifier || !$this->isContainerExpression($node->var)) {\n            return null;\n        }\n\n        return $this->build($node->name->toString(), array_values($node->args), $node, $context);\n    }\n\n    private function fromStaticCall(Expr\\StaticCall $node, BindingContext $context): ?ContainerBinding\n    {\n        if (!$node->name instanceof Identifier || !$node->class instanceof Node\\Name) {\n            return null;\n        }\n\n        $className = AstHelper::nameToString($node->class);\n        $shortName = strtolower(str_contains($className, '\\\\')\n            ? substr($className, (int) strrpos($className, '\\\\') + 1)\n            : $className);\n\n        if (!in_array($shortName, self::CONTAINER_CLASSES, true)) {\n            return null;\n        }\n\n        return $this->build($node->name->toString(), array_values($node->args), $node, $context);\n    }\n\n    /**\n     * @param list<Arg|Node\\VariadicPlaceholder> $args\n     */\n    private function build(string $method, array $args, Node $node, BindingContext $context): ?ContainerBinding\n    {\n        $descriptor = self::BINDING_METHODS[strtolower($method)] ?? null;\n\n        if ($descriptor === null) {\n            return null;\n        }\n\n        [$shared, $scoped, $sharedFromArgument] = $descriptor;\n\n        $abstractArg = $this->argument($args, 0, 'abstract');\n\n        if ($abstractArg === null) {\n            return null;\n        }\n\n        $key = AstHelper::containerKeyFromExpr($abstractArg, $context->currentClass, $context->parentClass);\n\n        if ($key === null) {\n            return null;\n        }\n\n        [$abstract, $abstractIsClass] = $key;\n\n        $concreteArg = $this->argument($args, 1, 'concrete');\n        $concrete = $concreteArg === null ? null : $this->resolveConcrete($concreteArg, $context);\n\n        if ($sharedFromArgument) {\n            $sharedArg = $this->argument($args, 2, 'shared');\n            $shared = $sharedArg instanceof Expr\\ConstFetch\n                && strtolower($sharedArg->name->toString()) === 'true';\n        }\n\n        $location = AstHelper::location($node, $context->file);\n\n        return new ContainerBinding(\n            strtolower($method),\n            $abstract,\n            $concrete,\n            $shared,\n            $scoped,\n            $location,\n            $context->file->snippet($location->line),\n            $context->currentClass,\n            $context->currentMethod,\n            $abstractIsClass,\n            $context->file->identitySource($node->getStartFilePos(), $node->getEndFilePos()),\n        );\n    }\n\n    private function resolveConcrete(Expr $expr, BindingContext $context): ?string\n    {\n        if ($expr instanceof Expr\\Closure || $expr instanceof Expr\\ArrowFunction) {\n            return FirstInstantiationFinder::find($expr, $context->currentClass, $context->parentClass);\n        }\n\n        // `instance('ctx', new Context())` hands the container a built object.\n        if ($expr instanceof Expr\\New_ && $expr->class instanceof Node\\Name) {\n            return AstHelper::resolveClassReference($expr->class, $context->currentClass, $context->parentClass);\n        }\n\n        return AstHelper::classNameFromExpr($expr, $context->currentClass, $context->parentClass);\n    }\n\n    /**\n     * Resolve an argument positionally or by name.\n     *\n     * @param list<Arg|Node\\VariadicPlaceholder> $args\n     */\n    private function argument(array $args, int $position, string $name): ?Expr\n    {\n        foreach ($args as $arg) {\n            if ($arg instanceof Arg && $arg->name instanceof Identifier && $arg->name->toString() === $name) {\n                return $arg->value;\n            }\n        }\n\n        $positional = [];\n\n        foreach ($args as $arg) {\n            if ($arg instanceof Arg && $arg->name === null) {\n                $positional[] = $arg->value;\n            }\n        }\n\n        return $positional[$position] ?? null;\n    }\n\n    private function isContainerExpression(Expr $expr): bool\n    {\n        if ($expr instanceof Expr\\PropertyFetch && $expr->name instanceof Identifier) {\n            return in_array(strtolower($expr->name->toString()), self::CONTAINER_NAMES, true);\n        }\n\n        if ($expr instanceof Expr\\Variable && is_string($expr->name)) {\n            return in_array(strtolower($expr->name), self::CONTAINER_NAMES, true);\n        }\n\n        // `app()->singleton(...)`\n        if ($expr instanceof Expr\\FuncCall) {\n            return AstHelper::functionName($expr) === 'app' && $expr->args === [];\n        }\n\n        // `Container::getInstance()->singleton(...)`\n        if ($expr instanceof Expr\\StaticCall\n            && $expr->class instanceof Node\\Name\n            && $expr->name instanceof Identifier\n        ) {\n            $shortName = strtolower(str_replace('\\\\', '/', AstHelper::nameToString($expr->class)));\n            $shortName = substr($shortName, (int) strrpos($shortName, '/') + 1);\n\n            return $shortName === 'container' && strtolower($expr->name->toString()) === 'getinstance';\n        }\n\n        return false;\n    }\n}\n","src/Framework/Laravel/Rule/ContainerSingletonMutableStateRule.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Framework\\Laravel\\Rule;\n\nuse WorkerSafety\\Ast\\Index\\PropertyShape;\nuse WorkerSafety\\Finding\\Finding;\nuse WorkerSafety\\Finding\\RuleCategory;\nuse WorkerSafety\\Finding\\Severity;\nuse WorkerSafety\\Finding\\SymbolContext;\nuse WorkerSafety\\Framework\\Framework;\nuse WorkerSafety\\Framework\\Laravel\\SharedBindingInspection;\nuse WorkerSafety\\Framework\\Laravel\\SharedBindingInspector;\nuse WorkerSafety\\Rule\\AbstractRule;\nuse WorkerSafety\\Rule\\ProjectContext;\nuse WorkerSafety\\Rule\\RuleDefinition;\nuse WorkerSafety\\Rule\\RuleId;\nuse WorkerSafety\\Runtime\\RuntimeTargetSet;\n\n/**\n * WS005 — a class registered as a container singleton that carries mutable state.\n *\n * Reported at the binding, because that is where the fix goes. The finding is\n * only produced when the bound class is declared inside the analyzed paths:\n * without the class shape there is nothing to be confident about.\n */\nfinal class ContainerSingletonMutableStateRule extends AbstractRule\n{\n    public function __construct(private readonly SharedBindingInspector $inspector = new SharedBindingInspector())\n    {\n    }\n\n    public function definition(): RuleDefinition\n    {\n        return new RuleDefinition(\n            RuleId::LARAVEL_SINGLETON_MUTABLE_STATE,\n            'Laravel container singleton with mutable state',\n            'A `singleton()` binding is resolved once and then reused. Octane keeps the container between requests, so the same instance — and everything written into it — is handed to every request the worker serves.',\n            Severity::High,\n            RuleCategory::ContainerBinding,\n            [\n                'Consider `$this->app->scoped()`: Octane discards scoped instances between requests. Check first what else resolves this class — anything that outlives a request and took it through the constructor keeps the instance it already has, so the binding changes while that consumer does not.',\n                'Or make the service immutable and pass the per-request values in as method arguments. That removes the question of lifetime instead of answering it.',\n                'If the binding must stay a singleton, reset its state in a RequestReceived listener.',\n            ],\n            RuntimeTargetSet::all(),\n            Framework::Laravel->value,\n        );\n    }\n\n    public function finishProject(ProjectContext $context): iterable\n    {\n        foreach ($this->inspector->inspect($context->index()) as $inspection) {\n            yield $this->report($inspection, $context);\n        }\n    }\n\n    private function report(SharedBindingInspection $inspection, ProjectContext $context): Finding\n    {\n        $binding = $inspection->binding;\n        $class = $inspection->class;\n        $requestScoped = $inspection->looksRequestScoped();\n\n        return $this->finding(\n            $context,\n            $binding->location,\n            $requestScoped\n                ? sprintf(\n                    'Laravel singleton %s contains potentially request-specific mutable state (%s).',\n                    $class->shortName,\n                    $inspection->describeProperties(),\n                )\n                : sprintf(\n                    'Laravel singleton %s contains mutable state (%s).',\n                    $class->shortName,\n                    $inspection->describeProperties(),\n                ),\n            $this->explain($inspection),\n            $requestScoped ? Severity::High : Severity::Medium,\n            new SymbolContext(\n                $class->name,\n                $binding->inMethod,\n                $inspection->mutableProperties[0]->name ?? null,\n            ),\n            $binding->snippet,\n            null,\n            $binding->excerpt,\n        );\n    }\n\n    private function explain(SharedBindingInspection $inspection): string\n    {\n        $binding = $inspection->binding;\n        $class = $inspection->class;\n\n        $explanation = sprintf(\n            '%s is registered with %s(), so the container builds it once and hands the same instance to every request. %s declares %d mutable instance %s (%s) at %s, which means values written while serving one request are still set for the next one.',\n            $class->shortName,\n            $binding->method,\n            $class->shortName,\n            count($inspection->mutableProperties),\n            count($inspection->mutableProperties) === 1 ? 'property' : 'properties',\n            $inspection->describeProperties(),\n            (string) $class->location,\n        );\n\n        if ($inspection->looksRequestScoped()) {\n            $explanation .= sprintf(\n                ' The property names read as request-specific state (%s), so this is a concrete cross-request leak rather than a theoretical one if the application runs on a persistent worker.',\n                implode(', ', $inspection->requestTokens()),\n            );\n        }\n\n        $writable = array_values(array_filter(\n            $inspection->mutableProperties,\n            static fn (PropertyShape $property): bool => $property->isPublic(),\n        ));\n\n        if ($writable !== []) {\n            $explanation .= sprintf(\n                ' $%s is public, so any caller holding the shared instance can change it.',\n                $writable[0]->name,\n            );\n        }\n\n        return $explanation;\n    }\n}\n","src/Framework/Laravel/Rule/ScopedBindingCandidateRule.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Framework\\Laravel\\Rule;\n\nuse WorkerSafety\\Finding\\Finding;\nuse WorkerSafety\\Finding\\RuleCategory;\nuse WorkerSafety\\Finding\\Severity;\nuse WorkerSafety\\Finding\\SymbolContext;\nuse WorkerSafety\\Framework\\Framework;\nuse WorkerSafety\\Framework\\Laravel\\SharedBindingInspection;\nuse WorkerSafety\\Framework\\Laravel\\SharedBindingInspector;\nuse WorkerSafety\\Rule\\AbstractRule;\nuse WorkerSafety\\Rule\\ProjectContext;\nuse WorkerSafety\\Rule\\RuleDefinition;\nuse WorkerSafety\\Rule\\RuleId;\nuse WorkerSafety\\Runtime\\RuntimeTargetSet;\n\n/**\n * WS006 — a singleton binding that should be a scoped binding.\n *\n * WS005 reports the risk; this rule is the concrete migration suggestion, and\n * it only fires when the state actually reads as request-specific. Turning it\n * off leaves WS005's risk reporting intact.\n */\nfinal class ScopedBindingCandidateRule extends AbstractRule\n{\n    public function __construct(private readonly SharedBindingInspector $inspector = new SharedBindingInspector())\n    {\n    }\n\n    public function definition(): RuleDefinition\n    {\n        return new RuleDefinition(\n            RuleId::LARAVEL_SCOPED_CANDIDATE,\n            'Laravel scoped binding candidate',\n            'Laravel offers a third lifetime between `bind()` (new instance every resolve) and `singleton()` (one instance forever): `scoped()`. A scoped instance is created once per request and discarded when the request ends, which is exactly what a request context object needs.',\n            Severity::Medium,\n            RuleCategory::ContainerBinding,\n            [\n                'Check how long the instance is meant to live and who resolves it, then decide. `scoped()` is the right lifetime for per-request state, but it is a lifetime change, not a drop-in.',\n                'Look for consumers that outlive a request: a singleton (or any longer-lived object) that takes this class in its constructor captures the first instance and keeps it, so the binding changes while that consumer does not.',\n                'Check what the instance carries across resolves today — a warmed cache, a connection, a lazily built index. Under `scoped()` that work happens once per request instead of once per worker.',\n                'Once the lifetime is right, Octane flushes scoped instances between requests, so no manual reset listener is needed for them.',\n            ],\n            RuntimeTargetSet::all(),\n            Framework::Laravel->value,\n        );\n    }\n\n    public function finishProject(ProjectContext $context): iterable\n    {\n        foreach ($this->inspector->inspect($context->index()) as $inspection) {\n            if (!$inspection->looksRequestScoped()) {\n                continue;\n            }\n\n            yield $this->reportCandidate($inspection, $context);\n        }\n    }\n\n    private function reportCandidate(SharedBindingInspection $inspection, ProjectContext $context): Finding\n    {\n        $binding = $inspection->binding;\n        $class = $inspection->class;\n\n        return $this->finding(\n            $context,\n            $binding->location,\n            sprintf('%s is a candidate for a scoped binding instead of %s().', $class->shortName, $binding->method),\n            sprintf(\n                '%s holds %s, which reads as per-request state (%s). Registering it with `scoped()` would make the container build one instance per request and discard it afterwards, so the state could not cross a request boundary. That is a change of lifetime rather than a rename: review what else resolves %s, and whether anything holding on to it lives longer than a request, before switching `$this->app->%s(%s::class, …)` to `$this->app->scoped(%s::class, …)`.',\n                $class->shortName,\n                $inspection->describeProperties(),\n                implode(', ', $inspection->requestTokens()),\n                $class->shortName,\n                $binding->method,\n                $class->shortName,\n                $class->shortName,\n            ),\n            Severity::Medium,\n            new SymbolContext($class->name, $binding->inMethod),\n            $binding->snippet,\n            null,\n            $binding->excerpt,\n        );\n    }\n}\n","src/Framework/Laravel/SharedBindingInspection.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Framework\\Laravel;\n\nuse WorkerSafety\\Ast\\Index\\ClassShape;\nuse WorkerSafety\\Ast\\Index\\ContainerBinding;\nuse WorkerSafety\\Ast\\Index\\PropertyShape;\n\n/**\n * One shared container binding together with the shape of the class it binds.\n */\nfinal class SharedBindingInspection\n{\n    /**\n     * @param list<PropertyShape> $mutableProperties\n     * @param list<PropertyShape> $requestScopedProperties\n     */\n    public function __construct(\n        public readonly ContainerBinding $binding,\n        public readonly ClassShape $class,\n        public readonly array $mutableProperties,\n        public readonly array $requestScopedProperties,\n    ) {\n    }\n\n    public function hasMutableState(): bool\n    {\n        return $this->mutableProperties !== [];\n    }\n\n    public function looksRequestScoped(): bool\n    {\n        return $this->requestScopedProperties !== [];\n    }\n\n    /**\n     * `$user, $locale` — for use inside a message.\n     */\n    public function describeProperties(int $limit = 4): string\n    {\n        $names = array_map(\n            static fn (PropertyShape $property): string => '$' . $property->name,\n            $this->mutableProperties,\n        );\n\n        $shown = implode(', ', array_slice($names, 0, $limit));\n\n        return count($names) > $limit ? $shown . ', …' : $shown;\n    }\n\n    /**\n     * @return list<string>\n     */\n    public function requestTokens(): array\n    {\n        $tokens = [];\n\n        foreach ($this->requestScopedProperties as $property) {\n            foreach ($property->requestTokens() as $token) {\n                if (!in_array($token, $tokens, true)) {\n                    $tokens[] = $token;\n                }\n            }\n        }\n\n        return $tokens;\n    }\n}\n","src/Framework/Laravel/SharedBindingInspector.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Framework\\Laravel;\n\nuse WorkerSafety\\Ast\\Index\\ClassShape;\nuse WorkerSafety\\Ast\\Index\\ContainerBinding;\nuse WorkerSafety\\Ast\\Index\\ProjectIndex;\nuse WorkerSafety\\Ast\\Index\\PropertyShape;\n\n/**\n * Correlates shared container bindings with the declaration of the bound class.\n *\n * This is the \"best effort\" data-flow the container rules are built on: the\n * binding says the object is created once, the class shape says whether that\n * object can change afterwards. A binding whose class is not declared inside\n * the analyzed paths is skipped rather than guessed at.\n */\nfinal class SharedBindingInspector\n{\n    /**\n     * @return list<SharedBindingInspection>\n     */\n    public function inspect(ProjectIndex $index): array\n    {\n        $inspections = [];\n\n        foreach ($index->bindings() as $binding) {\n            if (!$binding->shared || $binding->scoped) {\n                continue;\n            }\n\n            $class = $this->resolveClass($index, $binding);\n\n            if (!$class instanceof ClassShape) {\n                continue;\n            }\n\n            // A class that is also registered as `scoped()` somewhere has\n            // already been given a per-request lifetime.\n            if ($this->hasScopedBinding($index, $binding)) {\n                continue;\n            }\n\n            $mutable = $class->mutableInstanceProperties();\n\n            if ($mutable === []) {\n                continue;\n            }\n\n            $requestScoped = array_values(array_filter(\n                $mutable,\n                static fn (PropertyShape $property): bool => $property->looksRequestScoped(),\n            ));\n\n            $inspections[] = new SharedBindingInspection($binding, $class, $mutable, $requestScoped);\n        }\n\n        return $inspections;\n    }\n\n    private function resolveClass(ProjectIndex $index, ContainerBinding $binding): ?ClassShape\n    {\n        // Prefer the concrete type from the binding closure, then the abstract\n        // — but only when the abstract actually names a class.\n        $candidates = [$binding->concrete];\n\n        if ($binding->abstractIsClass) {\n            $candidates[] = $binding->abstract;\n        }\n\n        foreach ($candidates as $candidate) {\n            if ($candidate === null) {\n                continue;\n            }\n\n            $class = $index->findClass($candidate);\n\n            if ($class instanceof ClassShape && $class->instanceProperties !== []) {\n                return $class;\n            }\n\n            if ($class instanceof ClassShape) {\n                return $class;\n            }\n        }\n\n        return null;\n    }\n\n    /**\n     * The container flushes scoped instances by the exact key they were\n     * registered under, so only a scoped registration of that same key makes\n     * this binding safe.\n     *\n     * `forgetScopedInstances()` does a plain `unset($this->instances[$scoped])`\n     * with no alias resolution, and `bind()` deletes `$this->aliases[$abstract]`\n     * for the key it registers — so `alias(Ctx::class, 'a')` followed by\n     * `scoped('a')` leaves the `Ctx::class` singleton untouched. Aliases are\n     * therefore deliberately *not* followed here: inferring a shared lifetime\n     * from one would hide a real singleton. Keys are compared byte for byte,\n     * the way array keys are, which is separate from PHP class-name identity\n     * (case-insensitive; see ProjectIndex::findClass()).\n     */\n    private function hasScopedBinding(ProjectIndex $index, ContainerBinding $binding): bool\n    {\n        if ($binding->abstract === null) {\n            return false;\n        }\n\n        foreach ($index->bindings() as $other) {\n            if (!$other->scoped || $other->abstract === null) {\n                continue;\n            }\n\n            if ($other->abstract === $binding->abstract) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n}\n","src/Framework/PlainPhpAdapter.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Framework;\n\n/**\n * Fallback adapter for projects with no recognised framework.\n */\nfinal class PlainPhpAdapter implements FrameworkAdapter\n{\n    public function identifier(): string\n    {\n        return Framework::None->value;\n    }\n\n    public function supports(DetectedFramework $framework): bool\n    {\n        return !$framework->isKnown();\n    }\n\n    public function rules(): array\n    {\n        return [];\n    }\n\n    public function bindingCollectors(): array\n    {\n        return [];\n    }\n\n    public function defaultPaths(): array\n    {\n        return ['src', 'lib', 'app'];\n    }\n\n    public function defaultExcludes(): array\n    {\n        return [];\n    }\n}\n","src/Framework/Symfony/SymfonyAdapter.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Framework\\Symfony;\n\nuse WorkerSafety\\Framework\\DetectedFramework;\nuse WorkerSafety\\Framework\\Framework;\nuse WorkerSafety\\Framework\\FrameworkAdapter;\n\n/**\n * Symfony awareness: scan defaults only.\n *\n * The adapter exists so that Symfony-specific rules and a Symfony container\n * binding collector have a home; v1 ships none, and contributes no rules rather\n * than pretending to analyze something it does not understand yet.\n */\nfinal class SymfonyAdapter implements FrameworkAdapter\n{\n    public function identifier(): string\n    {\n        return Framework::Symfony->value;\n    }\n\n    public function supports(DetectedFramework $framework): bool\n    {\n        return $framework->isSymfony();\n    }\n\n    public function rules(): array\n    {\n        return [];\n    }\n\n    public function bindingCollectors(): array\n    {\n        return [];\n    }\n\n    public function defaultPaths(): array\n    {\n        return ['src', 'config'];\n    }\n\n    public function defaultExcludes(): array\n    {\n        return [\n            'var',\n            'public/bundles',\n            'templates',\n            '*.twig',\n        ];\n    }\n}\n","src/Ignore/FindingSuppressor.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Ignore;\n\nuse WorkerSafety\\Config\\Configuration;\nuse WorkerSafety\\Finding\\Finding;\nuse WorkerSafety\\Support\\ExcludeMatcher;\n\n/**\n * Decides whether a finding is suppressed, by inline directive or by config.\n */\nfinal class FindingSuppressor\n{\n    /**\n     * @var array<string, SuppressionIndex>\n     */\n    private array $indexes = [];\n\n    /**\n     * @var array<string, ExcludeMatcher|null>\n     */\n    private array $matchers = [];\n\n    public function __construct(private readonly Configuration $configuration)\n    {\n    }\n\n    public function addFileIndex(string $absolutePath, SuppressionIndex $index): void\n    {\n        if (!$index->isEmpty()) {\n            $this->indexes[$absolutePath] = $index;\n        }\n    }\n\n    public function isSuppressed(Finding $finding): bool\n    {\n        $index = $this->indexes[$finding->location->absolutePath] ?? null;\n\n        if ($index instanceof SuppressionIndex && $index->isSuppressed($finding->ruleId, $finding->location->line)) {\n            return true;\n        }\n\n        return $this->configMatcher($finding->ruleId)?->matches($finding->location->relativePath) === true;\n    }\n\n    private function configMatcher(string $ruleId): ?ExcludeMatcher\n    {\n        if (!array_key_exists($ruleId, $this->matchers)) {\n            $this->matchers[$ruleId] = $this->configuration->ignoreMatcherFor($ruleId);\n        }\n\n        return $this->matchers[$ruleId];\n    }\n}\n","src/Ignore/IgnoreAttributeVisitor.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Ignore;\n\nuse PhpParser\\Node;\nuse PhpParser\\NodeVisitorAbstract;\nuse WorkerSafety\\Application\\ApplicationInfo;\nuse WorkerSafety\\Ast\\AstHelper;\n\n/**\n * Collects `#[WorkerSafetyIgnore('WS001')]` attributes.\n *\n * The attribute suppresses the annotated declaration's whole line range, which\n * makes it the right tool for a class or method and the comment directive the\n * right tool for a single statement.\n */\nfinal class IgnoreAttributeVisitor extends NodeVisitorAbstract\n{\n    public function __construct(private readonly SuppressionIndex $index)\n    {\n    }\n\n    public function enterNode(Node $node): null\n    {\n        if (!property_exists($node, 'attrGroups')) {\n            return null;\n        }\n\n        /** @var list<Node\\AttributeGroup> $attrGroups */\n        $attrGroups = $node->attrGroups;\n\n        foreach ($attrGroups as $group) {\n            foreach ($group->attrs as $attribute) {\n                if (!$this->isIgnoreAttribute($attribute)) {\n                    continue;\n                }\n\n                $start = max(1, $node->getStartLine());\n                $end = max($start, $node->getEndLine());\n\n                $this->index->suppressRange($start, $end, $this->ruleIds($attribute));\n            }\n        }\n\n        return null;\n    }\n\n    private function isIgnoreAttribute(Node\\Attribute $attribute): bool\n    {\n        $name = AstHelper::nameToString($attribute->name);\n        $short = str_contains($name, '\\\\')\n            ? substr($name, (int) strrpos($name, '\\\\') + 1)\n            : $name;\n\n        return strtolower($short) === strtolower(ApplicationInfo::IGNORE_ATTRIBUTE);\n    }\n\n    /**\n     * @return list<string>\n     */\n    private function ruleIds(Node\\Attribute $attribute): array\n    {\n        $ids = [];\n\n        foreach ($attribute->args as $arg) {\n            foreach ($this->stringValues($arg->value) as $value) {\n                if (preg_match('/^[A-Za-z]{2}\\d{3}$/', $value) === 1) {\n                    $ids[] = strtoupper($value);\n                }\n            }\n        }\n\n        return array_values(array_unique($ids));\n    }\n\n    /**\n     * @return list<string>\n     */\n    private function stringValues(Node\\Expr $expr): array\n    {\n        $literal = AstHelper::stringValue($expr);\n\n        if ($literal !== null) {\n            return [$literal];\n        }\n\n        if (!$expr instanceof Node\\Expr\\Array_) {\n            return [];\n        }\n\n        $values = [];\n\n        foreach ($expr->items as $item) {\n            $value = AstHelper::stringValue($item->value);\n\n            if ($value !== null) {\n                $values[] = $value;\n            }\n        }\n\n        return $values;\n    }\n}\n","src/Ignore/IgnoreDirectiveParser.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Ignore;\n\nuse WorkerSafety\\Application\\ApplicationInfo;\nuse WorkerSafety\\Support\\SourceFile;\n\n/**\n * Extracts inline suppression comments from PHP source.\n *\n * Supported forms (rule list optional; omitting it suppresses every rule):\n *\n *   // worker-safety-ignore WS001            same line and the following line\n *   // worker-safety-ignore-line WS001       only the comment's own line\n *   // worker-safety-ignore-next-line WS001  only the following line\n *   // worker-safety-ignore-file WS001,WS008 the whole file\n *\n * Comments are read from the token stream, so a marker inside a string\n * literal is never mistaken for a directive.\n */\nfinal class IgnoreDirectiveParser\n{\n    public function parse(SourceFile $file): SuppressionIndex\n    {\n        $index = new SuppressionIndex();\n        $marker = ApplicationInfo::IGNORE_MARKER;\n\n        if (!str_contains($file->source, $marker)) {\n            return $index;\n        }\n\n        foreach ($this->comments($file->source) as [$text, $startLine]) {\n            $endLine = $startLine + substr_count($text, \"\\n\");\n\n            foreach ($this->directives($text) as [$scope, $ruleIds]) {\n                match ($scope) {\n                    'file' => $index->suppressFile($ruleIds),\n                    'line' => $index->suppressLine($startLine, $ruleIds),\n                    'next-line' => $index->suppressLine($endLine + 1, $ruleIds),\n                    default => $this->suppressLineAndNext($index, $startLine, $endLine, $ruleIds),\n                };\n            }\n        }\n\n        return $index;\n    }\n\n    /**\n     * @param list<string> $ruleIds\n     */\n    private function suppressLineAndNext(SuppressionIndex $index, int $startLine, int $endLine, array $ruleIds): void\n    {\n        // The bare directive is accepted both as a trailing comment and as a\n        // comment placed above the offending line.\n        $index->suppressLine($startLine, $ruleIds);\n        $index->suppressLine($endLine + 1, $ruleIds);\n    }\n\n    /**\n     * @return list<array{0: string, 1: list<string>}> scope and rule ids\n     */\n    private function directives(string $comment): array\n    {\n        $marker = preg_quote(ApplicationInfo::IGNORE_MARKER, '/');\n        // Rule ids may be separated by spaces, commas or both.\n        $pattern = '/(?:@)?' . $marker . '(-file|-line|-next-line)?((?:[ \\t,]+[A-Za-z]{2}\\d{3})*)/i';\n\n        if (preg_match_all($pattern, $comment, $matches, PREG_SET_ORDER) === false) {\n            return [];\n        }\n\n        $directives = [];\n\n        foreach ($matches as $match) {\n            $scope = match (strtolower($match[1] ?? '')) {\n                '-file' => 'file',\n                '-line' => 'line',\n                '-next-line' => 'next-line',\n                default => 'both',\n            };\n\n            $directives[] = [$scope, $this->ruleIds($match[2] ?? '')];\n        }\n\n        return $directives;\n    }\n\n    /**\n     * @return list<string>\n     */\n    private function ruleIds(string $raw): array\n    {\n        if (preg_match_all('/[A-Za-z]{2}\\d{3}/', $raw, $matches) === false) {\n            return [];\n        }\n\n        return array_values(array_unique(array_map('strtoupper', $matches[0])));\n    }\n\n    /**\n     * @return list<array{0: string, 1: int}> comment text and start line\n     */\n    private function comments(string $source): array\n    {\n        $comments = [];\n\n        foreach (@token_get_all($source) as $token) {\n            if (!is_array($token)) {\n                continue;\n            }\n\n            if ($token[0] !== T_COMMENT && $token[0] !== T_DOC_COMMENT) {\n                continue;\n            }\n\n            $comments[] = [$token[1], $token[2]];\n        }\n\n        return $comments;\n    }\n}\n","src/Ignore/SuppressionIndex.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Ignore;\n\n/**\n * Per-file record of which rules are suppressed where.\n *\n * An empty rule list means \"every rule\".\n */\nfinal class SuppressionIndex\n{\n    /**\n     * @var array<int, list<string>>\n     */\n    private array $lines = [];\n\n    /**\n     * @var list<array{start: int, end: int, rules: list<string>}>\n     */\n    private array $ranges = [];\n\n    /**\n     * @var list<list<string>>\n     */\n    private array $fileWide = [];\n\n    /**\n     * @param list<string> $ruleIds\n     */\n    public function suppressLine(int $line, array $ruleIds): void\n    {\n        if ($line < 1) {\n            return;\n        }\n\n        $existing = $this->lines[$line] ?? null;\n\n        if ($existing === null) {\n            $this->lines[$line] = $ruleIds;\n\n            return;\n        }\n\n        // Once a line suppresses everything it keeps suppressing everything.\n        if ($existing === [] || $ruleIds === []) {\n            $this->lines[$line] = [];\n\n            return;\n        }\n\n        $this->lines[$line] = array_values(array_unique([...$existing, ...$ruleIds]));\n    }\n\n    /**\n     * @param list<string> $ruleIds\n     */\n    public function suppressRange(int $start, int $end, array $ruleIds): void\n    {\n        if ($start < 1 || $end < $start) {\n            return;\n        }\n\n        $this->ranges[] = ['start' => $start, 'end' => $end, 'rules' => $ruleIds];\n    }\n\n    /**\n     * @param list<string> $ruleIds\n     */\n    public function suppressFile(array $ruleIds): void\n    {\n        $this->fileWide[] = $ruleIds;\n    }\n\n    public function isSuppressed(string $ruleId, int $line): bool\n    {\n        $ruleId = strtoupper($ruleId);\n\n        foreach ($this->fileWide as $rules) {\n            if ($this->covers($rules, $ruleId)) {\n                return true;\n            }\n        }\n\n        if (isset($this->lines[$line]) && $this->covers($this->lines[$line], $ruleId)) {\n            return true;\n        }\n\n        foreach ($this->ranges as $range) {\n            if ($line >= $range['start'] && $line <= $range['end'] && $this->covers($range['rules'], $ruleId)) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n\n    public function isEmpty(): bool\n    {\n        return $this->lines === [] && $this->ranges === [] && $this->fileWide === [];\n    }\n\n    /**\n     * @param list<string> $rules\n     */\n    private function covers(array $rules, string $ruleId): bool\n    {\n        return $rules === [] || in_array($ruleId, $rules, true);\n    }\n}\n","src/Integration/Laravel/ArtisanScanCommand.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Integration\\Laravel;\n\nuse Symfony\\Component\\Console\\Attribute\\AsCommand;\nuse WorkerSafety\\Analyzer\\ScanService;\nuse WorkerSafety\\Baseline\\BaselineRepository;\nuse WorkerSafety\\Command\\ScanCommand;\nuse WorkerSafety\\Support\\Paths;\n\n/**\n * `php artisan worker-safety:scan`.\n *\n * Deliberately nothing but a rename and a different default project root: the\n * arguments, options, output formats, baseline handling and exit codes all come\n * from {@see ScanCommand}, so the Artisan command and `vendor/bin/worker-safety`\n * can never drift apart.\n *\n * Artisan may be invoked from any directory, so the application's base path —\n * not the current working directory — is what the scan defaults to. An explicit\n * `--project-dir` still wins, and a relative one is resolved against the\n * application root, which is the directory an Artisan user is thinking in.\n */\n#[AsCommand(\n    name: 'worker-safety:scan',\n    description: 'Analyze this application for cross-request state risks under persistent workers',\n)]\nfinal class ArtisanScanCommand extends ScanCommand\n{\n    public function __construct(\n        private readonly string $basePath,\n        ScanService $scanService = new ScanService(),\n        BaselineRepository $baselines = new BaselineRepository(),\n    ) {\n        parent::__construct($scanService, $baselines);\n    }\n\n    protected function workingDirectory(): string\n    {\n        return Paths::normalize($this->basePath);\n    }\n}\n","src/Integration/Laravel/WorkerSafetyServiceProvider.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Integration\\Laravel;\n\nuse Illuminate\\Contracts\\Foundation\\Application;\nuse Illuminate\\Support\\ServiceProvider;\n\n/**\n * Registers `php artisan worker-safety:scan`.\n *\n * Found automatically by Laravel's package discovery through the\n * `extra.laravel.providers` entry in composer.json; see the README for the\n * manual registration a project with discovery disabled needs.\n *\n * Laravel is not a dependency of this package. Nothing in this namespace is\n * autoloaded unless an application registers the provider, so\n * `vendor/bin/worker-safety` behaves identically in a project without Laravel.\n */\nfinal class WorkerSafetyServiceProvider extends ServiceProvider\n{\n    public function register(): void\n    {\n        $this->app->singleton(\n            ArtisanScanCommand::class,\n            static fn (Application $app): ArtisanScanCommand => new ArtisanScanCommand($app->basePath()),\n        );\n    }\n\n    public function boot(): void\n    {\n        // A scanner has nothing to do during an HTTP request, so the command is\n        // only wired up for console runs.\n        if (!$this->app->runningInConsole()) {\n            return;\n        }\n\n        $this->commands([ArtisanScanCommand::class]);\n    }\n}\n","src/Reporting/ConsoleReporter.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Reporting;\n\nuse Symfony\\Component\\Console\\Formatter\\OutputFormatter;\nuse Symfony\\Component\\Console\\Output\\OutputInterface;\nuse WorkerSafety\\Application\\ApplicationInfo;\nuse WorkerSafety\\Ast\\ParseFailure;\nuse WorkerSafety\\Finding\\Finding;\nuse WorkerSafety\\Finding\\Severity;\n\n/**\n * Human readable report.\n */\nfinal class ConsoleReporter implements Reporter\n{\n    private const WIDTH = 76;\n\n    private const DIVIDER = '──────────────────────────────────────────────────────────────────────';\n\n    /**\n     * Printed under every scan, including a clean one.\n     *\n     * Worker Safety performs no runtime detection at all, and the absence of a\n     * runtime package in composer.json is not evidence that no persistent\n     * worker is used: queue workers, an externally installed runtime and the\n     * deployment configuration are all invisible from the source tree. Saying\n     * so plainly is the only honest option, and it keeps the tool usable as a\n     * pre-migration compatibility check.\n     */\n    /**\n     * Why a failing scan is not the same as a confirmed defect.\n     */\n    private const THRESHOLD_NOTE = 'That is a decision about the findings above against the configured threshold. '\n        . 'Each one still has to be read: it describes a risk under a persistent worker, not a fault observed in '\n        . 'production.';\n\n    private const TARGETS_NOTE = 'Selected for this scan, not detected — Worker Safety does not inspect how this '\n        . 'application is deployed. Findings below describe what the code would do if it ran under one of these '\n        . 'runtimes; they are not observations of its current behaviour.';\n\n    public function report(ScanReport $report, OutputInterface $output): void\n    {\n        ConsoleStyles::register($output);\n\n        $this->writeHeader($report, $output);\n\n        if ($report->findings->isEmpty()) {\n            $this->writeNoFindings($report, $output);\n        } else {\n            $this->writeFindings($report, $output);\n        }\n\n        $this->writeParseFailures($report, $output);\n        $this->writeSummary($report, $output);\n    }\n\n    private function writeHeader(ScanReport $report, OutputInterface $output): void\n    {\n        $output->writeln('');\n        $output->writeln(sprintf('<ws-heading>%s %s</ws-heading>', ApplicationInfo::NAME, $report->toolVersion));\n        $output->writeln('');\n\n        $output->writeln('<ws-heading>Project</ws-heading>');\n        $output->writeln('  ' . self::escape($report->projectRoot));\n        $output->writeln('');\n\n        // Two separate blocks on purpose. Everything under Environment was\n        // observed; everything under Analysis targets was chosen. Printing the\n        // targets as \"Runtime\" next to a detected framework version read as a\n        // claim that the application runs on them, which this tool never\n        // establishes.\n        $output->writeln('<ws-heading>Environment</ws-heading>');\n        $output->writeln(sprintf('  PHP        %s', $report->phpVersion));\n        $output->writeln(sprintf('  Framework  %s', $report->framework->describe()));\n\n        if ($report->configPath !== null) {\n            $output->writeln(sprintf('  Config     %s', self::escape($report->configPath)));\n        }\n\n        if ($report->baselinePath !== null) {\n            $output->writeln(sprintf('  Baseline   %s', self::escape($report->baselinePath)));\n        }\n\n        $output->writeln('');\n        $this->writeAnalysisTargets($report, $output);\n        $output->writeln(sprintf(\n            '%d PHP %s analyzed in %.2fs.',\n            $report->filesScanned,\n            $report->filesScanned === 1 ? 'file' : 'files',\n            $report->durationSeconds,\n        ));\n        $output->writeln('');\n    }\n\n    /**\n     * The runtimes this scan reasons about — selected, never detected.\n     */\n    private function writeAnalysisTargets(ScanReport $report, OutputInterface $output): void\n    {\n        $output->writeln('<ws-heading>Analysis targets</ws-heading>');\n        $output->writeln('  ' . $report->runtimes->describe());\n        $output->writeln('');\n\n        foreach ($this->wrap(self::TARGETS_NOTE, '  ') as $line) {\n            $output->writeln('<ws-muted>' . self::escape($line) . '</ws-muted>');\n        }\n\n        $output->writeln('');\n    }\n\n    private function writeNoFindings(ScanReport $report, OutputInterface $output): void\n    {\n        $output->writeln($report->isIncomplete()\n            ? '<ws-medium>No worker-safety risks found in the files that could be analyzed.</ws-medium>'\n            : '<ws-pass>No worker-safety risks found.</ws-pass>');\n\n        if ($report->suppressedCount > 0 || $report->baselineFilteredCount > 0) {\n            $output->writeln('');\n            $output->writeln('<ws-muted>Some findings were filtered; see the summary below.</ws-muted>');\n        }\n\n        $output->writeln('');\n    }\n\n    private function writeFindings(ScanReport $report, OutputInterface $output): void\n    {\n        $output->writeln('<ws-heading>Findings</ws-heading>');\n        $output->writeln('<ws-muted>' . self::DIVIDER . '</ws-muted>');\n\n        foreach ($report->findings as $finding) {\n            $this->writeFinding($finding, $report, $output);\n            $output->writeln('<ws-muted>' . self::DIVIDER . '</ws-muted>');\n        }\n\n        $output->writeln('');\n    }\n\n    private function writeFinding(Finding $finding, ScanReport $report, OutputInterface $output): void\n    {\n        $style = $finding->severity->consoleStyle();\n\n        $output->writeln('');\n        $output->writeln(sprintf(\n            '<%s>%s</%s> <ws-rule>%s</ws-rule>  %s',\n            $style,\n            $finding->severity->label(),\n            $style,\n            $finding->ruleId,\n            $finding->title,\n        ));\n\n        $output->writeln('');\n        $output->writeln($this->formatLocation($finding));\n\n        if ($finding->snippet !== null) {\n            $output->writeln('');\n            $output->writeln('    <ws-code>' . self::escape($finding->snippet) . '</ws-code>');\n        }\n\n        $output->writeln('');\n\n        foreach ($this->wrap($finding->message) as $line) {\n            $output->writeln(self::escape($line));\n        }\n\n        if ($finding->details !== null) {\n            $output->writeln('');\n\n            foreach ($this->wrap($finding->details) as $line) {\n                $output->writeln('<ws-muted>' . self::escape($line) . '</ws-muted>');\n            }\n        }\n\n        if ($finding->runtimes->count() > 0) {\n            $output->writeln('');\n            $output->writeln('Affected runtimes:');\n            $output->writeln('  ' . implode(', ', $finding->runtimes->labels()));\n\n            if ($finding->runtimes->count() === 1) {\n                $note = $finding->runtimes->toArray()[0]->note();\n\n                foreach ($this->wrap($note, '  ') as $line) {\n                    $output->writeln('<ws-muted>' . self::escape($line) . '</ws-muted>');\n                }\n            }\n        }\n\n        if ($finding->remediation !== []) {\n            $output->writeln('');\n            $output->writeln('Recommendation:');\n\n            foreach ($finding->remediation as $suggestion) {\n                $lines = $this->wrap($suggestion, '    ');\n                $first = array_shift($lines);\n                $output->writeln('  - ' . self::escape(ltrim((string) $first)));\n\n                foreach ($lines as $line) {\n                    $output->writeln(self::escape($line));\n                }\n            }\n        }\n\n        $output->writeln('');\n    }\n\n    private function formatLocation(Finding $finding): string\n    {\n        $location = $finding->location->relativePath . ':' . $finding->location->line;\n        $symbol = $finding->symbol->describe();\n\n        if ($symbol === null) {\n            return self::escape($location);\n        }\n\n        return self::escape($location) . '  <ws-muted>' . self::escape($symbol) . '</ws-muted>';\n    }\n\n    private function writeParseFailures(ScanReport $report, OutputInterface $output): void\n    {\n        if ($report->parseFailures === []) {\n            return;\n        }\n\n        $output->writeln('<ws-heading>Parse warnings</ws-heading>');\n\n        $shown = array_slice($report->parseFailures, 0, 10);\n\n        foreach ($shown as $failure) {\n            $output->writeln(sprintf(\n                '  <ws-medium>%s</ws-medium> %s:%d  %s',\n                $failure->fatal ? 'SKIPPED' : 'PARTIAL',\n                self::escape($failure->relativePath),\n                $failure->line,\n                self::escape($failure->message),\n            ));\n        }\n\n        $remaining = count($report->parseFailures) - count($shown);\n\n        if ($remaining > 0) {\n            $output->writeln(sprintf('  <ws-muted>… and %d more.</ws-muted>', $remaining));\n        }\n\n        $output->writeln('');\n    }\n\n    private function writeSummary(ScanReport $report, OutputInterface $output): void\n    {\n        $output->writeln('<ws-heading>Summary</ws-heading>');\n        $output->writeln('');\n\n        foreach (Severity::ordered() as $severity) {\n            $count = $report->counts()[$severity->value];\n            $label = ucfirst($severity->value);\n\n            $output->writeln(sprintf(\n                '  %-9s %s',\n                $label,\n                $count === 0\n                    ? '<ws-muted>0</ws-muted>'\n                    : sprintf('<%s>%d</%s>', $severity->consoleStyle(), $count, $severity->consoleStyle()),\n            ));\n        }\n\n        $output->writeln('');\n\n        if ($report->suppressedCount > 0) {\n            $output->writeln(sprintf(\n                '  <ws-muted>%d finding(s) suppressed by inline directives or config.</ws-muted>',\n                $report->suppressedCount,\n            ));\n        }\n\n        if ($report->baselineFilteredCount > 0) {\n            $output->writeln(sprintf(\n                '  <ws-muted>%d finding(s) ignored by the baseline.</ws-muted>',\n                $report->baselineFilteredCount,\n            ));\n        }\n\n        $partiallyParsed = $this->countFailedFiles($report->parseFailures) - $report->unanalyzedFileCount();\n\n        if ($partiallyParsed > 0) {\n            $output->writeln(sprintf(\n                '  <ws-muted>%d file(s) were analyzed despite a syntax error.</ws-muted>',\n                $partiallyParsed,\n            ));\n        }\n\n        if ($report->isIncomplete()) {\n            $output->writeln(sprintf(\n                '  <ws-medium>%d file(s) were not analyzed at all, so this scan is incomplete.</ws-medium>',\n                $report->unanalyzedFileCount(),\n            ));\n        }\n\n        $output->writeln('');\n\n        if ($report->failed()) {\n            $output->writeln('<ws-fail>Result: FAILED</ws-fail>');\n            $output->writeln('');\n\n            // FAILED is a threshold decision, not a verdict on production. The\n            // two reasons are printed separately because they mean different\n            // things: one is about what was found, the other about what could\n            // not be looked at.\n            if ($report->failedOnSeverity()) {\n                $output->writeln(sprintf(\n                    'Threshold exceeded: %d finding(s) at or above the configured fail_on level (%s).',\n                    $report->failingCount(),\n                    strtoupper(($report->failOn ?? Severity::High)->value),\n                ));\n\n                foreach ($this->wrap(self::THRESHOLD_NOTE) as $line) {\n                    $output->writeln('<ws-muted>' . self::escape($line) . '</ws-muted>');\n                }\n            }\n\n            if ($report->failedOnSeverity() && $report->failedOnIncompleteAnalysis()) {\n                $output->writeln('');\n            }\n\n            if ($report->failedOnIncompleteAnalysis()) {\n                $output->writeln(sprintf(\n                    'Incomplete analysis: %d file(s) could not be analyzed, so the scan cannot vouch for them. '\n                    . 'Fix them, or pass --allow-parse-errors to accept the gap.',\n                    $report->unanalyzedFileCount(),\n                ));\n            }\n        } else {\n            $output->writeln('<ws-pass>Result: PASSED</ws-pass>');\n\n            if ($report->failOn === null) {\n                $output->writeln('');\n                $output->writeln('<ws-muted>No failure threshold configured (fail_on: never).</ws-muted>');\n            }\n        }\n\n        $output->writeln('');\n    }\n\n    /**\n     * @param list<ParseFailure> $failures\n     */\n    private function countFailedFiles(array $failures): int\n    {\n        $paths = [];\n\n        foreach ($failures as $failure) {\n            $paths[$failure->relativePath] = true;\n        }\n\n        return count($paths);\n    }\n\n    /**\n     * Console output is written through the Symfony formatter, so any text\n     * coming from the analyzed source has to be escaped or a `<` in the code\n     * snippet would be parsed as a style tag.\n     */\n    private static function escape(string $text): string\n    {\n        return OutputFormatter::escape($text);\n    }\n\n    /**\n     * @return list<string>\n     */\n    private function wrap(string $text, string $indent = ''): array\n    {\n        $wrapped = wordwrap($text, self::WIDTH - strlen($indent), \"\\n\", false);\n\n        return array_map(\n            static fn (string $line): string => $indent . $line,\n            explode(\"\\n\", $wrapped),\n        );\n    }\n}\n","src/Reporting/ConsoleStyles.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Reporting;\n\nuse Symfony\\Component\\Console\\Formatter\\OutputFormatterStyle;\nuse Symfony\\Component\\Console\\Output\\OutputInterface;\nuse WorkerSafety\\Finding\\Severity;\n\n/**\n * Registers the severity colours used by the console reporter.\n *\n * With `--no-ansi` Symfony strips the tags, so the same code produces plain\n * text without any branching here.\n */\nfinal class ConsoleStyles\n{\n    private function __construct()\n    {\n    }\n\n    public static function register(OutputInterface $output): void\n    {\n        $formatter = $output->getFormatter();\n\n        $styles = [\n            Severity::Critical->consoleStyle() => new OutputFormatterStyle('white', 'red', ['bold']),\n            Severity::High->consoleStyle() => new OutputFormatterStyle('red', null, ['bold']),\n            Severity::Medium->consoleStyle() => new OutputFormatterStyle('yellow'),\n            Severity::Low->consoleStyle() => new OutputFormatterStyle('cyan'),\n            Severity::Info->consoleStyle() => new OutputFormatterStyle('gray'),\n            'ws-heading' => new OutputFormatterStyle(null, null, ['bold']),\n            'ws-muted' => new OutputFormatterStyle('gray'),\n            'ws-rule' => new OutputFormatterStyle('blue'),\n            'ws-pass' => new OutputFormatterStyle('green', null, ['bold']),\n            'ws-fail' => new OutputFormatterStyle('red', null, ['bold']),\n            'ws-code' => new OutputFormatterStyle('white'),\n        ];\n\n        foreach ($styles as $name => $style) {\n            $formatter->setStyle($name, $style);\n        }\n    }\n}\n","src/Reporting/JsonReporter.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Reporting;\n\nuse Symfony\\Component\\Console\\Output\\OutputInterface;\nuse WorkerSafety\\Application\\ApplicationInfo;\nuse WorkerSafety\\Finding\\Finding;\nuse WorkerSafety\\Finding\\Severity;\n\n/**\n * Stable machine-readable report.\n *\n * The `version` field is the schema version and is bumped only on a breaking\n * change, so tooling can rely on it independently of the tool version. Fields\n * are only ever added within a version, never renamed or removed.\n */\nfinal class JsonReporter implements Reporter\n{\n    public const SCHEMA_VERSION = '1';\n\n    public function report(ScanReport $report, OutputInterface $output): void\n    {\n        $output->writeln($this->encode($report));\n    }\n\n    public function encode(ScanReport $report): string\n    {\n        return (string) json_encode(\n            $this->toArray($report),\n            JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR,\n        );\n    }\n\n    /**\n     * @return array<string, mixed>\n     */\n    public function toArray(ScanReport $report): array\n    {\n        $counts = $report->counts();\n\n        return [\n            'version' => self::SCHEMA_VERSION,\n            'tool' => [\n                'name' => ApplicationInfo::NAME,\n                'package' => ApplicationInfo::PACKAGE,\n                'version' => $report->toolVersion,\n            ],\n            'project' => [\n                'root' => $report->projectRoot,\n                'paths' => $report->scannedPaths,\n                'framework' => [\n                    'name' => $report->framework->identifier(),\n                    'version' => $report->framework->version,\n                ],\n                // Selected with --runtime, never detected. `runtimes` is kept\n                // under its original name so existing consumers and baselines\n                // are unaffected; `analysis_targets` is the name that says\n                // what the value actually is.\n                'runtimes' => $report->runtimes->values(),\n                'analysis_targets' => $report->runtimes->values(),\n                'runtime_detected' => false,\n                'php' => $report->phpVersion,\n                'config' => $report->configPath,\n                'baseline' => $report->baselinePath,\n            ],\n            'summary' => [\n                'files' => $report->filesScanned,\n                'duration_seconds' => round($report->durationSeconds, 4),\n                'total' => $report->findings->count(),\n                'critical' => $counts[Severity::Critical->value],\n                'high' => $counts[Severity::High->value],\n                'medium' => $counts[Severity::Medium->value],\n                'low' => $counts[Severity::Low->value],\n                'info' => $counts[Severity::Info->value],\n                'suppressed' => $report->suppressedCount,\n                'baseline_filtered' => $report->baselineFilteredCount,\n                'parse_errors' => $report->parseFailureCount(),\n                'files_not_analyzed' => $report->unanalyzedFileCount(),\n                'incomplete' => $report->isIncomplete(),\n                'fail_on' => $report->failOn?->value,\n                'fail_on_parse_error' => $report->failOnParseError,\n                'failed' => $report->failed(),\n                'failed_on_severity' => $report->failedOnSeverity(),\n                'failed_on_incomplete_analysis' => $report->failedOnIncompleteAnalysis(),\n                'by_rule' => $report->findings->countsByRule(),\n            ],\n            'findings' => array_map(\n                fn (Finding $finding): array => $this->finding($finding),\n                $report->findings->toArray(),\n            ),\n            'parse_errors' => array_map(\n                static fn (\\WorkerSafety\\Ast\\ParseFailure $failure): array => [\n                    'file' => $failure->relativePath,\n                    'line' => $failure->line,\n                    'message' => $failure->message,\n                    'skipped' => $failure->fatal,\n                ],\n                $report->parseFailures,\n            ),\n        ];\n    }\n\n    /**\n     * @return array<string, mixed>\n     */\n    private function finding(Finding $finding): array\n    {\n        return [\n            'rule' => $finding->ruleId,\n            'title' => $finding->title,\n            'severity' => $finding->severity->value,\n            'category' => $finding->category->value,\n            'file' => $finding->location->relativePath,\n            'line' => $finding->location->line,\n            'column' => $finding->location->column,\n            'end_line' => $finding->location->endLine,\n            'message' => $finding->message,\n            'details' => $finding->details,\n            'remediation' => $finding->remediation,\n            'snippet' => $finding->snippet,\n            'symbol' => $finding->symbol->toArray(),\n            'runtimes' => $finding->runtimes->values(),\n            'framework' => $finding->framework,\n            'fingerprint' => $finding->fingerprint(),\n        ];\n    }\n}\n","src/Reporting/OutputFormat.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Reporting;\n\nuse WorkerSafety\\Exception\\ConfigurationException;\n\nenum OutputFormat: string\n{\n    case Console = 'console';\n    case Json = 'json';\n    case Sarif = 'sarif';\n\n    /**\n     * True when stdout must contain nothing but the report itself.\n     */\n    public function isMachineReadable(): bool\n    {\n        return $this !== self::Console;\n    }\n\n    public static function fromString(string $value): self\n    {\n        $format = self::tryFrom(strtolower(trim($value)));\n\n        if (!$format instanceof self) {\n            throw ConfigurationException::invalidValue(\n                'format',\n                sprintf('\"%s\" is not one of %s.', $value, implode(', ', self::names())),\n            );\n        }\n\n        return $format;\n    }\n\n    /**\n     * @return list<string>\n     */\n    public static function names(): array\n    {\n        return array_map(static fn (self $case): string => $case->value, self::cases());\n    }\n}\n","src/Reporting/Reporter.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Reporting;\n\nuse Symfony\\Component\\Console\\Output\\OutputInterface;\n\n/**\n * Renders a scan report.\n */\ninterface Reporter\n{\n    public function report(ScanReport $report, OutputInterface $output): void;\n}\n","src/Reporting/ReporterFactory.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Reporting;\n\nuse WorkerSafety\\Rule\\RuleRegistry;\n\n/**\n * Maps an output format to its reporter.\n */\nfinal class ReporterFactory\n{\n    public function __construct(private readonly ?RuleRegistry $registry = null)\n    {\n    }\n\n    public function create(OutputFormat $format): Reporter\n    {\n        return match ($format) {\n            OutputFormat::Console => new ConsoleReporter(),\n            OutputFormat::Json => new JsonReporter(),\n            OutputFormat::Sarif => new SarifReporter($this->registry),\n        };\n    }\n}\n","src/Reporting/SarifReporter.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Reporting;\n\nuse Symfony\\Component\\Console\\Output\\OutputInterface;\nuse WorkerSafety\\Application\\ApplicationInfo;\nuse WorkerSafety\\Finding\\Finding;\nuse WorkerSafety\\Rule\\Rule;\nuse WorkerSafety\\Rule\\RuleRegistry;\n\n/**\n * SARIF 2.1.0 output for GitHub code scanning.\n *\n * Every rule the scan could have produced is described in `tool.driver.rules`,\n * so GitHub can show the rule help even for rules with no results, and each\n * result carries a line-independent `partialFingerprints` entry so that code\n * scanning can track a finding across commits.\n */\nfinal class SarifReporter implements Reporter\n{\n    private const SCHEMA = 'https://raw.githubusercontent.com/oasis-tcs/sarif-spec/master/Schemata/sarif-schema-2.1.0.json';\n\n    public function __construct(private readonly ?RuleRegistry $registry = null)\n    {\n    }\n\n    public function report(ScanReport $report, OutputInterface $output): void\n    {\n        $output->writeln($this->encode($report));\n    }\n\n    public function encode(ScanReport $report): string\n    {\n        return (string) json_encode(\n            $this->toArray($report),\n            JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR,\n        );\n    }\n\n    /**\n     * @return array<string, mixed>\n     */\n    public function toArray(ScanReport $report): array\n    {\n        $rules = $this->rules();\n        $ruleIndex = [];\n\n        foreach ($rules as $index => $rule) {\n            $id = $rule['id'];\n\n            if (is_string($id)) {\n                $ruleIndex[$id] = $index;\n            }\n        }\n\n        return [\n            '$schema' => self::SCHEMA,\n            'version' => '2.1.0',\n            'runs' => [\n                [\n                    'tool' => [\n                        'driver' => [\n                            'name' => ApplicationInfo::NAME,\n                            'semanticVersion' => $report->toolVersion,\n                            'version' => $report->toolVersion,\n                            'informationUri' => ApplicationInfo::HOMEPAGE,\n                            'rules' => $rules,\n                        ],\n                    ],\n                    'originalUriBaseIds' => [\n                        'SRCROOT' => ['uri' => $this->directoryUri($report->projectRoot)],\n                    ],\n                    'invocations' => [\n                        [\n                            // False whenever a file could not be analyzed: a\n                            // consumer must be able to tell a complete run from\n                            // a partial one.\n                            'executionSuccessful' => !$report->isIncomplete(),\n                            'toolExecutionNotifications' => $this->notifications($report),\n                        ],\n                    ],\n                    'results' => array_map(\n                        fn (Finding $finding): array => $this->result($finding, $ruleIndex),\n                        $report->findings->toArray(),\n                    ),\n                ],\n            ],\n        ];\n    }\n\n    /**\n     * @return list<array<string, mixed>>\n     */\n    private function rules(): array\n    {\n        if (!$this->registry instanceof RuleRegistry) {\n            return [];\n        }\n\n        return array_map(\n            static function (Rule $rule): array {\n                $definition = $rule->definition();\n\n                $help = $definition->description;\n\n                if ($definition->remediation !== []) {\n                    $help .= \"\\n\\nHow to fix:\\n- \" . implode(\"\\n- \", $definition->remediation);\n                }\n\n                $tags = ['worker-safety', $definition->category->value];\n\n                foreach ($definition->runtimes as $runtime) {\n                    $tags[] = 'runtime:' . $runtime->value;\n                }\n\n                if ($definition->requiresFramework !== null) {\n                    $tags[] = 'framework:' . $definition->requiresFramework;\n                }\n\n                return [\n                    'id' => $definition->id,\n                    'name' => str_replace(' ', '', ucwords($definition->title)),\n                    'shortDescription' => ['text' => $definition->title],\n                    'fullDescription' => ['text' => $definition->description],\n                    'help' => ['text' => $help, 'markdown' => $help],\n                    'defaultConfiguration' => ['level' => $definition->defaultSeverity->sarifLevel()],\n                    'properties' => [\n                        'tags' => $tags,\n                        'category' => $definition->category->value,\n                        'defaultSeverity' => $definition->defaultSeverity->value,\n                        'problem' => ['severity' => $definition->defaultSeverity->value],\n                    ],\n                ];\n            },\n            $this->registry->all(),\n        );\n    }\n\n    /**\n     * @param array<string, int> $ruleIndex\n     *\n     * @return array<string, mixed>\n     */\n    private function result(Finding $finding, array $ruleIndex): array\n    {\n        $region = ['startLine' => max(1, $finding->location->line)];\n\n        if ($finding->location->column !== null) {\n            $region['startColumn'] = max(1, $finding->location->column);\n        }\n\n        if ($finding->snippet !== null) {\n            $region['snippet'] = ['text' => $finding->snippet];\n        }\n\n        $result = [\n            'ruleId' => $finding->ruleId,\n            'level' => $finding->severity->sarifLevel(),\n            'message' => ['text' => $this->message($finding)],\n            'locations' => [\n                [\n                    'physicalLocation' => [\n                        'artifactLocation' => [\n                            'uri' => self::encodePath($finding->location->relativePath),\n                            'uriBaseId' => 'SRCROOT',\n                        ],\n                        'region' => $region,\n                    ],\n                ],\n            ],\n            'partialFingerprints' => [\n                'workerSafetyFingerprint/v1' => $finding->fingerprint(),\n            ],\n            'properties' => [\n                'severity' => $finding->severity->value,\n                'category' => $finding->category->value,\n                'runtimes' => $finding->runtimes->values(),\n            ],\n        ];\n\n        if (isset($ruleIndex[$finding->ruleId])) {\n            $result['ruleIndex'] = $ruleIndex[$finding->ruleId];\n        }\n\n        return $result;\n    }\n\n    private function message(Finding $finding): string\n    {\n        $message = $finding->message;\n\n        if ($finding->details !== null) {\n            $message .= ' ' . $finding->details;\n        }\n\n        if ($finding->remediation !== []) {\n            $message .= ' Fix: ' . $finding->remediation[0];\n        }\n\n        return $message;\n    }\n\n    /**\n     * Parse failures are reported as tool notifications rather than results,\n     * which is what SARIF consumers expect for \"could not analyze this file\".\n     *\n     * @return list<array<string, mixed>>\n     */\n    private function notifications(ScanReport $report): array\n    {\n        return array_map(\n            static fn (\\WorkerSafety\\Ast\\ParseFailure $failure): array => [\n                'level' => $failure->fatal ? 'error' : 'warning',\n                'message' => ['text' => sprintf('Could not parse %s: %s', $failure->relativePath, $failure->message)],\n                'locations' => [\n                    [\n                        'physicalLocation' => [\n                            'artifactLocation' => [\n                                'uri' => self::encodePath($failure->relativePath),\n                                'uriBaseId' => 'SRCROOT',\n                            ],\n                            'region' => ['startLine' => max(1, $failure->line)],\n                        ],\n                    ],\n                ],\n            ],\n            $report->parseFailures,\n        );\n    }\n\n    /**\n     * Percent-encode a relative path for use as a SARIF artifact URI.\n     *\n     * Path separators stay literal; everything else is escaped, so a file named\n     * `path #1.php` cannot turn its `#` into a URI fragment delimiter.\n     */\n    private static function encodePath(string $relative): string\n    {\n        $segments = explode('/', str_replace('\\\\', '/', $relative));\n\n        return implode('/', array_map(static fn (string $segment): string => rawurlencode($segment), $segments));\n    }\n\n    private function directoryUri(string $path): string\n    {\n        $normalized = rtrim(str_replace('\\\\', '/', $path), '/');\n        $prefix = '';\n\n        // Keep a Windows drive letter readable: `C:` must not become `C%3A`.\n        if (preg_match('#^([a-zA-Z]:)(/.*)?$#', $normalized, $matches) === 1) {\n            $prefix = '/' . $matches[1];\n            $normalized = $matches[2] ?? '';\n        }\n\n        return 'file://' . $prefix . self::encodePath($normalized) . '/';\n    }\n}\n","src/Reporting/ScanReport.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Reporting;\n\nuse WorkerSafety\\Application\\ApplicationInfo;\nuse WorkerSafety\\Application\\ExitCode;\nuse WorkerSafety\\Ast\\ParseFailure;\nuse WorkerSafety\\Finding\\FindingCollection;\nuse WorkerSafety\\Finding\\Severity;\nuse WorkerSafety\\Framework\\DetectedFramework;\nuse WorkerSafety\\Runtime\\RuntimeTargetSet;\n\n/**\n * Everything the reporters need, and nothing about how it is rendered.\n */\nfinal class ScanReport\n{\n    /**\n     * @param list<ParseFailure> $parseFailures\n     * @param list<string> $scannedPaths project-relative\n     */\n    public function __construct(\n        public readonly string $projectRoot,\n        public readonly DetectedFramework $framework,\n        public readonly RuntimeTargetSet $runtimes,\n        public readonly FindingCollection $findings,\n        public readonly int $filesScanned,\n        public readonly array $parseFailures,\n        public readonly int $suppressedCount,\n        public readonly int $baselineFilteredCount,\n        public readonly float $durationSeconds,\n        public readonly ?Severity $failOn,\n        public readonly ?string $configPath,\n        public readonly ?string $baselinePath,\n        public readonly array $scannedPaths = [],\n        public readonly string $phpVersion = PHP_VERSION,\n        public readonly string $toolVersion = ApplicationInfo::VERSION,\n        public readonly bool $failOnParseError = true,\n    ) {\n    }\n\n    /**\n     * @return array<string, int>\n     */\n    public function counts(): array\n    {\n        return $this->findings->countsBySeverity();\n    }\n\n    /**\n     * True when at least one file could not be analyzed at all.\n     *\n     * A scan that skipped files is not evidence of safety, so it is tracked\n     * separately from the severity threshold.\n     */\n    public function isIncomplete(): bool\n    {\n        return $this->unanalyzedFiles() !== [];\n    }\n\n    /**\n     * Project-relative paths of the files that produced no usable AST.\n     *\n     * @return list<string>\n     */\n    public function unanalyzedFiles(): array\n    {\n        $paths = [];\n\n        foreach ($this->parseFailures as $failure) {\n            if ($failure->fatal) {\n                $paths[$failure->relativePath] = true;\n            }\n        }\n\n        return array_keys($paths);\n    }\n\n    public function unanalyzedFileCount(): int\n    {\n        return count($this->unanalyzedFiles());\n    }\n\n    public function failedOnSeverity(): bool\n    {\n        return $this->failOn instanceof Severity && $this->findings->hasSeverityAtLeast($this->failOn);\n    }\n\n    public function failedOnIncompleteAnalysis(): bool\n    {\n        return $this->failOnParseError && $this->isIncomplete();\n    }\n\n    public function failed(): bool\n    {\n        return $this->failedOnSeverity() || $this->failedOnIncompleteAnalysis();\n    }\n\n    public function exitCode(): ExitCode\n    {\n        return $this->failed() ? ExitCode::FindingsAboveThreshold : ExitCode::Success;\n    }\n\n    public function parseFailureCount(): int\n    {\n        return count($this->parseFailures);\n    }\n\n    /**\n     * Number of findings at or above the failure threshold.\n     */\n    public function failingCount(): int\n    {\n        if (!$this->failOn instanceof Severity) {\n            return 0;\n        }\n\n        return $this->findings->withSeverityAtLeast($this->failOn)->count();\n    }\n}\n","src/Rule/AbstractRule.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Rule;\n\nuse PhpParser\\Node;\nuse WorkerSafety\\Finding\\Finding;\nuse WorkerSafety\\Finding\\Location;\nuse WorkerSafety\\Finding\\Severity;\nuse WorkerSafety\\Finding\\SymbolContext;\n\n/**\n * Convenience base class: no-op lifecycle hooks plus a finding factory that\n * fills in the rule metadata and the applicable runtimes.\n */\nabstract class AbstractRule implements Rule\n{\n    /**\n     * @return list<class-string<Node>>\n     */\n    public function nodeTypes(): array\n    {\n        return [];\n    }\n\n    public function beginFile(RuleContext $context): void\n    {\n    }\n\n    /**\n     * @return iterable<Finding>\n     */\n    public function enterNode(Node $node, RuleContext $context): iterable\n    {\n        return [];\n    }\n\n    /**\n     * @return iterable<Finding>\n     */\n    public function finishFile(RuleContext $context): iterable\n    {\n        return [];\n    }\n\n    /**\n     * @return iterable<Finding>\n     */\n    public function finishProject(ProjectContext $context): iterable\n    {\n        return [];\n    }\n\n    /**\n     * @param list<string>|null $remediation overrides the rule default\n     */\n    protected function finding(\n        ReportingContext $context,\n        Location $location,\n        string $message,\n        ?string $details = null,\n        ?Severity $severity = null,\n        ?SymbolContext $symbol = null,\n        ?string $snippet = null,\n        ?array $remediation = null,\n        ?string $excerpt = null,\n    ): Finding {\n        $definition = $this->definition();\n\n        return new Finding(\n            $definition->id,\n            $definition->title,\n            $severity ?? $definition->defaultSeverity,\n            $definition->category,\n            $location,\n            $message,\n            $details,\n            $remediation ?? $definition->remediation,\n            $symbol ?? new SymbolContext(),\n            $snippet,\n            $context->runtimes()->intersect($definition->runtimes),\n            $context->framework()->findingLabel(),\n            $excerpt,\n        );\n    }\n}\n","src/Rule/BuiltIn/MutableGlobalVariableRule.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Rule\\BuiltIn;\n\nuse PhpParser\\Node;\nuse PhpParser\\Node\\Expr;\nuse PhpParser\\Node\\Stmt;\nuse WorkerSafety\\Ast\\AstHelper;\nuse WorkerSafety\\Ast\\Visitor\\VariableWriteFinder;\nuse WorkerSafety\\Finding\\Location;\nuse WorkerSafety\\Finding\\RuleCategory;\nuse WorkerSafety\\Finding\\Severity;\nuse WorkerSafety\\Finding\\SymbolContext;\nuse WorkerSafety\\Rule\\AbstractRule;\nuse WorkerSafety\\Rule\\RuleContext;\nuse WorkerSafety\\Rule\\RuleDefinition;\nuse WorkerSafety\\Rule\\RuleId;\nuse WorkerSafety\\Runtime\\RuntimeTargetSet;\n\n/**\n * WS002 — developer-controlled global state.\n *\n * Reading a superglobal is perfectly normal and never reported. What the rule\n * looks for is state the application itself puts into the global scope, plus\n * writes to the request superglobals, which persist for the rest of the worker\n * loop under every supported runtime.\n */\nfinal class MutableGlobalVariableRule extends AbstractRule\n{\n    /**\n     * Superglobals whose *mutation* changes what later requests observe.\n     *\n     * `$_ENV` and `$_SERVER` are handled by WS003, `$_SESSION` is excluded\n     * because writing to it is the documented way to use PHP sessions.\n     *\n     * @var list<string>\n     */\n    private const REQUEST_SUPERGLOBALS = ['_GET', '_POST', '_REQUEST', '_COOKIE', '_FILES'];\n\n    /**\n     * @var array<string, array{location: Location, severity: Severity, message: string, details: string, symbol: SymbolContext, snippet: string|null, excerpt: string|null, count: int}>\n     */\n    private array $pending = [];\n\n    public function definition(): RuleDefinition\n    {\n        return new RuleDefinition(\n            RuleId::MUTABLE_GLOBAL_VARIABLE,\n            'Mutable global variable',\n            'Variables in the global scope, including entries the application writes into $GLOBALS or into the request superglobals, are owned by the PHP process rather than by the request.',\n            Severity::High,\n            RuleCategory::GlobalState,\n            [\n                'Pass the value explicitly, or resolve it from a request-scoped service.',\n                'If a process-wide value is genuinely needed, expose it through an immutable object built once at boot.',\n                'Never write application state into $GLOBALS or into the request superglobals.',\n            ],\n            RuntimeTargetSet::all(),\n        );\n    }\n\n    public function nodeTypes(): array\n    {\n        return [\n            Stmt\\Global_::class,\n            Expr\\Assign::class,\n            Expr\\AssignRef::class,\n            Expr\\AssignOp::class,\n            Expr\\PreInc::class,\n            Expr\\PostInc::class,\n            Expr\\PreDec::class,\n            Expr\\PostDec::class,\n        ];\n    }\n\n    public function beginFile(RuleContext $context): void\n    {\n        $this->pending = [];\n    }\n\n    public function enterNode(Node $node, RuleContext $context): iterable\n    {\n        if ($node instanceof Stmt\\Global_) {\n            $this->collectGlobalDeclaration($node, $context);\n\n            return [];\n        }\n\n        $target = match (true) {\n            $node instanceof Expr\\Assign,\n            $node instanceof Expr\\AssignRef,\n            $node instanceof Expr\\AssignOp => $node->var,\n            $node instanceof Expr\\PreInc,\n            $node instanceof Expr\\PostInc,\n            $node instanceof Expr\\PreDec,\n            $node instanceof Expr\\PostDec => $node->var,\n            default => null,\n        };\n\n        if ($target !== null) {\n            $this->collectWrite($target, $node, $context);\n        }\n\n        return [];\n    }\n\n    public function finishFile(RuleContext $context): iterable\n    {\n        foreach ($this->pending as $entry) {\n            $details = $entry['details'];\n\n            if ($entry['count'] > 1) {\n                $details .= sprintf(' Found %d times in this file; only the first occurrence is reported.', $entry['count']);\n            }\n\n            yield $this->finding(\n                $context,\n                $entry['location'],\n                $entry['message'],\n                $details,\n                $entry['severity'],\n                $entry['symbol'],\n                $entry['snippet'],\n                null,\n                $entry['excerpt'],\n            );\n        }\n\n        $this->pending = [];\n    }\n\n    private function collectGlobalDeclaration(Stmt\\Global_ $node, RuleContext $context): void\n    {\n        $names = [];\n\n        foreach ($node->vars as $var) {\n            if ($var instanceof Expr\\Variable && is_string($var->name)) {\n                $names[] = $var->name;\n            }\n        }\n\n        if ($names === []) {\n            return;\n        }\n\n        $functionNode = $context->scope()->functionNode();\n        $body = $functionNode?->getStmts();\n        $writesLocally = $body !== null && VariableWriteFinder::writesAny(array_values($body), $names);\n\n        foreach ($names as $name) {\n            $this->remember(\n                'global:' . $name,\n                $context->location($node),\n                $writesLocally ? Severity::High : Severity::Medium,\n                sprintf('Global variable $%s is imported with `global` in %s.', $name, $context->scope()->describeLocationScope()),\n                $writesLocally\n                    ? sprintf('$%s lives in the global scope, which is created once per PHP process. Because %s also assigns to it, a value produced while serving one request is still there when the worker picks up the next one.', $name, $context->scope()->describeLocationScope())\n                    : sprintf('$%s lives in the global scope, which is created once per PHP process. Reading it means the behaviour of this request depends on whatever an earlier request left behind.', $name),\n                new SymbolContext($context->scope()->className(), $context->scope()->methodName(), null, $name),\n                $context->snippet($node),\n                $context->excerpt($node),\n            );\n        }\n    }\n\n    private function collectWrite(Expr $target, Node $node, RuleContext $context): void\n    {\n        $base = AstHelper::unwrapArrayDim($target);\n\n        if (!$base instanceof Expr\\Variable || !is_string($base->name)) {\n            return;\n        }\n\n        if ($base->name === 'GLOBALS') {\n            $key = $this->arrayKeyOf($target);\n\n            $this->remember(\n                'globals:' . ($key ?? '*'),\n                $context->location($node),\n                Severity::High,\n                $key !== null\n                    ? sprintf('Application state is written to $GLOBALS[\\'%s\\'].', $key)\n                    : 'Application state is written to $GLOBALS.',\n                sprintf(\n                    '$GLOBALS is the symbol table of the PHP process. Under a persistent worker the entry written here is still set for every later request handled by the same process, so state and lifetime leak between unrelated requests.%s',\n                    $key !== null ? '' : ' The key could not be resolved statically, so the whole array is treated as written.',\n                ),\n                new SymbolContext($context->scope()->className(), $context->scope()->methodName(), null, 'GLOBALS'),\n                $context->snippet($node),\n                $context->excerpt($node),\n            );\n\n            return;\n        }\n\n        if (in_array($base->name, self::REQUEST_SUPERGLOBALS, true)) {\n            $this->remember(\n                'superglobal:' . $base->name,\n                $context->location($node),\n                Severity::Low,\n                sprintf('Request superglobal $%s is rewritten at runtime.', $base->name),\n                sprintf(\n                    'The supported runtimes do rebuild $%s for every request — FrankenPHP documents $_GET, $_POST, $_COOKIE, $_FILES, $_SERVER and $_REQUEST as reset, with $_ENV as the exception — so this is not by itself a cross-request leak. It is reported because rewriting request input in place makes later reads indistinguishable from real input, and because any code that then caches the value in a static or a global does turn it into one.',\n                    $base->name,\n                ),\n                new SymbolContext($context->scope()->className(), $context->scope()->methodName(), null, $base->name),\n                $context->snippet($node),\n                $context->excerpt($node),\n            );\n        }\n    }\n\n    private function arrayKeyOf(Expr $target): ?string\n    {\n        if (!$target instanceof Expr\\ArrayDimFetch || $target->dim === null) {\n            return null;\n        }\n\n        return AstHelper::stringValue($target->dim);\n    }\n\n    /**\n     * Keep the first occurrence per file and count the rest.\n     */\n    private function remember(\n        string $key,\n        Location $location,\n        Severity $severity,\n        string $message,\n        string $details,\n        SymbolContext $symbol,\n        ?string $snippet,\n        ?string $excerpt,\n    ): void {\n        if (isset($this->pending[$key])) {\n            ++$this->pending[$key]['count'];\n\n            // A local assignment discovered later upgrades the severity.\n            if ($severity->rank() > $this->pending[$key]['severity']->rank()) {\n                $this->pending[$key]['severity'] = $severity;\n            }\n\n            return;\n        }\n\n        $this->pending[$key] = [\n            'location' => $location,\n            'severity' => $severity,\n            'message' => $message,\n            'details' => $details,\n            'symbol' => $symbol,\n            'snippet' => $snippet,\n            'excerpt' => $excerpt,\n            'count' => 1,\n        ];\n    }\n}\n","src/Rule/BuiltIn/MutableSingletonRule.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Rule\\BuiltIn;\n\nuse WorkerSafety\\Ast\\Index\\ClassShape;\nuse WorkerSafety\\Ast\\Index\\MethodShape;\nuse WorkerSafety\\Ast\\Index\\PropertyShape;\nuse WorkerSafety\\Ast\\Index\\SingletonAnalyzer;\nuse WorkerSafety\\Finding\\Finding;\nuse WorkerSafety\\Finding\\RuleCategory;\nuse WorkerSafety\\Finding\\Severity;\nuse WorkerSafety\\Finding\\SymbolContext;\nuse WorkerSafety\\Rule\\AbstractRule;\nuse WorkerSafety\\Rule\\ProjectContext;\nuse WorkerSafety\\Rule\\RuleDefinition;\nuse WorkerSafety\\Rule\\RuleId;\nuse WorkerSafety\\Runtime\\RuntimeTargetSet;\n\n/**\n * WS004 — the classic self-instantiating singleton.\n *\n * The shape is recognised structurally: a static property that can hold an\n * instance of the declaring class, plus a static method of that class which\n * assigns `new self`/`new static` to it.\n *\n * An immutable singleton is reported at a much lower severity than one that\n * carries mutable instance state, because sharing an immutable object between\n * requests is usually intentional and safe.\n */\nfinal class MutableSingletonRule extends AbstractRule\n{\n    public function definition(): RuleDefinition\n    {\n        return new RuleDefinition(\n            RuleId::MUTABLE_SINGLETON,\n            'Mutable singleton',\n            'A singleton is created once and then reused. Under a persistent worker \"once\" means once per worker process, so every request shares the same instance and everything written into it.',\n            Severity::Medium,\n            RuleCategory::Singleton,\n            [\n                'Register the class in your container instead, so its lifetime is controlled by the framework.',\n                'Keep the shared instance immutable: readonly properties set in the constructor only.',\n                'If it must hold per-request values, resolve a fresh instance per request (Laravel: `scoped()`).',\n            ],\n            RuntimeTargetSet::all(),\n        );\n    }\n\n    public function finishProject(ProjectContext $context): iterable\n    {\n        foreach ($context->index()->classes() as $class) {\n            $finding = $this->inspect($class, $context);\n\n            if ($finding instanceof Finding) {\n                yield $finding;\n            }\n        }\n    }\n\n    private function inspect(ClassShape $class, ProjectContext $context): ?Finding\n    {\n        $holder = SingletonAnalyzer::instanceHolder($class);\n\n        if (!$holder instanceof PropertyShape) {\n            return null;\n        }\n\n        $mutable = $class->mutableInstanceProperties();\n\n        if ($mutable === []) {\n            return $this->finding(\n                $context,\n                $holder->location,\n                sprintf('Singleton %s is shared by every request the worker handles.', $class->shortName),\n                sprintf(\n                    '%s instantiates itself into a static property, so exactly one instance exists per worker process rather than per request. No mutable instance state was found, which makes this low risk today, but any property added later is immediately shared across requests.',\n                    $class->shortName,\n                ),\n                Severity::Low,\n                new SymbolContext($class->name, null, $holder->name),\n                $holder->snippet,\n                null,\n                $holder->excerpt,\n            );\n        }\n\n        $names = array_map(static fn (PropertyShape $p): string => '$' . $p->name, $mutable);\n        $requestScoped = array_values(array_filter(\n            $mutable,\n            static fn (PropertyShape $p): bool => $p->looksRequestScoped(),\n        ));\n\n        return $this->finding(\n            $context,\n            $holder->location,\n            sprintf(\n                'Singleton %s carries mutable instance state (%s).',\n                $class->shortName,\n                implode(', ', array_slice($names, 0, 4)) . (count($names) > 4 ? ', …' : ''),\n            ),\n            $this->explain($class, $mutable, $requestScoped),\n            Severity::High,\n            new SymbolContext($class->name, null, $holder->name),\n            $holder->snippet,\n            $requestScoped !== [] ? $this->requestScopedRemediation() : null,\n            $holder->excerpt,\n        );\n    }\n\n    /**\n     * @param list<PropertyShape> $mutable\n     * @param list<PropertyShape> $requestScoped\n     */\n    private function explain(ClassShape $class, array $mutable, array $requestScoped): string\n    {\n        $explanation = sprintf(\n            '%s creates itself once per worker process and keeps %d mutable instance %s. Anything a request writes into the instance is still there for the next request handled by the same worker.',\n            $class->shortName,\n            count($mutable),\n            count($mutable) === 1 ? 'property' : 'properties',\n        );\n\n        if ($requestScoped !== []) {\n            $tokens = [];\n\n            foreach ($requestScoped as $property) {\n                foreach ($property->requestTokens() as $token) {\n                    if (!in_array($token, $tokens, true)) {\n                        $tokens[] = $token;\n                    }\n                }\n            }\n\n            $explanation .= sprintf(\n                ' $%s reads as request-specific state (%s), which makes cross-request leakage likely rather than theoretical.',\n                $requestScoped[0]->name,\n                implode(', ', $tokens),\n            );\n        }\n\n        if ($class->hasResetMethod()) {\n            $names = array_map(\n                static fn (MethodShape $m): string => $m->name . '()',\n                $class->resetMethods(),\n            );\n\n            $explanation .= sprintf(\n                ' The class exposes %s, so a release path exists — make sure it runs on every request.',\n                implode(', ', $names),\n            );\n        }\n\n        return $explanation;\n    }\n\n    /**\n     * @return list<string>\n     */\n    private function requestScopedRemediation(): array\n    {\n        return [\n            'Do not keep request-specific values in a singleton: pass them as arguments or resolve them per request.',\n            'Laravel: replace the singleton with a `scoped()` binding so the container discards it between requests.',\n            'FrankenPHP/RoadRunner/Swoole: build the object inside the request handler instead of caching it statically.',\n        ];\n    }\n}\n","src/Rule/BuiltIn/MutableStaticPropertyRule.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Rule\\BuiltIn;\n\nuse WorkerSafety\\Application\\ApplicationInfo;\nuse WorkerSafety\\Ast\\Index\\ClassShape;\nuse WorkerSafety\\Ast\\Index\\PropertyShape;\nuse WorkerSafety\\Ast\\Index\\SingletonAnalyzer;\nuse WorkerSafety\\Ast\\Index\\StateWrite;\nuse WorkerSafety\\Finding\\Finding;\nuse WorkerSafety\\Finding\\RuleCategory;\nuse WorkerSafety\\Finding\\Severity;\nuse WorkerSafety\\Finding\\SymbolContext;\nuse WorkerSafety\\Rule\\AbstractRule;\nuse WorkerSafety\\Rule\\ProjectContext;\nuse WorkerSafety\\Rule\\RuleDefinition;\nuse WorkerSafety\\Rule\\RuleId;\nuse WorkerSafety\\Runtime\\RuntimeTargetSet;\n\n/**\n * WS001 — a static property that is written at runtime.\n *\n * Runs after the whole project has been indexed so that writes performed from\n * another file (`Registry::$items[] = …`) still count, and so that a property\n * which is never written anywhere is not reported as mutable.\n */\nfinal class MutableStaticPropertyRule extends AbstractRule\n{\n    public function definition(): RuleDefinition\n    {\n        return new RuleDefinition(\n            RuleId::MUTABLE_STATIC_PROPERTY,\n            'Mutable static property',\n            'Static properties are bound to the PHP process, not to the request. Under a persistent worker any value written during one request stays visible to every later request served by the same worker. Singleton instance holders are reported by WS004 instead.',\n            Severity::High,\n            RuleCategory::StaticState,\n            [\n                'Move the value into a request-scoped service and inject it where it is needed.',\n                'If the value really is shared, make it immutable: a constant, a readonly instance property or a value object.',\n                'Otherwise reset the property explicitly at the start or the end of every request.',\n            ],\n            RuntimeTargetSet::all(),\n        );\n    }\n\n    public function finishProject(ProjectContext $context): iterable\n    {\n        foreach ($context->index()->classes() as $class) {\n            foreach ($class->staticProperties as $property) {\n                $finding = $this->inspect($property, $class, $context);\n\n                if ($finding instanceof Finding) {\n                    yield $finding;\n                }\n            }\n        }\n    }\n\n    private function inspect(PropertyShape $property, ClassShape $class, ProjectContext $context): ?Finding\n    {\n        // The singleton instance holder is WS004's territory: reporting it here\n        // as well would put two different severities on the same line.\n        if (SingletonAnalyzer::isInstanceHolder($class, $property)) {\n            return null;\n        }\n\n        $writes = $context->index()->writesForProperty($property);\n\n        if ($writes === []) {\n            return $this->inspectUnwritten($property, $class, $context);\n        }\n\n        $mutating = array_values(array_filter($writes, static fn (StateWrite $w): bool => !$w->isClearing()));\n\n        if ($mutating === []) {\n            // Only ever emptied — the property cannot accumulate, but something\n            // outside the analyzed sources must be filling it.\n            return $this->finding(\n                $context,\n                $property->location,\n                sprintf('Static property $%s is only ever cleared, never assigned in the analyzed paths.', $property->name),\n                sprintf(\n                    'The reset path exists, but %s is a process-wide slot: whatever fills it (a facade, a trait or code outside the scanned paths) leaks into later requests until the reset runs.',\n                    $this->describe($class, $property),\n                ),\n                Severity::Low,\n                new SymbolContext($class->name, null, $property->name),\n                $property->snippet,\n                null,\n                $property->excerpt,\n            );\n        }\n\n        $hasResetPath = $this->hasResetPath($writes, $class);\n        $first = $mutating[0];\n        $accumulatorOnly = $this->isAccumulatorOnly($mutating);\n        $conditional = $this->onlyConditionalAssignments($mutating);\n\n        return $this->finding(\n            $context,\n            $property->location,\n            $conditional\n                ? sprintf(\n                    'Static property $%s is initialized with `??=`, so a stored value is reused by later requests.',\n                    $property->name,\n                )\n                : sprintf('Mutable static property $%s may persist between requests.', $property->name),\n            $conditional\n                ? $this->explainConditionalInitialization($class, $property, $first)\n                : $this->explain($class, $property, $first, $hasResetPath, $accumulatorOnly),\n            $this->severityFor($hasResetPath, $accumulatorOnly),\n            new SymbolContext($class->name, null, $property->name),\n            $property->snippet,\n            match (true) {\n                $conditional => $this->conditionalInitializationRemediation(),\n                $hasResetPath => $this->resetRemediation(),\n                default => null,\n            },\n            $property->excerpt,\n        );\n    }\n\n    private function inspectUnwritten(PropertyShape $property, ClassShape $class, ProjectContext $context): ?Finding\n    {\n        // A scalar property holding a literal is configuration, not state.\n        if ($property->looksLikeConfiguration()) {\n            return null;\n        }\n\n        // Nothing in the analyzed sources writes it and nothing outside can:\n        // there is no reachable mutation to warn about.\n        if (!$property->isPublic()) {\n            return null;\n        }\n\n        return $this->finding(\n            $context,\n            $property->location,\n            sprintf('Public static property $%s is writable from anywhere and would persist between requests.', $property->name),\n            sprintf(\n                'No assignment to %s was found in the analyzed paths, but a public static property can be written by any caller — including code outside those paths — and the value would then survive for the lifetime of the worker.',\n                $this->describe($class, $property),\n            ),\n            Severity::Medium,\n            new SymbolContext($class->name, null, $property->name),\n            $property->snippet,\n            null,\n            $property->excerpt,\n        );\n    }\n\n    /**\n     * @param list<StateWrite> $writes\n     */\n    private function hasResetPath(array $writes, ClassShape $class): bool\n    {\n        foreach ($writes as $write) {\n            if ($write->isClearing() && $write->inResetMethod) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n\n    /**\n     * A property that is only ever appended to is a shared cache. That is a\n     * real cross-request risk, but a milder one than a slot whose whole value\n     * is replaced per request, and WS008 tells the memory side of the story.\n     *\n     * @param list<StateWrite> $mutating\n     */\n    private function isAccumulatorOnly(array $mutating): bool\n    {\n        foreach ($mutating as $write) {\n            if (!$write->isGrowth()) {\n                return false;\n            }\n        }\n\n        return $mutating !== [];\n    }\n\n    /**\n     * True when every assignment to the property writes only into an empty slot.\n     *\n     * Worth telling apart from a slot that is overwritten per request, but it\n     * is a fact about the assignments and nothing more. In particular it does\n     * not establish that the initializer runs once — see\n     * explainConditionalInitialization() — and it does not change the severity.\n     *\n     * Clearing writes are excluded by the caller, so a property that is also\n     * reset somewhere still qualifies. That is why the wording talks about\n     * reuse \"until something resets or replaces it\" rather than about a value\n     * that is computed once.\n     *\n     * @param list<StateWrite> $mutating\n     */\n    private function onlyConditionalAssignments(array $mutating): bool\n    {\n        foreach ($mutating as $write) {\n            if (!$write->kind->isConditionalAssignment()) {\n                return false;\n            }\n        }\n\n        return $mutating !== [];\n    }\n\n    private function severityFor(bool $hasResetPath, bool $accumulatorOnly): Severity\n    {\n        if ($accumulatorOnly) {\n            return $hasResetPath ? Severity::Low : Severity::Medium;\n        }\n\n        return $hasResetPath ? Severity::Medium : Severity::High;\n    }\n\n    private function explain(\n        ClassShape $class,\n        PropertyShape $property,\n        StateWrite $first,\n        bool $hasResetPath,\n        bool $accumulatorOnly,\n    ): string {\n        $where = $first->inMethod !== null\n            ? sprintf('%s::%s()', $class->name, $first->inMethod)\n            : $first->location->relativePath;\n\n        if ($accumulatorOnly) {\n            $explanation = sprintf(\n                '%s accumulates entries at runtime (%s, %s). The array is shared by every request the worker serves, so a value written for one request can be read back by the next one.',\n                $this->describe($class, $property),\n                $where,\n                (string) $first->location,\n            );\n        } else {\n            $explanation = sprintf(\n                '%s is assigned at runtime (%s, %s) and is never bound to a single request. Under a persistent worker the last value written stays readable by the next request served by the same process.',\n                $this->describe($class, $property),\n                $where,\n                (string) $first->location,\n            );\n        }\n\n        if ($hasResetPath) {\n            $explanation .= ' The class does expose a reset path, so the remaining risk is that the reset is not wired into the worker request lifecycle.';\n        }\n\n        return $explanation;\n    }\n\n    /**\n     * What `??=` does establish, and what it does not.\n     *\n     * It establishes that the assignment writes only into an empty slot, so a\n     * value already stored there is reused. It does NOT establish that the\n     * initializer runs once: an initializer that yields null leaves the slot\n     * empty and is evaluated again on the next pass, and any reset — including\n     * one in code that was not scanned — re-opens it. The wording stays inside\n     * that limit.\n     *\n     * It also does not guess whether the reuse is a problem. Separating a\n     * memoized constant from a memoized request value would mean knowing what\n     * every call in the initializer returns, and `Hash::make('password')`,\n     * `request('tenant')` and `auth()->user()` are the same shape to a parser.\n     * So the finding states both outcomes and points at the one thing a reader\n     * can check in a second: where the value comes from.\n     */\n    private function explainConditionalInitialization(\n        ClassShape $class,\n        PropertyShape $property,\n        StateWrite $first,\n    ): string {\n        $where = $first->inMethod !== null\n            ? sprintf('%s::%s()', $class->name, $first->inMethod)\n            : $first->location->relativePath;\n\n        return sprintf(\n            '%s is assigned with `??=` (%s, %s), which writes only while the slot is null or unset. Once a non-null '\n            . 'value is stored there, later requests served by the same worker reuse it instead of recomputing, until '\n            . 'something resets or replaces it. How long that lasts is not determined here: an initializer that '\n            . 'returns null leaves the slot empty and runs again, and a reset elsewhere — including in code outside '\n            . 'the scanned paths — re-opens it. What the reuse costs depends on where the value comes from, which '\n            . 'cannot be read off the syntax: if every input is fixed in the source — the hash of a constant test '\n            . 'password, say — reusing it is deliberate. If any input comes from the request, the session or the '\n            . 'authenticated user, then whichever request stored the value hands it to the requests that follow. '\n            . 'Check the initializer, then silence this finding with `// %s WS001` if the value really is constant.',\n            $this->describe($class, $property),\n            $where,\n            (string) $first->location,\n            ApplicationInfo::IGNORE_MARKER,\n        );\n    }\n\n    /**\n     * @return list<string>\n     */\n    private function conditionalInitializationRemediation(): array\n    {\n        return [\n            'Follow the initializer to its inputs. Anything reaching it from the request, the session, the container or the authenticated user makes the stored value a cross-request leak from whichever request stored it.',\n            'If the value is genuinely fixed, say so where it is written: `// ' . ApplicationInfo::IGNORE_MARKER . ' WS001` documents the decision and keeps the build green, and a baseline entry does the same for a whole set of them.',\n            'If it is not fixed, compute it per request instead — a request-scoped binding, or a local variable passed where it is needed.',\n        ];\n    }\n\n    /**\n     * @return list<string>\n     */\n    private function resetRemediation(): array\n    {\n        return [\n            'Make sure the existing reset method runs on every request, not only on the paths that remember to call it.',\n            'Under Laravel Octane, call it from a RequestReceived or RequestTerminated listener. Note that `octane.flush` will not help: it calls forgetInstance() on container bindings and never touches static properties.',\n            'Prefer moving the value into a request-scoped service so that no reset is needed at all.',\n        ];\n    }\n\n    private function describe(ClassShape $class, PropertyShape $property): string\n    {\n        return $class->shortName . '::$' . $property->name;\n    }\n}\n","src/Rule/BuiltIn/PersistentListenerRegistrationRule.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Rule\\BuiltIn;\n\nuse PhpParser\\Node;\nuse PhpParser\\Node\\Expr;\nuse PhpParser\\Node\\Identifier;\nuse WorkerSafety\\Ast\\AstHelper;\nuse WorkerSafety\\Finding\\Finding;\nuse WorkerSafety\\Finding\\RuleCategory;\nuse WorkerSafety\\Finding\\Severity;\nuse WorkerSafety\\Rule\\AbstractRule;\nuse WorkerSafety\\Rule\\RuleContext;\nuse WorkerSafety\\Rule\\RuleDefinition;\nuse WorkerSafety\\Rule\\RuleId;\nuse WorkerSafety\\Runtime\\RuntimeTargetSet;\nuse WorkerSafety\\Support\\NameHeuristics;\n\n/**\n * WS009 — registration that is meant to happen once, done on a request path.\n *\n * Registrations inside a `*ServiceProvider` are skipped: that is where they\n * belong, and it is the single biggest source of false positives for this\n * pattern. What remains is registration from controllers, middleware, jobs,\n * models and helpers — code that runs again for every request while the\n * registry it appends to lives as long as the worker.\n */\nfinal class PersistentListenerRegistrationRule extends AbstractRule\n{\n    /**\n     * Native functions that append to a process-wide registry.\n     *\n     * @var array<string, string>\n     */\n    private const GLOBAL_REGISTRATION_FUNCTIONS = [\n        'spl_autoload_register' => 'the autoloader stack',\n        'stream_wrapper_register' => 'the stream wrapper registry',\n        'stream_filter_register' => 'the stream filter registry',\n        'register_tick_function' => 'the tick function list',\n        'set_error_handler' => 'the error handler stack',\n        'set_exception_handler' => 'the exception handler slot',\n    ];\n\n    /**\n     * Laravel facades and their registering methods.\n     *\n     * @var array<string, list<string>>\n     */\n    private const LARAVEL_REGISTRATIONS = [\n        'event' => ['listen', 'subscribe', 'push'],\n        'db' => ['listen'],\n        'queue' => ['before', 'after', 'looping', 'failing', 'stopping', 'createPayloadUsing'],\n        'blade' => ['directive', 'component', 'componentNamespace', 'if', 'stringable', 'extend'],\n        'validator' => ['extend', 'extendImplicit', 'replacer', 'extendDependent'],\n        'gate' => ['define', 'policy', 'before', 'after'],\n        'route' => ['macro', 'mixin'],\n        'http' => ['globalMiddleware', 'globalRequestMiddleware', 'globalResponseMiddleware', 'macro'],\n        'relation' => ['morphMap', 'enforceMorphMap'],\n        'model' => ['observe', 'created', 'updated', 'saved', 'deleted', 'creating', 'updating', 'saving', 'deleting', 'retrieved', 'addGlobalScope', 'resolveRelationUsing'],\n        'schema' => ['macro'],\n    ];\n\n    /**\n     * Any class that offers `::macro()` extends a shared, process-wide object.\n     */\n    private const MACRO_METHOD = 'macro';\n\n    /**\n     * Property names that read like a listener registry.\n     *\n     * @var list<string>\n     */\n    private const LISTENER_TOKENS = [\n        'listener',\n        'listeners',\n        'handler',\n        'handlers',\n        'callback',\n        'callbacks',\n        'hook',\n        'hooks',\n        'subscriber',\n        'subscribers',\n        'observer',\n        'observers',\n        'middleware',\n        'extensions',\n        'macros',\n    ];\n\n    public function definition(): RuleDefinition\n    {\n        return new RuleDefinition(\n            RuleId::PERSISTENT_LISTENER_REGISTRATION,\n            'Persistent event/listener registration',\n            'Event listeners, macros and handler callbacks are registered into structures that live for the whole worker process. Registering them while serving a request means the registry grows on every request and listeners from earlier requests keep firing.',\n            Severity::Medium,\n            RuleCategory::EventRegistration,\n            [\n                'Register listeners, macros and handlers once, during boot: a service provider, or the worker bootstrap file.',\n                'If the registration depends on request data, invoke the behaviour directly instead of registering a listener for it.',\n                'Where a per-request listener is unavoidable, remove it again before the request ends.',\n            ],\n            RuntimeTargetSet::all(),\n        );\n    }\n\n    public function nodeTypes(): array\n    {\n        return [\n            Expr\\FuncCall::class,\n            Expr\\StaticCall::class,\n            Expr\\MethodCall::class,\n            Expr\\Assign::class,\n        ];\n    }\n\n    public function enterNode(Node $node, RuleContext $context): iterable\n    {\n        // Service providers are the correct home for registration.\n        if ($this->isInsideServiceProvider($context)) {\n            return [];\n        }\n\n        $finding = match (true) {\n            $node instanceof Expr\\FuncCall => $this->inspectFunctionCall($node, $context),\n            $node instanceof Expr\\StaticCall => $this->inspectStaticCall($node, $context),\n            $node instanceof Expr\\MethodCall => $this->inspectMethodCall($node, $context),\n            $node instanceof Expr\\Assign => $this->inspectListenerAppend($node, $context),\n            default => null,\n        };\n\n        if ($finding instanceof Finding) {\n            yield $finding;\n        }\n    }\n\n    private function inspectFunctionCall(Expr\\FuncCall $node, RuleContext $context): ?Finding\n    {\n        $name = AstHelper::functionName($node);\n\n        if ($name === null || !isset(self::GLOBAL_REGISTRATION_FUNCTIONS[$name])) {\n            return null;\n        }\n\n        return $this->finding(\n            $context,\n            $context->location($node),\n            sprintf('%s() registers into %s from a request path.', $name, self::GLOBAL_REGISTRATION_FUNCTIONS[$name]),\n            sprintf(\n                '%s is process-wide state. Called from %s it runs again for every request the worker serves, so the registration either accumulates or silently replaces what an earlier request installed.',\n                ucfirst(self::GLOBAL_REGISTRATION_FUNCTIONS[$name]),\n                $context->scope()->describeLocationScope(),\n            ),\n            $this->adjust(Severity::Medium, $context),\n            $context->scope()->symbol(),\n            $context->snippet($node),\n            null,\n            $context->excerpt($node),\n        );\n    }\n\n    private function inspectStaticCall(Expr\\StaticCall $node, RuleContext $context): ?Finding\n    {\n        if (!$node->name instanceof Identifier || !$node->class instanceof Node\\Name) {\n            return null;\n        }\n\n        $method = $node->name->toString();\n        $className = AstHelper::nameToString($node->class);\n        $shortName = str_contains($className, '\\\\')\n            ? substr($className, (int) strrpos($className, '\\\\') + 1)\n            : $className;\n\n        // `Anything::macro()` mutates a shared class-level registry.\n        if (strtolower($method) === self::MACRO_METHOD) {\n            return $this->registrationFinding($node, $context, $shortName, $method, 'macro');\n        }\n\n        if (!$context->framework()->isLaravel()) {\n            return null;\n        }\n\n        $methods = self::LARAVEL_REGISTRATIONS[strtolower($shortName)] ?? null;\n\n        if ($methods === null) {\n            // Eloquent model hooks are registered on the model class itself.\n            $methods = str_ends_with($shortName, 'Model') ? self::LARAVEL_REGISTRATIONS['model'] : null;\n        }\n\n        if ($methods === null || !in_array($method, $methods, true)) {\n            return null;\n        }\n\n        return $this->registrationFinding($node, $context, $shortName, $method, 'listener');\n    }\n\n    private function inspectMethodCall(Expr\\MethodCall $node, RuleContext $context): ?Finding\n    {\n        if (!$context->framework()->isLaravel() || !$node->name instanceof Identifier) {\n            return null;\n        }\n\n        $method = $node->name->toString();\n\n        if (!in_array($method, ['listen', 'subscribe', 'observe'], true)) {\n            return null;\n        }\n\n        // Only when the receiver is recognisably the event dispatcher.\n        if (!$this->isEventDispatcher($node->var)) {\n            return null;\n        }\n\n        return $this->registrationFinding($node, $context, 'events', $method, 'listener');\n    }\n\n    /**\n     * `self::$listeners[] = fn () => …` and friends.\n     */\n    private function inspectListenerAppend(Expr\\Assign $node, RuleContext $context): ?Finding\n    {\n        if (!$node->var instanceof Expr\\ArrayDimFetch) {\n            return null;\n        }\n\n        if (!$this->isCallableExpression($node->expr)) {\n            return null;\n        }\n\n        $base = AstHelper::unwrapArrayDim($node->var);\n\n        // Only a static registry is known to outlive the request. An instance\n        // property might belong to an object created for this request, and\n        // guessing costs more trust than the finding is worth.\n        $name = $base instanceof Expr\\StaticPropertyFetch && $base->name instanceof Node\\VarLikeIdentifier\n            ? $base->name->toString()\n            : null;\n\n        if ($name === null || !$this->looksLikeListenerRegistry($name)) {\n            return null;\n        }\n\n        return $this->finding(\n            $context,\n            $context->location($node),\n            sprintf('A callback is appended to the static $%s registry.', $name),\n            sprintf(\n                'The static $%s array is reached from %s and holds callables for the whole worker process. Every request appends another callback, and the ones registered by earlier requests keep running.',\n                $name,\n                $context->scope()->describeLocationScope(),\n            ),\n            $this->adjust(Severity::Medium, $context),\n            $context->scope()->symbol($name),\n            $context->snippet($node),\n            null,\n            $context->excerpt($node),\n        );\n    }\n\n    private function registrationFinding(\n        Node $node,\n        RuleContext $context,\n        string $subject,\n        string $method,\n        string $kind,\n    ): Finding {\n        return $this->finding(\n            $context,\n            $context->location($node),\n            $kind === 'macro'\n                ? sprintf('%s::%s() extends a shared class from a request path.', $subject, $method)\n                : sprintf('%s::%s() registers a listener from a request path.', $subject, $method),\n            $kind === 'macro'\n                ? sprintf(\n                    'Macros are stored in a static registry on %s, so the registration survives the request. Running it from %s repeats the work for every request and lets one request change how the class behaves for all the others.',\n                    $subject,\n                    $context->scope()->describeLocationScope(),\n                )\n                : sprintf(\n                    'The registration is performed from %s, which runs per request, while the dispatcher it registers with lives as long as the worker. Listeners therefore stack up and the ones registered by earlier requests keep firing — often with data captured from those requests.',\n                    $context->scope()->describeLocationScope(),\n                ),\n            $this->adjust(Severity::Medium, $context),\n            $context->scope()->symbol(),\n            $context->snippet($node),\n            null,\n            $context->excerpt($node),\n        );\n    }\n\n    private function isEventDispatcher(Expr $receiver): bool\n    {\n        // `$this->app['events']` / `$app['events']` / `$this->events` / `$dispatcher`\n        if ($receiver instanceof Expr\\ArrayDimFetch && $receiver->dim !== null) {\n            return AstHelper::stringValue($receiver->dim) === 'events';\n        }\n\n        if ($receiver instanceof Expr\\PropertyFetch && $receiver->name instanceof Identifier) {\n            return in_array(strtolower($receiver->name->toString()), ['events', 'dispatcher', 'eventdispatcher'], true);\n        }\n\n        if ($receiver instanceof Expr\\Variable && is_string($receiver->name)) {\n            return in_array(strtolower($receiver->name), ['events', 'dispatcher', 'eventdispatcher'], true);\n        }\n\n        return false;\n    }\n\n    private function isCallableExpression(Expr $expr): bool\n    {\n        if ($expr instanceof Expr\\Closure || $expr instanceof Expr\\ArrowFunction) {\n            return true;\n        }\n\n        if ($expr instanceof Expr\\FuncCall || $expr instanceof Expr\\New_) {\n            return false;\n        }\n\n        // `[$this, 'handle']` and `[self::class, 'handle']`\n        if ($expr instanceof Expr\\Array_ && count($expr->items) === 2) {\n            return AstHelper::stringValue($expr->items[1]->value) !== null;\n        }\n\n        return false;\n    }\n\n    private function looksLikeListenerRegistry(string $name): bool\n    {\n        foreach (NameHeuristics::tokenize($name) as $token) {\n            if (in_array($token, self::LISTENER_TOKENS, true)) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n\n    private function isInsideServiceProvider(RuleContext $context): bool\n    {\n        $className = $context->scope()->classShortName();\n\n        if ($className !== null && str_ends_with($className, 'ServiceProvider')) {\n            return true;\n        }\n\n        $parent = $context->scope()->parentClass();\n\n        return $parent !== null && str_ends_with($parent, 'ServiceProvider');\n    }\n\n    /**\n     * Registration in top-level bootstrap code runs once per worker boot.\n     */\n    private function adjust(Severity $severity, RuleContext $context): Severity\n    {\n        return $context->scope()->isFileScope() ? Severity::Low : $severity;\n    }\n}\n","src/Rule/BuiltIn/RuntimeEnvironmentMutationRule.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Rule\\BuiltIn;\n\nuse PhpParser\\Node;\nuse PhpParser\\Node\\Expr;\nuse PhpParser\\Node\\Stmt;\nuse WorkerSafety\\Ast\\AstHelper;\nuse WorkerSafety\\Finding\\Finding;\nuse WorkerSafety\\Finding\\RuleCategory;\nuse WorkerSafety\\Finding\\Severity;\nuse WorkerSafety\\Finding\\SymbolContext;\nuse WorkerSafety\\Rule\\AbstractRule;\nuse WorkerSafety\\Rule\\RuleContext;\nuse WorkerSafety\\Rule\\RuleDefinition;\nuse WorkerSafety\\Rule\\RuleId;\nuse WorkerSafety\\Runtime\\RuntimeTargetSet;\n\n/**\n * WS003 — mutation of the process environment or of PHP settings.\n *\n * Reads (`getenv()`, `ini_get()`, `$_ENV['X']`) are never reported: only\n * mutations are, because they change the environment for every later request\n * handled by the same worker.\n *\n * Top-level statements are downgraded one severity level: code outside any\n * function normally runs once while the worker boots, which is exactly where\n * this kind of call belongs.\n */\nfinal class RuntimeEnvironmentMutationRule extends AbstractRule\n{\n    /**\n     * Function name => [severity, minimum argument count that makes it a write].\n     *\n     * @var array<string, array{0: Severity, 1: int}>\n     */\n    private const MUTATING_FUNCTIONS = [\n        'putenv' => [Severity::High, 1],\n        'ini_set' => [Severity::Medium, 2],\n        'ini_alter' => [Severity::Medium, 2],\n        'date_default_timezone_set' => [Severity::Medium, 1],\n        'setlocale' => [Severity::Medium, 2],\n        'mb_internal_encoding' => [Severity::Medium, 1],\n        'set_time_limit' => [Severity::Low, 1],\n    ];\n\n    /**\n     * @var array<string, Severity>\n     */\n    private const MUTABLE_SUPERGLOBALS = [\n        // $_ENV is documented as NOT reset between requests in FrankenPHP\n        // worker mode, so a write to it really does survive.\n        '_ENV' => Severity::High,\n        // $_SERVER is rebuilt per request by the supported runtimes, so a write\n        // is a within-request concern rather than a retained value.\n        '_SERVER' => Severity::Low,\n    ];\n\n    public function definition(): RuleDefinition\n    {\n        return new RuleDefinition(\n            RuleId::RUNTIME_ENVIRONMENT_MUTATION,\n            'Runtime environment mutation',\n            'The process environment, the $_ENV/$_SERVER arrays and the ini settings belong to the worker process. Changing them while serving a request changes them for every request that follows.',\n            Severity::Medium,\n            RuleCategory::EnvironmentMutation,\n            [\n                'Read configuration instead of writing it: resolve values from a config object built at boot.',\n                'If a value has to differ per request, pass it through the request-scoped service that needs it.',\n                'When a temporary change is unavoidable, restore the previous value in a finally block.',\n            ],\n            RuntimeTargetSet::all(),\n        );\n    }\n\n    public function nodeTypes(): array\n    {\n        return [\n            Expr\\FuncCall::class,\n            Expr\\Assign::class,\n            Expr\\AssignRef::class,\n            Expr\\AssignOp::class,\n            Stmt\\Unset_::class,\n        ];\n    }\n\n    public function enterNode(Node $node, RuleContext $context): iterable\n    {\n        if ($node instanceof Expr\\FuncCall) {\n            $finding = $this->inspectCall($node, $context);\n\n            if ($finding instanceof Finding) {\n                yield $finding;\n            }\n\n            return;\n        }\n\n        if ($node instanceof Stmt\\Unset_) {\n            foreach ($node->vars as $var) {\n                $finding = $this->inspectTarget($var, $node, $context, true);\n\n                if ($finding instanceof Finding) {\n                    yield $finding;\n                }\n            }\n\n            return;\n        }\n\n        if ($node instanceof Expr\\Assign || $node instanceof Expr\\AssignRef || $node instanceof Expr\\AssignOp) {\n            $finding = $this->inspectTarget($node->var, $node, $context, false);\n\n            if ($finding instanceof Finding) {\n                yield $finding;\n            }\n        }\n    }\n\n    private function inspectCall(Expr\\FuncCall $node, RuleContext $context): ?Finding\n    {\n        $name = AstHelper::functionName($node);\n\n        if ($name === null || !isset(self::MUTATING_FUNCTIONS[$name])) {\n            return null;\n        }\n\n        [$severity, $minimumArgs] = self::MUTATING_FUNCTIONS[$name];\n\n        // Calls without arguments are reads (`mb_internal_encoding()`).\n        if (count($node->args) < $minimumArgs) {\n            return null;\n        }\n\n        if ($name === 'setlocale' && $this->isLocaleQuery($node)) {\n            return null;\n        }\n\n        return $this->finding(\n            $context,\n            $context->location($node),\n            sprintf('%s() changes process-wide state at runtime.', $name),\n            $this->explainCall($name, $context),\n            $this->adjust($severity, $context),\n            $context->scope()->symbol(),\n            $context->snippet($node),\n            null,\n            $context->excerpt($node),\n        );\n    }\n\n    /**\n     * `setlocale($category, 0)` and `setlocale($category, \"0\")` return the\n     * current locale without changing anything.\n     */\n    private function isLocaleQuery(Expr\\FuncCall $node): bool\n    {\n        $second = $node->args[1] ?? null;\n\n        if (!$second instanceof Node\\Arg) {\n            return false;\n        }\n\n        $value = $second->value;\n\n        if ($value instanceof Node\\Scalar\\Int_) {\n            return $value->value === 0;\n        }\n\n        if ($value instanceof Node\\Scalar\\String_) {\n            return $value->value === '0';\n        }\n\n        return AstHelper::isNullConstant($value);\n    }\n\n    private function inspectTarget(Expr $target, Node $node, RuleContext $context, bool $isUnset): ?Finding\n    {\n        $base = AstHelper::unwrapArrayDim($target);\n\n        if (!$base instanceof Expr\\Variable || !is_string($base->name)) {\n            return null;\n        }\n\n        $severity = self::MUTABLE_SUPERGLOBALS[$base->name] ?? null;\n\n        if ($severity === null) {\n            return null;\n        }\n\n        $key = $target instanceof Expr\\ArrayDimFetch && $target->dim !== null\n            ? AstHelper::stringValue($target->dim)\n            : null;\n\n        $reference = $key !== null\n            ? sprintf('$%s[\\'%s\\']', $base->name, $key)\n            : '$' . $base->name;\n\n        return $this->finding(\n            $context,\n            $context->location($node),\n            $isUnset\n                ? sprintf('%s is removed at runtime.', $reference)\n                : sprintf('%s is assigned at runtime.', $reference),\n            $base->name === '_ENV'\n                ? '$_ENV is the documented exception to superglobal resetting in FrankenPHP worker mode: it is not rebuilt between requests. A value written here stays visible to every later request the worker serves, and configuration readers such as env() will keep returning it.'\n                : sprintf(\n                    '$%s is rebuilt for every request by the supported runtimes, so the value does not persist the way a static property would. It is still reported because code downstream cannot tell an injected value from real request data, and because the same habit applied to $_ENV does leak across requests.',\n                    $base->name,\n                ),\n            $this->adjust($severity, $context),\n            new SymbolContext(\n                $context->scope()->className(),\n                $context->scope()->methodName(),\n                null,\n                $base->name,\n            ),\n            $context->snippet($node),\n            null,\n            $context->excerpt($node),\n        );\n    }\n\n    private function explainCall(string $name, RuleContext $context): string\n    {\n        $base = match ($name) {\n            'putenv' => 'putenv() writes into the environment of the whole PHP process. The value is not restored when the request ends, it is visible to every later request served by the worker, and under Swoole it can be read concurrently by other coroutines.',\n            'ini_set', 'ini_alter' => 'An ini value changed here stays changed for the rest of the worker process, so later requests run with settings they never asked for.',\n            'date_default_timezone_set' => 'The default timezone is process state. A request that switches it changes date formatting for every request the worker serves afterwards.',\n            'setlocale' => 'The locale is process state (and not coroutine-safe). Later requests inherit the locale that the last request happened to set.',\n            'mb_internal_encoding' => 'The mbstring internal encoding is process state and is inherited by later requests.',\n            'set_time_limit' => 'The execution time limit applies to the worker process rather than to a single request, and persistent runtimes usually ignore or reinterpret it.',\n            default => 'This call mutates state that outlives the current request.',\n        };\n\n        if ($context->scope()->isFileScope()) {\n            return $base . ' This call is at file scope, which normally runs once while the worker boots, so the severity is reduced — confirm that this file is not re-included per request.';\n        }\n\n        return $base;\n    }\n\n    /**\n     * Top-level code usually runs once per worker boot rather than per request.\n     */\n    private function adjust(Severity $severity, RuleContext $context): Severity\n    {\n        if (!$context->scope()->isFileScope()) {\n            return $severity;\n        }\n\n        return match ($severity) {\n            Severity::Critical => Severity::High,\n            Severity::High => Severity::Medium,\n            Severity::Medium => Severity::Low,\n            default => Severity::Info,\n        };\n    }\n}\n","src/Rule/BuiltIn/ShutdownLifecycleAssumptionRule.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Rule\\BuiltIn;\n\nuse PhpParser\\Node;\nuse PhpParser\\Node\\Expr;\nuse WorkerSafety\\Ast\\AstHelper;\nuse WorkerSafety\\Finding\\Finding;\nuse WorkerSafety\\Finding\\RuleCategory;\nuse WorkerSafety\\Finding\\Severity;\nuse WorkerSafety\\Rule\\AbstractRule;\nuse WorkerSafety\\Rule\\RuleContext;\nuse WorkerSafety\\Rule\\RuleDefinition;\nuse WorkerSafety\\Rule\\RuleId;\nuse WorkerSafety\\Runtime\\RuntimeTargetSet;\n\n/**\n * WS010 — code that assumes the process dies when the request ends.\n *\n * The individual signals are weaker than the other rules', so the default\n * severity is low and each detection explains what specifically breaks.\n */\nfinal class ShutdownLifecycleAssumptionRule extends AbstractRule\n{\n    /**\n     * SAPI names that only exist in a per-request process model.\n     *\n     * @var list<string>\n     */\n    private const REQUEST_SCOPED_SAPIS = ['fpm-fcgi', 'apache2handler', 'cgi-fcgi', 'cgi', 'litespeed'];\n\n    /**\n     * Class name suffixes that legitimately terminate the process.\n     *\n     * @var list<string>\n     */\n    private const ENTRY_POINT_SUFFIXES = ['Command', 'Console', 'Kernel'];\n\n    public function definition(): RuleDefinition\n    {\n        return new RuleDefinition(\n            RuleId::SHUTDOWN_LIFECYCLE_ASSUMPTION,\n            'Shutdown/runtime lifecycle assumption',\n            'Under PHP-FPM the PHP request lifecycle ends after every request — the engine tears down the request context even though the OS worker process is reused — which makes shutdown hooks, exit() and SAPI checks behave in one specific way. An application worker loop keeps one PHP context alive across many requests, so the same code means something different.',\n            Severity::Low,\n            RuleCategory::Lifecycle,\n            [\n                'Do the cleanup where the request ends (terminating middleware, a request-lifecycle listener) instead of at process shutdown.',\n                'Return a response instead of calling exit()/die() so the worker can finish the request loop.',\n                'Do not branch on the SAPI name: check for the capability you actually need.',\n            ],\n            RuntimeTargetSet::all(),\n        );\n    }\n\n    public function nodeTypes(): array\n    {\n        return [\n            Expr\\FuncCall::class,\n            Expr\\Exit_::class,\n            Expr\\BinaryOp\\Identical::class,\n            Expr\\BinaryOp\\Equal::class,\n            Expr\\BinaryOp\\NotIdentical::class,\n            Expr\\BinaryOp\\NotEqual::class,\n        ];\n    }\n\n    public function enterNode(Node $node, RuleContext $context): iterable\n    {\n        $finding = match (true) {\n            $node instanceof Expr\\FuncCall => $this->inspectCall($node, $context),\n            $node instanceof Expr\\Exit_ => $this->inspectExit($node, $context),\n            $node instanceof Expr\\BinaryOp => $this->inspectSapiComparison($node, $context),\n            default => null,\n        };\n\n        if ($finding instanceof Finding) {\n            yield $finding;\n        }\n    }\n\n    private function inspectCall(Expr\\FuncCall $node, RuleContext $context): ?Finding\n    {\n        $name = AstHelper::functionName($node);\n\n        return match ($name) {\n            'register_shutdown_function' => $this->shutdownFunctionFinding($node, $context),\n            'fastcgi_finish_request' => $this->fastCgiFinding($node, $context),\n            'gc_disable' => $this->gcDisableFinding($node, $context),\n            default => null,\n        };\n    }\n\n    private function shutdownFunctionFinding(Expr\\FuncCall $node, RuleContext $context): Finding\n    {\n        $perRequest = !$context->scope()->isFileScope();\n\n        return $this->finding(\n            $context,\n            $context->location($node),\n            'register_shutdown_function() defers work to process shutdown, not to the end of the request.',\n            $perRequest\n                ? sprintf(\n                    'Registered from %s, this callback is added again for every request, and none of them run until the worker process itself exits. Cleanup that was written to happen \"at the end of the request\" therefore never happens, while the callback list grows for the life of the worker.',\n                    $context->scope()->describeLocationScope(),\n                )\n                : 'At file scope this normally runs once per worker boot, so the callback list does not grow. It still only fires when the worker exits rather than at the end of each request.',\n            $perRequest ? Severity::Medium : Severity::Low,\n            $context->scope()->symbol(),\n            $context->snippet($node),\n            null,\n            $context->excerpt($node),\n        );\n    }\n\n    private function fastCgiFinding(Expr\\FuncCall $node, RuleContext $context): Finding\n    {\n        $runtimes = $context->runtimes();\n        $note = $runtimes->count() === 1\n            ? ' ' . $runtimes->toArray()[0]->note()\n            : '';\n\n        return $this->finding(\n            $context,\n            $context->location($node),\n            'fastcgi_finish_request() does not exist outside FPM/FastCGI.',\n            sprintf(\n                'The function is provided by the FPM and FastCGI SAPIs only. Under %s the call raises an undefined-function error, so any \"flush the response and keep working\" pattern built on it stops working.%s',\n                $runtimes->isEmpty() ? 'a persistent worker' : $runtimes->describe(),\n                $note,\n            ),\n            Severity::Medium,\n            $context->scope()->symbol(),\n            $context->snippet($node),\n            null,\n            $context->excerpt($node),\n        );\n    }\n\n    private function gcDisableFinding(Expr\\FuncCall $node, RuleContext $context): Finding\n    {\n        return $this->finding(\n            $context,\n            $context->location($node),\n            'gc_disable() turns off cycle collection for the whole worker process.',\n            'Disabling the cycle collector is a common per-request optimisation because the process is about to exit anyway. In a persistent worker the process does not exit, so reference cycles accumulate until the memory limit is reached.',\n            Severity::Medium,\n            $context->scope()->symbol(),\n            $context->snippet($node),\n            null,\n            $context->excerpt($node),\n        );\n    }\n\n    private function inspectExit(Expr\\Exit_ $node, RuleContext $context): ?Finding\n    {\n        if ($this->isEntryPoint($context)) {\n            return null;\n        }\n\n        $insideMethod = $context->scope()->methodName() !== null;\n\n        return $this->finding(\n            $context,\n            $context->location($node),\n            'exit()/die() ends the worker process, not just the request.',\n            sprintf(\n                'Called from %s. Under PHP-FPM this simply finishes the request; under a persistent worker it tears the process down mid-loop (Swoole converts it into an ExitException instead), so queued work is dropped and the runtime has to spawn a replacement worker.',\n                $context->scope()->describeLocationScope(),\n            ),\n            $insideMethod ? Severity::Medium : Severity::Low,\n            $context->scope()->symbol(),\n            $context->snippet($node),\n            null,\n            $context->excerpt($node),\n        );\n    }\n\n    private function inspectSapiComparison(Expr\\BinaryOp $node, RuleContext $context): ?Finding\n    {\n        $sapiSide = $this->isSapiExpression($node->left) ? $node->right : ($this->isSapiExpression($node->right) ? $node->left : null);\n\n        if ($sapiSide === null) {\n            return null;\n        }\n\n        $value = AstHelper::stringValue($sapiSide);\n\n        if ($value === null || !in_array(strtolower($value), self::REQUEST_SCOPED_SAPIS, true)) {\n            return null;\n        }\n\n        return $this->finding(\n            $context,\n            $context->location($node),\n            sprintf('Code branches on the SAPI being \"%s\".', $value),\n            sprintf(\n                'Persistent runtimes report a different SAPI name — FrankenPHP reports \"frankenphp\", RoadRunner, Octane and Swoole run under \"cli\". A branch that tests for \"%s\" therefore takes the other path once the application moves to a worker, silently changing behaviour.',\n                $value,\n            ),\n            Severity::Low,\n            $context->scope()->symbol(),\n            $context->snippet($node),\n            null,\n            $context->excerpt($node),\n        );\n    }\n\n    private function isSapiExpression(Expr $expr): bool\n    {\n        if ($expr instanceof Expr\\ConstFetch) {\n            return strtoupper($expr->name->toString()) === 'PHP_SAPI';\n        }\n\n        return $expr instanceof Expr\\FuncCall && AstHelper::functionName($expr) === 'php_sapi_name';\n    }\n\n    /**\n     * Console entry points are allowed to terminate the process.\n     */\n    private function isEntryPoint(RuleContext $context): bool\n    {\n        $className = $context->scope()->classShortName();\n\n        if ($className === null) {\n            return false;\n        }\n\n        foreach (self::ENTRY_POINT_SUFFIXES as $suffix) {\n            if (str_ends_with($className, $suffix)) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n}\n","src/Rule/BuiltIn/StaticCollectionGrowthRule.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Rule\\BuiltIn;\n\nuse WorkerSafety\\Application\\ApplicationInfo;\nuse WorkerSafety\\Ast\\Index\\ClassShape;\nuse WorkerSafety\\Ast\\Index\\DefaultValueKind;\nuse WorkerSafety\\Ast\\Index\\PropertyShape;\nuse WorkerSafety\\Ast\\Index\\StateWrite;\nuse WorkerSafety\\Ast\\Index\\StaticLocalVariable;\nuse WorkerSafety\\Finding\\Finding;\nuse WorkerSafety\\Finding\\RuleCategory;\nuse WorkerSafety\\Finding\\Severity;\nuse WorkerSafety\\Finding\\SymbolContext;\nuse WorkerSafety\\Rule\\AbstractRule;\nuse WorkerSafety\\Rule\\ProjectContext;\nuse WorkerSafety\\Rule\\RuleDefinition;\nuse WorkerSafety\\Rule\\RuleId;\nuse WorkerSafety\\Runtime\\RuntimeTargetSet;\n\n/**\n * WS008 — a static collection that only ever grows.\n *\n * Three outcomes, based on what can actually be proven:\n *\n *  - no clearing operation anywhere              → high (unbounded)\n *  - a removal exists but bounds nothing that\n *    can be verified from the code alone         → medium\n *  - an unconditional reset of the whole\n *    collection in the growing function          → not reported\n *\n * Only that last shape is a proof. Certifying an eviction would mean knowing\n * that the removal runs on every path through its guard, that it removes at\n * least as much as was added, and that the limit is finite; matching a removal\n * to an addition would mean knowing their order and the runtime value of the\n * key. None of that follows from the shape of the code, so an unproven removal\n * lowers the severity and sharpens the message rather than silencing the\n * finding.\n */\nfinal class StaticCollectionGrowthRule extends AbstractRule\n{\n    public function definition(): RuleDefinition\n    {\n        return new RuleDefinition(\n            RuleId::STATIC_COLLECTION_GROWTH,\n            'Static collection growth',\n            'A static array that is appended to on every request never releases its entries. Under PHP-FPM the engine tears down the request context and the memory goes away; under a persistent worker the same context stays alive, so the array accumulates until the worker is recycled or the memory limit is hit.',\n            Severity::Medium,\n            RuleCategory::MemoryRetention,\n            [\n                'Bound the collection: cap its size, or key it so that entries are reused instead of added.',\n                'Clear it at the end of every request. Under Laravel Octane that means a RequestTerminated listener that calls your reset: `octane.flush` only forgets container bindings, it does not empty static properties.',\n                'Move the cache into a real cache backend with a TTL, so eviction is somebody else\\'s problem.',\n            ],\n            RuntimeTargetSet::all(),\n        );\n    }\n\n    public function finishProject(ProjectContext $context): iterable\n    {\n        foreach ($context->index()->classes() as $class) {\n            foreach ($class->staticProperties as $property) {\n                $finding = $this->inspectProperty($property, $class, $context);\n\n                if ($finding instanceof Finding) {\n                    yield $finding;\n                }\n            }\n        }\n\n        foreach ($context->index()->staticLocals() as $local) {\n            $finding = $this->inspectStaticLocal($local, $context);\n\n            if ($finding instanceof Finding) {\n                yield $finding;\n            }\n        }\n    }\n\n    private function inspectProperty(PropertyShape $property, ClassShape $class, ProjectContext $context): ?Finding\n    {\n        if (!$this->isCollection($property)) {\n            return null;\n        }\n\n        $writes = $context->index()->writesForProperty($property);\n        $verdict = $this->judge($writes);\n\n        if ($verdict === null) {\n            return null;\n        }\n\n        [$severity, $growth, $release] = $verdict;\n\n        return $this->finding(\n            $context,\n            $property->location,\n            match ($release) {\n                'unproven' => sprintf(\n                    'Static collection $%s grows and the removals beside it are not a provable bound.',\n                    $property->name,\n                ),\n                'reset' => sprintf('Static collection $%s is only released by an explicit reset.', $property->name),\n                default => sprintf('Static collection $%s grows without any release path.', $property->name),\n            },\n            $this->explain($class->shortName . '::$' . $property->name, $growth, $release, $class),\n            $severity,\n            new SymbolContext($class->name, null, $property->name),\n            $property->snippet,\n            null,\n            $property->excerpt,\n        );\n    }\n\n    private function inspectStaticLocal(StaticLocalVariable $local, ProjectContext $context): ?Finding\n    {\n        if ($local->default !== DefaultValueKind::EmptyArray && $local->default !== DefaultValueKind::None) {\n            return null;\n        }\n\n        $verdict = $this->judge($local->writes);\n\n        if ($verdict === null) {\n            return null;\n        }\n\n        [$severity, $growth, $release] = $verdict;\n\n        return $this->finding(\n            $context,\n            $local->location,\n            $release === 'unproven'\n                ? sprintf(\n                    'Function-scoped static collection $%s grows and the removals beside it are not a provable bound.',\n                    $local->name,\n                )\n                : sprintf('Function-scoped static collection $%s grows across requests.', $local->name),\n            sprintf(\n                'The `static` array in %s is created once per worker process, so every entry added while serving a request is still there for the next one. First growth at %s (%s).%s',\n                $local->describeScope(),\n                (string) $growth->location,\n                $growth->kind->value,\n                $release === 'unproven'\n                    ? sprintf(\n                        ' There are removals in the same function, but nothing in the code proves they bound it. Confirm the behaviour, then silence this finding with `// %s WS008` if the trade-off is deliberate.',\n                        ApplicationInfo::IGNORE_MARKER,\n                    )\n                    : '',\n            ),\n            $severity,\n            new SymbolContext($local->inClass, $local->inFunction, null, $local->name),\n            $local->snippet,\n            null,\n            $local->excerpt,\n        );\n    }\n\n    /**\n     * @param list<StateWrite> $writes\n     *\n     * @return array{0: Severity, 1: StateWrite, 2: string}|null severity, the\n     *                                                           write it came\n     *                                                           from, and why\n     */\n    private function judge(array $writes): ?array\n    {\n        // A keyed write whose every dimension is a fixed key targets a fixed\n        // slot, so it cannot grow the collection without bound.\n        $growth = array_values(array_filter($writes, static fn (StateWrite $w): bool => $w->growsUnbounded()));\n\n        if ($growth === []) {\n            return null;\n        }\n\n        $clearing = array_values(array_filter($writes, static fn (StateWrite $w): bool => $w->isClearing()));\n\n        if ($clearing === []) {\n            return [Severity::High, $growth[0], 'none'];\n        }\n\n        $unbounded = array_values(array_filter(\n            $growth,\n            fn (StateWrite $w): bool => !$this->scopeIsBounded(self::scopeOf($w), $clearing),\n        ));\n\n        if ($unbounded === []) {\n            return null;\n        }\n\n        // Every growing function is graded, and the worst one decides. Looking\n        // at only the first would make the severity — and the exit code —\n        // depend on the order the methods happen to be declared in.\n        $worst = null;\n\n        foreach ($unbounded as $write) {\n            $release = self::releaseKindFor($write, $clearing);\n            $severity = $release === 'none' ? Severity::High : Severity::Medium;\n\n            if ($worst === null || $severity->rank() > $worst[0]->rank()) {\n                $worst = [$severity, $write, $release];\n            }\n        }\n\n        return $worst;\n    }\n\n    /**\n     * What kind of release path, if any, covers the function this write is in.\n     *\n     * A removal in the growing function is evidence of intent, not a proof of a\n     * bound, so it lowers the severity rather than removing the finding. So\n     * does a reset method that something has to call.\n     *\n     * @param list<StateWrite> $clearing\n     *\n     * @return 'none'|'reset'|'unproven'\n     */\n    private static function releaseKindFor(StateWrite $growth, array $clearing): string\n    {\n        $scope = self::scopeOf($growth);\n\n        foreach ($clearing as $write) {\n            if (self::scopeOf($write) === $scope) {\n                return 'unproven';\n            }\n        }\n\n        foreach ($clearing as $write) {\n            if ($write->inResetMethod) {\n                return 'reset';\n            }\n        }\n\n        return 'none';\n    }\n\n    /**\n     * Whether the growth in one function is provably bounded.\n     *\n     * @param list<StateWrite> $clearing\n     */\n    private function scopeIsBounded(string $scope, array $clearing): bool\n    {\n        foreach (self::inScope($clearing, $scope) as $write) {\n            if ($write->kind->isFullRelease() && $write->guaranteed) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n\n    /**\n     * @param list<StateWrite> $writes\n     *\n     * @return list<StateWrite>\n     */\n    private static function inScope(array $writes, string $scope): array\n    {\n        return array_values(array_filter(\n            $writes,\n            static fn (StateWrite $w): bool => self::scopeOf($w) === $scope,\n        ));\n    }\n\n    /**\n     * Identity of the function a write happens in, qualified by its class so\n     * that two same-named methods on different classes never cancel out.\n     */\n    private static function scopeOf(StateWrite $write): string\n    {\n        return strtolower(($write->inClass ?? '') . '::' . ($write->inMethod ?? '{file}'));\n    }\n\n    /**\n     * Only report things that can actually accumulate entries.\n     */\n    private function isCollection(PropertyShape $property): bool\n    {\n        if ($property->typeIsScalarOnly) {\n            return false;\n        }\n\n        return $property->typeIsArray\n            || $property->typeString === null\n            || $property->default === DefaultValueKind::EmptyArray\n            || $property->default === DefaultValueKind::NonEmptyArray;\n    }\n\n    private function explain(string $subject, StateWrite $growth, string $release, ClassShape $class): string\n    {\n        $where = sprintf('(%s at %s)', $growth->kind->value, (string) $growth->location);\n\n        if ($release === 'unproven') {\n            return sprintf(\n                '%s is appended to at runtime %s. There are removals in the same function, but nothing in the code proves they bound it: that would mean knowing the removal runs on every path, that it takes out at least as much as was added, and that any size limit is finite. If the eviction is correct this is bounded; if it is not, the array grows for the whole life of the worker. Confirm it, then silence this finding with `// %s WS008` if the trade-off is deliberate.',\n                $subject,\n                $where,\n                ApplicationInfo::IGNORE_MARKER,\n            );\n        }\n\n        if ($release === 'reset') {\n            $names = [];\n\n            foreach ($class->resetMethods() as $method) {\n                $names[] = $method->name . '()';\n            }\n\n            return sprintf(\n                '%s is appended to at runtime %s. Entries are only removed by %s, so the collection keeps growing for as long as nothing calls it — and under a persistent worker that is the whole life of the process. Each request therefore leaves memory behind that is never reclaimed until the worker restarts.',\n                $subject,\n                $where,\n                $names === [] ? 'an explicit reset' : implode(', ', $names),\n            );\n        }\n\n        return sprintf(\n            '%s is appended to at runtime %s and the analyzer found no operation that removes entries again. Each request therefore leaves memory behind that is never reclaimed until the worker restarts.',\n            $subject,\n            $where,\n        );\n    }\n}\n","src/Rule/BuiltIn/StaticRequestContextRule.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Rule\\BuiltIn;\n\nuse WorkerSafety\\Ast\\Index\\ClassShape;\nuse WorkerSafety\\Ast\\Index\\DefaultValueKind;\nuse WorkerSafety\\Ast\\Index\\PropertyShape;\nuse WorkerSafety\\Ast\\Index\\SingletonAnalyzer;\nuse WorkerSafety\\Ast\\Index\\StateWrite;\nuse WorkerSafety\\Ast\\Index\\StaticLocalVariable;\nuse WorkerSafety\\Finding\\Finding;\nuse WorkerSafety\\Finding\\RuleCategory;\nuse WorkerSafety\\Finding\\Severity;\nuse WorkerSafety\\Finding\\SymbolContext;\nuse WorkerSafety\\Rule\\AbstractRule;\nuse WorkerSafety\\Rule\\ProjectContext;\nuse WorkerSafety\\Rule\\RuleDefinition;\nuse WorkerSafety\\Rule\\RuleId;\nuse WorkerSafety\\Runtime\\RuntimeTargetSet;\nuse WorkerSafety\\Support\\NameHeuristics;\n\n/**\n * WS007 — process-wide state whose name or type reads as request-specific.\n *\n * This is the one deliberately name-driven rule, so the vocabulary is kept\n * narrow and is neutralised by configuration/infrastructure words: `$currentUser`\n * and `static ?User $u` match, `$userTable`, `$defaultLocale` and\n * `UserRepository` do not. See {@see NameHeuristics}.\n */\nfinal class StaticRequestContextRule extends AbstractRule\n{\n    public function definition(): RuleDefinition\n    {\n        return new RuleDefinition(\n            RuleId::STATIC_REQUEST_CONTEXT,\n            'Static request/user context',\n            'State that identifies the current user, request, session or tenant belongs to a single request. Held in a static property or a function-scoped static, it becomes the identity that the next request sees.',\n            Severity::High,\n            RuleCategory::StaticState,\n            [\n                'Resolve the value from the current request instead of caching it statically.',\n                'Inject a request-scoped context object (Laravel: a `scoped()` binding) into the classes that need it.',\n                'If the static slot must stay, clear it in a terminating middleware or a worker request-lifecycle hook.',\n            ],\n            RuntimeTargetSet::all(),\n        );\n    }\n\n    public function finishProject(ProjectContext $context): iterable\n    {\n        foreach ($context->index()->classes() as $class) {\n            foreach ($class->staticProperties as $property) {\n                $finding = $this->inspectProperty($property, $class, $context);\n\n                if ($finding instanceof Finding) {\n                    yield $finding;\n                }\n            }\n        }\n\n        foreach ($context->index()->staticLocals() as $local) {\n            $finding = $this->inspectStaticLocal($local, $context);\n\n            if ($finding instanceof Finding) {\n                yield $finding;\n            }\n        }\n    }\n\n    private function inspectProperty(PropertyShape $property, ClassShape $class, ProjectContext $context): ?Finding\n    {\n        $tokens = $property->requestTokens();\n\n        if ($tokens === []) {\n            return null;\n        }\n\n        // The singleton holder is WS004's finding, and its type name would\n        // otherwise match through the class name.\n        if (SingletonAnalyzer::isInstanceHolder($class, $property)) {\n            return null;\n        }\n\n        if (!$this->isCandidate($property)) {\n            return null;\n        }\n\n        $writes = $context->index()->writesForProperty($property);\n        $mutating = array_values(array_filter($writes, static fn (StateWrite $w): bool => !$w->isClearing()));\n\n        if ($mutating === [] && !$property->isPublic()) {\n            return null;\n        }\n\n        $severity = $this->severityFor($mutating !== [], $property->isPublic(), $this->hasResetPath($writes));\n\n        return $this->finding(\n            $context,\n            $property->location,\n            sprintf('Static property $%s holds request-specific state.', $property->name),\n            $this->explain(\n                $class->shortName . '::$' . $property->name,\n                $tokens,\n                $mutating[0] ?? null,\n                $property->isPublic(),\n            ),\n            $severity,\n            new SymbolContext($class->name, null, $property->name),\n            $property->snippet,\n            null,\n            $property->excerpt,\n        );\n    }\n\n    private function inspectStaticLocal(StaticLocalVariable $local, ProjectContext $context): ?Finding\n    {\n        $tokens = NameHeuristics::requestTokens($local->name);\n\n        if ($tokens === []) {\n            return null;\n        }\n\n        if ($local->default === DefaultValueKind::NonEmptyArray || $local->default === DefaultValueKind::Scalar) {\n            return null;\n        }\n\n        $mutating = array_values(array_filter($local->writes, static fn (StateWrite $w): bool => !$w->isClearing()));\n\n        if ($mutating === []) {\n            return null;\n        }\n\n        return $this->finding(\n            $context,\n            $local->location,\n            sprintf('Function-scoped static $%s holds request-specific state.', $local->name),\n            sprintf(\n                'A `static` variable inside %s is initialised once per worker process, not once per request, so $%s (%s) keeps the value the first request gave it. Function-scoped statics are easy to miss because no class or property is involved.',\n                $local->describeScope(),\n                $local->name,\n                implode(', ', $tokens),\n            ),\n            $local->hasClearingWrite() ? Severity::High : Severity::Critical,\n            new SymbolContext($local->inClass, $local->inFunction, null, $local->name),\n            $local->snippet,\n            null,\n            $local->excerpt,\n        );\n    }\n\n    /**\n     * Weed out declarations that read as configuration rather than as state.\n     */\n    private function isCandidate(PropertyShape $property): bool\n    {\n        // `private static string $userTable = 'users'` and friends.\n        if ($property->looksLikeConfiguration()) {\n            return false;\n        }\n\n        // A populated literal map is a lookup table, not request state.\n        if ($property->default === DefaultValueKind::NonEmptyArray) {\n            return false;\n        }\n\n        return true;\n    }\n\n    /**\n     * @param list<StateWrite> $writes\n     */\n    private function hasResetPath(array $writes): bool\n    {\n        foreach ($writes as $write) {\n            if ($write->isClearing() && $write->inResetMethod) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n\n    private function severityFor(bool $written, bool $isPublic, bool $hasResetPath): Severity\n    {\n        $severity = match (true) {\n            $written && $isPublic => Severity::Critical,\n            $written => Severity::High,\n            default => Severity::Medium,\n        };\n\n        if (!$hasResetPath) {\n            return $severity;\n        }\n\n        return match ($severity) {\n            Severity::Critical => Severity::High,\n            Severity::High => Severity::Medium,\n            default => Severity::Low,\n        };\n    }\n\n    /**\n     * @param list<string> $tokens\n     */\n    private function explain(string $subject, array $tokens, ?StateWrite $write, bool $isPublic): string\n    {\n        $explanation = sprintf(\n            '%s reads as request-specific state (%s) but lives in a static slot, which exists once per worker process. Whatever the last request stored is what the next request will read, so one user can be served another user\\'s context.',\n            $subject,\n            implode(', ', $tokens),\n        );\n\n        if ($write instanceof StateWrite && $write->inMethod !== null) {\n            $explanation .= sprintf(' Assigned in %s() at %s.', $write->inMethod, (string) $write->location);\n        }\n\n        if ($isPublic) {\n            $explanation .= ' The property is public, so any code in the application can overwrite it.';\n        }\n\n        return $explanation;\n    }\n}\n","src/Rule/ProjectContext.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Rule;\n\nuse WorkerSafety\\Ast\\Index\\ProjectIndex;\nuse WorkerSafety\\Framework\\DetectedFramework;\nuse WorkerSafety\\Runtime\\RuntimeTargetSet;\n\n/**\n * Analysis state available once every file has been visited.\n */\nfinal class ProjectContext implements ReportingContext\n{\n    public function __construct(\n        private readonly ProjectIndex $index,\n        private readonly DetectedFramework $framework,\n        private readonly RuntimeTargetSet $runtimes,\n        private readonly string $projectRoot,\n    ) {\n    }\n\n    public function index(): ProjectIndex\n    {\n        return $this->index;\n    }\n\n    public function framework(): DetectedFramework\n    {\n        return $this->framework;\n    }\n\n    public function runtimes(): RuntimeTargetSet\n    {\n        return $this->runtimes;\n    }\n\n    public function projectRoot(): string\n    {\n        return $this->projectRoot;\n    }\n}\n","src/Rule/ReportingContext.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Rule;\n\nuse WorkerSafety\\Ast\\Index\\ProjectIndex;\nuse WorkerSafety\\Framework\\DetectedFramework;\nuse WorkerSafety\\Runtime\\RuntimeTargetSet;\n\n/**\n * The subset of analysis state every rule hook can rely on.\n */\ninterface ReportingContext\n{\n    public function index(): ProjectIndex;\n\n    public function framework(): DetectedFramework;\n\n    public function runtimes(): RuntimeTargetSet;\n\n    public function projectRoot(): string;\n}\n","src/Rule/Rule.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Rule;\n\nuse PhpParser\\Node;\nuse WorkerSafety\\Finding\\Finding;\n\n/**\n * One worker-safety check.\n *\n * The lifecycle is aligned with how php-parser traverses code, and with the\n * fact that some risks are only visible once the whole project is known:\n *\n *  1. `beginFile()`   — reset per-file state\n *  2. `enterNode()`   — called for every node matching `nodeTypes()`\n *  3. `finishFile()`  — emit findings that needed the whole file\n *  4. `finishProject()` — emit findings that needed the whole project\n *\n * A rule may implement any subset; `AbstractRule` no-ops the rest.\n */\ninterface Rule\n{\n    public function definition(): RuleDefinition;\n\n    /**\n     * Node classes (or parent classes / interfaces) this rule wants to see.\n     *\n     * Returning an empty list means the rule is driven purely by the project\n     * index and never inspects individual nodes.\n     *\n     * @return list<class-string<Node>>\n     */\n    public function nodeTypes(): array;\n\n    public function beginFile(RuleContext $context): void;\n\n    /**\n     * @return iterable<Finding>\n     */\n    public function enterNode(Node $node, RuleContext $context): iterable;\n\n    /**\n     * @return iterable<Finding>\n     */\n    public function finishFile(RuleContext $context): iterable;\n\n    /**\n     * @return iterable<Finding>\n     */\n    public function finishProject(ProjectContext $context): iterable;\n}\n","src/Rule/RuleContext.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Rule;\n\nuse PhpParser\\Node;\nuse WorkerSafety\\Ast\\AstHelper;\nuse WorkerSafety\\Ast\\Index\\ProjectIndex;\nuse WorkerSafety\\Finding\\Location;\nuse WorkerSafety\\Framework\\DetectedFramework;\nuse WorkerSafety\\Runtime\\RuntimeTargetSet;\nuse WorkerSafety\\Support\\SourceFile;\n\n/**\n * Analysis state for the file currently being visited.\n */\nfinal class RuleContext implements ReportingContext\n{\n    public function __construct(\n        private readonly SourceFile $file,\n        private readonly Scope $scope,\n        private readonly ProjectContext $project,\n    ) {\n    }\n\n    public function file(): SourceFile\n    {\n        return $this->file;\n    }\n\n    public function scope(): Scope\n    {\n        return $this->scope;\n    }\n\n    public function project(): ProjectContext\n    {\n        return $this->project;\n    }\n\n    public function index(): ProjectIndex\n    {\n        return $this->project->index();\n    }\n\n    public function framework(): DetectedFramework\n    {\n        return $this->project->framework();\n    }\n\n    public function runtimes(): RuntimeTargetSet\n    {\n        return $this->project->runtimes();\n    }\n\n    public function projectRoot(): string\n    {\n        return $this->project->projectRoot();\n    }\n\n    public function location(Node $node): Location\n    {\n        return AstHelper::location($node, $this->file);\n    }\n\n    public function snippet(Node|int $at): ?string\n    {\n        return $this->file->snippet($at instanceof Node ? max(1, $at->getStartLine()) : $at);\n    }\n\n    /**\n     * Whitespace-normalized source of the whole node, used as finding identity.\n     */\n    public function excerpt(Node $node): ?string\n    {\n        return $this->file->identitySource($node->getStartFilePos(), $node->getEndFilePos());\n    }\n}\n","src/Rule/RuleDefinition.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Rule;\n\nuse WorkerSafety\\Finding\\RuleCategory;\nuse WorkerSafety\\Finding\\Severity;\nuse WorkerSafety\\Runtime\\RuntimeTargetSet;\n\n/**\n * Static metadata describing one rule.\n */\nfinal class RuleDefinition\n{\n    /**\n     * @param list<string> $remediation ordered, actionable suggestions\n     * @param string|null $requiresFramework framework identifier the rule needs, or null for any project\n     */\n    public function __construct(\n        public readonly string $id,\n        public readonly string $title,\n        public readonly string $description,\n        public readonly Severity $defaultSeverity,\n        public readonly RuleCategory $category,\n        public readonly array $remediation,\n        public readonly RuntimeTargetSet $runtimes,\n        public readonly ?string $requiresFramework = null,\n    ) {\n    }\n}\n","src/Rule/RuleId.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Rule;\n\n/**\n * Canonical rule identifiers, referenced by configuration and tests.\n */\nfinal class RuleId\n{\n    public const MUTABLE_STATIC_PROPERTY = 'WS001';\n    public const MUTABLE_GLOBAL_VARIABLE = 'WS002';\n    public const RUNTIME_ENVIRONMENT_MUTATION = 'WS003';\n    public const MUTABLE_SINGLETON = 'WS004';\n    public const LARAVEL_SINGLETON_MUTABLE_STATE = 'WS005';\n    public const LARAVEL_SCOPED_CANDIDATE = 'WS006';\n    public const STATIC_REQUEST_CONTEXT = 'WS007';\n    public const STATIC_COLLECTION_GROWTH = 'WS008';\n    public const PERSISTENT_LISTENER_REGISTRATION = 'WS009';\n    public const SHUTDOWN_LIFECYCLE_ASSUMPTION = 'WS010';\n\n    private function __construct()\n    {\n    }\n\n    /**\n     * @return list<string>\n     */\n    public static function all(): array\n    {\n        return [\n            self::MUTABLE_STATIC_PROPERTY,\n            self::MUTABLE_GLOBAL_VARIABLE,\n            self::RUNTIME_ENVIRONMENT_MUTATION,\n            self::MUTABLE_SINGLETON,\n            self::LARAVEL_SINGLETON_MUTABLE_STATE,\n            self::LARAVEL_SCOPED_CANDIDATE,\n            self::STATIC_REQUEST_CONTEXT,\n            self::STATIC_COLLECTION_GROWTH,\n            self::PERSISTENT_LISTENER_REGISTRATION,\n            self::SHUTDOWN_LIFECYCLE_ASSUMPTION,\n        ];\n    }\n}\n","src/Rule/RuleRegistry.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Rule;\n\nuse WorkerSafety\\Config\\Configuration;\nuse WorkerSafety\\Framework\\DetectedFramework;\nuse WorkerSafety\\Runtime\\RuntimeTargetSet;\n\n/**\n * Holds the available rules and decides which apply to a given scan.\n */\nfinal class RuleRegistry\n{\n    /**\n     * @var array<string, Rule>\n     */\n    private array $rules = [];\n\n    /**\n     * @param iterable<Rule> $rules\n     */\n    public function __construct(iterable $rules = [])\n    {\n        foreach ($rules as $rule) {\n            $this->register($rule);\n        }\n    }\n\n    public function register(Rule $rule): void\n    {\n        $this->rules[$rule->definition()->id] = $rule;\n    }\n\n    public function has(string $ruleId): bool\n    {\n        return isset($this->rules[strtoupper($ruleId)]);\n    }\n\n    public function get(string $ruleId): ?Rule\n    {\n        return $this->rules[strtoupper($ruleId)] ?? null;\n    }\n\n    /**\n     * All registered rules ordered by id.\n     *\n     * @return list<Rule>\n     */\n    public function all(): array\n    {\n        $rules = $this->rules;\n        ksort($rules);\n\n        return array_values($rules);\n    }\n\n    /**\n     * @return list<string>\n     */\n    public function ids(): array\n    {\n        $ids = array_keys($this->rules);\n        sort($ids);\n\n        return $ids;\n    }\n\n    /**\n     * Rules that are enabled, match the detected framework and target at least\n     * one of the selected runtimes.\n     *\n     * @return list<Rule>\n     */\n    public function enabledFor(\n        Configuration $configuration,\n        DetectedFramework $framework,\n        RuntimeTargetSet $runtimes,\n    ): array {\n        $enabled = [];\n\n        foreach ($this->all() as $rule) {\n            $definition = $rule->definition();\n\n            if (!$configuration->isRuleEnabled($definition->id)) {\n                continue;\n            }\n\n            if ($definition->requiresFramework !== null\n                && $definition->requiresFramework !== $framework->identifier()\n            ) {\n                continue;\n            }\n\n            if ($runtimes->intersect($definition->runtimes)->isEmpty()) {\n                continue;\n            }\n\n            $enabled[] = $rule;\n        }\n\n        return $enabled;\n    }\n\n    public function count(): int\n    {\n        return count($this->rules);\n    }\n}\n","src/Rule/RuleRegistryFactory.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Rule;\n\nuse WorkerSafety\\Framework\\FrameworkAdapterRegistry;\nuse WorkerSafety\\Rule\\BuiltIn\\MutableGlobalVariableRule;\nuse WorkerSafety\\Rule\\BuiltIn\\MutableSingletonRule;\nuse WorkerSafety\\Rule\\BuiltIn\\MutableStaticPropertyRule;\nuse WorkerSafety\\Rule\\BuiltIn\\PersistentListenerRegistrationRule;\nuse WorkerSafety\\Rule\\BuiltIn\\RuntimeEnvironmentMutationRule;\nuse WorkerSafety\\Rule\\BuiltIn\\ShutdownLifecycleAssumptionRule;\nuse WorkerSafety\\Rule\\BuiltIn\\StaticCollectionGrowthRule;\nuse WorkerSafety\\Rule\\BuiltIn\\StaticRequestContextRule;\n\n/**\n * Builds the rule registry from the built-in rules plus every framework\n * adapter's rules.\n *\n * Framework-specific rules are always registered; {@see RuleRegistry::enabledFor()}\n * is what decides whether they run for the project at hand. That way\n * `worker-safety rules` can list the complete rule set regardless of which\n * project it is invoked in.\n */\nfinal class RuleRegistryFactory\n{\n    public function __construct(private readonly FrameworkAdapterRegistry $adapters = new FrameworkAdapterRegistry())\n    {\n    }\n\n    public function create(): RuleRegistry\n    {\n        $registry = new RuleRegistry($this->builtIn());\n\n        foreach ($this->adapters->all() as $adapter) {\n            foreach ($adapter->rules() as $rule) {\n                $registry->register($rule);\n            }\n        }\n\n        return $registry;\n    }\n\n    /**\n     * The framework-independent rules.\n     *\n     * @return list<Rule>\n     */\n    public function builtIn(): array\n    {\n        return [\n            new MutableStaticPropertyRule(),\n            new MutableGlobalVariableRule(),\n            new RuntimeEnvironmentMutationRule(),\n            new MutableSingletonRule(),\n            new StaticRequestContextRule(),\n            new StaticCollectionGrowthRule(),\n            new PersistentListenerRegistrationRule(),\n            new ShutdownLifecycleAssumptionRule(),\n        ];\n    }\n}\n","src/Rule/Scope.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Rule;\n\nuse PhpParser\\Node;\nuse PhpParser\\Node\\FunctionLike;\nuse PhpParser\\Node\\Stmt;\nuse WorkerSafety\\Ast\\Index\\ClassKind;\nuse WorkerSafety\\Finding\\SymbolContext;\n\n/**\n * The class / function nesting at the node currently being visited.\n *\n * Maintained by {@see RuleDispatchVisitor} and exposed to rules read-only\n * through {@see RuleContext}.\n */\nfinal class Scope\n{\n    /**\n     * @var list<array{name: string, short: string, parent: string|null, kind: ClassKind, node: Stmt\\ClassLike}>\n     */\n    private array $classes = [];\n\n    /**\n     * @var list<array{name: string|null, node: FunctionLike, isMethod: bool, isStatic: bool}>\n     */\n    private array $functions = [];\n\n    public function reset(): void\n    {\n        $this->classes = [];\n        $this->functions = [];\n    }\n\n    public function enterClass(\n        Stmt\\ClassLike $node,\n        string $name,\n        string $shortName,\n        ?string $parent,\n        ClassKind $kind,\n    ): void {\n        $this->classes[] = [\n            'name' => $name,\n            'short' => $shortName,\n            'parent' => $parent,\n            'kind' => $kind,\n            'node' => $node,\n        ];\n    }\n\n    public function leaveClass(): void\n    {\n        array_pop($this->classes);\n    }\n\n    public function enterFunction(FunctionLike $node, ?string $name, bool $isMethod, bool $isStatic): void\n    {\n        $this->functions[] = [\n            'name' => $name,\n            'node' => $node,\n            'isMethod' => $isMethod,\n            'isStatic' => $isStatic,\n        ];\n    }\n\n    public function leaveFunction(): void\n    {\n        array_pop($this->functions);\n    }\n\n    public function isInsideClass(): bool\n    {\n        return $this->classes !== [];\n    }\n\n    public function isInsideFunction(): bool\n    {\n        return $this->functions !== [];\n    }\n\n    public function className(): ?string\n    {\n        $current = $this->currentClass();\n\n        return $current === null ? null : $current['name'];\n    }\n\n    public function classShortName(): ?string\n    {\n        $current = $this->currentClass();\n\n        return $current === null ? null : $current['short'];\n    }\n\n    public function parentClass(): ?string\n    {\n        $current = $this->currentClass();\n\n        return $current === null ? null : $current['parent'];\n    }\n\n    public function classKind(): ?ClassKind\n    {\n        $current = $this->currentClass();\n\n        return $current === null ? null : $current['kind'];\n    }\n\n    public function classNode(): ?Stmt\\ClassLike\n    {\n        $current = $this->currentClass();\n\n        return $current === null ? null : $current['node'];\n    }\n\n    /**\n     * Innermost function-like node, closures included.\n     */\n    public function functionNode(): ?FunctionLike\n    {\n        $current = $this->currentFunction();\n\n        return $current === null ? null : $current['node'];\n    }\n\n    /**\n     * Name of the nearest enclosing named function or method.\n     */\n    public function functionName(): ?string\n    {\n        for ($i = count($this->functions) - 1; $i >= 0; --$i) {\n            if ($this->functions[$i]['name'] !== null) {\n                return $this->functions[$i]['name'];\n            }\n        }\n\n        return null;\n    }\n\n    /**\n     * Name of the nearest enclosing method (null inside plain functions).\n     */\n    public function methodName(): ?string\n    {\n        for ($i = count($this->functions) - 1; $i >= 0; --$i) {\n            if ($this->functions[$i]['isMethod']) {\n                return $this->functions[$i]['name'];\n            }\n        }\n\n        return null;\n    }\n\n    /**\n     * Nearest enclosing method node, used by rules that need to inspect the\n     * whole method body from one of its statements.\n     */\n    public function methodNode(): ?Stmt\\ClassMethod\n    {\n        for ($i = count($this->functions) - 1; $i >= 0; --$i) {\n            $node = $this->functions[$i]['node'];\n\n            if ($node instanceof Stmt\\ClassMethod) {\n                return $node;\n            }\n        }\n\n        return null;\n    }\n\n    public function isInsideClosure(): bool\n    {\n        $current = $this->currentFunction();\n\n        return $current !== null && $current['name'] === null;\n    }\n\n    public function symbol(?string $property = null, ?string $variable = null): SymbolContext\n    {\n        return new SymbolContext(\n            $this->className(),\n            $property === null ? $this->methodName() : null,\n            $property,\n            $variable,\n        );\n    }\n\n    /**\n     * @return array{name: string, short: string, parent: string|null, kind: ClassKind, node: Stmt\\ClassLike}|null\n     */\n    private function currentClass(): ?array\n    {\n        return $this->classes === [] ? null : $this->classes[count($this->classes) - 1];\n    }\n\n    /**\n     * @return array{name: string|null, node: FunctionLike, isMethod: bool, isStatic: bool}|null\n     */\n    private function currentFunction(): ?array\n    {\n        return $this->functions === [] ? null : $this->functions[count($this->functions) - 1];\n    }\n\n    /**\n     * Convenience for rules that need to know whether a node is a top-level\n     * statement rather than part of a function body.\n     */\n    public function isFileScope(): bool\n    {\n        return $this->classes === [] && $this->functions === [];\n    }\n\n    public function describeLocationScope(): string\n    {\n        $class = $this->className();\n        $function = $this->functionName();\n\n        if ($class !== null && $function !== null) {\n            return $class . '::' . $function . '()';\n        }\n\n        if ($class !== null) {\n            return $class;\n        }\n\n        if ($function !== null) {\n            return $function . '()';\n        }\n\n        return 'file scope';\n    }\n\n    /**\n     * Node type guard used by the dispatch visitor.\n     */\n    public static function isFunctionLike(Node $node): bool\n    {\n        return $node instanceof FunctionLike;\n    }\n}\n","src/Runtime/RuntimeTarget.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Runtime;\n\nuse WorkerSafety\\Exception\\ConfigurationException;\n\n/**\n * A persistent PHP worker runtime the analysis can target.\n */\nenum RuntimeTarget: string\n{\n    case FrankenPhp = 'frankenphp';\n    case Octane = 'octane';\n    case RoadRunner = 'roadrunner';\n    case Swoole = 'swoole';\n\n    public function label(): string\n    {\n        return match ($this) {\n            self::FrankenPhp => 'FrankenPHP',\n            self::Octane => 'Octane',\n            self::RoadRunner => 'RoadRunner',\n            self::Swoole => 'Swoole',\n        };\n    }\n\n    /**\n     * One short runtime specific remark, shown when a single runtime is targeted.\n     */\n    public function note(): string\n    {\n        return match ($this) {\n            self::FrankenPhp => 'FrankenPHP worker mode keeps the same PHP process (and therefore every static, global and singleton) alive across the whole worker loop. It does reset $_GET, $_POST, $_COOKIE, $_FILES, $_SERVER and $_REQUEST between requests; $_ENV is the documented exception.',\n            self::Octane => 'Laravel Octane resets framework container state between requests, but application-owned statics and globals are never flushed for you. `octane.flush` calls forgetInstance() on container bindings only, so a static property still needs an explicit reset from a RequestReceived or RequestTerminated listener.',\n            self::RoadRunner => 'RoadRunner reuses the PHP worker process for many requests; only a worker restart (max_jobs) clears retained state.',\n            self::Swoole => 'Swoole runs requests in coroutines inside a shared process, so retained state is visible across requests and may be read concurrently.',\n        };\n    }\n\n    public static function fromString(string $value): self\n    {\n        $normalized = strtolower(trim($value));\n        $normalized = match ($normalized) {\n            'franken-php', 'franken_php', 'frankenphp' => 'frankenphp',\n            'road-runner', 'road_runner', 'roadrunner', 'rr' => 'roadrunner',\n            'laravel-octane', 'octane' => 'octane',\n            'openswoole', 'open-swoole', 'swoole' => 'swoole',\n            default => $normalized,\n        };\n\n        $runtime = self::tryFrom($normalized);\n\n        if (!$runtime instanceof self) {\n            throw ConfigurationException::invalidValue(\n                'runtime',\n                sprintf('\"%s\" is not a known runtime (%s, all).', $value, implode(', ', self::names())),\n            );\n        }\n\n        return $runtime;\n    }\n\n    /**\n     * @return list<self>\n     */\n    public static function all(): array\n    {\n        return self::cases();\n    }\n\n    /**\n     * @return list<string>\n     */\n    public static function names(): array\n    {\n        return array_map(static fn (self $case): string => $case->value, self::cases());\n    }\n}\n","src/Runtime/RuntimeTargetSet.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Runtime;\n\n/**\n * Immutable, de-duplicated, canonically ordered set of runtime targets.\n *\n * @implements \\IteratorAggregate<int, RuntimeTarget>\n */\nfinal class RuntimeTargetSet implements \\Countable, \\IteratorAggregate\n{\n    /**\n     * @var list<RuntimeTarget>\n     */\n    private readonly array $targets;\n\n    /**\n     * @param iterable<RuntimeTarget> $targets\n     */\n    public function __construct(iterable $targets)\n    {\n        $seen = [];\n\n        foreach ($targets as $target) {\n            $seen[$target->value] = true;\n        }\n\n        // Keep the declaration order of the enum for stable output.\n        $ordered = [];\n\n        foreach (RuntimeTarget::cases() as $case) {\n            if (isset($seen[$case->value])) {\n                $ordered[] = $case;\n            }\n        }\n\n        $this->targets = $ordered;\n    }\n\n    public static function all(): self\n    {\n        return new self(RuntimeTarget::all());\n    }\n\n    /**\n     * @param list<string> $values\n     */\n    public static function fromStrings(array $values): self\n    {\n        $targets = [];\n\n        foreach ($values as $value) {\n            if (strtolower(trim($value)) === 'all') {\n                return self::all();\n            }\n\n            $targets[] = RuntimeTarget::fromString($value);\n        }\n\n        return new self($targets);\n    }\n\n    public function contains(RuntimeTarget $target): bool\n    {\n        return in_array($target, $this->targets, true);\n    }\n\n    public function isEmpty(): bool\n    {\n        return $this->targets === [];\n    }\n\n    public function isAll(): bool\n    {\n        return count($this->targets) === count(RuntimeTarget::cases());\n    }\n\n    /**\n     * @param iterable<RuntimeTarget> $other\n     */\n    public function intersect(iterable $other): self\n    {\n        $result = [];\n\n        foreach ($other as $target) {\n            if ($this->contains($target)) {\n                $result[] = $target;\n            }\n        }\n\n        return new self($result);\n    }\n\n    /**\n     * @return list<RuntimeTarget>\n     */\n    public function toArray(): array\n    {\n        return $this->targets;\n    }\n\n    /**\n     * @return list<string>\n     */\n    public function values(): array\n    {\n        return array_map(static fn (RuntimeTarget $target): string => $target->value, $this->targets);\n    }\n\n    /**\n     * @return list<string>\n     */\n    public function labels(): array\n    {\n        return array_map(static fn (RuntimeTarget $target): string => $target->label(), $this->targets);\n    }\n\n    public function describe(): string\n    {\n        if ($this->isEmpty()) {\n            return 'none';\n        }\n\n        return implode(', ', $this->labels());\n    }\n\n    public function count(): int\n    {\n        return count($this->targets);\n    }\n\n    public function getIterator(): \\Traversable\n    {\n        return new \\ArrayIterator($this->targets);\n    }\n}\n","src/Support/ExcludeMatcher.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Support;\n\n/**\n * Matches project-relative paths against the configured exclude patterns.\n *\n * Supported pattern forms:\n *  - `vendor`            a path segment anywhere in the path\n *  - `app/Legacy`        a path prefix relative to the project root\n *  - `*.blade.php`       an fnmatch glob applied to the full relative path and to the basename\n */\nfinal class ExcludeMatcher\n{\n    /**\n     * @var list<string>\n     */\n    private readonly array $globs;\n\n    /**\n     * @var array<string, true>\n     */\n    private readonly array $segments;\n\n    /**\n     * @var list<string>\n     */\n    private readonly array $prefixes;\n\n    /**\n     * @param list<string> $patterns\n     */\n    public function __construct(array $patterns)\n    {\n        $globs = [];\n        $segments = [];\n        $prefixes = [];\n\n        foreach ($patterns as $pattern) {\n            $pattern = trim(str_replace('\\\\', '/', $pattern));\n            $pattern = trim($pattern, '/');\n\n            if ($pattern === '') {\n                continue;\n            }\n\n            if (str_contains($pattern, '*') || str_contains($pattern, '?') || str_contains($pattern, '[')) {\n                $globs[] = $pattern;\n\n                continue;\n            }\n\n            if (str_contains($pattern, '/')) {\n                $prefixes[] = $pattern;\n\n                continue;\n            }\n\n            $segments[$pattern] = true;\n        }\n\n        $this->globs = $globs;\n        $this->segments = $segments;\n        $this->prefixes = $prefixes;\n    }\n\n    /**\n     * @param list<string> $patterns\n     */\n    public static function fromPatterns(array $patterns): self\n    {\n        return new self($patterns);\n    }\n\n    public function matches(string $relativePath): bool\n    {\n        $relativePath = trim(str_replace('\\\\', '/', $relativePath), '/');\n\n        if ($relativePath === '') {\n            return false;\n        }\n\n        if ($this->segments !== []) {\n            foreach (explode('/', $relativePath) as $segment) {\n                if (isset($this->segments[$segment])) {\n                    return true;\n                }\n            }\n        }\n\n        foreach ($this->prefixes as $prefix) {\n            if ($relativePath === $prefix || str_starts_with($relativePath, $prefix . '/')) {\n                return true;\n            }\n        }\n\n        if ($this->globs !== []) {\n            $basename = basename($relativePath);\n\n            foreach ($this->globs as $glob) {\n                if (fnmatch($glob, $relativePath) || fnmatch($glob, $basename)) {\n                    return true;\n                }\n            }\n        }\n\n        return false;\n    }\n\n    public function isEmpty(): bool\n    {\n        return $this->globs === [] && $this->segments === [] && $this->prefixes === [];\n    }\n}\n","src/Support/FileFinder.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Support;\n\nuse WorkerSafety\\Exception\\AnalysisException;\n\n/**\n * Discovers PHP files to analyze.\n *\n * Excluded directories are pruned during traversal instead of being filtered\n * afterwards, which is what keeps `vendor/` from ever being walked.\n */\nfinal class FileFinder\n{\n    public function __construct(\n        private readonly string $projectRoot,\n        private readonly ExcludeMatcher $excludes,\n        /** @var list<string> */\n        private readonly array $extensions = ['php'],\n    ) {\n    }\n\n    /**\n     * @param list<string> $paths absolute file or directory paths\n     *\n     * @return list<string> sorted absolute file paths\n     */\n    public function find(array $paths): array\n    {\n        if ($paths === []) {\n            throw AnalysisException::noPaths();\n        }\n\n        $files = [];\n\n        foreach ($paths as $path) {\n            if (!file_exists($path)) {\n                throw AnalysisException::pathNotFound($path);\n            }\n\n            if (is_file($path)) {\n                // An explicitly named file bypasses the extension filter but not\n                // the exclude list, so `scan storage/x.php` still honours config.\n                if (!$this->isExcluded($path)) {\n                    $files[$path] = true;\n                }\n\n                continue;\n            }\n\n            foreach ($this->walk($path) as $file) {\n                $files[$file] = true;\n            }\n        }\n\n        $result = array_keys($files);\n        sort($result, SORT_STRING);\n\n        return $result;\n    }\n\n    /**\n     * @return list<string>\n     */\n    private function walk(string $directory): array\n    {\n        $directoryIterator = new \\RecursiveDirectoryIterator(\n            $directory,\n            \\FilesystemIterator::SKIP_DOTS | \\FilesystemIterator::CURRENT_AS_FILEINFO | \\FilesystemIterator::UNIX_PATHS,\n        );\n\n        $filter = new \\RecursiveCallbackFilterIterator(\n            $directoryIterator,\n            function (\\SplFileInfo $current): bool {\n                // Never traverse into symlinked directories: they invite cycles\n                // and usually point back into excluded trees.\n                if ($current->isLink()) {\n                    return false;\n                }\n\n                if ($current->isDir()) {\n                    return !$this->isExcluded($current->getPathname());\n                }\n\n                return $current->isFile()\n                    && $this->hasScannableExtension($current->getFilename())\n                    && !$this->isExcluded($current->getPathname());\n            },\n        );\n\n        $files = [];\n\n        /** @var \\SplFileInfo $file */\n        foreach (new \\RecursiveIteratorIterator($filter, \\RecursiveIteratorIterator::LEAVES_ONLY) as $file) {\n            if ($file->isFile()) {\n                $files[] = Paths::normalize($file->getPathname());\n            }\n        }\n\n        return $files;\n    }\n\n    private function hasScannableExtension(string $filename): bool\n    {\n        $extension = strtolower(pathinfo($filename, PATHINFO_EXTENSION));\n\n        return in_array($extension, $this->extensions, true);\n    }\n\n    private function isExcluded(string $absolutePath): bool\n    {\n        if ($this->excludes->isEmpty()) {\n            return false;\n        }\n\n        return $this->excludes->matches(Paths::makeRelative(Paths::normalize($absolutePath), $this->projectRoot));\n    }\n}\n","src/Support/NameHeuristics.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Support;\n\n/**\n * Identifier heuristics shared by the naming sensitive rules.\n *\n * The goal is a deliberately conservative signal: a name only counts as\n * request scoped when it contains request vocabulary *and* no vocabulary that\n * marks it as configuration or infrastructure. `$currentUser` matches,\n * `$userTable` and `UserRepository` do not.\n */\nfinal class NameHeuristics\n{\n    /**\n     * Vocabulary that suggests state belonging to a single request.\n     *\n     * @var list<string>\n     */\n    private const REQUEST_TOKENS = [\n        'account',\n        'actor',\n        'auth',\n        'authenticated',\n        'bearer',\n        'cookie',\n        'cookies',\n        'credential',\n        'credentials',\n        'csrf',\n        'header',\n        'headers',\n        'identity',\n        'impersonated',\n        'jwt',\n        'locale',\n        'principal',\n        'request',\n        'response',\n        'session',\n        'tenant',\n        'token',\n        'user',\n        'users',\n        'viewer',\n    ];\n\n    /**\n     * Vocabulary that turns a request-looking name into configuration or\n     * infrastructure. Presence of any of these disqualifies the name.\n     *\n     * @var list<string>\n     */\n    private const NEUTRALIZING_TOKENS = [\n        'builder',\n        'class',\n        'classname',\n        'column',\n        'columns',\n        'config',\n        'configuration',\n        'default',\n        'defaults',\n        'driver',\n        'factory',\n        'field',\n        'fields',\n        'format',\n        'formatter',\n        'handler',\n        'interface',\n        'label',\n        'labels',\n        'logger',\n        'manager',\n        'map',\n        'mapper',\n        'mapping',\n        'middleware',\n        'migration',\n        'normalizer',\n        'option',\n        'options',\n        'pattern',\n        'policy',\n        'prefix',\n        'provider',\n        'repository',\n        'resolver',\n        'route',\n        'routes',\n        'schema',\n        'seeder',\n        'serializer',\n        'service',\n        'setting',\n        'settings',\n        'subscriber',\n        'suffix',\n        'table',\n        'template',\n        'transformer',\n        'validator',\n    ];\n\n    /**\n     * Vocabulary that suggests an accumulating structure.\n     *\n     * @var list<string>\n     */\n    private const COLLECTION_TOKENS = [\n        'buffer',\n        'cache',\n        'cached',\n        'entries',\n        'index',\n        'instances',\n        'items',\n        'list',\n        'loaded',\n        'log',\n        'logs',\n        'memo',\n        'memoized',\n        'pool',\n        'queue',\n        'records',\n        'registry',\n        'resolved',\n        'results',\n        'rows',\n        'seen',\n        'stack',\n        'store',\n    ];\n\n    /**\n     * Method name prefixes that indicate the class can release retained state.\n     *\n     * @var list<string>\n     */\n    private const RESET_TOKENS = [\n        'clean',\n        'cleanup',\n        'clear',\n        'destroy',\n        'flush',\n        'forget',\n        'gc',\n        'invalidate',\n        'prune',\n        'purge',\n        'release',\n        'reset',\n        'terminate',\n        'teardown',\n        'truncate',\n    ];\n\n    private function __construct()\n    {\n    }\n\n    /**\n     * Split camelCase, PascalCase, snake_case and kebab-case into lowercase tokens.\n     *\n     * @return list<string>\n     */\n    public static function tokenize(string $identifier): array\n    {\n        $parts = preg_split(\n            '/(?<=[a-z0-9])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])|(?<=[a-zA-Z])(?=[0-9])|[^a-zA-Z0-9]+/',\n            $identifier,\n        );\n\n        if ($parts === false) {\n            return [strtolower($identifier)];\n        }\n\n        $tokens = [];\n\n        foreach ($parts as $part) {\n            if ($part === '') {\n                continue;\n            }\n\n            $tokens[] = strtolower($part);\n        }\n\n        return $tokens;\n    }\n\n    /**\n     * True when the identifier reads like state scoped to a single request.\n     */\n    public static function looksRequestScoped(string $identifier): bool\n    {\n        return self::requestTokens($identifier) !== [];\n    }\n\n    /**\n     * The request vocabulary found in the identifier, empty when neutralized.\n     *\n     * @return list<string>\n     */\n    public static function requestTokens(string $identifier): array\n    {\n        $tokens = self::tokenize($identifier);\n\n        if ($tokens === []) {\n            return [];\n        }\n\n        foreach ($tokens as $token) {\n            if (in_array($token, self::NEUTRALIZING_TOKENS, true)) {\n                return [];\n            }\n        }\n\n        $matched = [];\n\n        foreach ($tokens as $token) {\n            if (in_array($token, self::REQUEST_TOKENS, true) && !in_array($token, $matched, true)) {\n                $matched[] = $token;\n            }\n        }\n\n        return $matched;\n    }\n\n    /**\n     * True when any of the given identifiers reads like request scoped state.\n     *\n     * @param list<string> $identifiers\n     */\n    public static function anyLooksRequestScoped(array $identifiers): bool\n    {\n        foreach ($identifiers as $identifier) {\n            if (self::looksRequestScoped($identifier)) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n\n    public static function looksLikeCollection(string $identifier): bool\n    {\n        foreach (self::tokenize($identifier) as $token) {\n            if (in_array($token, self::COLLECTION_TOKENS, true)) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n\n    /**\n     * True for method names such as `reset()`, `flushState()` or `clearCache()`.\n     */\n    public static function looksLikeReset(string $methodName): bool\n    {\n        foreach (self::tokenize($methodName) as $token) {\n            if (in_array($token, self::RESET_TOKENS, true)) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n}\n","src/Support/Paths.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Support;\n\n/**\n * Pure path helpers. Nothing here touches the filesystem except realpath().\n */\nfinal class Paths\n{\n    private function __construct()\n    {\n    }\n\n    /**\n     * Normalize separators and collapse `.` / `..` segments without resolving symlinks.\n     */\n    public static function normalize(string $path): string\n    {\n        $path = str_replace('\\\\', '/', $path);\n        $isAbsolute = str_starts_with($path, '/');\n        $prefix = '';\n\n        if (preg_match('#^([a-zA-Z]:)/#', $path, $matches) === 1) {\n            $prefix = $matches[1];\n            $path = substr($path, strlen($prefix));\n            $isAbsolute = true;\n        }\n\n        $segments = [];\n\n        foreach (explode('/', $path) as $segment) {\n            if ($segment === '' || $segment === '.') {\n                continue;\n            }\n\n            if ($segment === '..') {\n                if ($segments !== [] && end($segments) !== '..') {\n                    array_pop($segments);\n\n                    continue;\n                }\n\n                if ($isAbsolute) {\n                    continue;\n                }\n            }\n\n            $segments[] = $segment;\n        }\n\n        $normalized = implode('/', $segments);\n\n        if ($isAbsolute) {\n            return $prefix . '/' . $normalized;\n        }\n\n        return $normalized === '' ? '.' : $normalized;\n    }\n\n    public static function isAbsolute(string $path): bool\n    {\n        $path = str_replace('\\\\', '/', $path);\n\n        return str_starts_with($path, '/') || preg_match('#^[a-zA-Z]:/#', $path) === 1;\n    }\n\n    public static function makeAbsolute(string $path, string $workingDirectory): string\n    {\n        if (self::isAbsolute($path)) {\n            return self::normalize($path);\n        }\n\n        return self::normalize($workingDirectory . '/' . $path);\n    }\n\n    /**\n     * Express $path relative to $base. Falls back to the absolute path when the\n     * two live on different roots.\n     */\n    public static function makeRelative(string $path, string $base): string\n    {\n        $path = self::normalize($path);\n        $base = rtrim(self::normalize($base), '/');\n\n        if ($base === '' || $base === '/') {\n            return ltrim($path, '/');\n        }\n\n        if ($path === $base) {\n            return '.';\n        }\n\n        if (str_starts_with($path, $base . '/')) {\n            return substr($path, strlen($base) + 1);\n        }\n\n        return $path;\n    }\n\n    /**\n     * @return list<string>\n     */\n    public static function segments(string $path): array\n    {\n        return array_values(array_filter(explode('/', self::normalize($path)), static fn (string $s): bool => $s !== ''));\n    }\n}\n","src/Support/SourceFile.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace WorkerSafety\\Support;\n\n/**\n * A PHP file selected for analysis, together with its source.\n */\nfinal class SourceFile\n{\n    /**\n     * @var list<string>|null\n     */\n    private ?array $lines = null;\n\n    /**\n     * @var list<array{0: int, 1: int|null, 2: string}>|null\n     */\n    private ?array $tokens = null;\n\n    public function __construct(\n        public readonly string $absolutePath,\n        public readonly string $relativePath,\n        public readonly string $source,\n    ) {\n    }\n\n    public static function fromPath(string $absolutePath, string $projectRoot): self\n    {\n        $source = @file_get_contents($absolutePath);\n\n        return new self(\n            $absolutePath,\n            Paths::makeRelative($absolutePath, $projectRoot),\n            $source === false ? '' : $source,\n        );\n    }\n\n    /**\n     * 1-indexed source line without the trailing newline, or null when out of range.\n     */\n    public function line(int $number): ?string\n    {\n        $lines = $this->lines();\n\n        return $lines[$number - 1] ?? null;\n    }\n\n    /**\n     * Trimmed single line snippet suitable for reports.\n     */\n    public function snippet(int $line): ?string\n    {\n        $source = $this->line($line);\n\n        if ($source === null) {\n            return null;\n        }\n\n        $trimmed = trim($source);\n\n        return $trimmed === '' ? null : $trimmed;\n    }\n\n    /**\n     * Canonical source of a byte range, used as the identity of a finding.\n     *\n     * Walks the token stream rather than the raw text so that the result is\n     * stable under reformatting but exact about content:\n     *\n     *  - runs of whitespace *between* tokens collapse to a single space, so\n     *    re-indenting a file does not invalidate a baseline;\n     *  - the text of every other token, string literals and heredoc bodies\n     *    included, is kept byte for byte, so `'a  b'` and `'a b'` stay\n     *    distinct;\n     *  - comments are dropped, so annotating code does not change its identity.\n     *\n     * There is deliberately no length limit: truncating the identity is what\n     * let two different calls share a fingerprint.\n     */\n    public function identitySource(int $startFilePos, int $endFilePos): ?string\n    {\n        if ($startFilePos < 0 || $endFilePos < $startFilePos) {\n            return null;\n        }\n\n        $parts = [];\n\n        foreach ($this->tokens() as [$offset, $id, $text]) {\n            if ($offset + strlen($text) - 1 < $startFilePos) {\n                continue;\n            }\n\n            if ($offset > $endFilePos) {\n                break;\n            }\n\n            if ($id === T_COMMENT || $id === T_DOC_COMMENT) {\n                continue;\n            }\n\n            $parts[] = $id === T_WHITESPACE ? ' ' : $text;\n        }\n\n        $result = trim(implode('', $parts));\n\n        return $result === '' ? null : $result;\n    }\n\n    /**\n     * Lazily tokenized source as `[byte offset, token id or null, text]`.\n     *\n     * @return list<array{0: int, 1: int|null, 2: string}>\n     */\n    private function tokens(): array\n    {\n        if ($this->tokens !== null) {\n            return $this->tokens;\n        }\n\n        $tokens = [];\n        $offset = 0;\n\n        foreach (@token_get_all($this->source) as $token) {\n            if (is_array($token)) {\n                $tokens[] = [$offset, $token[0], $token[1]];\n                $offset += strlen($token[1]);\n\n                continue;\n            }\n\n            $tokens[] = [$offset, null, $token];\n            $offset += strlen($token);\n        }\n\n        return $this->tokens = $tokens;\n    }\n\n    public function lineCount(): int\n    {\n        return count($this->lines());\n    }\n\n    /**\n     * @return list<string>\n     */\n    public function lines(): array\n    {\n        if ($this->lines === null) {\n            $this->lines = explode(\"\\n\", str_replace([\"\\r\\n\", \"\\r\"], \"\\n\", $this->source));\n        }\n\n        return $this->lines;\n    }\n}\n","vendor/autoload.php":"<?php\n\n// autoload.php @generated by Composer\n\nif (PHP_VERSION_ID < 50600) {\n    if (!headers_sent()) {\n        header('HTTP/1.1 500 Internal Server Error');\n    }\n    $err = 'Composer 2.3.0 dropped support for autoloading on PHP <5.6 and you are running '.PHP_VERSION.', please upgrade PHP or use Composer 2.2 LTS via \"composer self-update --2.2\". Aborting.'.PHP_EOL;\n    if (!ini_get('display_errors')) {\n        if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') {\n            fwrite(STDERR, $err);\n        } elseif (!headers_sent()) {\n            echo $err;\n        }\n    }\n    throw new RuntimeException($err);\n}\n\nrequire_once __DIR__ . '/composer/autoload_real.php';\n\nreturn ComposerAutoloaderInitade0b511dfb236ccca8e627237d0e6fb::getLoader();\n","vendor/bin/php-parse":"#!/usr/bin/env php\n<?php\n\n/**\n * Proxy PHP file generated by Composer\n *\n * This file includes the referenced bin path (../nikic/php-parser/bin/php-parse)\n * using a stream wrapper to prevent the shebang from being output on PHP<8\n *\n * @generated\n */\n\nnamespace Composer;\n\n$GLOBALS['_composer_bin_dir'] = __DIR__;\n$GLOBALS['_composer_autoload_path'] = __DIR__ . '/..'.'/autoload.php';\n\nif (PHP_VERSION_ID < 80000) {\n    if (!class_exists('Composer\\BinProxyWrapper')) {\n        /**\n         * @internal\n         */\n        final class BinProxyWrapper\n        {\n            private $handle;\n            private $position;\n            private $realpath;\n\n            public function stream_open($path, $mode, $options, &$opened_path)\n            {\n                // get rid of phpvfscomposer:// prefix for __FILE__ & __DIR__ resolution\n                $opened_path = substr($path, 17);\n                $this->realpath = realpath($opened_path) ?: $opened_path;\n                $opened_path = $this->realpath;\n                $this->handle = fopen($this->realpath, $mode);\n                $this->position = 0;\n\n                return (bool) $this->handle;\n            }\n\n            public function stream_read($count)\n            {\n                $data = fread($this->handle, $count);\n\n                if ($this->position === 0) {\n                    $data = preg_replace('{^#!.*\\r?\\n}', '', $data);\n                }\n\n                $this->position += strlen($data);\n\n                return $data;\n            }\n\n            public function stream_cast($castAs)\n            {\n                return $this->handle;\n            }\n\n            public function stream_close()\n            {\n                fclose($this->handle);\n            }\n\n            public function stream_lock($operation)\n            {\n                return $operation ? flock($this->handle, $operation) : true;\n            }\n\n            public function stream_seek($offset, $whence)\n            {\n                if (0 === fseek($this->handle, $offset, $whence)) {\n                    $this->position = ftell($this->handle);\n                    return true;\n                }\n\n                return false;\n            }\n\n            public function stream_tell()\n            {\n                return $this->position;\n            }\n\n            public function stream_eof()\n            {\n                return feof($this->handle);\n            }\n\n            public function stream_stat()\n            {\n                return array();\n            }\n\n            public function stream_set_option($option, $arg1, $arg2)\n            {\n                return true;\n            }\n\n            public function url_stat($path, $flags)\n            {\n                $path = substr($path, 17);\n                if (file_exists($path)) {\n                    return stat($path);\n                }\n\n                return false;\n            }\n        }\n    }\n\n    if (\n        (function_exists('stream_get_wrappers') && in_array('phpvfscomposer', stream_get_wrappers(), true))\n        || (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\\BinProxyWrapper'))\n    ) {\n        return include(\"phpvfscomposer://\" . __DIR__ . '/..'.'/nikic/php-parser/bin/php-parse');\n    }\n}\n\nreturn include __DIR__ . '/..'.'/nikic/php-parser/bin/php-parse';\n","vendor/bin/yaml-lint":"#!/usr/bin/env php\n<?php\n\n/**\n * Proxy PHP file generated by Composer\n *\n * This file includes the referenced bin path (../symfony/yaml/Resources/bin/yaml-lint)\n * using a stream wrapper to prevent the shebang from being output on PHP<8\n *\n * @generated\n */\n\nnamespace Composer;\n\n$GLOBALS['_composer_bin_dir'] = __DIR__;\n$GLOBALS['_composer_autoload_path'] = __DIR__ . '/..'.'/autoload.php';\n\nif (PHP_VERSION_ID < 80000) {\n    if (!class_exists('Composer\\BinProxyWrapper')) {\n        /**\n         * @internal\n         */\n        final class BinProxyWrapper\n        {\n            private $handle;\n            private $position;\n            private $realpath;\n\n            public function stream_open($path, $mode, $options, &$opened_path)\n            {\n                // get rid of phpvfscomposer:// prefix for __FILE__ & __DIR__ resolution\n                $opened_path = substr($path, 17);\n                $this->realpath = realpath($opened_path) ?: $opened_path;\n                $opened_path = $this->realpath;\n                $this->handle = fopen($this->realpath, $mode);\n                $this->position = 0;\n\n                return (bool) $this->handle;\n            }\n\n            public function stream_read($count)\n            {\n                $data = fread($this->handle, $count);\n\n                if ($this->position === 0) {\n                    $data = preg_replace('{^#!.*\\r?\\n}', '', $data);\n                }\n\n                $this->position += strlen($data);\n\n                return $data;\n            }\n\n            public function stream_cast($castAs)\n            {\n                return $this->handle;\n            }\n\n            public function stream_close()\n            {\n                fclose($this->handle);\n            }\n\n            public function stream_lock($operation)\n            {\n                return $operation ? flock($this->handle, $operation) : true;\n            }\n\n            public function stream_seek($offset, $whence)\n            {\n                if (0 === fseek($this->handle, $offset, $whence)) {\n                    $this->position = ftell($this->handle);\n                    return true;\n                }\n\n                return false;\n            }\n\n            public function stream_tell()\n            {\n                return $this->position;\n            }\n\n            public function stream_eof()\n            {\n                return feof($this->handle);\n            }\n\n            public function stream_stat()\n            {\n                return array();\n            }\n\n            public function stream_set_option($option, $arg1, $arg2)\n            {\n                return true;\n            }\n\n            public function url_stat($path, $flags)\n            {\n                $path = substr($path, 17);\n                if (file_exists($path)) {\n                    return stat($path);\n                }\n\n                return false;\n            }\n        }\n    }\n\n    if (\n        (function_exists('stream_get_wrappers') && in_array('phpvfscomposer', stream_get_wrappers(), true))\n        || (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\\BinProxyWrapper'))\n    ) {\n        return include(\"phpvfscomposer://\" . __DIR__ . '/..'.'/symfony/yaml/Resources/bin/yaml-lint');\n    }\n}\n\nreturn include __DIR__ . '/..'.'/symfony/yaml/Resources/bin/yaml-lint';\n","vendor/composer/ClassLoader.php":"<?php\n\n/*\n * This file is part of Composer.\n *\n * (c) Nils Adermann <naderman@naderman.de>\n *     Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Composer\\Autoload;\n\n/**\n * ClassLoader implements a PSR-0, PSR-4 and classmap class loader.\n *\n *     $loader = new \\Composer\\Autoload\\ClassLoader();\n *\n *     // register classes with namespaces\n *     $loader->add('Symfony\\Component', __DIR__.'/component');\n *     $loader->add('Symfony',           __DIR__.'/framework');\n *\n *     // activate the autoloader\n *     $loader->register();\n *\n *     // to enable searching the include path (eg. for PEAR packages)\n *     $loader->setUseIncludePath(true);\n *\n * In this example, if you try to use a class in the Symfony\\Component\n * namespace or one of its children (Symfony\\Component\\Console for instance),\n * the autoloader will first look for the class under the component/\n * directory, and it will then fallback to the framework/ directory if not\n * found before giving up.\n *\n * This class is loosely based on the Symfony UniversalClassLoader.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n * @author Jordi Boggiano <j.boggiano@seld.be>\n * @see    https://www.php-fig.org/psr/psr-0/\n * @see    https://www.php-fig.org/psr/psr-4/\n */\nclass ClassLoader\n{\n    /** @var \\Closure(string):void */\n    private static $includeFile;\n\n    /** @var string|null */\n    private $vendorDir;\n\n    // PSR-4\n    /**\n     * @var array<string, array<string, int>>\n     */\n    private $prefixLengthsPsr4 = array();\n    /**\n     * @var array<string, list<string>>\n     */\n    private $prefixDirsPsr4 = array();\n    /**\n     * @var list<string>\n     */\n    private $fallbackDirsPsr4 = array();\n\n    // PSR-0\n    /**\n     * List of PSR-0 prefixes\n     *\n     * Structured as array('F (first letter)' => array('Foo\\Bar (full prefix)' => array('path', 'path2')))\n     *\n     * @var array<string, array<string, list<string>>>\n     */\n    private $prefixesPsr0 = array();\n    /**\n     * @var list<string>\n     */\n    private $fallbackDirsPsr0 = array();\n\n    /** @var bool */\n    private $useIncludePath = false;\n\n    /**\n     * @var array<string, string>\n     */\n    private $classMap = array();\n\n    /** @var bool */\n    private $classMapAuthoritative = false;\n\n    /**\n     * @var array<string, bool>\n     */\n    private $missingClasses = array();\n\n    /** @var string|null */\n    private $apcuPrefix;\n\n    /**\n     * @var array<string, self>\n     */\n    private static $registeredLoaders = array();\n\n    /**\n     * @param string|null $vendorDir\n     */\n    public function __construct($vendorDir = null)\n    {\n        $this->vendorDir = $vendorDir;\n        self::initializeIncludeClosure();\n    }\n\n    /**\n     * @return array<string, list<string>>\n     */\n    public function getPrefixes()\n    {\n        if (!empty($this->prefixesPsr0)) {\n            return call_user_func_array('array_merge', array_values($this->prefixesPsr0));\n        }\n\n        return array();\n    }\n\n    /**\n     * @return array<string, list<string>>\n     */\n    public function getPrefixesPsr4()\n    {\n        return $this->prefixDirsPsr4;\n    }\n\n    /**\n     * @return list<string>\n     */\n    public function getFallbackDirs()\n    {\n        return $this->fallbackDirsPsr0;\n    }\n\n    /**\n     * @return list<string>\n     */\n    public function getFallbackDirsPsr4()\n    {\n        return $this->fallbackDirsPsr4;\n    }\n\n    /**\n     * @return array<string, string> Array of classname => path\n     */\n    public function getClassMap()\n    {\n        return $this->classMap;\n    }\n\n    /**\n     * @param array<string, string> $classMap Class to filename map\n     *\n     * @return void\n     */\n    public function addClassMap(array $classMap)\n    {\n        if ($this->classMap) {\n            $this->classMap = array_merge($this->classMap, $classMap);\n        } else {\n            $this->classMap = $classMap;\n        }\n    }\n\n    /**\n     * Registers a set of PSR-0 directories for a given prefix, either\n     * appending or prepending to the ones previously set for this prefix.\n     *\n     * @param string              $prefix  The prefix\n     * @param list<string>|string $paths   The PSR-0 root directories\n     * @param bool                $prepend Whether to prepend the directories\n     *\n     * @return void\n     */\n    public function add($prefix, $paths, $prepend = false)\n    {\n        $paths = (array) $paths;\n        if (!$prefix) {\n            if ($prepend) {\n                $this->fallbackDirsPsr0 = array_merge(\n                    $paths,\n                    $this->fallbackDirsPsr0\n                );\n            } else {\n                $this->fallbackDirsPsr0 = array_merge(\n                    $this->fallbackDirsPsr0,\n                    $paths\n                );\n            }\n\n            return;\n        }\n\n        $first = $prefix[0];\n        if (!isset($this->prefixesPsr0[$first][$prefix])) {\n            $this->prefixesPsr0[$first][$prefix] = $paths;\n\n            return;\n        }\n        if ($prepend) {\n            $this->prefixesPsr0[$first][$prefix] = array_merge(\n                $paths,\n                $this->prefixesPsr0[$first][$prefix]\n            );\n        } else {\n            $this->prefixesPsr0[$first][$prefix] = array_merge(\n                $this->prefixesPsr0[$first][$prefix],\n                $paths\n            );\n        }\n    }\n\n    /**\n     * Registers a set of PSR-4 directories for a given namespace, either\n     * appending or prepending to the ones previously set for this namespace.\n     *\n     * @param string              $prefix  The prefix/namespace, with trailing '\\\\'\n     * @param list<string>|string $paths   The PSR-4 base directories\n     * @param bool                $prepend Whether to prepend the directories\n     *\n     * @throws \\InvalidArgumentException\n     *\n     * @return void\n     */\n    public function addPsr4($prefix, $paths, $prepend = false)\n    {\n        $paths = (array) $paths;\n        if (!$prefix) {\n            // Register directories for the root namespace.\n            if ($prepend) {\n                $this->fallbackDirsPsr4 = array_merge(\n                    $paths,\n                    $this->fallbackDirsPsr4\n                );\n            } else {\n                $this->fallbackDirsPsr4 = array_merge(\n                    $this->fallbackDirsPsr4,\n                    $paths\n                );\n            }\n        } elseif (!isset($this->prefixDirsPsr4[$prefix])) {\n            // Register directories for a new namespace.\n            $length = strlen($prefix);\n            if ('\\\\' !== $prefix[$length - 1]) {\n                throw new \\InvalidArgumentException(\"A non-empty PSR-4 prefix must end with a namespace separator.\");\n            }\n            $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;\n            $this->prefixDirsPsr4[$prefix] = $paths;\n        } elseif ($prepend) {\n            // Prepend directories for an already registered namespace.\n            $this->prefixDirsPsr4[$prefix] = array_merge(\n                $paths,\n                $this->prefixDirsPsr4[$prefix]\n            );\n        } else {\n            // Append directories for an already registered namespace.\n            $this->prefixDirsPsr4[$prefix] = array_merge(\n                $this->prefixDirsPsr4[$prefix],\n                $paths\n            );\n        }\n    }\n\n    /**\n     * Registers a set of PSR-0 directories for a given prefix,\n     * replacing any others previously set for this prefix.\n     *\n     * @param string              $prefix The prefix\n     * @param list<string>|string $paths  The PSR-0 base directories\n     *\n     * @return void\n     */\n    public function set($prefix, $paths)\n    {\n        if (!$prefix) {\n            $this->fallbackDirsPsr0 = (array) $paths;\n        } else {\n            $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;\n        }\n    }\n\n    /**\n     * Registers a set of PSR-4 directories for a given namespace,\n     * replacing any others previously set for this namespace.\n     *\n     * @param string              $prefix The prefix/namespace, with trailing '\\\\'\n     * @param list<string>|string $paths  The PSR-4 base directories\n     *\n     * @throws \\InvalidArgumentException\n     *\n     * @return void\n     */\n    public function setPsr4($prefix, $paths)\n    {\n        if (!$prefix) {\n            $this->fallbackDirsPsr4 = (array) $paths;\n        } else {\n            $length = strlen($prefix);\n            if ('\\\\' !== $prefix[$length - 1]) {\n                throw new \\InvalidArgumentException(\"A non-empty PSR-4 prefix must end with a namespace separator.\");\n            }\n            $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;\n            $this->prefixDirsPsr4[$prefix] = (array) $paths;\n        }\n    }\n\n    /**\n     * Turns on searching the include path for class files.\n     *\n     * @param bool $useIncludePath\n     *\n     * @return void\n     */\n    public function setUseIncludePath($useIncludePath)\n    {\n        $this->useIncludePath = $useIncludePath;\n    }\n\n    /**\n     * Can be used to check if the autoloader uses the include path to check\n     * for classes.\n     *\n     * @return bool\n     */\n    public function getUseIncludePath()\n    {\n        return $this->useIncludePath;\n    }\n\n    /**\n     * Turns off searching the prefix and fallback directories for classes\n     * that have not been registered with the class map.\n     *\n     * @param bool $classMapAuthoritative\n     *\n     * @return void\n     */\n    public function setClassMapAuthoritative($classMapAuthoritative)\n    {\n        $this->classMapAuthoritative = $classMapAuthoritative;\n    }\n\n    /**\n     * Should class lookup fail if not found in the current class map?\n     *\n     * @return bool\n     */\n    public function isClassMapAuthoritative()\n    {\n        return $this->classMapAuthoritative;\n    }\n\n    /**\n     * APCu prefix to use to cache found/not-found classes, if the extension is enabled.\n     *\n     * @param string|null $apcuPrefix\n     *\n     * @return void\n     */\n    public function setApcuPrefix($apcuPrefix)\n    {\n        $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null;\n    }\n\n    /**\n     * The APCu prefix in use, or null if APCu caching is not enabled.\n     *\n     * @return string|null\n     */\n    public function getApcuPrefix()\n    {\n        return $this->apcuPrefix;\n    }\n\n    /**\n     * Registers this instance as an autoloader.\n     *\n     * @param bool $prepend Whether to prepend the autoloader or not\n     *\n     * @return void\n     */\n    public function register($prepend = false)\n    {\n        spl_autoload_register(array($this, 'loadClass'), true, $prepend);\n\n        if (null === $this->vendorDir) {\n            return;\n        }\n\n        if ($prepend) {\n            self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders;\n        } else {\n            unset(self::$registeredLoaders[$this->vendorDir]);\n            self::$registeredLoaders[$this->vendorDir] = $this;\n        }\n    }\n\n    /**\n     * Unregisters this instance as an autoloader.\n     *\n     * @return void\n     */\n    public function unregister()\n    {\n        spl_autoload_unregister(array($this, 'loadClass'));\n\n        if (null !== $this->vendorDir) {\n            unset(self::$registeredLoaders[$this->vendorDir]);\n        }\n    }\n\n    /**\n     * Loads the given class or interface.\n     *\n     * @param  string    $class The name of the class\n     * @return true|null True if loaded, null otherwise\n     */\n    public function loadClass($class)\n    {\n        if ($file = $this->findFile($class)) {\n            $includeFile = self::$includeFile;\n            $includeFile($file);\n\n            return true;\n        }\n\n        return null;\n    }\n\n    /**\n     * Finds the path to the file where the class is defined.\n     *\n     * @param string $class The name of the class\n     *\n     * @return string|false The path if found, false otherwise\n     */\n    public function findFile($class)\n    {\n        // class map lookup\n        if (isset($this->classMap[$class])) {\n            return $this->classMap[$class];\n        }\n        if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {\n            return false;\n        }\n        if (null !== $this->apcuPrefix) {\n            $file = apcu_fetch($this->apcuPrefix.$class, $hit);\n            if ($hit) {\n                return $file;\n            }\n        }\n\n        $file = $this->findFileWithExtension($class, '.php');\n\n        // Search for Hack files if we are running on HHVM\n        if (false === $file && defined('HHVM_VERSION')) {\n            $file = $this->findFileWithExtension($class, '.hh');\n        }\n\n        if (null !== $this->apcuPrefix) {\n            apcu_add($this->apcuPrefix.$class, $file);\n        }\n\n        if (false === $file) {\n            // Remember that this class does not exist.\n            $this->missingClasses[$class] = true;\n        }\n\n        return $file;\n    }\n\n    /**\n     * Returns the currently registered loaders keyed by their corresponding vendor directories.\n     *\n     * @return array<string, self>\n     */\n    public static function getRegisteredLoaders()\n    {\n        return self::$registeredLoaders;\n    }\n\n    /**\n     * @param  string       $class\n     * @param  string       $ext\n     * @return string|false\n     */\n    private function findFileWithExtension($class, $ext)\n    {\n        // PSR-4 lookup\n        $logicalPathPsr4 = strtr($class, '\\\\', DIRECTORY_SEPARATOR) . $ext;\n\n        $first = $class[0];\n        if (isset($this->prefixLengthsPsr4[$first])) {\n            $subPath = $class;\n            while (false !== $lastPos = strrpos($subPath, '\\\\')) {\n                $subPath = substr($subPath, 0, $lastPos);\n                $search = $subPath . '\\\\';\n                if (isset($this->prefixDirsPsr4[$search])) {\n                    $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1);\n                    foreach ($this->prefixDirsPsr4[$search] as $dir) {\n                        if (file_exists($file = $dir . $pathEnd)) {\n                            return $file;\n                        }\n                    }\n                }\n            }\n        }\n\n        // PSR-4 fallback dirs\n        foreach ($this->fallbackDirsPsr4 as $dir) {\n            if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {\n                return $file;\n            }\n        }\n\n        // PSR-0 lookup\n        if (false !== $pos = strrpos($class, '\\\\')) {\n            // namespaced class name\n            $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)\n                . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);\n        } else {\n            // PEAR-like class name\n            $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;\n        }\n\n        if (isset($this->prefixesPsr0[$first])) {\n            foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {\n                if (0 === strpos($class, $prefix)) {\n                    foreach ($dirs as $dir) {\n                        if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {\n                            return $file;\n                        }\n                    }\n                }\n            }\n        }\n\n        // PSR-0 fallback dirs\n        foreach ($this->fallbackDirsPsr0 as $dir) {\n            if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {\n                return $file;\n            }\n        }\n\n        // PSR-0 include paths.\n        if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {\n            return $file;\n        }\n\n        return false;\n    }\n\n    /**\n     * @return void\n     */\n    private static function initializeIncludeClosure()\n    {\n        if (self::$includeFile !== null) {\n            return;\n        }\n\n        /**\n         * Scope isolated include.\n         *\n         * Prevents access to $this/self from included files.\n         *\n         * @param  string $file\n         * @return void\n         */\n        self::$includeFile = \\Closure::bind(static function($file) {\n            include $file;\n        }, null, null);\n    }\n}\n","vendor/composer/InstalledVersions.php":"<?php\n\n/*\n * This file is part of Composer.\n *\n * (c) Nils Adermann <naderman@naderman.de>\n *     Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Composer;\n\nuse Composer\\Autoload\\ClassLoader;\nuse Composer\\Semver\\VersionParser;\n\n/**\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 */\nclass InstalledVersions\n{\n    /**\n     * @var string|null if set (by reflection by Composer), this should be set to the path where this class is being copied to\n     * @internal\n     */\n    private static $selfDir = null;\n\n    /**\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     */\n    private static $installed;\n\n    /**\n     * @var bool\n     */\n    private static $installedIsLocalDir;\n\n    /**\n     * @var bool|null\n     */\n    private static $canGetVendors;\n\n    /**\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     */\n    private static $installedByVendor = array();\n\n    /**\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     */\n    public static function getInstalledPackages()\n    {\n        $packages = array();\n        foreach (self::getInstalled() as $installed) {\n            $packages[] = array_keys($installed['versions']);\n        }\n\n        if (1 === \\count($packages)) {\n            return $packages[0];\n        }\n\n        return array_keys(array_flip(\\call_user_func_array('array_merge', $packages)));\n    }\n\n    /**\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     */\n    public static function getInstalledPackagesByType($type)\n    {\n        $packagesByType = array();\n\n        foreach (self::getInstalled() as $installed) {\n            foreach ($installed['versions'] as $name => $package) {\n                if (isset($package['type']) && $package['type'] === $type) {\n                    $packagesByType[] = $name;\n                }\n            }\n        }\n\n        return $packagesByType;\n    }\n\n    /**\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     */\n    public static function isInstalled($packageName, $includeDevRequirements = true)\n    {\n        foreach (self::getInstalled() as $installed) {\n            if (isset($installed['versions'][$packageName])) {\n                return $includeDevRequirements || !isset($installed['versions'][$packageName]['dev_requirement']) || $installed['versions'][$packageName]['dev_requirement'] === false;\n            }\n        }\n\n        return false;\n    }\n\n    /**\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     */\n    public static function satisfies(VersionParser $parser, $packageName, $constraint)\n    {\n        $constraint = $parser->parseConstraints((string) $constraint);\n        $provided = $parser->parseConstraints(self::getVersionRanges($packageName));\n\n        return $provided->matches($constraint);\n    }\n\n    /**\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     */\n    public static function getVersionRanges($packageName)\n    {\n        foreach (self::getInstalled() as $installed) {\n            if (!isset($installed['versions'][$packageName])) {\n                continue;\n            }\n\n            $ranges = array();\n            if (isset($installed['versions'][$packageName]['pretty_version'])) {\n                $ranges[] = $installed['versions'][$packageName]['pretty_version'];\n            }\n            if (array_key_exists('aliases', $installed['versions'][$packageName])) {\n                $ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']);\n            }\n            if (array_key_exists('replaced', $installed['versions'][$packageName])) {\n                $ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']);\n            }\n            if (array_key_exists('provided', $installed['versions'][$packageName])) {\n                $ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']);\n            }\n\n            return implode(' || ', $ranges);\n        }\n\n        throw new \\OutOfBoundsException('Package \"' . $packageName . '\" is not installed');\n    }\n\n    /**\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     */\n    public static function getVersion($packageName)\n    {\n        foreach (self::getInstalled() as $installed) {\n            if (!isset($installed['versions'][$packageName])) {\n                continue;\n            }\n\n            if (!isset($installed['versions'][$packageName]['version'])) {\n                return null;\n            }\n\n            return $installed['versions'][$packageName]['version'];\n        }\n\n        throw new \\OutOfBoundsException('Package \"' . $packageName . '\" is not installed');\n    }\n\n    /**\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     */\n    public static function getPrettyVersion($packageName)\n    {\n        foreach (self::getInstalled() as $installed) {\n            if (!isset($installed['versions'][$packageName])) {\n                continue;\n            }\n\n            if (!isset($installed['versions'][$packageName]['pretty_version'])) {\n                return null;\n            }\n\n            return $installed['versions'][$packageName]['pretty_version'];\n        }\n\n        throw new \\OutOfBoundsException('Package \"' . $packageName . '\" is not installed');\n    }\n\n    /**\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     */\n    public static function getReference($packageName)\n    {\n        foreach (self::getInstalled() as $installed) {\n            if (!isset($installed['versions'][$packageName])) {\n                continue;\n            }\n\n            if (!isset($installed['versions'][$packageName]['reference'])) {\n                return null;\n            }\n\n            return $installed['versions'][$packageName]['reference'];\n        }\n\n        throw new \\OutOfBoundsException('Package \"' . $packageName . '\" is not installed');\n    }\n\n    /**\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     */\n    public static function getInstallPath($packageName)\n    {\n        foreach (self::getInstalled() as $installed) {\n            if (!isset($installed['versions'][$packageName])) {\n                continue;\n            }\n\n            return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null;\n        }\n\n        throw new \\OutOfBoundsException('Package \"' . $packageName . '\" is not installed');\n    }\n\n    /**\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     */\n    public static function getRootPackage()\n    {\n        $installed = self::getInstalled();\n\n        return $installed[0]['root'];\n    }\n\n    /**\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     */\n    public static function getRawData()\n    {\n        @trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED);\n\n        if (null === self::$installed) {\n            // only require the installed.php file if this file is loaded from its dumped location,\n            // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937\n            if (substr(__DIR__, -8, 1) !== 'C') {\n                self::$installed = include __DIR__ . '/installed.php';\n            } else {\n                self::$installed = array();\n            }\n        }\n\n        return self::$installed;\n    }\n\n    /**\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     */\n    public static function getAllRawData()\n    {\n        return self::getInstalled();\n    }\n\n    /**\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     */\n    public static function reload($data)\n    {\n        self::$installed = $data;\n        self::$installedByVendor = array();\n\n        // when using reload, we disable the duplicate protection to ensure that self::$installed data is\n        // always returned, but we cannot know whether it comes from the installed.php in __DIR__ or not,\n        // so we have to assume it does not, and that may result in duplicate data being returned when listing\n        // all installed packages for example\n        self::$installedIsLocalDir = false;\n    }\n\n    /**\n     * @return string\n     */\n    private static function getSelfDir()\n    {\n        if (self::$selfDir === null) {\n            self::$selfDir = strtr(__DIR__, '\\\\', '/');\n        }\n\n        return self::$selfDir;\n    }\n\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     */\n    private static function getInstalled()\n    {\n        if (null === self::$canGetVendors) {\n            self::$canGetVendors = method_exists('Composer\\Autoload\\ClassLoader', 'getRegisteredLoaders');\n        }\n\n        $installed = array();\n        $copiedLocalDir = false;\n\n        if (self::$canGetVendors) {\n            $selfDir = self::getSelfDir();\n            foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) {\n                $vendorDir = strtr($vendorDir, '\\\\', '/');\n                if (isset(self::$installedByVendor[$vendorDir])) {\n                    $installed[] = self::$installedByVendor[$vendorDir];\n                } elseif (is_file($vendorDir.'/composer/installed.php')) {\n                    /** @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[]}>} $required */\n                    $required = require $vendorDir.'/composer/installed.php';\n                    self::$installedByVendor[$vendorDir] = $required;\n                    $installed[] = $required;\n                    if (self::$installed === null && $vendorDir.'/composer' === $selfDir) {\n                        self::$installed = $required;\n                        self::$installedIsLocalDir = true;\n                    }\n                }\n                if (self::$installedIsLocalDir && $vendorDir.'/composer' === $selfDir) {\n                    $copiedLocalDir = true;\n                }\n            }\n        }\n\n        if (null === self::$installed) {\n            // only require the installed.php file if this file is loaded from its dumped location,\n            // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937\n            if (substr(__DIR__, -8, 1) !== 'C') {\n                /** @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[]}>} $required */\n                $required = require __DIR__ . '/installed.php';\n                self::$installed = $required;\n            } else {\n                self::$installed = array();\n            }\n        }\n\n        if (self::$installed !== array() && !$copiedLocalDir) {\n            $installed[] = self::$installed;\n        }\n\n        return $installed;\n    }\n}\n","vendor/composer/LICENSE":"\nCopyright (c) Nils Adermann, Jordi Boggiano\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is furnished\nto do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n","vendor/composer/autoload_classmap.php":"<?php\n\n// autoload_classmap.php @generated by Composer\n\n$vendorDir = dirname(__DIR__);\n$baseDir = dirname($vendorDir);\n\nreturn array(\n    'Composer\\\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php',\n    'Normalizer' => $vendorDir . '/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php',\n    'PhpParser\\\\Builder' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder.php',\n    'PhpParser\\\\BuilderFactory' => $vendorDir . '/nikic/php-parser/lib/PhpParser/BuilderFactory.php',\n    'PhpParser\\\\BuilderHelpers' => $vendorDir . '/nikic/php-parser/lib/PhpParser/BuilderHelpers.php',\n    'PhpParser\\\\Builder\\\\ClassConst' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/ClassConst.php',\n    'PhpParser\\\\Builder\\\\Class_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Class_.php',\n    'PhpParser\\\\Builder\\\\Declaration' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Declaration.php',\n    'PhpParser\\\\Builder\\\\EnumCase' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/EnumCase.php',\n    'PhpParser\\\\Builder\\\\Enum_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Enum_.php',\n    'PhpParser\\\\Builder\\\\FunctionLike' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/FunctionLike.php',\n    'PhpParser\\\\Builder\\\\Function_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Function_.php',\n    'PhpParser\\\\Builder\\\\Interface_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Interface_.php',\n    'PhpParser\\\\Builder\\\\Method' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Method.php',\n    'PhpParser\\\\Builder\\\\Namespace_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Namespace_.php',\n    'PhpParser\\\\Builder\\\\Param' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Param.php',\n    'PhpParser\\\\Builder\\\\Property' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Property.php',\n    'PhpParser\\\\Builder\\\\TraitUse' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/TraitUse.php',\n    'PhpParser\\\\Builder\\\\TraitUseAdaptation' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/TraitUseAdaptation.php',\n    'PhpParser\\\\Builder\\\\Trait_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Trait_.php',\n    'PhpParser\\\\Builder\\\\Use_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Use_.php',\n    'PhpParser\\\\Comment' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Comment.php',\n    'PhpParser\\\\Comment\\\\Doc' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Comment/Doc.php',\n    'PhpParser\\\\ConstExprEvaluationException' => $vendorDir . '/nikic/php-parser/lib/PhpParser/ConstExprEvaluationException.php',\n    'PhpParser\\\\ConstExprEvaluator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/ConstExprEvaluator.php',\n    'PhpParser\\\\Error' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Error.php',\n    'PhpParser\\\\ErrorHandler' => $vendorDir . '/nikic/php-parser/lib/PhpParser/ErrorHandler.php',\n    'PhpParser\\\\ErrorHandler\\\\Collecting' => $vendorDir . '/nikic/php-parser/lib/PhpParser/ErrorHandler/Collecting.php',\n    'PhpParser\\\\ErrorHandler\\\\Throwing' => $vendorDir . '/nikic/php-parser/lib/PhpParser/ErrorHandler/Throwing.php',\n    'PhpParser\\\\Internal\\\\DiffElem' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Internal/DiffElem.php',\n    'PhpParser\\\\Internal\\\\Differ' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Internal/Differ.php',\n    'PhpParser\\\\Internal\\\\PrintableNewAnonClassNode' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Internal/PrintableNewAnonClassNode.php',\n    'PhpParser\\\\Internal\\\\TokenPolyfill' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Internal/TokenPolyfill.php',\n    'PhpParser\\\\Internal\\\\TokenStream' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Internal/TokenStream.php',\n    'PhpParser\\\\JsonDecoder' => $vendorDir . '/nikic/php-parser/lib/PhpParser/JsonDecoder.php',\n    'PhpParser\\\\Lexer' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer.php',\n    'PhpParser\\\\Lexer\\\\Emulative' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/Emulative.php',\n    'PhpParser\\\\Lexer\\\\TokenEmulator\\\\AsymmetricVisibilityTokenEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/AsymmetricVisibilityTokenEmulator.php',\n    'PhpParser\\\\Lexer\\\\TokenEmulator\\\\AttributeEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/AttributeEmulator.php',\n    'PhpParser\\\\Lexer\\\\TokenEmulator\\\\EnumTokenEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/EnumTokenEmulator.php',\n    'PhpParser\\\\Lexer\\\\TokenEmulator\\\\ExplicitOctalEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ExplicitOctalEmulator.php',\n    'PhpParser\\\\Lexer\\\\TokenEmulator\\\\FnTokenEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FnTokenEmulator.php',\n    'PhpParser\\\\Lexer\\\\TokenEmulator\\\\KeywordEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/KeywordEmulator.php',\n    'PhpParser\\\\Lexer\\\\TokenEmulator\\\\MatchTokenEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/MatchTokenEmulator.php',\n    'PhpParser\\\\Lexer\\\\TokenEmulator\\\\NullsafeTokenEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NullsafeTokenEmulator.php',\n    'PhpParser\\\\Lexer\\\\TokenEmulator\\\\PipeOperatorEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/PipeOperatorEmulator.php',\n    'PhpParser\\\\Lexer\\\\TokenEmulator\\\\PropertyTokenEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/PropertyTokenEmulator.php',\n    'PhpParser\\\\Lexer\\\\TokenEmulator\\\\ReadonlyFunctionTokenEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyFunctionTokenEmulator.php',\n    'PhpParser\\\\Lexer\\\\TokenEmulator\\\\ReadonlyTokenEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyTokenEmulator.php',\n    'PhpParser\\\\Lexer\\\\TokenEmulator\\\\ReverseEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReverseEmulator.php',\n    'PhpParser\\\\Lexer\\\\TokenEmulator\\\\TokenEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/TokenEmulator.php',\n    'PhpParser\\\\Lexer\\\\TokenEmulator\\\\VoidCastEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/VoidCastEmulator.php',\n    'PhpParser\\\\Modifiers' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Modifiers.php',\n    'PhpParser\\\\NameContext' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NameContext.php',\n    'PhpParser\\\\Node' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node.php',\n    'PhpParser\\\\NodeAbstract' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeAbstract.php',\n    'PhpParser\\\\NodeDumper' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeDumper.php',\n    'PhpParser\\\\NodeFinder' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeFinder.php',\n    'PhpParser\\\\NodeTraverser' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeTraverser.php',\n    'PhpParser\\\\NodeTraverserInterface' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeTraverserInterface.php',\n    'PhpParser\\\\NodeVisitor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitor.php',\n    'PhpParser\\\\NodeVisitorAbstract' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitorAbstract.php',\n    'PhpParser\\\\NodeVisitor\\\\CloningVisitor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitor/CloningVisitor.php',\n    'PhpParser\\\\NodeVisitor\\\\CommentAnnotatingVisitor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitor/CommentAnnotatingVisitor.php',\n    'PhpParser\\\\NodeVisitor\\\\FindingVisitor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitor/FindingVisitor.php',\n    'PhpParser\\\\NodeVisitor\\\\FirstFindingVisitor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitor/FirstFindingVisitor.php',\n    'PhpParser\\\\NodeVisitor\\\\NameResolver' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitor/NameResolver.php',\n    'PhpParser\\\\NodeVisitor\\\\NodeConnectingVisitor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitor/NodeConnectingVisitor.php',\n    'PhpParser\\\\NodeVisitor\\\\ParentConnectingVisitor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitor/ParentConnectingVisitor.php',\n    'PhpParser\\\\Node\\\\Arg' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Arg.php',\n    'PhpParser\\\\Node\\\\ArrayItem' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/ArrayItem.php',\n    'PhpParser\\\\Node\\\\Attribute' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Attribute.php',\n    'PhpParser\\\\Node\\\\AttributeGroup' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/AttributeGroup.php',\n    'PhpParser\\\\Node\\\\ClosureUse' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/ClosureUse.php',\n    'PhpParser\\\\Node\\\\ComplexType' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/ComplexType.php',\n    'PhpParser\\\\Node\\\\Const_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Const_.php',\n    'PhpParser\\\\Node\\\\DeclareItem' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/DeclareItem.php',\n    'PhpParser\\\\Node\\\\Expr' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr.php',\n    'PhpParser\\\\Node\\\\Expr\\\\ArrayDimFetch' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayDimFetch.php',\n    'PhpParser\\\\Node\\\\Expr\\\\ArrayItem' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayItem.php',\n    'PhpParser\\\\Node\\\\Expr\\\\Array_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Array_.php',\n    'PhpParser\\\\Node\\\\Expr\\\\ArrowFunction' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ArrowFunction.php',\n    'PhpParser\\\\Node\\\\Expr\\\\Assign' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Assign.php',\n    'PhpParser\\\\Node\\\\Expr\\\\AssignOp' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp.php',\n    'PhpParser\\\\Node\\\\Expr\\\\AssignOp\\\\BitwiseAnd' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseAnd.php',\n    'PhpParser\\\\Node\\\\Expr\\\\AssignOp\\\\BitwiseOr' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseOr.php',\n    'PhpParser\\\\Node\\\\Expr\\\\AssignOp\\\\BitwiseXor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseXor.php',\n    'PhpParser\\\\Node\\\\Expr\\\\AssignOp\\\\Coalesce' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Coalesce.php',\n    'PhpParser\\\\Node\\\\Expr\\\\AssignOp\\\\Concat' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Concat.php',\n    'PhpParser\\\\Node\\\\Expr\\\\AssignOp\\\\Div' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Div.php',\n    'PhpParser\\\\Node\\\\Expr\\\\AssignOp\\\\Minus' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Minus.php',\n    'PhpParser\\\\Node\\\\Expr\\\\AssignOp\\\\Mod' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mod.php',\n    'PhpParser\\\\Node\\\\Expr\\\\AssignOp\\\\Mul' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mul.php',\n    'PhpParser\\\\Node\\\\Expr\\\\AssignOp\\\\Plus' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Plus.php',\n    'PhpParser\\\\Node\\\\Expr\\\\AssignOp\\\\Pow' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Pow.php',\n    'PhpParser\\\\Node\\\\Expr\\\\AssignOp\\\\ShiftLeft' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftLeft.php',\n    'PhpParser\\\\Node\\\\Expr\\\\AssignOp\\\\ShiftRight' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftRight.php',\n    'PhpParser\\\\Node\\\\Expr\\\\AssignRef' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignRef.php',\n    'PhpParser\\\\Node\\\\Expr\\\\BinaryOp' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp.php',\n    'PhpParser\\\\Node\\\\Expr\\\\BinaryOp\\\\BitwiseAnd' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseAnd.php',\n    'PhpParser\\\\Node\\\\Expr\\\\BinaryOp\\\\BitwiseOr' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseOr.php',\n    'PhpParser\\\\Node\\\\Expr\\\\BinaryOp\\\\BitwiseXor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseXor.php',\n    'PhpParser\\\\Node\\\\Expr\\\\BinaryOp\\\\BooleanAnd' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanAnd.php',\n    'PhpParser\\\\Node\\\\Expr\\\\BinaryOp\\\\BooleanOr' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanOr.php',\n    'PhpParser\\\\Node\\\\Expr\\\\BinaryOp\\\\Coalesce' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Coalesce.php',\n    'PhpParser\\\\Node\\\\Expr\\\\BinaryOp\\\\Concat' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Concat.php',\n    'PhpParser\\\\Node\\\\Expr\\\\BinaryOp\\\\Div' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Div.php',\n    'PhpParser\\\\Node\\\\Expr\\\\BinaryOp\\\\Equal' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Equal.php',\n    'PhpParser\\\\Node\\\\Expr\\\\BinaryOp\\\\Greater' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Greater.php',\n    'PhpParser\\\\Node\\\\Expr\\\\BinaryOp\\\\GreaterOrEqual' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/GreaterOrEqual.php',\n    'PhpParser\\\\Node\\\\Expr\\\\BinaryOp\\\\Identical' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Identical.php',\n    'PhpParser\\\\Node\\\\Expr\\\\BinaryOp\\\\LogicalAnd' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalAnd.php',\n    'PhpParser\\\\Node\\\\Expr\\\\BinaryOp\\\\LogicalOr' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalOr.php',\n    'PhpParser\\\\Node\\\\Expr\\\\BinaryOp\\\\LogicalXor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalXor.php',\n    'PhpParser\\\\Node\\\\Expr\\\\BinaryOp\\\\Minus' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Minus.php',\n    'PhpParser\\\\Node\\\\Expr\\\\BinaryOp\\\\Mod' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mod.php',\n    'PhpParser\\\\Node\\\\Expr\\\\BinaryOp\\\\Mul' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mul.php',\n    'PhpParser\\\\Node\\\\Expr\\\\BinaryOp\\\\NotEqual' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotEqual.php',\n    'PhpParser\\\\Node\\\\Expr\\\\BinaryOp\\\\NotIdentical' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotIdentical.php',\n    'PhpParser\\\\Node\\\\Expr\\\\BinaryOp\\\\Pipe' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Pipe.php',\n    'PhpParser\\\\Node\\\\Expr\\\\BinaryOp\\\\Plus' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Plus.php',\n    'PhpParser\\\\Node\\\\Expr\\\\BinaryOp\\\\Pow' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Pow.php',\n    'PhpParser\\\\Node\\\\Expr\\\\BinaryOp\\\\ShiftLeft' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftLeft.php',\n    'PhpParser\\\\Node\\\\Expr\\\\BinaryOp\\\\ShiftRight' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftRight.php',\n    'PhpParser\\\\Node\\\\Expr\\\\BinaryOp\\\\Smaller' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Smaller.php',\n    'PhpParser\\\\Node\\\\Expr\\\\BinaryOp\\\\SmallerOrEqual' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/SmallerOrEqual.php',\n    'PhpParser\\\\Node\\\\Expr\\\\BinaryOp\\\\Spaceship' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Spaceship.php',\n    'PhpParser\\\\Node\\\\Expr\\\\BitwiseNot' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BitwiseNot.php',\n    'PhpParser\\\\Node\\\\Expr\\\\BooleanNot' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BooleanNot.php',\n    'PhpParser\\\\Node\\\\Expr\\\\CallLike' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/CallLike.php',\n    'PhpParser\\\\Node\\\\Expr\\\\Cast' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast.php',\n    'PhpParser\\\\Node\\\\Expr\\\\Cast\\\\Array_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Array_.php',\n    'PhpParser\\\\Node\\\\Expr\\\\Cast\\\\Bool_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Bool_.php',\n    'PhpParser\\\\Node\\\\Expr\\\\Cast\\\\Double' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Double.php',\n    'PhpParser\\\\Node\\\\Expr\\\\Cast\\\\Int_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Int_.php',\n    'PhpParser\\\\Node\\\\Expr\\\\Cast\\\\Object_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Object_.php',\n    'PhpParser\\\\Node\\\\Expr\\\\Cast\\\\String_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/String_.php',\n    'PhpParser\\\\Node\\\\Expr\\\\Cast\\\\Unset_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Unset_.php',\n    'PhpParser\\\\Node\\\\Expr\\\\Cast\\\\Void_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Void_.php',\n    'PhpParser\\\\Node\\\\Expr\\\\ClassConstFetch' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ClassConstFetch.php',\n    'PhpParser\\\\Node\\\\Expr\\\\Clone_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Clone_.php',\n    'PhpParser\\\\Node\\\\Expr\\\\Closure' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Closure.php',\n    'PhpParser\\\\Node\\\\Expr\\\\ClosureUse' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ClosureUse.php',\n    'PhpParser\\\\Node\\\\Expr\\\\ConstFetch' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ConstFetch.php',\n    'PhpParser\\\\Node\\\\Expr\\\\Empty_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Empty_.php',\n    'PhpParser\\\\Node\\\\Expr\\\\Error' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Error.php',\n    'PhpParser\\\\Node\\\\Expr\\\\ErrorSuppress' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ErrorSuppress.php',\n    'PhpParser\\\\Node\\\\Expr\\\\Eval_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Eval_.php',\n    'PhpParser\\\\Node\\\\Expr\\\\Exit_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Exit_.php',\n    'PhpParser\\\\Node\\\\Expr\\\\FuncCall' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/FuncCall.php',\n    'PhpParser\\\\Node\\\\Expr\\\\Include_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Include_.php',\n    'PhpParser\\\\Node\\\\Expr\\\\Instanceof_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Instanceof_.php',\n    'PhpParser\\\\Node\\\\Expr\\\\Isset_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Isset_.php',\n    'PhpParser\\\\Node\\\\Expr\\\\List_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/List_.php',\n    'PhpParser\\\\Node\\\\Expr\\\\Match_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Match_.php',\n    'PhpParser\\\\Node\\\\Expr\\\\MethodCall' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/MethodCall.php',\n    'PhpParser\\\\Node\\\\Expr\\\\New_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/New_.php',\n    'PhpParser\\\\Node\\\\Expr\\\\NullsafeMethodCall' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafeMethodCall.php',\n    'PhpParser\\\\Node\\\\Expr\\\\NullsafePropertyFetch' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafePropertyFetch.php',\n    'PhpParser\\\\Node\\\\Expr\\\\PostDec' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/PostDec.php',\n    'PhpParser\\\\Node\\\\Expr\\\\PostInc' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/PostInc.php',\n    'PhpParser\\\\Node\\\\Expr\\\\PreDec' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/PreDec.php',\n    'PhpParser\\\\Node\\\\Expr\\\\PreInc' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/PreInc.php',\n    'PhpParser\\\\Node\\\\Expr\\\\Print_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Print_.php',\n    'PhpParser\\\\Node\\\\Expr\\\\PropertyFetch' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/PropertyFetch.php',\n    'PhpParser\\\\Node\\\\Expr\\\\ShellExec' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ShellExec.php',\n    'PhpParser\\\\Node\\\\Expr\\\\StaticCall' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/StaticCall.php',\n    'PhpParser\\\\Node\\\\Expr\\\\StaticPropertyFetch' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/StaticPropertyFetch.php',\n    'PhpParser\\\\Node\\\\Expr\\\\Ternary' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Ternary.php',\n    'PhpParser\\\\Node\\\\Expr\\\\Throw_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Throw_.php',\n    'PhpParser\\\\Node\\\\Expr\\\\UnaryMinus' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryMinus.php',\n    'PhpParser\\\\Node\\\\Expr\\\\UnaryPlus' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryPlus.php',\n    'PhpParser\\\\Node\\\\Expr\\\\Variable' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Variable.php',\n    'PhpParser\\\\Node\\\\Expr\\\\YieldFrom' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/YieldFrom.php',\n    'PhpParser\\\\Node\\\\Expr\\\\Yield_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Yield_.php',\n    'PhpParser\\\\Node\\\\FunctionLike' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/FunctionLike.php',\n    'PhpParser\\\\Node\\\\Identifier' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Identifier.php',\n    'PhpParser\\\\Node\\\\InterpolatedStringPart' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/InterpolatedStringPart.php',\n    'PhpParser\\\\Node\\\\IntersectionType' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/IntersectionType.php',\n    'PhpParser\\\\Node\\\\MatchArm' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/MatchArm.php',\n    'PhpParser\\\\Node\\\\Name' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Name.php',\n    'PhpParser\\\\Node\\\\Name\\\\FullyQualified' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Name/FullyQualified.php',\n    'PhpParser\\\\Node\\\\Name\\\\Relative' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Name/Relative.php',\n    'PhpParser\\\\Node\\\\NullableType' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/NullableType.php',\n    'PhpParser\\\\Node\\\\Param' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Param.php',\n    'PhpParser\\\\Node\\\\PropertyHook' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/PropertyHook.php',\n    'PhpParser\\\\Node\\\\PropertyItem' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/PropertyItem.php',\n    'PhpParser\\\\Node\\\\Scalar' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar.php',\n    'PhpParser\\\\Node\\\\Scalar\\\\DNumber' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/DNumber.php',\n    'PhpParser\\\\Node\\\\Scalar\\\\Encapsed' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/Encapsed.php',\n    'PhpParser\\\\Node\\\\Scalar\\\\EncapsedStringPart' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/EncapsedStringPart.php',\n    'PhpParser\\\\Node\\\\Scalar\\\\Float_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/Float_.php',\n    'PhpParser\\\\Node\\\\Scalar\\\\Int_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/Int_.php',\n    'PhpParser\\\\Node\\\\Scalar\\\\InterpolatedString' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/InterpolatedString.php',\n    'PhpParser\\\\Node\\\\Scalar\\\\LNumber' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/LNumber.php',\n    'PhpParser\\\\Node\\\\Scalar\\\\MagicConst' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst.php',\n    'PhpParser\\\\Node\\\\Scalar\\\\MagicConst\\\\Class_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Class_.php',\n    'PhpParser\\\\Node\\\\Scalar\\\\MagicConst\\\\Dir' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Dir.php',\n    'PhpParser\\\\Node\\\\Scalar\\\\MagicConst\\\\File' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/File.php',\n    'PhpParser\\\\Node\\\\Scalar\\\\MagicConst\\\\Function_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Function_.php',\n    'PhpParser\\\\Node\\\\Scalar\\\\MagicConst\\\\Line' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Line.php',\n    'PhpParser\\\\Node\\\\Scalar\\\\MagicConst\\\\Method' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Method.php',\n    'PhpParser\\\\Node\\\\Scalar\\\\MagicConst\\\\Namespace_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Namespace_.php',\n    'PhpParser\\\\Node\\\\Scalar\\\\MagicConst\\\\Property' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Property.php',\n    'PhpParser\\\\Node\\\\Scalar\\\\MagicConst\\\\Trait_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Trait_.php',\n    'PhpParser\\\\Node\\\\Scalar\\\\String_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/String_.php',\n    'PhpParser\\\\Node\\\\StaticVar' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/StaticVar.php',\n    'PhpParser\\\\Node\\\\Stmt' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt.php',\n    'PhpParser\\\\Node\\\\Stmt\\\\Block' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Block.php',\n    'PhpParser\\\\Node\\\\Stmt\\\\Break_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Break_.php',\n    'PhpParser\\\\Node\\\\Stmt\\\\Case_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Case_.php',\n    'PhpParser\\\\Node\\\\Stmt\\\\Catch_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Catch_.php',\n    'PhpParser\\\\Node\\\\Stmt\\\\ClassConst' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassConst.php',\n    'PhpParser\\\\Node\\\\Stmt\\\\ClassLike' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassLike.php',\n    'PhpParser\\\\Node\\\\Stmt\\\\ClassMethod' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassMethod.php',\n    'PhpParser\\\\Node\\\\Stmt\\\\Class_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Class_.php',\n    'PhpParser\\\\Node\\\\Stmt\\\\Const_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Const_.php',\n    'PhpParser\\\\Node\\\\Stmt\\\\Continue_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Continue_.php',\n    'PhpParser\\\\Node\\\\Stmt\\\\DeclareDeclare' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/DeclareDeclare.php',\n    'PhpParser\\\\Node\\\\Stmt\\\\Declare_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Declare_.php',\n    'PhpParser\\\\Node\\\\Stmt\\\\Do_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Do_.php',\n    'PhpParser\\\\Node\\\\Stmt\\\\Echo_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Echo_.php',\n    'PhpParser\\\\Node\\\\Stmt\\\\ElseIf_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/ElseIf_.php',\n    'PhpParser\\\\Node\\\\Stmt\\\\Else_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Else_.php',\n    'PhpParser\\\\Node\\\\Stmt\\\\EnumCase' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/EnumCase.php',\n    'PhpParser\\\\Node\\\\Stmt\\\\Enum_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Enum_.php',\n    'PhpParser\\\\Node\\\\Stmt\\\\Expression' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Expression.php',\n    'PhpParser\\\\Node\\\\Stmt\\\\Finally_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Finally_.php',\n    'PhpParser\\\\Node\\\\Stmt\\\\For_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/For_.php',\n    'PhpParser\\\\Node\\\\Stmt\\\\Foreach_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Foreach_.php',\n    'PhpParser\\\\Node\\\\Stmt\\\\Function_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Function_.php',\n    'PhpParser\\\\Node\\\\Stmt\\\\Global_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Global_.php',\n    'PhpParser\\\\Node\\\\Stmt\\\\Goto_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Goto_.php',\n    'PhpParser\\\\Node\\\\Stmt\\\\GroupUse' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/GroupUse.php',\n    'PhpParser\\\\Node\\\\Stmt\\\\HaltCompiler' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/HaltCompiler.php',\n    'PhpParser\\\\Node\\\\Stmt\\\\If_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/If_.php',\n    'PhpParser\\\\Node\\\\Stmt\\\\InlineHTML' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/InlineHTML.php',\n    'PhpParser\\\\Node\\\\Stmt\\\\Interface_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Interface_.php',\n    'PhpParser\\\\Node\\\\Stmt\\\\Label' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Label.php',\n    'PhpParser\\\\Node\\\\Stmt\\\\Namespace_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Namespace_.php',\n    'PhpParser\\\\Node\\\\Stmt\\\\Nop' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Nop.php',\n    'PhpParser\\\\Node\\\\Stmt\\\\Property' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Property.php',\n    'PhpParser\\\\Node\\\\Stmt\\\\PropertyProperty' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/PropertyProperty.php',\n    'PhpParser\\\\Node\\\\Stmt\\\\Return_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Return_.php',\n    'PhpParser\\\\Node\\\\Stmt\\\\StaticVar' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/StaticVar.php',\n    'PhpParser\\\\Node\\\\Stmt\\\\Static_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Static_.php',\n    'PhpParser\\\\Node\\\\Stmt\\\\Switch_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Switch_.php',\n    'PhpParser\\\\Node\\\\Stmt\\\\TraitUse' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUse.php',\n    'PhpParser\\\\Node\\\\Stmt\\\\TraitUseAdaptation' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation.php',\n    'PhpParser\\\\Node\\\\Stmt\\\\TraitUseAdaptation\\\\Alias' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Alias.php',\n    'PhpParser\\\\Node\\\\Stmt\\\\TraitUseAdaptation\\\\Precedence' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Precedence.php',\n    'PhpParser\\\\Node\\\\Stmt\\\\Trait_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Trait_.php',\n    'PhpParser\\\\Node\\\\Stmt\\\\TryCatch' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TryCatch.php',\n    'PhpParser\\\\Node\\\\Stmt\\\\Unset_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Unset_.php',\n    'PhpParser\\\\Node\\\\Stmt\\\\UseUse' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/UseUse.php',\n    'PhpParser\\\\Node\\\\Stmt\\\\Use_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Use_.php',\n    'PhpParser\\\\Node\\\\Stmt\\\\While_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/While_.php',\n    'PhpParser\\\\Node\\\\UnionType' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/UnionType.php',\n    'PhpParser\\\\Node\\\\UseItem' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/UseItem.php',\n    'PhpParser\\\\Node\\\\VarLikeIdentifier' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/VarLikeIdentifier.php',\n    'PhpParser\\\\Node\\\\VariadicPlaceholder' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/VariadicPlaceholder.php',\n    'PhpParser\\\\Parser' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Parser.php',\n    'PhpParser\\\\ParserAbstract' => $vendorDir . '/nikic/php-parser/lib/PhpParser/ParserAbstract.php',\n    'PhpParser\\\\ParserFactory' => $vendorDir . '/nikic/php-parser/lib/PhpParser/ParserFactory.php',\n    'PhpParser\\\\Parser\\\\Php7' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Parser/Php7.php',\n    'PhpParser\\\\Parser\\\\Php8' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Parser/Php8.php',\n    'PhpParser\\\\PhpVersion' => $vendorDir . '/nikic/php-parser/lib/PhpParser/PhpVersion.php',\n    'PhpParser\\\\PrettyPrinter' => $vendorDir . '/nikic/php-parser/lib/PhpParser/PrettyPrinter.php',\n    'PhpParser\\\\PrettyPrinterAbstract' => $vendorDir . '/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php',\n    'PhpParser\\\\PrettyPrinter\\\\Standard' => $vendorDir . '/nikic/php-parser/lib/PhpParser/PrettyPrinter/Standard.php',\n    'PhpParser\\\\Token' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Token.php',\n    'Psr\\\\Container\\\\ContainerExceptionInterface' => $vendorDir . '/psr/container/src/ContainerExceptionInterface.php',\n    'Psr\\\\Container\\\\ContainerInterface' => $vendorDir . '/psr/container/src/ContainerInterface.php',\n    'Psr\\\\Container\\\\NotFoundExceptionInterface' => $vendorDir . '/psr/container/src/NotFoundExceptionInterface.php',\n    'Symfony\\\\Component\\\\Console\\\\Application' => $vendorDir . '/symfony/console/Application.php',\n    'Symfony\\\\Component\\\\Console\\\\Attribute\\\\Argument' => $vendorDir . '/symfony/console/Attribute/Argument.php',\n    'Symfony\\\\Component\\\\Console\\\\Attribute\\\\AsCommand' => $vendorDir . '/symfony/console/Attribute/AsCommand.php',\n    'Symfony\\\\Component\\\\Console\\\\Attribute\\\\Ask' => $vendorDir . '/symfony/console/Attribute/Ask.php',\n    'Symfony\\\\Component\\\\Console\\\\Attribute\\\\Interact' => $vendorDir . '/symfony/console/Attribute/Interact.php',\n    'Symfony\\\\Component\\\\Console\\\\Attribute\\\\InteractiveAttributeInterface' => $vendorDir . '/symfony/console/Attribute/InteractiveAttributeInterface.php',\n    'Symfony\\\\Component\\\\Console\\\\Attribute\\\\MapInput' => $vendorDir . '/symfony/console/Attribute/MapInput.php',\n    'Symfony\\\\Component\\\\Console\\\\Attribute\\\\Option' => $vendorDir . '/symfony/console/Attribute/Option.php',\n    'Symfony\\\\Component\\\\Console\\\\Attribute\\\\Reflection\\\\ReflectionMember' => $vendorDir . '/symfony/console/Attribute/Reflection/ReflectionMember.php',\n    'Symfony\\\\Component\\\\Console\\\\CI\\\\GithubActionReporter' => $vendorDir . '/symfony/console/CI/GithubActionReporter.php',\n    'Symfony\\\\Component\\\\Console\\\\Color' => $vendorDir . '/symfony/console/Color.php',\n    'Symfony\\\\Component\\\\Console\\\\CommandLoader\\\\CommandLoaderInterface' => $vendorDir . '/symfony/console/CommandLoader/CommandLoaderInterface.php',\n    'Symfony\\\\Component\\\\Console\\\\CommandLoader\\\\ContainerCommandLoader' => $vendorDir . '/symfony/console/CommandLoader/ContainerCommandLoader.php',\n    'Symfony\\\\Component\\\\Console\\\\CommandLoader\\\\FactoryCommandLoader' => $vendorDir . '/symfony/console/CommandLoader/FactoryCommandLoader.php',\n    'Symfony\\\\Component\\\\Console\\\\Command\\\\Command' => $vendorDir . '/symfony/console/Command/Command.php',\n    'Symfony\\\\Component\\\\Console\\\\Command\\\\CompleteCommand' => $vendorDir . '/symfony/console/Command/CompleteCommand.php',\n    'Symfony\\\\Component\\\\Console\\\\Command\\\\DumpCompletionCommand' => $vendorDir . '/symfony/console/Command/DumpCompletionCommand.php',\n    'Symfony\\\\Component\\\\Console\\\\Command\\\\HelpCommand' => $vendorDir . '/symfony/console/Command/HelpCommand.php',\n    'Symfony\\\\Component\\\\Console\\\\Command\\\\InvokableCommand' => $vendorDir . '/symfony/console/Command/InvokableCommand.php',\n    'Symfony\\\\Component\\\\Console\\\\Command\\\\LazyCommand' => $vendorDir . '/symfony/console/Command/LazyCommand.php',\n    'Symfony\\\\Component\\\\Console\\\\Command\\\\ListCommand' => $vendorDir . '/symfony/console/Command/ListCommand.php',\n    'Symfony\\\\Component\\\\Console\\\\Command\\\\LockableTrait' => $vendorDir . '/symfony/console/Command/LockableTrait.php',\n    'Symfony\\\\Component\\\\Console\\\\Command\\\\SignalableCommandInterface' => $vendorDir . '/symfony/console/Command/SignalableCommandInterface.php',\n    'Symfony\\\\Component\\\\Console\\\\Command\\\\TraceableCommand' => $vendorDir . '/symfony/console/Command/TraceableCommand.php',\n    'Symfony\\\\Component\\\\Console\\\\Completion\\\\CompletionInput' => $vendorDir . '/symfony/console/Completion/CompletionInput.php',\n    'Symfony\\\\Component\\\\Console\\\\Completion\\\\CompletionSuggestions' => $vendorDir . '/symfony/console/Completion/CompletionSuggestions.php',\n    'Symfony\\\\Component\\\\Console\\\\Completion\\\\Output\\\\BashCompletionOutput' => $vendorDir . '/symfony/console/Completion/Output/BashCompletionOutput.php',\n    'Symfony\\\\Component\\\\Console\\\\Completion\\\\Output\\\\CompletionOutputInterface' => $vendorDir . '/symfony/console/Completion/Output/CompletionOutputInterface.php',\n    'Symfony\\\\Component\\\\Console\\\\Completion\\\\Output\\\\FishCompletionOutput' => $vendorDir . '/symfony/console/Completion/Output/FishCompletionOutput.php',\n    'Symfony\\\\Component\\\\Console\\\\Completion\\\\Output\\\\ZshCompletionOutput' => $vendorDir . '/symfony/console/Completion/Output/ZshCompletionOutput.php',\n    'Symfony\\\\Component\\\\Console\\\\Completion\\\\Suggestion' => $vendorDir . '/symfony/console/Completion/Suggestion.php',\n    'Symfony\\\\Component\\\\Console\\\\ConsoleEvents' => $vendorDir . '/symfony/console/ConsoleEvents.php',\n    'Symfony\\\\Component\\\\Console\\\\Cursor' => $vendorDir . '/symfony/console/Cursor.php',\n    'Symfony\\\\Component\\\\Console\\\\DataCollector\\\\CommandDataCollector' => $vendorDir . '/symfony/console/DataCollector/CommandDataCollector.php',\n    'Symfony\\\\Component\\\\Console\\\\Debug\\\\CliRequest' => $vendorDir . '/symfony/console/Debug/CliRequest.php',\n    'Symfony\\\\Component\\\\Console\\\\DependencyInjection\\\\AddConsoleCommandPass' => $vendorDir . '/symfony/console/DependencyInjection/AddConsoleCommandPass.php',\n    'Symfony\\\\Component\\\\Console\\\\Descriptor\\\\ApplicationDescription' => $vendorDir . '/symfony/console/Descriptor/ApplicationDescription.php',\n    'Symfony\\\\Component\\\\Console\\\\Descriptor\\\\Descriptor' => $vendorDir . '/symfony/console/Descriptor/Descriptor.php',\n    'Symfony\\\\Component\\\\Console\\\\Descriptor\\\\DescriptorInterface' => $vendorDir . '/symfony/console/Descriptor/DescriptorInterface.php',\n    'Symfony\\\\Component\\\\Console\\\\Descriptor\\\\JsonDescriptor' => $vendorDir . '/symfony/console/Descriptor/JsonDescriptor.php',\n    'Symfony\\\\Component\\\\Console\\\\Descriptor\\\\MarkdownDescriptor' => $vendorDir . '/symfony/console/Descriptor/MarkdownDescriptor.php',\n    'Symfony\\\\Component\\\\Console\\\\Descriptor\\\\ReStructuredTextDescriptor' => $vendorDir . '/symfony/console/Descriptor/ReStructuredTextDescriptor.php',\n    'Symfony\\\\Component\\\\Console\\\\Descriptor\\\\TextDescriptor' => $vendorDir . '/symfony/console/Descriptor/TextDescriptor.php',\n    'Symfony\\\\Component\\\\Console\\\\Descriptor\\\\XmlDescriptor' => $vendorDir . '/symfony/console/Descriptor/XmlDescriptor.php',\n    'Symfony\\\\Component\\\\Console\\\\EventListener\\\\ErrorListener' => $vendorDir . '/symfony/console/EventListener/ErrorListener.php',\n    'Symfony\\\\Component\\\\Console\\\\Event\\\\ConsoleAlarmEvent' => $vendorDir . '/symfony/console/Event/ConsoleAlarmEvent.php',\n    'Symfony\\\\Component\\\\Console\\\\Event\\\\ConsoleCommandEvent' => $vendorDir . '/symfony/console/Event/ConsoleCommandEvent.php',\n    'Symfony\\\\Component\\\\Console\\\\Event\\\\ConsoleErrorEvent' => $vendorDir . '/symfony/console/Event/ConsoleErrorEvent.php',\n    'Symfony\\\\Component\\\\Console\\\\Event\\\\ConsoleEvent' => $vendorDir . '/symfony/console/Event/ConsoleEvent.php',\n    'Symfony\\\\Component\\\\Console\\\\Event\\\\ConsoleSignalEvent' => $vendorDir . '/symfony/console/Event/ConsoleSignalEvent.php',\n    'Symfony\\\\Component\\\\Console\\\\Event\\\\ConsoleTerminateEvent' => $vendorDir . '/symfony/console/Event/ConsoleTerminateEvent.php',\n    'Symfony\\\\Component\\\\Console\\\\Exception\\\\CommandNotFoundException' => $vendorDir . '/symfony/console/Exception/CommandNotFoundException.php',\n    'Symfony\\\\Component\\\\Console\\\\Exception\\\\ExceptionInterface' => $vendorDir . '/symfony/console/Exception/ExceptionInterface.php',\n    'Symfony\\\\Component\\\\Console\\\\Exception\\\\InvalidArgumentException' => $vendorDir . '/symfony/console/Exception/InvalidArgumentException.php',\n    'Symfony\\\\Component\\\\Console\\\\Exception\\\\InvalidOptionException' => $vendorDir . '/symfony/console/Exception/InvalidOptionException.php',\n    'Symfony\\\\Component\\\\Console\\\\Exception\\\\LogicException' => $vendorDir . '/symfony/console/Exception/LogicException.php',\n    'Symfony\\\\Component\\\\Console\\\\Exception\\\\MissingInputException' => $vendorDir . '/symfony/console/Exception/MissingInputException.php',\n    'Symfony\\\\Component\\\\Console\\\\Exception\\\\NamespaceNotFoundException' => $vendorDir . '/symfony/console/Exception/NamespaceNotFoundException.php',\n    'Symfony\\\\Component\\\\Console\\\\Exception\\\\RunCommandFailedException' => $vendorDir . '/symfony/console/Exception/RunCommandFailedException.php',\n    'Symfony\\\\Component\\\\Console\\\\Exception\\\\RuntimeException' => $vendorDir . '/symfony/console/Exception/RuntimeException.php',\n    'Symfony\\\\Component\\\\Console\\\\Formatter\\\\NullOutputFormatter' => $vendorDir . '/symfony/console/Formatter/NullOutputFormatter.php',\n    'Symfony\\\\Component\\\\Console\\\\Formatter\\\\NullOutputFormatterStyle' => $vendorDir . '/symfony/console/Formatter/NullOutputFormatterStyle.php',\n    'Symfony\\\\Component\\\\Console\\\\Formatter\\\\OutputFormatter' => $vendorDir . '/symfony/console/Formatter/OutputFormatter.php',\n    'Symfony\\\\Component\\\\Console\\\\Formatter\\\\OutputFormatterInterface' => $vendorDir . '/symfony/console/Formatter/OutputFormatterInterface.php',\n    'Symfony\\\\Component\\\\Console\\\\Formatter\\\\OutputFormatterStyle' => $vendorDir . '/symfony/console/Formatter/OutputFormatterStyle.php',\n    'Symfony\\\\Component\\\\Console\\\\Formatter\\\\OutputFormatterStyleInterface' => $vendorDir . '/symfony/console/Formatter/OutputFormatterStyleInterface.php',\n    'Symfony\\\\Component\\\\Console\\\\Formatter\\\\OutputFormatterStyleStack' => $vendorDir . '/symfony/console/Formatter/OutputFormatterStyleStack.php',\n    'Symfony\\\\Component\\\\Console\\\\Formatter\\\\WrappableOutputFormatterInterface' => $vendorDir . '/symfony/console/Formatter/WrappableOutputFormatterInterface.php',\n    'Symfony\\\\Component\\\\Console\\\\Helper\\\\DebugFormatterHelper' => $vendorDir . '/symfony/console/Helper/DebugFormatterHelper.php',\n    'Symfony\\\\Component\\\\Console\\\\Helper\\\\DescriptorHelper' => $vendorDir . '/symfony/console/Helper/DescriptorHelper.php',\n    'Symfony\\\\Component\\\\Console\\\\Helper\\\\Dumper' => $vendorDir . '/symfony/console/Helper/Dumper.php',\n    'Symfony\\\\Component\\\\Console\\\\Helper\\\\FormatterHelper' => $vendorDir . '/symfony/console/Helper/FormatterHelper.php',\n    'Symfony\\\\Component\\\\Console\\\\Helper\\\\Helper' => $vendorDir . '/symfony/console/Helper/Helper.php',\n    'Symfony\\\\Component\\\\Console\\\\Helper\\\\HelperInterface' => $vendorDir . '/symfony/console/Helper/HelperInterface.php',\n    'Symfony\\\\Component\\\\Console\\\\Helper\\\\HelperSet' => $vendorDir . '/symfony/console/Helper/HelperSet.php',\n    'Symfony\\\\Component\\\\Console\\\\Helper\\\\InputAwareHelper' => $vendorDir . '/symfony/console/Helper/InputAwareHelper.php',\n    'Symfony\\\\Component\\\\Console\\\\Helper\\\\OutputWrapper' => $vendorDir . '/symfony/console/Helper/OutputWrapper.php',\n    'Symfony\\\\Component\\\\Console\\\\Helper\\\\ProcessHelper' => $vendorDir . '/symfony/console/Helper/ProcessHelper.php',\n    'Symfony\\\\Component\\\\Console\\\\Helper\\\\ProgressBar' => $vendorDir . '/symfony/console/Helper/ProgressBar.php',\n    'Symfony\\\\Component\\\\Console\\\\Helper\\\\ProgressIndicator' => $vendorDir . '/symfony/console/Helper/ProgressIndicator.php',\n    'Symfony\\\\Component\\\\Console\\\\Helper\\\\QuestionHelper' => $vendorDir . '/symfony/console/Helper/QuestionHelper.php',\n    'Symfony\\\\Component\\\\Console\\\\Helper\\\\SymfonyQuestionHelper' => $vendorDir . '/symfony/console/Helper/SymfonyQuestionHelper.php',\n    'Symfony\\\\Component\\\\Console\\\\Helper\\\\Table' => $vendorDir . '/symfony/console/Helper/Table.php',\n    'Symfony\\\\Component\\\\Console\\\\Helper\\\\TableCell' => $vendorDir . '/symfony/console/Helper/TableCell.php',\n    'Symfony\\\\Component\\\\Console\\\\Helper\\\\TableCellStyle' => $vendorDir . '/symfony/console/Helper/TableCellStyle.php',\n    'Symfony\\\\Component\\\\Console\\\\Helper\\\\TableRows' => $vendorDir . '/symfony/console/Helper/TableRows.php',\n    'Symfony\\\\Component\\\\Console\\\\Helper\\\\TableSeparator' => $vendorDir . '/symfony/console/Helper/TableSeparator.php',\n    'Symfony\\\\Component\\\\Console\\\\Helper\\\\TableStyle' => $vendorDir . '/symfony/console/Helper/TableStyle.php',\n    'Symfony\\\\Component\\\\Console\\\\Helper\\\\TerminalInputHelper' => $vendorDir . '/symfony/console/Helper/TerminalInputHelper.php',\n    'Symfony\\\\Component\\\\Console\\\\Helper\\\\TreeHelper' => $vendorDir . '/symfony/console/Helper/TreeHelper.php',\n    'Symfony\\\\Component\\\\Console\\\\Helper\\\\TreeNode' => $vendorDir . '/symfony/console/Helper/TreeNode.php',\n    'Symfony\\\\Component\\\\Console\\\\Helper\\\\TreeStyle' => $vendorDir . '/symfony/console/Helper/TreeStyle.php',\n    'Symfony\\\\Component\\\\Console\\\\Input\\\\ArgvInput' => $vendorDir . '/symfony/console/Input/ArgvInput.php',\n    'Symfony\\\\Component\\\\Console\\\\Input\\\\ArrayInput' => $vendorDir . '/symfony/console/Input/ArrayInput.php',\n    'Symfony\\\\Component\\\\Console\\\\Input\\\\Input' => $vendorDir . '/symfony/console/Input/Input.php',\n    'Symfony\\\\Component\\\\Console\\\\Input\\\\InputArgument' => $vendorDir . '/symfony/console/Input/InputArgument.php',\n    'Symfony\\\\Component\\\\Console\\\\Input\\\\InputAwareInterface' => $vendorDir . '/symfony/console/Input/InputAwareInterface.php',\n    'Symfony\\\\Component\\\\Console\\\\Input\\\\InputDefinition' => $vendorDir . '/symfony/console/Input/InputDefinition.php',\n    'Symfony\\\\Component\\\\Console\\\\Input\\\\InputInterface' => $vendorDir . '/symfony/console/Input/InputInterface.php',\n    'Symfony\\\\Component\\\\Console\\\\Input\\\\InputOption' => $vendorDir . '/symfony/console/Input/InputOption.php',\n    'Symfony\\\\Component\\\\Console\\\\Input\\\\StreamableInputInterface' => $vendorDir . '/symfony/console/Input/StreamableInputInterface.php',\n    'Symfony\\\\Component\\\\Console\\\\Input\\\\StringInput' => $vendorDir . '/symfony/console/Input/StringInput.php',\n    'Symfony\\\\Component\\\\Console\\\\Interaction\\\\Interaction' => $vendorDir . '/symfony/console/Interaction/Interaction.php',\n    'Symfony\\\\Component\\\\Console\\\\Logger\\\\ConsoleLogger' => $vendorDir . '/symfony/console/Logger/ConsoleLogger.php',\n    'Symfony\\\\Component\\\\Console\\\\Messenger\\\\RunCommandContext' => $vendorDir . '/symfony/console/Messenger/RunCommandContext.php',\n    'Symfony\\\\Component\\\\Console\\\\Messenger\\\\RunCommandMessage' => $vendorDir . '/symfony/console/Messenger/RunCommandMessage.php',\n    'Symfony\\\\Component\\\\Console\\\\Messenger\\\\RunCommandMessageHandler' => $vendorDir . '/symfony/console/Messenger/RunCommandMessageHandler.php',\n    'Symfony\\\\Component\\\\Console\\\\Output\\\\AnsiColorMode' => $vendorDir . '/symfony/console/Output/AnsiColorMode.php',\n    'Symfony\\\\Component\\\\Console\\\\Output\\\\BufferedOutput' => $vendorDir . '/symfony/console/Output/BufferedOutput.php',\n    'Symfony\\\\Component\\\\Console\\\\Output\\\\ConsoleOutput' => $vendorDir . '/symfony/console/Output/ConsoleOutput.php',\n    'Symfony\\\\Component\\\\Console\\\\Output\\\\ConsoleOutputInterface' => $vendorDir . '/symfony/console/Output/ConsoleOutputInterface.php',\n    'Symfony\\\\Component\\\\Console\\\\Output\\\\ConsoleSectionOutput' => $vendorDir . '/symfony/console/Output/ConsoleSectionOutput.php',\n    'Symfony\\\\Component\\\\Console\\\\Output\\\\NullOutput' => $vendorDir . '/symfony/console/Output/NullOutput.php',\n    'Symfony\\\\Component\\\\Console\\\\Output\\\\Output' => $vendorDir . '/symfony/console/Output/Output.php',\n    'Symfony\\\\Component\\\\Console\\\\Output\\\\OutputInterface' => $vendorDir . '/symfony/console/Output/OutputInterface.php',\n    'Symfony\\\\Component\\\\Console\\\\Output\\\\StreamOutput' => $vendorDir . '/symfony/console/Output/StreamOutput.php',\n    'Symfony\\\\Component\\\\Console\\\\Output\\\\TrimmedBufferOutput' => $vendorDir . '/symfony/console/Output/TrimmedBufferOutput.php',\n    'Symfony\\\\Component\\\\Console\\\\Question\\\\ChoiceQuestion' => $vendorDir . '/symfony/console/Question/ChoiceQuestion.php',\n    'Symfony\\\\Component\\\\Console\\\\Question\\\\ConfirmationQuestion' => $vendorDir . '/symfony/console/Question/ConfirmationQuestion.php',\n    'Symfony\\\\Component\\\\Console\\\\Question\\\\Question' => $vendorDir . '/symfony/console/Question/Question.php',\n    'Symfony\\\\Component\\\\Console\\\\SignalRegistry\\\\SignalMap' => $vendorDir . '/symfony/console/SignalRegistry/SignalMap.php',\n    'Symfony\\\\Component\\\\Console\\\\SignalRegistry\\\\SignalRegistry' => $vendorDir . '/symfony/console/SignalRegistry/SignalRegistry.php',\n    'Symfony\\\\Component\\\\Console\\\\SingleCommandApplication' => $vendorDir . '/symfony/console/SingleCommandApplication.php',\n    'Symfony\\\\Component\\\\Console\\\\Style\\\\OutputStyle' => $vendorDir . '/symfony/console/Style/OutputStyle.php',\n    'Symfony\\\\Component\\\\Console\\\\Style\\\\StyleInterface' => $vendorDir . '/symfony/console/Style/StyleInterface.php',\n    'Symfony\\\\Component\\\\Console\\\\Style\\\\SymfonyStyle' => $vendorDir . '/symfony/console/Style/SymfonyStyle.php',\n    'Symfony\\\\Component\\\\Console\\\\Terminal' => $vendorDir . '/symfony/console/Terminal.php',\n    'Symfony\\\\Component\\\\Console\\\\Tester\\\\ApplicationTester' => $vendorDir . '/symfony/console/Tester/ApplicationTester.php',\n    'Symfony\\\\Component\\\\Console\\\\Tester\\\\CommandCompletionTester' => $vendorDir . '/symfony/console/Tester/CommandCompletionTester.php',\n    'Symfony\\\\Component\\\\Console\\\\Tester\\\\CommandTester' => $vendorDir . '/symfony/console/Tester/CommandTester.php',\n    'Symfony\\\\Component\\\\Console\\\\Tester\\\\Constraint\\\\CommandIsSuccessful' => $vendorDir . '/symfony/console/Tester/Constraint/CommandIsSuccessful.php',\n    'Symfony\\\\Component\\\\Console\\\\Tester\\\\TesterTrait' => $vendorDir . '/symfony/console/Tester/TesterTrait.php',\n    'Symfony\\\\Component\\\\String\\\\AbstractString' => $vendorDir . '/symfony/string/AbstractString.php',\n    'Symfony\\\\Component\\\\String\\\\AbstractUnicodeString' => $vendorDir . '/symfony/string/AbstractUnicodeString.php',\n    'Symfony\\\\Component\\\\String\\\\ByteString' => $vendorDir . '/symfony/string/ByteString.php',\n    'Symfony\\\\Component\\\\String\\\\CodePointString' => $vendorDir . '/symfony/string/CodePointString.php',\n    'Symfony\\\\Component\\\\String\\\\Exception\\\\ExceptionInterface' => $vendorDir . '/symfony/string/Exception/ExceptionInterface.php',\n    'Symfony\\\\Component\\\\String\\\\Exception\\\\InvalidArgumentException' => $vendorDir . '/symfony/string/Exception/InvalidArgumentException.php',\n    'Symfony\\\\Component\\\\String\\\\Exception\\\\RuntimeException' => $vendorDir . '/symfony/string/Exception/RuntimeException.php',\n    'Symfony\\\\Component\\\\String\\\\Inflector\\\\EnglishInflector' => $vendorDir . '/symfony/string/Inflector/EnglishInflector.php',\n    'Symfony\\\\Component\\\\String\\\\Inflector\\\\FrenchInflector' => $vendorDir . '/symfony/string/Inflector/FrenchInflector.php',\n    'Symfony\\\\Component\\\\String\\\\Inflector\\\\InflectorInterface' => $vendorDir . '/symfony/string/Inflector/InflectorInterface.php',\n    'Symfony\\\\Component\\\\String\\\\Inflector\\\\SpanishInflector' => $vendorDir . '/symfony/string/Inflector/SpanishInflector.php',\n    'Symfony\\\\Component\\\\String\\\\LazyString' => $vendorDir . '/symfony/string/LazyString.php',\n    'Symfony\\\\Component\\\\String\\\\Slugger\\\\AsciiSlugger' => $vendorDir . '/symfony/string/Slugger/AsciiSlugger.php',\n    'Symfony\\\\Component\\\\String\\\\Slugger\\\\SluggerInterface' => $vendorDir . '/symfony/string/Slugger/SluggerInterface.php',\n    'Symfony\\\\Component\\\\String\\\\TruncateMode' => $vendorDir . '/symfony/string/TruncateMode.php',\n    'Symfony\\\\Component\\\\String\\\\UnicodeString' => $vendorDir . '/symfony/string/UnicodeString.php',\n    'Symfony\\\\Component\\\\Yaml\\\\Command\\\\LintCommand' => $vendorDir . '/symfony/yaml/Command/LintCommand.php',\n    'Symfony\\\\Component\\\\Yaml\\\\Dumper' => $vendorDir . '/symfony/yaml/Dumper.php',\n    'Symfony\\\\Component\\\\Yaml\\\\Escaper' => $vendorDir . '/symfony/yaml/Escaper.php',\n    'Symfony\\\\Component\\\\Yaml\\\\Exception\\\\DumpException' => $vendorDir . '/symfony/yaml/Exception/DumpException.php',\n    'Symfony\\\\Component\\\\Yaml\\\\Exception\\\\ExceptionInterface' => $vendorDir . '/symfony/yaml/Exception/ExceptionInterface.php',\n    'Symfony\\\\Component\\\\Yaml\\\\Exception\\\\ParseException' => $vendorDir . '/symfony/yaml/Exception/ParseException.php',\n    'Symfony\\\\Component\\\\Yaml\\\\Exception\\\\RuntimeException' => $vendorDir . '/symfony/yaml/Exception/RuntimeException.php',\n    'Symfony\\\\Component\\\\Yaml\\\\Inline' => $vendorDir . '/symfony/yaml/Inline.php',\n    'Symfony\\\\Component\\\\Yaml\\\\Parser' => $vendorDir . '/symfony/yaml/Parser.php',\n    'Symfony\\\\Component\\\\Yaml\\\\ParserState' => $vendorDir . '/symfony/yaml/ParserState.php',\n    'Symfony\\\\Component\\\\Yaml\\\\Tag\\\\TaggedValue' => $vendorDir . '/symfony/yaml/Tag/TaggedValue.php',\n    'Symfony\\\\Component\\\\Yaml\\\\Unescaper' => $vendorDir . '/symfony/yaml/Unescaper.php',\n    'Symfony\\\\Component\\\\Yaml\\\\Yaml' => $vendorDir . '/symfony/yaml/Yaml.php',\n    'Symfony\\\\Contracts\\\\Service\\\\Attribute\\\\Required' => $vendorDir . '/symfony/service-contracts/Attribute/Required.php',\n    'Symfony\\\\Contracts\\\\Service\\\\Attribute\\\\SubscribedService' => $vendorDir . '/symfony/service-contracts/Attribute/SubscribedService.php',\n    'Symfony\\\\Contracts\\\\Service\\\\ContainerAwareInterface' => $vendorDir . '/symfony/service-contracts/ContainerAwareInterface.php',\n    'Symfony\\\\Contracts\\\\Service\\\\ContainerProviderInterface' => $vendorDir . '/symfony/service-contracts/ContainerProviderInterface.php',\n    'Symfony\\\\Contracts\\\\Service\\\\ResetInterface' => $vendorDir . '/symfony/service-contracts/ResetInterface.php',\n    'Symfony\\\\Contracts\\\\Service\\\\ServiceCollectionInterface' => $vendorDir . '/symfony/service-contracts/ServiceCollectionInterface.php',\n    'Symfony\\\\Contracts\\\\Service\\\\ServiceLocatorTrait' => $vendorDir . '/symfony/service-contracts/ServiceLocatorTrait.php',\n    'Symfony\\\\Contracts\\\\Service\\\\ServiceMethodsSubscriberTrait' => $vendorDir . '/symfony/service-contracts/ServiceMethodsSubscriberTrait.php',\n    'Symfony\\\\Contracts\\\\Service\\\\ServiceProviderInterface' => $vendorDir . '/symfony/service-contracts/ServiceProviderInterface.php',\n    'Symfony\\\\Contracts\\\\Service\\\\ServiceSubscriberInterface' => $vendorDir . '/symfony/service-contracts/ServiceSubscriberInterface.php',\n    'Symfony\\\\Contracts\\\\Service\\\\ServiceSubscriberTrait' => $vendorDir . '/symfony/service-contracts/ServiceSubscriberTrait.php',\n    'Symfony\\\\Polyfill\\\\Ctype\\\\Ctype' => $vendorDir . '/symfony/polyfill-ctype/Ctype.php',\n    'Symfony\\\\Polyfill\\\\Intl\\\\Grapheme\\\\Grapheme' => $vendorDir . '/symfony/polyfill-intl-grapheme/Grapheme.php',\n    'Symfony\\\\Polyfill\\\\Intl\\\\Normalizer\\\\Normalizer' => $vendorDir . '/symfony/polyfill-intl-normalizer/Normalizer.php',\n    'Symfony\\\\Polyfill\\\\Mbstring\\\\Mbstring' => $vendorDir . '/symfony/polyfill-mbstring/Mbstring.php',\n    'WorkerSafety\\\\Analyzer\\\\AnalysisRequest' => $baseDir . '/src/Analyzer/AnalysisRequest.php',\n    'WorkerSafety\\\\Analyzer\\\\AnalysisResult' => $baseDir . '/src/Analyzer/AnalysisResult.php',\n    'WorkerSafety\\\\Analyzer\\\\Analyzer' => $baseDir . '/src/Analyzer/Analyzer.php',\n    'WorkerSafety\\\\Analyzer\\\\FileAnalysisResult' => $baseDir . '/src/Analyzer/FileAnalysisResult.php',\n    'WorkerSafety\\\\Analyzer\\\\FileAnalyzer' => $baseDir . '/src/Analyzer/FileAnalyzer.php',\n    'WorkerSafety\\\\Analyzer\\\\ProjectAnalyzer' => $baseDir . '/src/Analyzer/ProjectAnalyzer.php',\n    'WorkerSafety\\\\Analyzer\\\\ScanOptions' => $baseDir . '/src/Analyzer/ScanOptions.php',\n    'WorkerSafety\\\\Analyzer\\\\ScanOutcome' => $baseDir . '/src/Analyzer/ScanOutcome.php',\n    'WorkerSafety\\\\Analyzer\\\\ScanPathResolver' => $baseDir . '/src/Analyzer/ScanPathResolver.php',\n    'WorkerSafety\\\\Analyzer\\\\ScanService' => $baseDir . '/src/Analyzer/ScanService.php',\n    'WorkerSafety\\\\Application\\\\ApplicationInfo' => $baseDir . '/src/Application/ApplicationInfo.php',\n    'WorkerSafety\\\\Application\\\\ExitCode' => $baseDir . '/src/Application/ExitCode.php',\n    'WorkerSafety\\\\Application\\\\WorkerSafetyApplication' => $baseDir . '/src/Application/WorkerSafetyApplication.php',\n    'WorkerSafety\\\\Ast\\\\AstHelper' => $baseDir . '/src/Ast/AstHelper.php',\n    'WorkerSafety\\\\Ast\\\\AstParser' => $baseDir . '/src/Ast/AstParser.php',\n    'WorkerSafety\\\\Ast\\\\Index\\\\BindingContext' => $baseDir . '/src/Ast/Index/BindingContext.php',\n    'WorkerSafety\\\\Ast\\\\Index\\\\ClassKind' => $baseDir . '/src/Ast/Index/ClassKind.php',\n    'WorkerSafety\\\\Ast\\\\Index\\\\ClassShape' => $baseDir . '/src/Ast/Index/ClassShape.php',\n    'WorkerSafety\\\\Ast\\\\Index\\\\ContainerBinding' => $baseDir . '/src/Ast/Index/ContainerBinding.php',\n    'WorkerSafety\\\\Ast\\\\Index\\\\ContainerBindingCollector' => $baseDir . '/src/Ast/Index/ContainerBindingCollector.php',\n    'WorkerSafety\\\\Ast\\\\Index\\\\DefaultValueKind' => $baseDir . '/src/Ast/Index/DefaultValueKind.php',\n    'WorkerSafety\\\\Ast\\\\Index\\\\MethodShape' => $baseDir . '/src/Ast/Index/MethodShape.php',\n    'WorkerSafety\\\\Ast\\\\Index\\\\ProjectIndex' => $baseDir . '/src/Ast/Index/ProjectIndex.php',\n    'WorkerSafety\\\\Ast\\\\Index\\\\PropertyShape' => $baseDir . '/src/Ast/Index/PropertyShape.php',\n    'WorkerSafety\\\\Ast\\\\Index\\\\SingletonAnalyzer' => $baseDir . '/src/Ast/Index/SingletonAnalyzer.php',\n    'WorkerSafety\\\\Ast\\\\Index\\\\StateWrite' => $baseDir . '/src/Ast/Index/StateWrite.php',\n    'WorkerSafety\\\\Ast\\\\Index\\\\StaticLocalVariable' => $baseDir . '/src/Ast/Index/StaticLocalVariable.php',\n    'WorkerSafety\\\\Ast\\\\Index\\\\WriteKind' => $baseDir . '/src/Ast/Index/WriteKind.php',\n    'WorkerSafety\\\\Ast\\\\ParseFailure' => $baseDir . '/src/Ast/ParseFailure.php',\n    'WorkerSafety\\\\Ast\\\\ParseResult' => $baseDir . '/src/Ast/ParseResult.php',\n    'WorkerSafety\\\\Ast\\\\Visitor\\\\ClassShapeBuilder' => $baseDir . '/src/Ast/Visitor/ClassShapeBuilder.php',\n    'WorkerSafety\\\\Ast\\\\Visitor\\\\FirstInstantiationFinder' => $baseDir . '/src/Ast/Visitor/FirstInstantiationFinder.php',\n    'WorkerSafety\\\\Ast\\\\Visitor\\\\FunctionScope' => $baseDir . '/src/Ast/Visitor/FunctionScope.php',\n    'WorkerSafety\\\\Ast\\\\Visitor\\\\IndexCollectingVisitor' => $baseDir . '/src/Ast/Visitor/IndexCollectingVisitor.php',\n    'WorkerSafety\\\\Ast\\\\Visitor\\\\RuleDispatchVisitor' => $baseDir . '/src/Ast/Visitor/RuleDispatchVisitor.php',\n    'WorkerSafety\\\\Ast\\\\Visitor\\\\VariableWriteFinder' => $baseDir . '/src/Ast/Visitor/VariableWriteFinder.php',\n    'WorkerSafety\\\\Attribute\\\\WorkerSafetyIgnore' => $baseDir . '/src/Attribute/WorkerSafetyIgnore.php',\n    'WorkerSafety\\\\Baseline\\\\Baseline' => $baseDir . '/src/Baseline/Baseline.php',\n    'WorkerSafety\\\\Baseline\\\\BaselineFilter' => $baseDir . '/src/Baseline/BaselineFilter.php',\n    'WorkerSafety\\\\Baseline\\\\BaselineRepository' => $baseDir . '/src/Baseline/BaselineRepository.php',\n    'WorkerSafety\\\\Command\\\\AbstractCommand' => $baseDir . '/src/Command/AbstractCommand.php',\n    'WorkerSafety\\\\Command\\\\BaselineCommand' => $baseDir . '/src/Command/BaselineCommand.php',\n    'WorkerSafety\\\\Command\\\\InitCommand' => $baseDir . '/src/Command/InitCommand.php',\n    'WorkerSafety\\\\Command\\\\RulesCommand' => $baseDir . '/src/Command/RulesCommand.php',\n    'WorkerSafety\\\\Command\\\\ScanCommand' => $baseDir . '/src/Command/ScanCommand.php',\n    'WorkerSafety\\\\Config\\\\Configuration' => $baseDir . '/src/Config/Configuration.php',\n    'WorkerSafety\\\\Config\\\\ConfigurationLoader' => $baseDir . '/src/Config/ConfigurationLoader.php',\n    'WorkerSafety\\\\Config\\\\ConfigurationTemplate' => $baseDir . '/src/Config/ConfigurationTemplate.php',\n    'WorkerSafety\\\\Config\\\\RuleSetting' => $baseDir . '/src/Config/RuleSetting.php',\n    'WorkerSafety\\\\Exception\\\\AnalysisException' => $baseDir . '/src/Exception/AnalysisException.php',\n    'WorkerSafety\\\\Exception\\\\ConfigurationException' => $baseDir . '/src/Exception/ConfigurationException.php',\n    'WorkerSafety\\\\Exception\\\\WorkerSafetyException' => $baseDir . '/src/Exception/WorkerSafetyException.php',\n    'WorkerSafety\\\\Finding\\\\Finding' => $baseDir . '/src/Finding/Finding.php',\n    'WorkerSafety\\\\Finding\\\\FindingCollection' => $baseDir . '/src/Finding/FindingCollection.php',\n    'WorkerSafety\\\\Finding\\\\Location' => $baseDir . '/src/Finding/Location.php',\n    'WorkerSafety\\\\Finding\\\\RuleCategory' => $baseDir . '/src/Finding/RuleCategory.php',\n    'WorkerSafety\\\\Finding\\\\Severity' => $baseDir . '/src/Finding/Severity.php',\n    'WorkerSafety\\\\Finding\\\\SymbolContext' => $baseDir . '/src/Finding/SymbolContext.php',\n    'WorkerSafety\\\\Framework\\\\DetectedFramework' => $baseDir . '/src/Framework/DetectedFramework.php',\n    'WorkerSafety\\\\Framework\\\\Framework' => $baseDir . '/src/Framework/Framework.php',\n    'WorkerSafety\\\\Framework\\\\FrameworkAdapter' => $baseDir . '/src/Framework/FrameworkAdapter.php',\n    'WorkerSafety\\\\Framework\\\\FrameworkAdapterRegistry' => $baseDir . '/src/Framework/FrameworkAdapterRegistry.php',\n    'WorkerSafety\\\\Framework\\\\FrameworkDetector' => $baseDir . '/src/Framework/FrameworkDetector.php',\n    'WorkerSafety\\\\Framework\\\\Laravel\\\\LaravelAdapter' => $baseDir . '/src/Framework/Laravel/LaravelAdapter.php',\n    'WorkerSafety\\\\Framework\\\\Laravel\\\\LaravelContainerBindingCollector' => $baseDir . '/src/Framework/Laravel/LaravelContainerBindingCollector.php',\n    'WorkerSafety\\\\Framework\\\\Laravel\\\\Rule\\\\ContainerSingletonMutableStateRule' => $baseDir . '/src/Framework/Laravel/Rule/ContainerSingletonMutableStateRule.php',\n    'WorkerSafety\\\\Framework\\\\Laravel\\\\Rule\\\\ScopedBindingCandidateRule' => $baseDir . '/src/Framework/Laravel/Rule/ScopedBindingCandidateRule.php',\n    'WorkerSafety\\\\Framework\\\\Laravel\\\\SharedBindingInspection' => $baseDir . '/src/Framework/Laravel/SharedBindingInspection.php',\n    'WorkerSafety\\\\Framework\\\\Laravel\\\\SharedBindingInspector' => $baseDir . '/src/Framework/Laravel/SharedBindingInspector.php',\n    'WorkerSafety\\\\Framework\\\\PlainPhpAdapter' => $baseDir . '/src/Framework/PlainPhpAdapter.php',\n    'WorkerSafety\\\\Framework\\\\Symfony\\\\SymfonyAdapter' => $baseDir . '/src/Framework/Symfony/SymfonyAdapter.php',\n    'WorkerSafety\\\\Ignore\\\\FindingSuppressor' => $baseDir . '/src/Ignore/FindingSuppressor.php',\n    'WorkerSafety\\\\Ignore\\\\IgnoreAttributeVisitor' => $baseDir . '/src/Ignore/IgnoreAttributeVisitor.php',\n    'WorkerSafety\\\\Ignore\\\\IgnoreDirectiveParser' => $baseDir . '/src/Ignore/IgnoreDirectiveParser.php',\n    'WorkerSafety\\\\Ignore\\\\SuppressionIndex' => $baseDir . '/src/Ignore/SuppressionIndex.php',\n    'WorkerSafety\\\\Integration\\\\Laravel\\\\ArtisanScanCommand' => $baseDir . '/src/Integration/Laravel/ArtisanScanCommand.php',\n    'WorkerSafety\\\\Integration\\\\Laravel\\\\WorkerSafetyServiceProvider' => $baseDir . '/src/Integration/Laravel/WorkerSafetyServiceProvider.php',\n    'WorkerSafety\\\\Reporting\\\\ConsoleReporter' => $baseDir . '/src/Reporting/ConsoleReporter.php',\n    'WorkerSafety\\\\Reporting\\\\ConsoleStyles' => $baseDir . '/src/Reporting/ConsoleStyles.php',\n    'WorkerSafety\\\\Reporting\\\\JsonReporter' => $baseDir . '/src/Reporting/JsonReporter.php',\n    'WorkerSafety\\\\Reporting\\\\OutputFormat' => $baseDir . '/src/Reporting/OutputFormat.php',\n    'WorkerSafety\\\\Reporting\\\\Reporter' => $baseDir . '/src/Reporting/Reporter.php',\n    'WorkerSafety\\\\Reporting\\\\ReporterFactory' => $baseDir . '/src/Reporting/ReporterFactory.php',\n    'WorkerSafety\\\\Reporting\\\\SarifReporter' => $baseDir . '/src/Reporting/SarifReporter.php',\n    'WorkerSafety\\\\Reporting\\\\ScanReport' => $baseDir . '/src/Reporting/ScanReport.php',\n    'WorkerSafety\\\\Rule\\\\AbstractRule' => $baseDir . '/src/Rule/AbstractRule.php',\n    'WorkerSafety\\\\Rule\\\\BuiltIn\\\\MutableGlobalVariableRule' => $baseDir . '/src/Rule/BuiltIn/MutableGlobalVariableRule.php',\n    'WorkerSafety\\\\Rule\\\\BuiltIn\\\\MutableSingletonRule' => $baseDir . '/src/Rule/BuiltIn/MutableSingletonRule.php',\n    'WorkerSafety\\\\Rule\\\\BuiltIn\\\\MutableStaticPropertyRule' => $baseDir . '/src/Rule/BuiltIn/MutableStaticPropertyRule.php',\n    'WorkerSafety\\\\Rule\\\\BuiltIn\\\\PersistentListenerRegistrationRule' => $baseDir . '/src/Rule/BuiltIn/PersistentListenerRegistrationRule.php',\n    'WorkerSafety\\\\Rule\\\\BuiltIn\\\\RuntimeEnvironmentMutationRule' => $baseDir . '/src/Rule/BuiltIn/RuntimeEnvironmentMutationRule.php',\n    'WorkerSafety\\\\Rule\\\\BuiltIn\\\\ShutdownLifecycleAssumptionRule' => $baseDir . '/src/Rule/BuiltIn/ShutdownLifecycleAssumptionRule.php',\n    'WorkerSafety\\\\Rule\\\\BuiltIn\\\\StaticCollectionGrowthRule' => $baseDir . '/src/Rule/BuiltIn/StaticCollectionGrowthRule.php',\n    'WorkerSafety\\\\Rule\\\\BuiltIn\\\\StaticRequestContextRule' => $baseDir . '/src/Rule/BuiltIn/StaticRequestContextRule.php',\n    'WorkerSafety\\\\Rule\\\\ProjectContext' => $baseDir . '/src/Rule/ProjectContext.php',\n    'WorkerSafety\\\\Rule\\\\ReportingContext' => $baseDir . '/src/Rule/ReportingContext.php',\n    'WorkerSafety\\\\Rule\\\\Rule' => $baseDir . '/src/Rule/Rule.php',\n    'WorkerSafety\\\\Rule\\\\RuleContext' => $baseDir . '/src/Rule/RuleContext.php',\n    'WorkerSafety\\\\Rule\\\\RuleDefinition' => $baseDir . '/src/Rule/RuleDefinition.php',\n    'WorkerSafety\\\\Rule\\\\RuleId' => $baseDir . '/src/Rule/RuleId.php',\n    'WorkerSafety\\\\Rule\\\\RuleRegistry' => $baseDir . '/src/Rule/RuleRegistry.php',\n    'WorkerSafety\\\\Rule\\\\RuleRegistryFactory' => $baseDir . '/src/Rule/RuleRegistryFactory.php',\n    'WorkerSafety\\\\Rule\\\\Scope' => $baseDir . '/src/Rule/Scope.php',\n    'WorkerSafety\\\\Runtime\\\\RuntimeTarget' => $baseDir . '/src/Runtime/RuntimeTarget.php',\n    'WorkerSafety\\\\Runtime\\\\RuntimeTargetSet' => $baseDir . '/src/Runtime/RuntimeTargetSet.php',\n    'WorkerSafety\\\\Support\\\\ExcludeMatcher' => $baseDir . '/src/Support/ExcludeMatcher.php',\n    'WorkerSafety\\\\Support\\\\FileFinder' => $baseDir . '/src/Support/FileFinder.php',\n    'WorkerSafety\\\\Support\\\\NameHeuristics' => $baseDir . '/src/Support/NameHeuristics.php',\n    'WorkerSafety\\\\Support\\\\Paths' => $baseDir . '/src/Support/Paths.php',\n    'WorkerSafety\\\\Support\\\\SourceFile' => $baseDir . '/src/Support/SourceFile.php',\n);\n","vendor/composer/autoload_files.php":"<?php\n\n// autoload_files.php @generated by Composer\n\n$vendorDir = dirname(__DIR__);\n$baseDir = dirname($vendorDir);\n\nreturn array(\n    '6e3fae29631ef280660b3cdad06f25a8' => $vendorDir . '/symfony/deprecation-contracts/function.php',\n    '320cde22f66dd4f5d3fd621d3e88b98f' => $vendorDir . '/symfony/polyfill-ctype/bootstrap.php',\n    '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php',\n    '8825ede83f2f289127722d4e842cf7e8' => $vendorDir . '/symfony/polyfill-intl-grapheme/bootstrap.php',\n    'e69f7f6ee287b969198c3c9d6777bd38' => $vendorDir . '/symfony/polyfill-intl-normalizer/bootstrap.php',\n    'b6b991a57620e2fb6b2f66f03fe9ddc2' => $vendorDir . '/symfony/string/Resources/functions.php',\n);\n","vendor/composer/autoload_namespaces.php":"<?php\n\n// autoload_namespaces.php @generated by Composer\n\n$vendorDir = dirname(__DIR__);\n$baseDir = dirname($vendorDir);\n\nreturn array(\n);\n","vendor/composer/autoload_psr4.php":"<?php\n\n// autoload_psr4.php @generated by Composer\n\n$vendorDir = dirname(__DIR__);\n$baseDir = dirname($vendorDir);\n\nreturn array(\n    'WorkerSafety\\\\' => array($baseDir . '/src'),\n    'Symfony\\\\Polyfill\\\\Mbstring\\\\' => array($vendorDir . '/symfony/polyfill-mbstring'),\n    'Symfony\\\\Polyfill\\\\Intl\\\\Normalizer\\\\' => array($vendorDir . '/symfony/polyfill-intl-normalizer'),\n    'Symfony\\\\Polyfill\\\\Intl\\\\Grapheme\\\\' => array($vendorDir . '/symfony/polyfill-intl-grapheme'),\n    'Symfony\\\\Polyfill\\\\Ctype\\\\' => array($vendorDir . '/symfony/polyfill-ctype'),\n    'Symfony\\\\Contracts\\\\Service\\\\' => array($vendorDir . '/symfony/service-contracts'),\n    'Symfony\\\\Component\\\\Yaml\\\\' => array($vendorDir . '/symfony/yaml'),\n    'Symfony\\\\Component\\\\String\\\\' => array($vendorDir . '/symfony/string'),\n    'Symfony\\\\Component\\\\Console\\\\' => array($vendorDir . '/symfony/console'),\n    'Psr\\\\Container\\\\' => array($vendorDir . '/psr/container/src'),\n    'PhpParser\\\\' => array($vendorDir . '/nikic/php-parser/lib/PhpParser'),\n);\n","vendor/composer/autoload_real.php":"<?php\n\n// autoload_real.php @generated by Composer\n\nclass ComposerAutoloaderInitade0b511dfb236ccca8e627237d0e6fb\n{\n    private static $loader;\n\n    public static function loadClassLoader($class)\n    {\n        if ('Composer\\Autoload\\ClassLoader' === $class) {\n            require __DIR__ . '/ClassLoader.php';\n        }\n    }\n\n    /**\n     * @return \\Composer\\Autoload\\ClassLoader\n     */\n    public static function getLoader()\n    {\n        if (null !== self::$loader) {\n            return self::$loader;\n        }\n\n        require __DIR__ . '/platform_check.php';\n\n        spl_autoload_register(array('ComposerAutoloaderInitade0b511dfb236ccca8e627237d0e6fb', 'loadClassLoader'), true, true);\n        self::$loader = $loader = new \\Composer\\Autoload\\ClassLoader(\\dirname(__DIR__));\n        spl_autoload_unregister(array('ComposerAutoloaderInitade0b511dfb236ccca8e627237d0e6fb', 'loadClassLoader'));\n\n        require __DIR__ . '/autoload_static.php';\n        call_user_func(\\Composer\\Autoload\\ComposerStaticInitade0b511dfb236ccca8e627237d0e6fb::getInitializer($loader));\n\n        $loader->register(true);\n\n        $filesToLoad = \\Composer\\Autoload\\ComposerStaticInitade0b511dfb236ccca8e627237d0e6fb::$files;\n        $requireFile = \\Closure::bind(static function ($fileIdentifier, $file) {\n            if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {\n                $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;\n\n                require $file;\n            }\n        }, null, null);\n        foreach ($filesToLoad as $fileIdentifier => $file) {\n            $requireFile($fileIdentifier, $file);\n        }\n\n        return $loader;\n    }\n}\n","vendor/composer/autoload_static.php":"<?php\n\n// autoload_static.php @generated by Composer\n\nnamespace Composer\\Autoload;\n\nclass ComposerStaticInitade0b511dfb236ccca8e627237d0e6fb\n{\n    public static $files = array (\n        '6e3fae29631ef280660b3cdad06f25a8' => __DIR__ . '/..' . '/symfony/deprecation-contracts/function.php',\n        '320cde22f66dd4f5d3fd621d3e88b98f' => __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php',\n        '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',\n        '8825ede83f2f289127722d4e842cf7e8' => __DIR__ . '/..' . '/symfony/polyfill-intl-grapheme/bootstrap.php',\n        'e69f7f6ee287b969198c3c9d6777bd38' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/bootstrap.php',\n        'b6b991a57620e2fb6b2f66f03fe9ddc2' => __DIR__ . '/..' . '/symfony/string/Resources/functions.php',\n    );\n\n    public static $prefixLengthsPsr4 = array (\n        'W' =>\n        array (\n            'WorkerSafety\\\\' => 13,\n        ),\n        'S' =>\n        array (\n            'Symfony\\\\Polyfill\\\\Mbstring\\\\' => 26,\n            'Symfony\\\\Polyfill\\\\Intl\\\\Normalizer\\\\' => 33,\n            'Symfony\\\\Polyfill\\\\Intl\\\\Grapheme\\\\' => 31,\n            'Symfony\\\\Polyfill\\\\Ctype\\\\' => 23,\n            'Symfony\\\\Contracts\\\\Service\\\\' => 26,\n            'Symfony\\\\Component\\\\Yaml\\\\' => 23,\n            'Symfony\\\\Component\\\\String\\\\' => 25,\n            'Symfony\\\\Component\\\\Console\\\\' => 26,\n        ),\n        'P' =>\n        array (\n            'Psr\\\\Container\\\\' => 14,\n            'PhpParser\\\\' => 10,\n        ),\n    );\n\n    public static $prefixDirsPsr4 = array (\n        'WorkerSafety\\\\' =>\n        array (\n            0 => __DIR__ . '/../..' . '/src',\n        ),\n        'Symfony\\\\Polyfill\\\\Mbstring\\\\' =>\n        array (\n            0 => __DIR__ . '/..' . '/symfony/polyfill-mbstring',\n        ),\n        'Symfony\\\\Polyfill\\\\Intl\\\\Normalizer\\\\' =>\n        array (\n            0 => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer',\n        ),\n        'Symfony\\\\Polyfill\\\\Intl\\\\Grapheme\\\\' =>\n        array (\n            0 => __DIR__ . '/..' . '/symfony/polyfill-intl-grapheme',\n        ),\n        'Symfony\\\\Polyfill\\\\Ctype\\\\' =>\n        array (\n            0 => __DIR__ . '/..' . '/symfony/polyfill-ctype',\n        ),\n        'Symfony\\\\Contracts\\\\Service\\\\' =>\n        array (\n            0 => __DIR__ . '/..' . '/symfony/service-contracts',\n        ),\n        'Symfony\\\\Component\\\\Yaml\\\\' =>\n        array (\n            0 => __DIR__ . '/..' . '/symfony/yaml',\n        ),\n        'Symfony\\\\Component\\\\String\\\\' =>\n        array (\n            0 => __DIR__ . '/..' . '/symfony/string',\n        ),\n        'Symfony\\\\Component\\\\Console\\\\' =>\n        array (\n            0 => __DIR__ . '/..' . '/symfony/console',\n        ),\n        'Psr\\\\Container\\\\' =>\n        array (\n            0 => __DIR__ . '/..' . '/psr/container/src',\n        ),\n        'PhpParser\\\\' =>\n        array (\n            0 => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser',\n        ),\n    );\n\n    public static $classMap = array (\n        'Composer\\\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php',\n        'Normalizer' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php',\n        'PhpParser\\\\Builder' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder.php',\n        'PhpParser\\\\BuilderFactory' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/BuilderFactory.php',\n        'PhpParser\\\\BuilderHelpers' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/BuilderHelpers.php',\n        'PhpParser\\\\Builder\\\\ClassConst' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/ClassConst.php',\n        'PhpParser\\\\Builder\\\\Class_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Class_.php',\n        'PhpParser\\\\Builder\\\\Declaration' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Declaration.php',\n        'PhpParser\\\\Builder\\\\EnumCase' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/EnumCase.php',\n        'PhpParser\\\\Builder\\\\Enum_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Enum_.php',\n        'PhpParser\\\\Builder\\\\FunctionLike' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/FunctionLike.php',\n        'PhpParser\\\\Builder\\\\Function_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Function_.php',\n        'PhpParser\\\\Builder\\\\Interface_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Interface_.php',\n        'PhpParser\\\\Builder\\\\Method' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Method.php',\n        'PhpParser\\\\Builder\\\\Namespace_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Namespace_.php',\n        'PhpParser\\\\Builder\\\\Param' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Param.php',\n        'PhpParser\\\\Builder\\\\Property' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Property.php',\n        'PhpParser\\\\Builder\\\\TraitUse' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/TraitUse.php',\n        'PhpParser\\\\Builder\\\\TraitUseAdaptation' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/TraitUseAdaptation.php',\n        'PhpParser\\\\Builder\\\\Trait_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Trait_.php',\n        'PhpParser\\\\Builder\\\\Use_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Use_.php',\n        'PhpParser\\\\Comment' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Comment.php',\n        'PhpParser\\\\Comment\\\\Doc' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Comment/Doc.php',\n        'PhpParser\\\\ConstExprEvaluationException' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/ConstExprEvaluationException.php',\n        'PhpParser\\\\ConstExprEvaluator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/ConstExprEvaluator.php',\n        'PhpParser\\\\Error' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Error.php',\n        'PhpParser\\\\ErrorHandler' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/ErrorHandler.php',\n        'PhpParser\\\\ErrorHandler\\\\Collecting' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/ErrorHandler/Collecting.php',\n        'PhpParser\\\\ErrorHandler\\\\Throwing' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/ErrorHandler/Throwing.php',\n        'PhpParser\\\\Internal\\\\DiffElem' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Internal/DiffElem.php',\n        'PhpParser\\\\Internal\\\\Differ' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Internal/Differ.php',\n        'PhpParser\\\\Internal\\\\PrintableNewAnonClassNode' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Internal/PrintableNewAnonClassNode.php',\n        'PhpParser\\\\Internal\\\\TokenPolyfill' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Internal/TokenPolyfill.php',\n        'PhpParser\\\\Internal\\\\TokenStream' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Internal/TokenStream.php',\n        'PhpParser\\\\JsonDecoder' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/JsonDecoder.php',\n        'PhpParser\\\\Lexer' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer.php',\n        'PhpParser\\\\Lexer\\\\Emulative' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/Emulative.php',\n        'PhpParser\\\\Lexer\\\\TokenEmulator\\\\AsymmetricVisibilityTokenEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/AsymmetricVisibilityTokenEmulator.php',\n        'PhpParser\\\\Lexer\\\\TokenEmulator\\\\AttributeEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/AttributeEmulator.php',\n        'PhpParser\\\\Lexer\\\\TokenEmulator\\\\EnumTokenEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/EnumTokenEmulator.php',\n        'PhpParser\\\\Lexer\\\\TokenEmulator\\\\ExplicitOctalEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ExplicitOctalEmulator.php',\n        'PhpParser\\\\Lexer\\\\TokenEmulator\\\\FnTokenEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FnTokenEmulator.php',\n        'PhpParser\\\\Lexer\\\\TokenEmulator\\\\KeywordEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/KeywordEmulator.php',\n        'PhpParser\\\\Lexer\\\\TokenEmulator\\\\MatchTokenEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/MatchTokenEmulator.php',\n        'PhpParser\\\\Lexer\\\\TokenEmulator\\\\NullsafeTokenEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NullsafeTokenEmulator.php',\n        'PhpParser\\\\Lexer\\\\TokenEmulator\\\\PipeOperatorEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/PipeOperatorEmulator.php',\n        'PhpParser\\\\Lexer\\\\TokenEmulator\\\\PropertyTokenEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/PropertyTokenEmulator.php',\n        'PhpParser\\\\Lexer\\\\TokenEmulator\\\\ReadonlyFunctionTokenEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyFunctionTokenEmulator.php',\n        'PhpParser\\\\Lexer\\\\TokenEmulator\\\\ReadonlyTokenEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyTokenEmulator.php',\n        'PhpParser\\\\Lexer\\\\TokenEmulator\\\\ReverseEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReverseEmulator.php',\n        'PhpParser\\\\Lexer\\\\TokenEmulator\\\\TokenEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/TokenEmulator.php',\n        'PhpParser\\\\Lexer\\\\TokenEmulator\\\\VoidCastEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/VoidCastEmulator.php',\n        'PhpParser\\\\Modifiers' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Modifiers.php',\n        'PhpParser\\\\NameContext' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NameContext.php',\n        'PhpParser\\\\Node' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node.php',\n        'PhpParser\\\\NodeAbstract' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeAbstract.php',\n        'PhpParser\\\\NodeDumper' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeDumper.php',\n        'PhpParser\\\\NodeFinder' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeFinder.php',\n        'PhpParser\\\\NodeTraverser' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeTraverser.php',\n        'PhpParser\\\\NodeTraverserInterface' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeTraverserInterface.php',\n        'PhpParser\\\\NodeVisitor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitor.php',\n        'PhpParser\\\\NodeVisitorAbstract' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitorAbstract.php',\n        'PhpParser\\\\NodeVisitor\\\\CloningVisitor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitor/CloningVisitor.php',\n        'PhpParser\\\\NodeVisitor\\\\CommentAnnotatingVisitor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitor/CommentAnnotatingVisitor.php',\n        'PhpParser\\\\NodeVisitor\\\\FindingVisitor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitor/FindingVisitor.php',\n        'PhpParser\\\\NodeVisitor\\\\FirstFindingVisitor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitor/FirstFindingVisitor.php',\n        'PhpParser\\\\NodeVisitor\\\\NameResolver' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitor/NameResolver.php',\n        'PhpParser\\\\NodeVisitor\\\\NodeConnectingVisitor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitor/NodeConnectingVisitor.php',\n        'PhpParser\\\\NodeVisitor\\\\ParentConnectingVisitor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitor/ParentConnectingVisitor.php',\n        'PhpParser\\\\Node\\\\Arg' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Arg.php',\n        'PhpParser\\\\Node\\\\ArrayItem' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/ArrayItem.php',\n        'PhpParser\\\\Node\\\\Attribute' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Attribute.php',\n        'PhpParser\\\\Node\\\\AttributeGroup' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/AttributeGroup.php',\n        'PhpParser\\\\Node\\\\ClosureUse' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/ClosureUse.php',\n        'PhpParser\\\\Node\\\\ComplexType' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/ComplexType.php',\n        'PhpParser\\\\Node\\\\Const_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Const_.php',\n        'PhpParser\\\\Node\\\\DeclareItem' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/DeclareItem.php',\n        'PhpParser\\\\Node\\\\Expr' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr.php',\n        'PhpParser\\\\Node\\\\Expr\\\\ArrayDimFetch' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayDimFetch.php',\n        'PhpParser\\\\Node\\\\Expr\\\\ArrayItem' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayItem.php',\n        'PhpParser\\\\Node\\\\Expr\\\\Array_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Array_.php',\n        'PhpParser\\\\Node\\\\Expr\\\\ArrowFunction' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ArrowFunction.php',\n        'PhpParser\\\\Node\\\\Expr\\\\Assign' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Assign.php',\n        'PhpParser\\\\Node\\\\Expr\\\\AssignOp' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp.php',\n        'PhpParser\\\\Node\\\\Expr\\\\AssignOp\\\\BitwiseAnd' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseAnd.php',\n        'PhpParser\\\\Node\\\\Expr\\\\AssignOp\\\\BitwiseOr' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseOr.php',\n        'PhpParser\\\\Node\\\\Expr\\\\AssignOp\\\\BitwiseXor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseXor.php',\n        'PhpParser\\\\Node\\\\Expr\\\\AssignOp\\\\Coalesce' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Coalesce.php',\n        'PhpParser\\\\Node\\\\Expr\\\\AssignOp\\\\Concat' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Concat.php',\n        'PhpParser\\\\Node\\\\Expr\\\\AssignOp\\\\Div' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Div.php',\n        'PhpParser\\\\Node\\\\Expr\\\\AssignOp\\\\Minus' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Minus.php',\n        'PhpParser\\\\Node\\\\Expr\\\\AssignOp\\\\Mod' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mod.php',\n        'PhpParser\\\\Node\\\\Expr\\\\AssignOp\\\\Mul' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mul.php',\n        'PhpParser\\\\Node\\\\Expr\\\\AssignOp\\\\Plus' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Plus.php',\n        'PhpParser\\\\Node\\\\Expr\\\\AssignOp\\\\Pow' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Pow.php',\n        'PhpParser\\\\Node\\\\Expr\\\\AssignOp\\\\ShiftLeft' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftLeft.php',\n        'PhpParser\\\\Node\\\\Expr\\\\AssignOp\\\\ShiftRight' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftRight.php',\n        'PhpParser\\\\Node\\\\Expr\\\\AssignRef' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignRef.php',\n        'PhpParser\\\\Node\\\\Expr\\\\BinaryOp' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp.php',\n        'PhpParser\\\\Node\\\\Expr\\\\BinaryOp\\\\BitwiseAnd' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseAnd.php',\n        'PhpParser\\\\Node\\\\Expr\\\\BinaryOp\\\\BitwiseOr' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseOr.php',\n        'PhpParser\\\\Node\\\\Expr\\\\BinaryOp\\\\BitwiseXor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseXor.php',\n        'PhpParser\\\\Node\\\\Expr\\\\BinaryOp\\\\BooleanAnd' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanAnd.php',\n        'PhpParser\\\\Node\\\\Expr\\\\BinaryOp\\\\BooleanOr' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanOr.php',\n        'PhpParser\\\\Node\\\\Expr\\\\BinaryOp\\\\Coalesce' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Coalesce.php',\n        'PhpParser\\\\Node\\\\Expr\\\\BinaryOp\\\\Concat' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Concat.php',\n        'PhpParser\\\\Node\\\\Expr\\\\BinaryOp\\\\Div' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Div.php',\n        'PhpParser\\\\Node\\\\Expr\\\\BinaryOp\\\\Equal' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Equal.php',\n        'PhpParser\\\\Node\\\\Expr\\\\BinaryOp\\\\Greater' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Greater.php',\n        'PhpParser\\\\Node\\\\Expr\\\\BinaryOp\\\\GreaterOrEqual' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/GreaterOrEqual.php',\n        'PhpParser\\\\Node\\\\Expr\\\\BinaryOp\\\\Identical' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Identical.php',\n        'PhpParser\\\\Node\\\\Expr\\\\BinaryOp\\\\LogicalAnd' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalAnd.php',\n        'PhpParser\\\\Node\\\\Expr\\\\BinaryOp\\\\LogicalOr' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalOr.php',\n        'PhpParser\\\\Node\\\\Expr\\\\BinaryOp\\\\LogicalXor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalXor.php',\n        'PhpParser\\\\Node\\\\Expr\\\\BinaryOp\\\\Minus' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Minus.php',\n        'PhpParser\\\\Node\\\\Expr\\\\BinaryOp\\\\Mod' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mod.php',\n        'PhpParser\\\\Node\\\\Expr\\\\BinaryOp\\\\Mul' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mul.php',\n        'PhpParser\\\\Node\\\\Expr\\\\BinaryOp\\\\NotEqual' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotEqual.php',\n        'PhpParser\\\\Node\\\\Expr\\\\BinaryOp\\\\NotIdentical' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotIdentical.php',\n        'PhpParser\\\\Node\\\\Expr\\\\BinaryOp\\\\Pipe' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Pipe.php',\n        'PhpParser\\\\Node\\\\Expr\\\\BinaryOp\\\\Plus' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Plus.php',\n        'PhpParser\\\\Node\\\\Expr\\\\BinaryOp\\\\Pow' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Pow.php',\n        'PhpParser\\\\Node\\\\Expr\\\\BinaryOp\\\\ShiftLeft' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftLeft.php',\n        'PhpParser\\\\Node\\\\Expr\\\\BinaryOp\\\\ShiftRight' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftRight.php',\n        'PhpParser\\\\Node\\\\Expr\\\\BinaryOp\\\\Smaller' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Smaller.php',\n        'PhpParser\\\\Node\\\\Expr\\\\BinaryOp\\\\SmallerOrEqual' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/SmallerOrEqual.php',\n        'PhpParser\\\\Node\\\\Expr\\\\BinaryOp\\\\Spaceship' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Spaceship.php',\n        'PhpParser\\\\Node\\\\Expr\\\\BitwiseNot' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BitwiseNot.php',\n        'PhpParser\\\\Node\\\\Expr\\\\BooleanNot' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BooleanNot.php',\n        'PhpParser\\\\Node\\\\Expr\\\\CallLike' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/CallLike.php',\n        'PhpParser\\\\Node\\\\Expr\\\\Cast' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast.php',\n        'PhpParser\\\\Node\\\\Expr\\\\Cast\\\\Array_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Array_.php',\n        'PhpParser\\\\Node\\\\Expr\\\\Cast\\\\Bool_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Bool_.php',\n        'PhpParser\\\\Node\\\\Expr\\\\Cast\\\\Double' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Double.php',\n        'PhpParser\\\\Node\\\\Expr\\\\Cast\\\\Int_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Int_.php',\n        'PhpParser\\\\Node\\\\Expr\\\\Cast\\\\Object_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Object_.php',\n        'PhpParser\\\\Node\\\\Expr\\\\Cast\\\\String_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/String_.php',\n        'PhpParser\\\\Node\\\\Expr\\\\Cast\\\\Unset_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Unset_.php',\n        'PhpParser\\\\Node\\\\Expr\\\\Cast\\\\Void_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Void_.php',\n        'PhpParser\\\\Node\\\\Expr\\\\ClassConstFetch' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ClassConstFetch.php',\n        'PhpParser\\\\Node\\\\Expr\\\\Clone_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Clone_.php',\n        'PhpParser\\\\Node\\\\Expr\\\\Closure' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Closure.php',\n        'PhpParser\\\\Node\\\\Expr\\\\ClosureUse' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ClosureUse.php',\n        'PhpParser\\\\Node\\\\Expr\\\\ConstFetch' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ConstFetch.php',\n        'PhpParser\\\\Node\\\\Expr\\\\Empty_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Empty_.php',\n        'PhpParser\\\\Node\\\\Expr\\\\Error' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Error.php',\n        'PhpParser\\\\Node\\\\Expr\\\\ErrorSuppress' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ErrorSuppress.php',\n        'PhpParser\\\\Node\\\\Expr\\\\Eval_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Eval_.php',\n        'PhpParser\\\\Node\\\\Expr\\\\Exit_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Exit_.php',\n        'PhpParser\\\\Node\\\\Expr\\\\FuncCall' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/FuncCall.php',\n        'PhpParser\\\\Node\\\\Expr\\\\Include_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Include_.php',\n        'PhpParser\\\\Node\\\\Expr\\\\Instanceof_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Instanceof_.php',\n        'PhpParser\\\\Node\\\\Expr\\\\Isset_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Isset_.php',\n        'PhpParser\\\\Node\\\\Expr\\\\List_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/List_.php',\n        'PhpParser\\\\Node\\\\Expr\\\\Match_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Match_.php',\n        'PhpParser\\\\Node\\\\Expr\\\\MethodCall' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/MethodCall.php',\n        'PhpParser\\\\Node\\\\Expr\\\\New_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/New_.php',\n        'PhpParser\\\\Node\\\\Expr\\\\NullsafeMethodCall' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafeMethodCall.php',\n        'PhpParser\\\\Node\\\\Expr\\\\NullsafePropertyFetch' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafePropertyFetch.php',\n        'PhpParser\\\\Node\\\\Expr\\\\PostDec' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/PostDec.php',\n        'PhpParser\\\\Node\\\\Expr\\\\PostInc' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/PostInc.php',\n        'PhpParser\\\\Node\\\\Expr\\\\PreDec' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/PreDec.php',\n        'PhpParser\\\\Node\\\\Expr\\\\PreInc' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/PreInc.php',\n        'PhpParser\\\\Node\\\\Expr\\\\Print_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Print_.php',\n        'PhpParser\\\\Node\\\\Expr\\\\PropertyFetch' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/PropertyFetch.php',\n        'PhpParser\\\\Node\\\\Expr\\\\ShellExec' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ShellExec.php',\n        'PhpParser\\\\Node\\\\Expr\\\\StaticCall' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/StaticCall.php',\n        'PhpParser\\\\Node\\\\Expr\\\\StaticPropertyFetch' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/StaticPropertyFetch.php',\n        'PhpParser\\\\Node\\\\Expr\\\\Ternary' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Ternary.php',\n        'PhpParser\\\\Node\\\\Expr\\\\Throw_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Throw_.php',\n        'PhpParser\\\\Node\\\\Expr\\\\UnaryMinus' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryMinus.php',\n        'PhpParser\\\\Node\\\\Expr\\\\UnaryPlus' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryPlus.php',\n        'PhpParser\\\\Node\\\\Expr\\\\Variable' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Variable.php',\n        'PhpParser\\\\Node\\\\Expr\\\\YieldFrom' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/YieldFrom.php',\n        'PhpParser\\\\Node\\\\Expr\\\\Yield_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Yield_.php',\n        'PhpParser\\\\Node\\\\FunctionLike' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/FunctionLike.php',\n        'PhpParser\\\\Node\\\\Identifier' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Identifier.php',\n        'PhpParser\\\\Node\\\\InterpolatedStringPart' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/InterpolatedStringPart.php',\n        'PhpParser\\\\Node\\\\IntersectionType' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/IntersectionType.php',\n        'PhpParser\\\\Node\\\\MatchArm' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/MatchArm.php',\n        'PhpParser\\\\Node\\\\Name' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Name.php',\n        'PhpParser\\\\Node\\\\Name\\\\FullyQualified' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Name/FullyQualified.php',\n        'PhpParser\\\\Node\\\\Name\\\\Relative' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Name/Relative.php',\n        'PhpParser\\\\Node\\\\NullableType' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/NullableType.php',\n        'PhpParser\\\\Node\\\\Param' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Param.php',\n        'PhpParser\\\\Node\\\\PropertyHook' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/PropertyHook.php',\n        'PhpParser\\\\Node\\\\PropertyItem' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/PropertyItem.php',\n        'PhpParser\\\\Node\\\\Scalar' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar.php',\n        'PhpParser\\\\Node\\\\Scalar\\\\DNumber' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/DNumber.php',\n        'PhpParser\\\\Node\\\\Scalar\\\\Encapsed' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/Encapsed.php',\n        'PhpParser\\\\Node\\\\Scalar\\\\EncapsedStringPart' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/EncapsedStringPart.php',\n        'PhpParser\\\\Node\\\\Scalar\\\\Float_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/Float_.php',\n        'PhpParser\\\\Node\\\\Scalar\\\\Int_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/Int_.php',\n        'PhpParser\\\\Node\\\\Scalar\\\\InterpolatedString' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/InterpolatedString.php',\n        'PhpParser\\\\Node\\\\Scalar\\\\LNumber' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/LNumber.php',\n        'PhpParser\\\\Node\\\\Scalar\\\\MagicConst' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst.php',\n        'PhpParser\\\\Node\\\\Scalar\\\\MagicConst\\\\Class_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Class_.php',\n        'PhpParser\\\\Node\\\\Scalar\\\\MagicConst\\\\Dir' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Dir.php',\n        'PhpParser\\\\Node\\\\Scalar\\\\MagicConst\\\\File' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/File.php',\n        'PhpParser\\\\Node\\\\Scalar\\\\MagicConst\\\\Function_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Function_.php',\n        'PhpParser\\\\Node\\\\Scalar\\\\MagicConst\\\\Line' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Line.php',\n        'PhpParser\\\\Node\\\\Scalar\\\\MagicConst\\\\Method' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Method.php',\n        'PhpParser\\\\Node\\\\Scalar\\\\MagicConst\\\\Namespace_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Namespace_.php',\n        'PhpParser\\\\Node\\\\Scalar\\\\MagicConst\\\\Property' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Property.php',\n        'PhpParser\\\\Node\\\\Scalar\\\\MagicConst\\\\Trait_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Trait_.php',\n        'PhpParser\\\\Node\\\\Scalar\\\\String_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/String_.php',\n        'PhpParser\\\\Node\\\\StaticVar' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/StaticVar.php',\n        'PhpParser\\\\Node\\\\Stmt' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt.php',\n        'PhpParser\\\\Node\\\\Stmt\\\\Block' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Block.php',\n        'PhpParser\\\\Node\\\\Stmt\\\\Break_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Break_.php',\n        'PhpParser\\\\Node\\\\Stmt\\\\Case_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Case_.php',\n        'PhpParser\\\\Node\\\\Stmt\\\\Catch_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Catch_.php',\n        'PhpParser\\\\Node\\\\Stmt\\\\ClassConst' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassConst.php',\n        'PhpParser\\\\Node\\\\Stmt\\\\ClassLike' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassLike.php',\n        'PhpParser\\\\Node\\\\Stmt\\\\ClassMethod' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassMethod.php',\n        'PhpParser\\\\Node\\\\Stmt\\\\Class_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Class_.php',\n        'PhpParser\\\\Node\\\\Stmt\\\\Const_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Const_.php',\n        'PhpParser\\\\Node\\\\Stmt\\\\Continue_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Continue_.php',\n        'PhpParser\\\\Node\\\\Stmt\\\\DeclareDeclare' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/DeclareDeclare.php',\n        'PhpParser\\\\Node\\\\Stmt\\\\Declare_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Declare_.php',\n        'PhpParser\\\\Node\\\\Stmt\\\\Do_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Do_.php',\n        'PhpParser\\\\Node\\\\Stmt\\\\Echo_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Echo_.php',\n        'PhpParser\\\\Node\\\\Stmt\\\\ElseIf_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/ElseIf_.php',\n        'PhpParser\\\\Node\\\\Stmt\\\\Else_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Else_.php',\n        'PhpParser\\\\Node\\\\Stmt\\\\EnumCase' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/EnumCase.php',\n        'PhpParser\\\\Node\\\\Stmt\\\\Enum_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Enum_.php',\n        'PhpParser\\\\Node\\\\Stmt\\\\Expression' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Expression.php',\n        'PhpParser\\\\Node\\\\Stmt\\\\Finally_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Finally_.php',\n        'PhpParser\\\\Node\\\\Stmt\\\\For_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/For_.php',\n        'PhpParser\\\\Node\\\\Stmt\\\\Foreach_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Foreach_.php',\n        'PhpParser\\\\Node\\\\Stmt\\\\Function_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Function_.php',\n        'PhpParser\\\\Node\\\\Stmt\\\\Global_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Global_.php',\n        'PhpParser\\\\Node\\\\Stmt\\\\Goto_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Goto_.php',\n        'PhpParser\\\\Node\\\\Stmt\\\\GroupUse' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/GroupUse.php',\n        'PhpParser\\\\Node\\\\Stmt\\\\HaltCompiler' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/HaltCompiler.php',\n        'PhpParser\\\\Node\\\\Stmt\\\\If_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/If_.php',\n        'PhpParser\\\\Node\\\\Stmt\\\\InlineHTML' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/InlineHTML.php',\n        'PhpParser\\\\Node\\\\Stmt\\\\Interface_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Interface_.php',\n        'PhpParser\\\\Node\\\\Stmt\\\\Label' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Label.php',\n        'PhpParser\\\\Node\\\\Stmt\\\\Namespace_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Namespace_.php',\n        'PhpParser\\\\Node\\\\Stmt\\\\Nop' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Nop.php',\n        'PhpParser\\\\Node\\\\Stmt\\\\Property' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Property.php',\n        'PhpParser\\\\Node\\\\Stmt\\\\PropertyProperty' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/PropertyProperty.php',\n        'PhpParser\\\\Node\\\\Stmt\\\\Return_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Return_.php',\n        'PhpParser\\\\Node\\\\Stmt\\\\StaticVar' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/StaticVar.php',\n        'PhpParser\\\\Node\\\\Stmt\\\\Static_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Static_.php',\n        'PhpParser\\\\Node\\\\Stmt\\\\Switch_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Switch_.php',\n        'PhpParser\\\\Node\\\\Stmt\\\\TraitUse' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUse.php',\n        'PhpParser\\\\Node\\\\Stmt\\\\TraitUseAdaptation' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation.php',\n        'PhpParser\\\\Node\\\\Stmt\\\\TraitUseAdaptation\\\\Alias' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Alias.php',\n        'PhpParser\\\\Node\\\\Stmt\\\\TraitUseAdaptation\\\\Precedence' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Precedence.php',\n        'PhpParser\\\\Node\\\\Stmt\\\\Trait_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Trait_.php',\n        'PhpParser\\\\Node\\\\Stmt\\\\TryCatch' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TryCatch.php',\n        'PhpParser\\\\Node\\\\Stmt\\\\Unset_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Unset_.php',\n        'PhpParser\\\\Node\\\\Stmt\\\\UseUse' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/UseUse.php',\n        'PhpParser\\\\Node\\\\Stmt\\\\Use_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Use_.php',\n        'PhpParser\\\\Node\\\\Stmt\\\\While_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/While_.php',\n        'PhpParser\\\\Node\\\\UnionType' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/UnionType.php',\n        'PhpParser\\\\Node\\\\UseItem' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/UseItem.php',\n        'PhpParser\\\\Node\\\\VarLikeIdentifier' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/VarLikeIdentifier.php',\n        'PhpParser\\\\Node\\\\VariadicPlaceholder' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/VariadicPlaceholder.php',\n        'PhpParser\\\\Parser' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Parser.php',\n        'PhpParser\\\\ParserAbstract' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/ParserAbstract.php',\n        'PhpParser\\\\ParserFactory' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/ParserFactory.php',\n        'PhpParser\\\\Parser\\\\Php7' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Parser/Php7.php',\n        'PhpParser\\\\Parser\\\\Php8' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Parser/Php8.php',\n        'PhpParser\\\\PhpVersion' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/PhpVersion.php',\n        'PhpParser\\\\PrettyPrinter' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/PrettyPrinter.php',\n        'PhpParser\\\\PrettyPrinterAbstract' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php',\n        'PhpParser\\\\PrettyPrinter\\\\Standard' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/PrettyPrinter/Standard.php',\n        'PhpParser\\\\Token' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Token.php',\n        'Psr\\\\Container\\\\ContainerExceptionInterface' => __DIR__ . '/..' . '/psr/container/src/ContainerExceptionInterface.php',\n        'Psr\\\\Container\\\\ContainerInterface' => __DIR__ . '/..' . '/psr/container/src/ContainerInterface.php',\n        'Psr\\\\Container\\\\NotFoundExceptionInterface' => __DIR__ . '/..' . '/psr/container/src/NotFoundExceptionInterface.php',\n        'Symfony\\\\Component\\\\Console\\\\Application' => __DIR__ . '/..' . '/symfony/console/Application.php',\n        'Symfony\\\\Component\\\\Console\\\\Attribute\\\\Argument' => __DIR__ . '/..' . '/symfony/console/Attribute/Argument.php',\n        'Symfony\\\\Component\\\\Console\\\\Attribute\\\\AsCommand' => __DIR__ . '/..' . '/symfony/console/Attribute/AsCommand.php',\n        'Symfony\\\\Component\\\\Console\\\\Attribute\\\\Ask' => __DIR__ . '/..' . '/symfony/console/Attribute/Ask.php',\n        'Symfony\\\\Component\\\\Console\\\\Attribute\\\\Interact' => __DIR__ . '/..' . '/symfony/console/Attribute/Interact.php',\n        'Symfony\\\\Component\\\\Console\\\\Attribute\\\\InteractiveAttributeInterface' => __DIR__ . '/..' . '/symfony/console/Attribute/InteractiveAttributeInterface.php',\n        'Symfony\\\\Component\\\\Console\\\\Attribute\\\\MapInput' => __DIR__ . '/..' . '/symfony/console/Attribute/MapInput.php',\n        'Symfony\\\\Component\\\\Console\\\\Attribute\\\\Option' => __DIR__ . '/..' . '/symfony/console/Attribute/Option.php',\n        'Symfony\\\\Component\\\\Console\\\\Attribute\\\\Reflection\\\\ReflectionMember' => __DIR__ . '/..' . '/symfony/console/Attribute/Reflection/ReflectionMember.php',\n        'Symfony\\\\Component\\\\Console\\\\CI\\\\GithubActionReporter' => __DIR__ . '/..' . '/symfony/console/CI/GithubActionReporter.php',\n        'Symfony\\\\Component\\\\Console\\\\Color' => __DIR__ . '/..' . '/symfony/console/Color.php',\n        'Symfony\\\\Component\\\\Console\\\\CommandLoader\\\\CommandLoaderInterface' => __DIR__ . '/..' . '/symfony/console/CommandLoader/CommandLoaderInterface.php',\n        'Symfony\\\\Component\\\\Console\\\\CommandLoader\\\\ContainerCommandLoader' => __DIR__ . '/..' . '/symfony/console/CommandLoader/ContainerCommandLoader.php',\n        'Symfony\\\\Component\\\\Console\\\\CommandLoader\\\\FactoryCommandLoader' => __DIR__ . '/..' . '/symfony/console/CommandLoader/FactoryCommandLoader.php',\n        'Symfony\\\\Component\\\\Console\\\\Command\\\\Command' => __DIR__ . '/..' . '/symfony/console/Command/Command.php',\n        'Symfony\\\\Component\\\\Console\\\\Command\\\\CompleteCommand' => __DIR__ . '/..' . '/symfony/console/Command/CompleteCommand.php',\n        'Symfony\\\\Component\\\\Console\\\\Command\\\\DumpCompletionCommand' => __DIR__ . '/..' . '/symfony/console/Command/DumpCompletionCommand.php',\n        'Symfony\\\\Component\\\\Console\\\\Command\\\\HelpCommand' => __DIR__ . '/..' . '/symfony/console/Command/HelpCommand.php',\n        'Symfony\\\\Component\\\\Console\\\\Command\\\\InvokableCommand' => __DIR__ . '/..' . '/symfony/console/Command/InvokableCommand.php',\n        'Symfony\\\\Component\\\\Console\\\\Command\\\\LazyCommand' => __DIR__ . '/..' . '/symfony/console/Command/LazyCommand.php',\n        'Symfony\\\\Component\\\\Console\\\\Command\\\\ListCommand' => __DIR__ . '/..' . '/symfony/console/Command/ListCommand.php',\n        'Symfony\\\\Component\\\\Console\\\\Command\\\\LockableTrait' => __DIR__ . '/..' . '/symfony/console/Command/LockableTrait.php',\n        'Symfony\\\\Component\\\\Console\\\\Command\\\\SignalableCommandInterface' => __DIR__ . '/..' . '/symfony/console/Command/SignalableCommandInterface.php',\n        'Symfony\\\\Component\\\\Console\\\\Command\\\\TraceableCommand' => __DIR__ . '/..' . '/symfony/console/Command/TraceableCommand.php',\n        'Symfony\\\\Component\\\\Console\\\\Completion\\\\CompletionInput' => __DIR__ . '/..' . '/symfony/console/Completion/CompletionInput.php',\n        'Symfony\\\\Component\\\\Console\\\\Completion\\\\CompletionSuggestions' => __DIR__ . '/..' . '/symfony/console/Completion/CompletionSuggestions.php',\n        'Symfony\\\\Component\\\\Console\\\\Completion\\\\Output\\\\BashCompletionOutput' => __DIR__ . '/..' . '/symfony/console/Completion/Output/BashCompletionOutput.php',\n        'Symfony\\\\Component\\\\Console\\\\Completion\\\\Output\\\\CompletionOutputInterface' => __DIR__ . '/..' . '/symfony/console/Completion/Output/CompletionOutputInterface.php',\n        'Symfony\\\\Component\\\\Console\\\\Completion\\\\Output\\\\FishCompletionOutput' => __DIR__ . '/..' . '/symfony/console/Completion/Output/FishCompletionOutput.php',\n        'Symfony\\\\Component\\\\Console\\\\Completion\\\\Output\\\\ZshCompletionOutput' => __DIR__ . '/..' . '/symfony/console/Completion/Output/ZshCompletionOutput.php',\n        'Symfony\\\\Component\\\\Console\\\\Completion\\\\Suggestion' => __DIR__ . '/..' . '/symfony/console/Completion/Suggestion.php',\n        'Symfony\\\\Component\\\\Console\\\\ConsoleEvents' => __DIR__ . '/..' . '/symfony/console/ConsoleEvents.php',\n        'Symfony\\\\Component\\\\Console\\\\Cursor' => __DIR__ . '/..' . '/symfony/console/Cursor.php',\n        'Symfony\\\\Component\\\\Console\\\\DataCollector\\\\CommandDataCollector' => __DIR__ . '/..' . '/symfony/console/DataCollector/CommandDataCollector.php',\n        'Symfony\\\\Component\\\\Console\\\\Debug\\\\CliRequest' => __DIR__ . '/..' . '/symfony/console/Debug/CliRequest.php',\n        'Symfony\\\\Component\\\\Console\\\\DependencyInjection\\\\AddConsoleCommandPass' => __DIR__ . '/..' . '/symfony/console/DependencyInjection/AddConsoleCommandPass.php',\n        'Symfony\\\\Component\\\\Console\\\\Descriptor\\\\ApplicationDescription' => __DIR__ . '/..' . '/symfony/console/Descriptor/ApplicationDescription.php',\n        'Symfony\\\\Component\\\\Console\\\\Descriptor\\\\Descriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/Descriptor.php',\n        'Symfony\\\\Component\\\\Console\\\\Descriptor\\\\DescriptorInterface' => __DIR__ . '/..' . '/symfony/console/Descriptor/DescriptorInterface.php',\n        'Symfony\\\\Component\\\\Console\\\\Descriptor\\\\JsonDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/JsonDescriptor.php',\n        'Symfony\\\\Component\\\\Console\\\\Descriptor\\\\MarkdownDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/MarkdownDescriptor.php',\n        'Symfony\\\\Component\\\\Console\\\\Descriptor\\\\ReStructuredTextDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/ReStructuredTextDescriptor.php',\n        'Symfony\\\\Component\\\\Console\\\\Descriptor\\\\TextDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/TextDescriptor.php',\n        'Symfony\\\\Component\\\\Console\\\\Descriptor\\\\XmlDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/XmlDescriptor.php',\n        'Symfony\\\\Component\\\\Console\\\\EventListener\\\\ErrorListener' => __DIR__ . '/..' . '/symfony/console/EventListener/ErrorListener.php',\n        'Symfony\\\\Component\\\\Console\\\\Event\\\\ConsoleAlarmEvent' => __DIR__ . '/..' . '/symfony/console/Event/ConsoleAlarmEvent.php',\n        'Symfony\\\\Component\\\\Console\\\\Event\\\\ConsoleCommandEvent' => __DIR__ . '/..' . '/symfony/console/Event/ConsoleCommandEvent.php',\n        'Symfony\\\\Component\\\\Console\\\\Event\\\\ConsoleErrorEvent' => __DIR__ . '/..' . '/symfony/console/Event/ConsoleErrorEvent.php',\n        'Symfony\\\\Component\\\\Console\\\\Event\\\\ConsoleEvent' => __DIR__ . '/..' . '/symfony/console/Event/ConsoleEvent.php',\n        'Symfony\\\\Component\\\\Console\\\\Event\\\\ConsoleSignalEvent' => __DIR__ . '/..' . '/symfony/console/Event/ConsoleSignalEvent.php',\n        'Symfony\\\\Component\\\\Console\\\\Event\\\\ConsoleTerminateEvent' => __DIR__ . '/..' . '/symfony/console/Event/ConsoleTerminateEvent.php',\n        'Symfony\\\\Component\\\\Console\\\\Exception\\\\CommandNotFoundException' => __DIR__ . '/..' . '/symfony/console/Exception/CommandNotFoundException.php',\n        'Symfony\\\\Component\\\\Console\\\\Exception\\\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/console/Exception/ExceptionInterface.php',\n        'Symfony\\\\Component\\\\Console\\\\Exception\\\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/console/Exception/InvalidArgumentException.php',\n        'Symfony\\\\Component\\\\Console\\\\Exception\\\\InvalidOptionException' => __DIR__ . '/..' . '/symfony/console/Exception/InvalidOptionException.php',\n        'Symfony\\\\Component\\\\Console\\\\Exception\\\\LogicException' => __DIR__ . '/..' . '/symfony/console/Exception/LogicException.php',\n        'Symfony\\\\Component\\\\Console\\\\Exception\\\\MissingInputException' => __DIR__ . '/..' . '/symfony/console/Exception/MissingInputException.php',\n        'Symfony\\\\Component\\\\Console\\\\Exception\\\\NamespaceNotFoundException' => __DIR__ . '/..' . '/symfony/console/Exception/NamespaceNotFoundException.php',\n        'Symfony\\\\Component\\\\Console\\\\Exception\\\\RunCommandFailedException' => __DIR__ . '/..' . '/symfony/console/Exception/RunCommandFailedException.php',\n        'Symfony\\\\Component\\\\Console\\\\Exception\\\\RuntimeException' => __DIR__ . '/..' . '/symfony/console/Exception/RuntimeException.php',\n        'Symfony\\\\Component\\\\Console\\\\Formatter\\\\NullOutputFormatter' => __DIR__ . '/..' . '/symfony/console/Formatter/NullOutputFormatter.php',\n        'Symfony\\\\Component\\\\Console\\\\Formatter\\\\NullOutputFormatterStyle' => __DIR__ . '/..' . '/symfony/console/Formatter/NullOutputFormatterStyle.php',\n        'Symfony\\\\Component\\\\Console\\\\Formatter\\\\OutputFormatter' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatter.php',\n        'Symfony\\\\Component\\\\Console\\\\Formatter\\\\OutputFormatterInterface' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatterInterface.php',\n        'Symfony\\\\Component\\\\Console\\\\Formatter\\\\OutputFormatterStyle' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatterStyle.php',\n        'Symfony\\\\Component\\\\Console\\\\Formatter\\\\OutputFormatterStyleInterface' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatterStyleInterface.php',\n        'Symfony\\\\Component\\\\Console\\\\Formatter\\\\OutputFormatterStyleStack' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatterStyleStack.php',\n        'Symfony\\\\Component\\\\Console\\\\Formatter\\\\WrappableOutputFormatterInterface' => __DIR__ . '/..' . '/symfony/console/Formatter/WrappableOutputFormatterInterface.php',\n        'Symfony\\\\Component\\\\Console\\\\Helper\\\\DebugFormatterHelper' => __DIR__ . '/..' . '/symfony/console/Helper/DebugFormatterHelper.php',\n        'Symfony\\\\Component\\\\Console\\\\Helper\\\\DescriptorHelper' => __DIR__ . '/..' . '/symfony/console/Helper/DescriptorHelper.php',\n        'Symfony\\\\Component\\\\Console\\\\Helper\\\\Dumper' => __DIR__ . '/..' . '/symfony/console/Helper/Dumper.php',\n        'Symfony\\\\Component\\\\Console\\\\Helper\\\\FormatterHelper' => __DIR__ . '/..' . '/symfony/console/Helper/FormatterHelper.php',\n        'Symfony\\\\Component\\\\Console\\\\Helper\\\\Helper' => __DIR__ . '/..' . '/symfony/console/Helper/Helper.php',\n        'Symfony\\\\Component\\\\Console\\\\Helper\\\\HelperInterface' => __DIR__ . '/..' . '/symfony/console/Helper/HelperInterface.php',\n        'Symfony\\\\Component\\\\Console\\\\Helper\\\\HelperSet' => __DIR__ . '/..' . '/symfony/console/Helper/HelperSet.php',\n        'Symfony\\\\Component\\\\Console\\\\Helper\\\\InputAwareHelper' => __DIR__ . '/..' . '/symfony/console/Helper/InputAwareHelper.php',\n        'Symfony\\\\Component\\\\Console\\\\Helper\\\\OutputWrapper' => __DIR__ . '/..' . '/symfony/console/Helper/OutputWrapper.php',\n        'Symfony\\\\Component\\\\Console\\\\Helper\\\\ProcessHelper' => __DIR__ . '/..' . '/symfony/console/Helper/ProcessHelper.php',\n        'Symfony\\\\Component\\\\Console\\\\Helper\\\\ProgressBar' => __DIR__ . '/..' . '/symfony/console/Helper/ProgressBar.php',\n        'Symfony\\\\Component\\\\Console\\\\Helper\\\\ProgressIndicator' => __DIR__ . '/..' . '/symfony/console/Helper/ProgressIndicator.php',\n        'Symfony\\\\Component\\\\Console\\\\Helper\\\\QuestionHelper' => __DIR__ . '/..' . '/symfony/console/Helper/QuestionHelper.php',\n        'Symfony\\\\Component\\\\Console\\\\Helper\\\\SymfonyQuestionHelper' => __DIR__ . '/..' . '/symfony/console/Helper/SymfonyQuestionHelper.php',\n        'Symfony\\\\Component\\\\Console\\\\Helper\\\\Table' => __DIR__ . '/..' . '/symfony/console/Helper/Table.php',\n        'Symfony\\\\Component\\\\Console\\\\Helper\\\\TableCell' => __DIR__ . '/..' . '/symfony/console/Helper/TableCell.php',\n        'Symfony\\\\Component\\\\Console\\\\Helper\\\\TableCellStyle' => __DIR__ . '/..' . '/symfony/console/Helper/TableCellStyle.php',\n        'Symfony\\\\Component\\\\Console\\\\Helper\\\\TableRows' => __DIR__ . '/..' . '/symfony/console/Helper/TableRows.php',\n        'Symfony\\\\Component\\\\Console\\\\Helper\\\\TableSeparator' => __DIR__ . '/..' . '/symfony/console/Helper/TableSeparator.php',\n        'Symfony\\\\Component\\\\Console\\\\Helper\\\\TableStyle' => __DIR__ . '/..' . '/symfony/console/Helper/TableStyle.php',\n        'Symfony\\\\Component\\\\Console\\\\Helper\\\\TerminalInputHelper' => __DIR__ . '/..' . '/symfony/console/Helper/TerminalInputHelper.php',\n        'Symfony\\\\Component\\\\Console\\\\Helper\\\\TreeHelper' => __DIR__ . '/..' . '/symfony/console/Helper/TreeHelper.php',\n        'Symfony\\\\Component\\\\Console\\\\Helper\\\\TreeNode' => __DIR__ . '/..' . '/symfony/console/Helper/TreeNode.php',\n        'Symfony\\\\Component\\\\Console\\\\Helper\\\\TreeStyle' => __DIR__ . '/..' . '/symfony/console/Helper/TreeStyle.php',\n        'Symfony\\\\Component\\\\Console\\\\Input\\\\ArgvInput' => __DIR__ . '/..' . '/symfony/console/Input/ArgvInput.php',\n        'Symfony\\\\Component\\\\Console\\\\Input\\\\ArrayInput' => __DIR__ . '/..' . '/symfony/console/Input/ArrayInput.php',\n        'Symfony\\\\Component\\\\Console\\\\Input\\\\Input' => __DIR__ . '/..' . '/symfony/console/Input/Input.php',\n        'Symfony\\\\Component\\\\Console\\\\Input\\\\InputArgument' => __DIR__ . '/..' . '/symfony/console/Input/InputArgument.php',\n        'Symfony\\\\Component\\\\Console\\\\Input\\\\InputAwareInterface' => __DIR__ . '/..' . '/symfony/console/Input/InputAwareInterface.php',\n        'Symfony\\\\Component\\\\Console\\\\Input\\\\InputDefinition' => __DIR__ . '/..' . '/symfony/console/Input/InputDefinition.php',\n        'Symfony\\\\Component\\\\Console\\\\Input\\\\InputInterface' => __DIR__ . '/..' . '/symfony/console/Input/InputInterface.php',\n        'Symfony\\\\Component\\\\Console\\\\Input\\\\InputOption' => __DIR__ . '/..' . '/symfony/console/Input/InputOption.php',\n        'Symfony\\\\Component\\\\Console\\\\Input\\\\StreamableInputInterface' => __DIR__ . '/..' . '/symfony/console/Input/StreamableInputInterface.php',\n        'Symfony\\\\Component\\\\Console\\\\Input\\\\StringInput' => __DIR__ . '/..' . '/symfony/console/Input/StringInput.php',\n        'Symfony\\\\Component\\\\Console\\\\Interaction\\\\Interaction' => __DIR__ . '/..' . '/symfony/console/Interaction/Interaction.php',\n        'Symfony\\\\Component\\\\Console\\\\Logger\\\\ConsoleLogger' => __DIR__ . '/..' . '/symfony/console/Logger/ConsoleLogger.php',\n        'Symfony\\\\Component\\\\Console\\\\Messenger\\\\RunCommandContext' => __DIR__ . '/..' . '/symfony/console/Messenger/RunCommandContext.php',\n        'Symfony\\\\Component\\\\Console\\\\Messenger\\\\RunCommandMessage' => __DIR__ . '/..' . '/symfony/console/Messenger/RunCommandMessage.php',\n        'Symfony\\\\Component\\\\Console\\\\Messenger\\\\RunCommandMessageHandler' => __DIR__ . '/..' . '/symfony/console/Messenger/RunCommandMessageHandler.php',\n        'Symfony\\\\Component\\\\Console\\\\Output\\\\AnsiColorMode' => __DIR__ . '/..' . '/symfony/console/Output/AnsiColorMode.php',\n        'Symfony\\\\Component\\\\Console\\\\Output\\\\BufferedOutput' => __DIR__ . '/..' . '/symfony/console/Output/BufferedOutput.php',\n        'Symfony\\\\Component\\\\Console\\\\Output\\\\ConsoleOutput' => __DIR__ . '/..' . '/symfony/console/Output/ConsoleOutput.php',\n        'Symfony\\\\Component\\\\Console\\\\Output\\\\ConsoleOutputInterface' => __DIR__ . '/..' . '/symfony/console/Output/ConsoleOutputInterface.php',\n        'Symfony\\\\Component\\\\Console\\\\Output\\\\ConsoleSectionOutput' => __DIR__ . '/..' . '/symfony/console/Output/ConsoleSectionOutput.php',\n        'Symfony\\\\Component\\\\Console\\\\Output\\\\NullOutput' => __DIR__ . '/..' . '/symfony/console/Output/NullOutput.php',\n        'Symfony\\\\Component\\\\Console\\\\Output\\\\Output' => __DIR__ . '/..' . '/symfony/console/Output/Output.php',\n        'Symfony\\\\Component\\\\Console\\\\Output\\\\OutputInterface' => __DIR__ . '/..' . '/symfony/console/Output/OutputInterface.php',\n        'Symfony\\\\Component\\\\Console\\\\Output\\\\StreamOutput' => __DIR__ . '/..' . '/symfony/console/Output/StreamOutput.php',\n        'Symfony\\\\Component\\\\Console\\\\Output\\\\TrimmedBufferOutput' => __DIR__ . '/..' . '/symfony/console/Output/TrimmedBufferOutput.php',\n        'Symfony\\\\Component\\\\Console\\\\Question\\\\ChoiceQuestion' => __DIR__ . '/..' . '/symfony/console/Question/ChoiceQuestion.php',\n        'Symfony\\\\Component\\\\Console\\\\Question\\\\ConfirmationQuestion' => __DIR__ . '/..' . '/symfony/console/Question/ConfirmationQuestion.php',\n        'Symfony\\\\Component\\\\Console\\\\Question\\\\Question' => __DIR__ . '/..' . '/symfony/console/Question/Question.php',\n        'Symfony\\\\Component\\\\Console\\\\SignalRegistry\\\\SignalMap' => __DIR__ . '/..' . '/symfony/console/SignalRegistry/SignalMap.php',\n        'Symfony\\\\Component\\\\Console\\\\SignalRegistry\\\\SignalRegistry' => __DIR__ . '/..' . '/symfony/console/SignalRegistry/SignalRegistry.php',\n        'Symfony\\\\Component\\\\Console\\\\SingleCommandApplication' => __DIR__ . '/..' . '/symfony/console/SingleCommandApplication.php',\n        'Symfony\\\\Component\\\\Console\\\\Style\\\\OutputStyle' => __DIR__ . '/..' . '/symfony/console/Style/OutputStyle.php',\n        'Symfony\\\\Component\\\\Console\\\\Style\\\\StyleInterface' => __DIR__ . '/..' . '/symfony/console/Style/StyleInterface.php',\n        'Symfony\\\\Component\\\\Console\\\\Style\\\\SymfonyStyle' => __DIR__ . '/..' . '/symfony/console/Style/SymfonyStyle.php',\n        'Symfony\\\\Component\\\\Console\\\\Terminal' => __DIR__ . '/..' . '/symfony/console/Terminal.php',\n        'Symfony\\\\Component\\\\Console\\\\Tester\\\\ApplicationTester' => __DIR__ . '/..' . '/symfony/console/Tester/ApplicationTester.php',\n        'Symfony\\\\Component\\\\Console\\\\Tester\\\\CommandCompletionTester' => __DIR__ . '/..' . '/symfony/console/Tester/CommandCompletionTester.php',\n        'Symfony\\\\Component\\\\Console\\\\Tester\\\\CommandTester' => __DIR__ . '/..' . '/symfony/console/Tester/CommandTester.php',\n        'Symfony\\\\Component\\\\Console\\\\Tester\\\\Constraint\\\\CommandIsSuccessful' => __DIR__ . '/..' . '/symfony/console/Tester/Constraint/CommandIsSuccessful.php',\n        'Symfony\\\\Component\\\\Console\\\\Tester\\\\TesterTrait' => __DIR__ . '/..' . '/symfony/console/Tester/TesterTrait.php',\n        'Symfony\\\\Component\\\\String\\\\AbstractString' => __DIR__ . '/..' . '/symfony/string/AbstractString.php',\n        'Symfony\\\\Component\\\\String\\\\AbstractUnicodeString' => __DIR__ . '/..' . '/symfony/string/AbstractUnicodeString.php',\n        'Symfony\\\\Component\\\\String\\\\ByteString' => __DIR__ . '/..' . '/symfony/string/ByteString.php',\n        'Symfony\\\\Component\\\\String\\\\CodePointString' => __DIR__ . '/..' . '/symfony/string/CodePointString.php',\n        'Symfony\\\\Component\\\\String\\\\Exception\\\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/string/Exception/ExceptionInterface.php',\n        'Symfony\\\\Component\\\\String\\\\Exception\\\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/string/Exception/InvalidArgumentException.php',\n        'Symfony\\\\Component\\\\String\\\\Exception\\\\RuntimeException' => __DIR__ . '/..' . '/symfony/string/Exception/RuntimeException.php',\n        'Symfony\\\\Component\\\\String\\\\Inflector\\\\EnglishInflector' => __DIR__ . '/..' . '/symfony/string/Inflector/EnglishInflector.php',\n        'Symfony\\\\Component\\\\String\\\\Inflector\\\\FrenchInflector' => __DIR__ . '/..' . '/symfony/string/Inflector/FrenchInflector.php',\n        'Symfony\\\\Component\\\\String\\\\Inflector\\\\InflectorInterface' => __DIR__ . '/..' . '/symfony/string/Inflector/InflectorInterface.php',\n        'Symfony\\\\Component\\\\String\\\\Inflector\\\\SpanishInflector' => __DIR__ . '/..' . '/symfony/string/Inflector/SpanishInflector.php',\n        'Symfony\\\\Component\\\\String\\\\LazyString' => __DIR__ . '/..' . '/symfony/string/LazyString.php',\n        'Symfony\\\\Component\\\\String\\\\Slugger\\\\AsciiSlugger' => __DIR__ . '/..' . '/symfony/string/Slugger/AsciiSlugger.php',\n        'Symfony\\\\Component\\\\String\\\\Slugger\\\\SluggerInterface' => __DIR__ . '/..' . '/symfony/string/Slugger/SluggerInterface.php',\n        'Symfony\\\\Component\\\\String\\\\TruncateMode' => __DIR__ . '/..' . '/symfony/string/TruncateMode.php',\n        'Symfony\\\\Component\\\\String\\\\UnicodeString' => __DIR__ . '/..' . '/symfony/string/UnicodeString.php',\n        'Symfony\\\\Component\\\\Yaml\\\\Command\\\\LintCommand' => __DIR__ . '/..' . '/symfony/yaml/Command/LintCommand.php',\n        'Symfony\\\\Component\\\\Yaml\\\\Dumper' => __DIR__ . '/..' . '/symfony/yaml/Dumper.php',\n        'Symfony\\\\Component\\\\Yaml\\\\Escaper' => __DIR__ . '/..' . '/symfony/yaml/Escaper.php',\n        'Symfony\\\\Component\\\\Yaml\\\\Exception\\\\DumpException' => __DIR__ . '/..' . '/symfony/yaml/Exception/DumpException.php',\n        'Symfony\\\\Component\\\\Yaml\\\\Exception\\\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/yaml/Exception/ExceptionInterface.php',\n        'Symfony\\\\Component\\\\Yaml\\\\Exception\\\\ParseException' => __DIR__ . '/..' . '/symfony/yaml/Exception/ParseException.php',\n        'Symfony\\\\Component\\\\Yaml\\\\Exception\\\\RuntimeException' => __DIR__ . '/..' . '/symfony/yaml/Exception/RuntimeException.php',\n        'Symfony\\\\Component\\\\Yaml\\\\Inline' => __DIR__ . '/..' . '/symfony/yaml/Inline.php',\n        'Symfony\\\\Component\\\\Yaml\\\\Parser' => __DIR__ . '/..' . '/symfony/yaml/Parser.php',\n        'Symfony\\\\Component\\\\Yaml\\\\ParserState' => __DIR__ . '/..' . '/symfony/yaml/ParserState.php',\n        'Symfony\\\\Component\\\\Yaml\\\\Tag\\\\TaggedValue' => __DIR__ . '/..' . '/symfony/yaml/Tag/TaggedValue.php',\n        'Symfony\\\\Component\\\\Yaml\\\\Unescaper' => __DIR__ . '/..' . '/symfony/yaml/Unescaper.php',\n        'Symfony\\\\Component\\\\Yaml\\\\Yaml' => __DIR__ . '/..' . '/symfony/yaml/Yaml.php',\n        'Symfony\\\\Contracts\\\\Service\\\\Attribute\\\\Required' => __DIR__ . '/..' . '/symfony/service-contracts/Attribute/Required.php',\n        'Symfony\\\\Contracts\\\\Service\\\\Attribute\\\\SubscribedService' => __DIR__ . '/..' . '/symfony/service-contracts/Attribute/SubscribedService.php',\n        'Symfony\\\\Contracts\\\\Service\\\\ContainerAwareInterface' => __DIR__ . '/..' . '/symfony/service-contracts/ContainerAwareInterface.php',\n        'Symfony\\\\Contracts\\\\Service\\\\ContainerProviderInterface' => __DIR__ . '/..' . '/symfony/service-contracts/ContainerProviderInterface.php',\n        'Symfony\\\\Contracts\\\\Service\\\\ResetInterface' => __DIR__ . '/..' . '/symfony/service-contracts/ResetInterface.php',\n        'Symfony\\\\Contracts\\\\Service\\\\ServiceCollectionInterface' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceCollectionInterface.php',\n        'Symfony\\\\Contracts\\\\Service\\\\ServiceLocatorTrait' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceLocatorTrait.php',\n        'Symfony\\\\Contracts\\\\Service\\\\ServiceMethodsSubscriberTrait' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceMethodsSubscriberTrait.php',\n        'Symfony\\\\Contracts\\\\Service\\\\ServiceProviderInterface' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceProviderInterface.php',\n        'Symfony\\\\Contracts\\\\Service\\\\ServiceSubscriberInterface' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceSubscriberInterface.php',\n        'Symfony\\\\Contracts\\\\Service\\\\ServiceSubscriberTrait' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceSubscriberTrait.php',\n        'Symfony\\\\Polyfill\\\\Ctype\\\\Ctype' => __DIR__ . '/..' . '/symfony/polyfill-ctype/Ctype.php',\n        'Symfony\\\\Polyfill\\\\Intl\\\\Grapheme\\\\Grapheme' => __DIR__ . '/..' . '/symfony/polyfill-intl-grapheme/Grapheme.php',\n        'Symfony\\\\Polyfill\\\\Intl\\\\Normalizer\\\\Normalizer' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/Normalizer.php',\n        'Symfony\\\\Polyfill\\\\Mbstring\\\\Mbstring' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/Mbstring.php',\n        'WorkerSafety\\\\Analyzer\\\\AnalysisRequest' => __DIR__ . '/../..' . '/src/Analyzer/AnalysisRequest.php',\n        'WorkerSafety\\\\Analyzer\\\\AnalysisResult' => __DIR__ . '/../..' . '/src/Analyzer/AnalysisResult.php',\n        'WorkerSafety\\\\Analyzer\\\\Analyzer' => __DIR__ . '/../..' . '/src/Analyzer/Analyzer.php',\n        'WorkerSafety\\\\Analyzer\\\\FileAnalysisResult' => __DIR__ . '/../..' . '/src/Analyzer/FileAnalysisResult.php',\n        'WorkerSafety\\\\Analyzer\\\\FileAnalyzer' => __DIR__ . '/../..' . '/src/Analyzer/FileAnalyzer.php',\n        'WorkerSafety\\\\Analyzer\\\\ProjectAnalyzer' => __DIR__ . '/../..' . '/src/Analyzer/ProjectAnalyzer.php',\n        'WorkerSafety\\\\Analyzer\\\\ScanOptions' => __DIR__ . '/../..' . '/src/Analyzer/ScanOptions.php',\n        'WorkerSafety\\\\Analyzer\\\\ScanOutcome' => __DIR__ . '/../..' . '/src/Analyzer/ScanOutcome.php',\n        'WorkerSafety\\\\Analyzer\\\\ScanPathResolver' => __DIR__ . '/../..' . '/src/Analyzer/ScanPathResolver.php',\n        'WorkerSafety\\\\Analyzer\\\\ScanService' => __DIR__ . '/../..' . '/src/Analyzer/ScanService.php',\n        'WorkerSafety\\\\Application\\\\ApplicationInfo' => __DIR__ . '/../..' . '/src/Application/ApplicationInfo.php',\n        'WorkerSafety\\\\Application\\\\ExitCode' => __DIR__ . '/../..' . '/src/Application/ExitCode.php',\n        'WorkerSafety\\\\Application\\\\WorkerSafetyApplication' => __DIR__ . '/../..' . '/src/Application/WorkerSafetyApplication.php',\n        'WorkerSafety\\\\Ast\\\\AstHelper' => __DIR__ . '/../..' . '/src/Ast/AstHelper.php',\n        'WorkerSafety\\\\Ast\\\\AstParser' => __DIR__ . '/../..' . '/src/Ast/AstParser.php',\n        'WorkerSafety\\\\Ast\\\\Index\\\\BindingContext' => __DIR__ . '/../..' . '/src/Ast/Index/BindingContext.php',\n        'WorkerSafety\\\\Ast\\\\Index\\\\ClassKind' => __DIR__ . '/../..' . '/src/Ast/Index/ClassKind.php',\n        'WorkerSafety\\\\Ast\\\\Index\\\\ClassShape' => __DIR__ . '/../..' . '/src/Ast/Index/ClassShape.php',\n        'WorkerSafety\\\\Ast\\\\Index\\\\ContainerBinding' => __DIR__ . '/../..' . '/src/Ast/Index/ContainerBinding.php',\n        'WorkerSafety\\\\Ast\\\\Index\\\\ContainerBindingCollector' => __DIR__ . '/../..' . '/src/Ast/Index/ContainerBindingCollector.php',\n        'WorkerSafety\\\\Ast\\\\Index\\\\DefaultValueKind' => __DIR__ . '/../..' . '/src/Ast/Index/DefaultValueKind.php',\n        'WorkerSafety\\\\Ast\\\\Index\\\\MethodShape' => __DIR__ . '/../..' . '/src/Ast/Index/MethodShape.php',\n        'WorkerSafety\\\\Ast\\\\Index\\\\ProjectIndex' => __DIR__ . '/../..' . '/src/Ast/Index/ProjectIndex.php',\n        'WorkerSafety\\\\Ast\\\\Index\\\\PropertyShape' => __DIR__ . '/../..' . '/src/Ast/Index/PropertyShape.php',\n        'WorkerSafety\\\\Ast\\\\Index\\\\SingletonAnalyzer' => __DIR__ . '/../..' . '/src/Ast/Index/SingletonAnalyzer.php',\n        'WorkerSafety\\\\Ast\\\\Index\\\\StateWrite' => __DIR__ . '/../..' . '/src/Ast/Index/StateWrite.php',\n        'WorkerSafety\\\\Ast\\\\Index\\\\StaticLocalVariable' => __DIR__ . '/../..' . '/src/Ast/Index/StaticLocalVariable.php',\n        'WorkerSafety\\\\Ast\\\\Index\\\\WriteKind' => __DIR__ . '/../..' . '/src/Ast/Index/WriteKind.php',\n        'WorkerSafety\\\\Ast\\\\ParseFailure' => __DIR__ . '/../..' . '/src/Ast/ParseFailure.php',\n        'WorkerSafety\\\\Ast\\\\ParseResult' => __DIR__ . '/../..' . '/src/Ast/ParseResult.php',\n        'WorkerSafety\\\\Ast\\\\Visitor\\\\ClassShapeBuilder' => __DIR__ . '/../..' . '/src/Ast/Visitor/ClassShapeBuilder.php',\n        'WorkerSafety\\\\Ast\\\\Visitor\\\\FirstInstantiationFinder' => __DIR__ . '/../..' . '/src/Ast/Visitor/FirstInstantiationFinder.php',\n        'WorkerSafety\\\\Ast\\\\Visitor\\\\FunctionScope' => __DIR__ . '/../..' . '/src/Ast/Visitor/FunctionScope.php',\n        'WorkerSafety\\\\Ast\\\\Visitor\\\\IndexCollectingVisitor' => __DIR__ . '/../..' . '/src/Ast/Visitor/IndexCollectingVisitor.php',\n        'WorkerSafety\\\\Ast\\\\Visitor\\\\RuleDispatchVisitor' => __DIR__ . '/../..' . '/src/Ast/Visitor/RuleDispatchVisitor.php',\n        'WorkerSafety\\\\Ast\\\\Visitor\\\\VariableWriteFinder' => __DIR__ . '/../..' . '/src/Ast/Visitor/VariableWriteFinder.php',\n        'WorkerSafety\\\\Attribute\\\\WorkerSafetyIgnore' => __DIR__ . '/../..' . '/src/Attribute/WorkerSafetyIgnore.php',\n        'WorkerSafety\\\\Baseline\\\\Baseline' => __DIR__ . '/../..' . '/src/Baseline/Baseline.php',\n        'WorkerSafety\\\\Baseline\\\\BaselineFilter' => __DIR__ . '/../..' . '/src/Baseline/BaselineFilter.php',\n        'WorkerSafety\\\\Baseline\\\\BaselineRepository' => __DIR__ . '/../..' . '/src/Baseline/BaselineRepository.php',\n        'WorkerSafety\\\\Command\\\\AbstractCommand' => __DIR__ . '/../..' . '/src/Command/AbstractCommand.php',\n        'WorkerSafety\\\\Command\\\\BaselineCommand' => __DIR__ . '/../..' . '/src/Command/BaselineCommand.php',\n        'WorkerSafety\\\\Command\\\\InitCommand' => __DIR__ . '/../..' . '/src/Command/InitCommand.php',\n        'WorkerSafety\\\\Command\\\\RulesCommand' => __DIR__ . '/../..' . '/src/Command/RulesCommand.php',\n        'WorkerSafety\\\\Command\\\\ScanCommand' => __DIR__ . '/../..' . '/src/Command/ScanCommand.php',\n        'WorkerSafety\\\\Config\\\\Configuration' => __DIR__ . '/../..' . '/src/Config/Configuration.php',\n        'WorkerSafety\\\\Config\\\\ConfigurationLoader' => __DIR__ . '/../..' . '/src/Config/ConfigurationLoader.php',\n        'WorkerSafety\\\\Config\\\\ConfigurationTemplate' => __DIR__ . '/../..' . '/src/Config/ConfigurationTemplate.php',\n        'WorkerSafety\\\\Config\\\\RuleSetting' => __DIR__ . '/../..' . '/src/Config/RuleSetting.php',\n        'WorkerSafety\\\\Exception\\\\AnalysisException' => __DIR__ . '/../..' . '/src/Exception/AnalysisException.php',\n        'WorkerSafety\\\\Exception\\\\ConfigurationException' => __DIR__ . '/../..' . '/src/Exception/ConfigurationException.php',\n        'WorkerSafety\\\\Exception\\\\WorkerSafetyException' => __DIR__ . '/../..' . '/src/Exception/WorkerSafetyException.php',\n        'WorkerSafety\\\\Finding\\\\Finding' => __DIR__ . '/../..' . '/src/Finding/Finding.php',\n        'WorkerSafety\\\\Finding\\\\FindingCollection' => __DIR__ . '/../..' . '/src/Finding/FindingCollection.php',\n        'WorkerSafety\\\\Finding\\\\Location' => __DIR__ . '/../..' . '/src/Finding/Location.php',\n        'WorkerSafety\\\\Finding\\\\RuleCategory' => __DIR__ . '/../..' . '/src/Finding/RuleCategory.php',\n        'WorkerSafety\\\\Finding\\\\Severity' => __DIR__ . '/../..' . '/src/Finding/Severity.php',\n        'WorkerSafety\\\\Finding\\\\SymbolContext' => __DIR__ . '/../..' . '/src/Finding/SymbolContext.php',\n        'WorkerSafety\\\\Framework\\\\DetectedFramework' => __DIR__ . '/../..' . '/src/Framework/DetectedFramework.php',\n        'WorkerSafety\\\\Framework\\\\Framework' => __DIR__ . '/../..' . '/src/Framework/Framework.php',\n        'WorkerSafety\\\\Framework\\\\FrameworkAdapter' => __DIR__ . '/../..' . '/src/Framework/FrameworkAdapter.php',\n        'WorkerSafety\\\\Framework\\\\FrameworkAdapterRegistry' => __DIR__ . '/../..' . '/src/Framework/FrameworkAdapterRegistry.php',\n        'WorkerSafety\\\\Framework\\\\FrameworkDetector' => __DIR__ . '/../..' . '/src/Framework/FrameworkDetector.php',\n        'WorkerSafety\\\\Framework\\\\Laravel\\\\LaravelAdapter' => __DIR__ . '/../..' . '/src/Framework/Laravel/LaravelAdapter.php',\n        'WorkerSafety\\\\Framework\\\\Laravel\\\\LaravelContainerBindingCollector' => __DIR__ . '/../..' . '/src/Framework/Laravel/LaravelContainerBindingCollector.php',\n        'WorkerSafety\\\\Framework\\\\Laravel\\\\Rule\\\\ContainerSingletonMutableStateRule' => __DIR__ . '/../..' . '/src/Framework/Laravel/Rule/ContainerSingletonMutableStateRule.php',\n        'WorkerSafety\\\\Framework\\\\Laravel\\\\Rule\\\\ScopedBindingCandidateRule' => __DIR__ . '/../..' . '/src/Framework/Laravel/Rule/ScopedBindingCandidateRule.php',\n        'WorkerSafety\\\\Framework\\\\Laravel\\\\SharedBindingInspection' => __DIR__ . '/../..' . '/src/Framework/Laravel/SharedBindingInspection.php',\n        'WorkerSafety\\\\Framework\\\\Laravel\\\\SharedBindingInspector' => __DIR__ . '/../..' . '/src/Framework/Laravel/SharedBindingInspector.php',\n        'WorkerSafety\\\\Framework\\\\PlainPhpAdapter' => __DIR__ . '/../..' . '/src/Framework/PlainPhpAdapter.php',\n        'WorkerSafety\\\\Framework\\\\Symfony\\\\SymfonyAdapter' => __DIR__ . '/../..' . '/src/Framework/Symfony/SymfonyAdapter.php',\n        'WorkerSafety\\\\Ignore\\\\FindingSuppressor' => __DIR__ . '/../..' . '/src/Ignore/FindingSuppressor.php',\n        'WorkerSafety\\\\Ignore\\\\IgnoreAttributeVisitor' => __DIR__ . '/../..' . '/src/Ignore/IgnoreAttributeVisitor.php',\n        'WorkerSafety\\\\Ignore\\\\IgnoreDirectiveParser' => __DIR__ . '/../..' . '/src/Ignore/IgnoreDirectiveParser.php',\n        'WorkerSafety\\\\Ignore\\\\SuppressionIndex' => __DIR__ . '/../..' . '/src/Ignore/SuppressionIndex.php',\n        'WorkerSafety\\\\Integration\\\\Laravel\\\\ArtisanScanCommand' => __DIR__ . '/../..' . '/src/Integration/Laravel/ArtisanScanCommand.php',\n        'WorkerSafety\\\\Integration\\\\Laravel\\\\WorkerSafetyServiceProvider' => __DIR__ . '/../..' . '/src/Integration/Laravel/WorkerSafetyServiceProvider.php',\n        'WorkerSafety\\\\Reporting\\\\ConsoleReporter' => __DIR__ . '/../..' . '/src/Reporting/ConsoleReporter.php',\n        'WorkerSafety\\\\Reporting\\\\ConsoleStyles' => __DIR__ . '/../..' . '/src/Reporting/ConsoleStyles.php',\n        'WorkerSafety\\\\Reporting\\\\JsonReporter' => __DIR__ . '/../..' . '/src/Reporting/JsonReporter.php',\n        'WorkerSafety\\\\Reporting\\\\OutputFormat' => __DIR__ . '/../..' . '/src/Reporting/OutputFormat.php',\n        'WorkerSafety\\\\Reporting\\\\Reporter' => __DIR__ . '/../..' . '/src/Reporting/Reporter.php',\n        'WorkerSafety\\\\Reporting\\\\ReporterFactory' => __DIR__ . '/../..' . '/src/Reporting/ReporterFactory.php',\n        'WorkerSafety\\\\Reporting\\\\SarifReporter' => __DIR__ . '/../..' . '/src/Reporting/SarifReporter.php',\n        'WorkerSafety\\\\Reporting\\\\ScanReport' => __DIR__ . '/../..' . '/src/Reporting/ScanReport.php',\n        'WorkerSafety\\\\Rule\\\\AbstractRule' => __DIR__ . '/../..' . '/src/Rule/AbstractRule.php',\n        'WorkerSafety\\\\Rule\\\\BuiltIn\\\\MutableGlobalVariableRule' => __DIR__ . '/../..' . '/src/Rule/BuiltIn/MutableGlobalVariableRule.php',\n        'WorkerSafety\\\\Rule\\\\BuiltIn\\\\MutableSingletonRule' => __DIR__ . '/../..' . '/src/Rule/BuiltIn/MutableSingletonRule.php',\n        'WorkerSafety\\\\Rule\\\\BuiltIn\\\\MutableStaticPropertyRule' => __DIR__ . '/../..' . '/src/Rule/BuiltIn/MutableStaticPropertyRule.php',\n        'WorkerSafety\\\\Rule\\\\BuiltIn\\\\PersistentListenerRegistrationRule' => __DIR__ . '/../..' . '/src/Rule/BuiltIn/PersistentListenerRegistrationRule.php',\n        'WorkerSafety\\\\Rule\\\\BuiltIn\\\\RuntimeEnvironmentMutationRule' => __DIR__ . '/../..' . '/src/Rule/BuiltIn/RuntimeEnvironmentMutationRule.php',\n        'WorkerSafety\\\\Rule\\\\BuiltIn\\\\ShutdownLifecycleAssumptionRule' => __DIR__ . '/../..' . '/src/Rule/BuiltIn/ShutdownLifecycleAssumptionRule.php',\n        'WorkerSafety\\\\Rule\\\\BuiltIn\\\\StaticCollectionGrowthRule' => __DIR__ . '/../..' . '/src/Rule/BuiltIn/StaticCollectionGrowthRule.php',\n        'WorkerSafety\\\\Rule\\\\BuiltIn\\\\StaticRequestContextRule' => __DIR__ . '/../..' . '/src/Rule/BuiltIn/StaticRequestContextRule.php',\n        'WorkerSafety\\\\Rule\\\\ProjectContext' => __DIR__ . '/../..' . '/src/Rule/ProjectContext.php',\n        'WorkerSafety\\\\Rule\\\\ReportingContext' => __DIR__ . '/../..' . '/src/Rule/ReportingContext.php',\n        'WorkerSafety\\\\Rule\\\\Rule' => __DIR__ . '/../..' . '/src/Rule/Rule.php',\n        'WorkerSafety\\\\Rule\\\\RuleContext' => __DIR__ . '/../..' . '/src/Rule/RuleContext.php',\n        'WorkerSafety\\\\Rule\\\\RuleDefinition' => __DIR__ . '/../..' . '/src/Rule/RuleDefinition.php',\n        'WorkerSafety\\\\Rule\\\\RuleId' => __DIR__ . '/../..' . '/src/Rule/RuleId.php',\n        'WorkerSafety\\\\Rule\\\\RuleRegistry' => __DIR__ . '/../..' . '/src/Rule/RuleRegistry.php',\n        'WorkerSafety\\\\Rule\\\\RuleRegistryFactory' => __DIR__ . '/../..' . '/src/Rule/RuleRegistryFactory.php',\n        'WorkerSafety\\\\Rule\\\\Scope' => __DIR__ . '/../..' . '/src/Rule/Scope.php',\n        'WorkerSafety\\\\Runtime\\\\RuntimeTarget' => __DIR__ . '/../..' . '/src/Runtime/RuntimeTarget.php',\n        'WorkerSafety\\\\Runtime\\\\RuntimeTargetSet' => __DIR__ . '/../..' . '/src/Runtime/RuntimeTargetSet.php',\n        'WorkerSafety\\\\Support\\\\ExcludeMatcher' => __DIR__ . '/../..' . '/src/Support/ExcludeMatcher.php',\n        'WorkerSafety\\\\Support\\\\FileFinder' => __DIR__ . '/../..' . '/src/Support/FileFinder.php',\n        'WorkerSafety\\\\Support\\\\NameHeuristics' => __DIR__ . '/../..' . '/src/Support/NameHeuristics.php',\n        'WorkerSafety\\\\Support\\\\Paths' => __DIR__ . '/../..' . '/src/Support/Paths.php',\n        'WorkerSafety\\\\Support\\\\SourceFile' => __DIR__ . '/../..' . '/src/Support/SourceFile.php',\n    );\n\n    public static function getInitializer(ClassLoader $loader)\n    {\n        return \\Closure::bind(function () use ($loader) {\n            $loader->prefixLengthsPsr4 = ComposerStaticInitade0b511dfb236ccca8e627237d0e6fb::$prefixLengthsPsr4;\n            $loader->prefixDirsPsr4 = ComposerStaticInitade0b511dfb236ccca8e627237d0e6fb::$prefixDirsPsr4;\n            $loader->classMap = ComposerStaticInitade0b511dfb236ccca8e627237d0e6fb::$classMap;\n\n        }, null, ClassLoader::class);\n    }\n}\n","vendor/composer/installed.json":"{\n    \"packages\": [\n        {\n            \"name\": \"nikic/php-parser\",\n            \"version\": \"v5.8.0\",\n            \"version_normalized\": \"5.8.0.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/nikic/PHP-Parser.git\",\n                \"reference\": \"044a6a392ff8ad0d61f14370a5fbbd0a0107152f\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/nikic/PHP-Parser/zipball/044a6a392ff8ad0d61f14370a5fbbd0a0107152f\",\n                \"reference\": \"044a6a392ff8ad0d61f14370a5fbbd0a0107152f\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"ext-json\": \"*\",\n                \"ext-tokenizer\": \"*\",\n                \"php\": \">=7.4\"\n            },\n            \"require-dev\": {\n                \"ircmaxell/php-yacc\": \"^0.0.7\",\n                \"phpunit/phpunit\": \"^9.0\"\n            },\n            \"time\": \"2026-07-04T14:30:18+00:00\",\n            \"bin\": [\n                \"bin/php-parse\"\n            ],\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-master\": \"5.x-dev\"\n                }\n            },\n            \"installation-source\": \"dist\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"PhpParser\\\\\": \"lib/PhpParser\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"BSD-3-Clause\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Nikita Popov\"\n                }\n            ],\n            \"description\": \"A PHP parser written in PHP\",\n            \"keywords\": [\n                \"parser\",\n                \"php\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/nikic/PHP-Parser/issues\",\n                \"source\": \"https://github.com/nikic/PHP-Parser/tree/v5.8.0\"\n            },\n            \"install-path\": \"../nikic/php-parser\"\n        },\n        {\n            \"name\": \"psr/container\",\n            \"version\": \"2.0.2\",\n            \"version_normalized\": \"2.0.2.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/php-fig/container.git\",\n                \"reference\": \"c71ecc56dfe541dbd90c5360474fbc405f8d5963\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963\",\n                \"reference\": \"c71ecc56dfe541dbd90c5360474fbc405f8d5963\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=7.4.0\"\n            },\n            \"time\": \"2021-11-05T16:47:00+00:00\",\n            \"type\": \"library\",\n            \"extra\": {\n                \"branch-alias\": {\n                    \"dev-master\": \"2.0.x-dev\"\n                }\n            },\n            \"installation-source\": \"dist\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Psr\\\\Container\\\\\": \"src/\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"PHP-FIG\",\n                    \"homepage\": \"https://www.php-fig.org/\"\n                }\n            ],\n            \"description\": \"Common Container Interface (PHP FIG PSR-11)\",\n            \"homepage\": \"https://github.com/php-fig/container\",\n            \"keywords\": [\n                \"PSR-11\",\n                \"container\",\n                \"container-interface\",\n                \"container-interop\",\n                \"psr\"\n            ],\n            \"support\": {\n                \"issues\": \"https://github.com/php-fig/container/issues\",\n                \"source\": \"https://github.com/php-fig/container/tree/2.0.2\"\n            },\n            \"install-path\": \"../psr/container\"\n        },\n        {\n            \"name\": \"symfony/console\",\n            \"version\": \"v7.4.18\",\n            \"version_normalized\": \"7.4.18.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/symfony/console.git\",\n                \"reference\": \"23d6f88a29f6d0eac45bd77d70307adf83ba7ab0\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/symfony/console/zipball/23d6f88a29f6d0eac45bd77d70307adf83ba7ab0\",\n                \"reference\": \"23d6f88a29f6d0eac45bd77d70307adf83ba7ab0\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=8.2\",\n                \"symfony/deprecation-contracts\": \"^2.5|^3\",\n                \"symfony/polyfill-mbstring\": \"~1.0\",\n                \"symfony/service-contracts\": \"^2.5|^3\",\n                \"symfony/string\": \"^7.2|^8.0\"\n            },\n            \"conflict\": {\n                \"symfony/dependency-injection\": \"<6.4\",\n                \"symfony/dotenv\": \"<6.4\",\n                \"symfony/event-dispatcher\": \"<6.4\",\n                \"symfony/lock\": \"<6.4\",\n                \"symfony/process\": \"<6.4\"\n            },\n            \"provide\": {\n                \"psr/log-implementation\": \"1.0|2.0|3.0\"\n            },\n            \"require-dev\": {\n                \"psr/log\": \"^1|^2|^3\",\n                \"symfony/config\": \"^6.4|^7.0|^8.0\",\n                \"symfony/dependency-injection\": \"^6.4|^7.0|^8.0\",\n                \"symfony/event-dispatcher\": \"^6.4|^7.0|^8.0\",\n                \"symfony/http-foundation\": \"^6.4|^7.0|^8.0\",\n                \"symfony/http-kernel\": \"^6.4|^7.0|^8.0\",\n                \"symfony/lock\": \"^6.4|^7.0|^8.0\",\n                \"symfony/messenger\": \"^6.4|^7.0|^8.0\",\n                \"symfony/process\": \"^6.4|^7.0|^8.0\",\n                \"symfony/stopwatch\": \"^6.4|^7.0|^8.0\",\n                \"symfony/var-dumper\": \"^6.4|^7.0|^8.0\"\n            },\n            \"time\": \"2026-08-25T14:18:37+00:00\",\n            \"type\": \"library\",\n            \"installation-source\": \"dist\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Symfony\\\\Component\\\\Console\\\\\": \"\"\n                },\n                \"exclude-from-classmap\": [\n                    \"/Tests/\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Fabien Potencier\",\n                    \"email\": \"fabien@symfony.com\"\n                },\n                {\n                    \"name\": \"Symfony Community\",\n                    \"homepage\": \"https://symfony.com/contributors\"\n                }\n            ],\n            \"description\": \"Eases the creation of beautiful and testable command line interfaces\",\n            \"homepage\": \"https://symfony.com\",\n            \"keywords\": [\n                \"cli\",\n                \"command-line\",\n                \"console\",\n                \"terminal\"\n            ],\n            \"support\": {\n                \"source\": \"https://github.com/symfony/console/tree/v7.4.18\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://symfony.com/sponsor\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://github.com/fabpot\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://github.com/nicolas-grekas\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"install-path\": \"../symfony/console\"\n        },\n        {\n            \"name\": \"symfony/deprecation-contracts\",\n            \"version\": \"v3.7.1\",\n            \"version_normalized\": \"3.7.1.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/symfony/deprecation-contracts.git\",\n                \"reference\": \"f3202fa1b5097b0af062dc978b32ecf63404e31d\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/symfony/deprecation-contracts/zipball/f3202fa1b5097b0af062dc978b32ecf63404e31d\",\n                \"reference\": \"f3202fa1b5097b0af062dc978b32ecf63404e31d\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=8.1\"\n            },\n            \"time\": \"2026-06-05T06:23:12+00:00\",\n            \"type\": \"library\",\n            \"extra\": {\n                \"thanks\": {\n                    \"url\": \"https://github.com/symfony/contracts\",\n                    \"name\": \"symfony/contracts\"\n                },\n                \"branch-alias\": {\n                    \"dev-main\": \"3.7-dev\"\n                }\n            },\n            \"installation-source\": \"dist\",\n            \"autoload\": {\n                \"files\": [\n                    \"function.php\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Nicolas Grekas\",\n                    \"email\": \"p@tchwork.com\"\n                },\n                {\n                    \"name\": \"Symfony Community\",\n                    \"homepage\": \"https://symfony.com/contributors\"\n                }\n            ],\n            \"description\": \"A generic function and convention to trigger deprecation notices\",\n            \"homepage\": \"https://symfony.com\",\n            \"support\": {\n                \"source\": \"https://github.com/symfony/deprecation-contracts/tree/v3.7.1\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://symfony.com/sponsor\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://github.com/fabpot\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://github.com/nicolas-grekas\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"install-path\": \"../symfony/deprecation-contracts\"\n        },\n        {\n            \"name\": \"symfony/polyfill-ctype\",\n            \"version\": \"v1.37.0\",\n            \"version_normalized\": \"1.37.0.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/symfony/polyfill-ctype.git\",\n                \"reference\": \"141046a8f9477948ff284fa65be2095baafb94f2\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/symfony/polyfill-ctype/zipball/141046a8f9477948ff284fa65be2095baafb94f2\",\n                \"reference\": \"141046a8f9477948ff284fa65be2095baafb94f2\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=7.2\"\n            },\n            \"provide\": {\n                \"ext-ctype\": \"*\"\n            },\n            \"suggest\": {\n                \"ext-ctype\": \"For best performance\"\n            },\n            \"time\": \"2026-04-10T16:19:22+00:00\",\n            \"type\": \"library\",\n            \"extra\": {\n                \"thanks\": {\n                    \"url\": \"https://github.com/symfony/polyfill\",\n                    \"name\": \"symfony/polyfill\"\n                }\n            },\n            \"installation-source\": \"dist\",\n            \"autoload\": {\n                \"files\": [\n                    \"bootstrap.php\"\n                ],\n                \"psr-4\": {\n                    \"Symfony\\\\Polyfill\\\\Ctype\\\\\": \"\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Gert de Pagter\",\n                    \"email\": \"BackEndTea@gmail.com\"\n                },\n                {\n                    \"name\": \"Symfony Community\",\n                    \"homepage\": \"https://symfony.com/contributors\"\n                }\n            ],\n            \"description\": \"Symfony polyfill for ctype functions\",\n            \"homepage\": \"https://symfony.com\",\n            \"keywords\": [\n                \"compatibility\",\n                \"ctype\",\n                \"polyfill\",\n                \"portable\"\n            ],\n            \"support\": {\n                \"source\": \"https://github.com/symfony/polyfill-ctype/tree/v1.37.0\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://symfony.com/sponsor\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://github.com/fabpot\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://github.com/nicolas-grekas\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"install-path\": \"../symfony/polyfill-ctype\"\n        },\n        {\n            \"name\": \"symfony/polyfill-intl-grapheme\",\n            \"version\": \"v1.41.0\",\n            \"version_normalized\": \"1.41.0.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/symfony/polyfill-intl-grapheme.git\",\n                \"reference\": \"bb899c1db0aa8127dc3afe8cda4a67eb24915f8d\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/bb899c1db0aa8127dc3afe8cda4a67eb24915f8d\",\n                \"reference\": \"bb899c1db0aa8127dc3afe8cda4a67eb24915f8d\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=7.2\"\n            },\n            \"suggest\": {\n                \"ext-intl\": \"For best performance\"\n            },\n            \"time\": \"2026-07-28T08:25:59+00:00\",\n            \"type\": \"library\",\n            \"extra\": {\n                \"thanks\": {\n                    \"url\": \"https://github.com/symfony/polyfill\",\n                    \"name\": \"symfony/polyfill\"\n                }\n            },\n            \"installation-source\": \"dist\",\n            \"autoload\": {\n                \"files\": [\n                    \"bootstrap.php\"\n                ],\n                \"psr-4\": {\n                    \"Symfony\\\\Polyfill\\\\Intl\\\\Grapheme\\\\\": \"\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Nicolas Grekas\",\n                    \"email\": \"p@tchwork.com\"\n                },\n                {\n                    \"name\": \"Symfony Community\",\n                    \"homepage\": \"https://symfony.com/contributors\"\n                }\n            ],\n            \"description\": \"Symfony polyfill for intl's grapheme_* functions\",\n            \"homepage\": \"https://symfony.com\",\n            \"keywords\": [\n                \"compatibility\",\n                \"grapheme\",\n                \"intl\",\n                \"polyfill\",\n                \"portable\",\n                \"shim\"\n            ],\n            \"support\": {\n                \"source\": \"https://github.com/symfony/polyfill-intl-grapheme/tree/v1.41.0\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://symfony.com/sponsor\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://github.com/fabpot\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://github.com/nicolas-grekas\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"install-path\": \"../symfony/polyfill-intl-grapheme\"\n        },\n        {\n            \"name\": \"symfony/polyfill-intl-normalizer\",\n            \"version\": \"v1.42.0\",\n            \"version_normalized\": \"1.42.0.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/symfony/polyfill-intl-normalizer.git\",\n                \"reference\": \"aa20edea75bd9c48cfecc8360922e5a6e5c44502\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/aa20edea75bd9c48cfecc8360922e5a6e5c44502\",\n                \"reference\": \"aa20edea75bd9c48cfecc8360922e5a6e5c44502\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=7.2\"\n            },\n            \"suggest\": {\n                \"ext-intl\": \"For best performance\"\n            },\n            \"time\": \"2026-08-07T06:33:24+00:00\",\n            \"type\": \"library\",\n            \"extra\": {\n                \"thanks\": {\n                    \"url\": \"https://github.com/symfony/polyfill\",\n                    \"name\": \"symfony/polyfill\"\n                }\n            },\n            \"installation-source\": \"dist\",\n            \"autoload\": {\n                \"files\": [\n                    \"bootstrap.php\"\n                ],\n                \"psr-4\": {\n                    \"Symfony\\\\Polyfill\\\\Intl\\\\Normalizer\\\\\": \"\"\n                },\n                \"classmap\": [\n                    \"Resources/stubs\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Nicolas Grekas\",\n                    \"email\": \"p@tchwork.com\"\n                },\n                {\n                    \"name\": \"Symfony Community\",\n                    \"homepage\": \"https://symfony.com/contributors\"\n                }\n            ],\n            \"description\": \"Symfony polyfill for intl's Normalizer class and related functions\",\n            \"homepage\": \"https://symfony.com\",\n            \"keywords\": [\n                \"compatibility\",\n                \"intl\",\n                \"normalizer\",\n                \"polyfill\",\n                \"portable\",\n                \"shim\"\n            ],\n            \"support\": {\n                \"source\": \"https://github.com/symfony/polyfill-intl-normalizer/tree/v1.42.0\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://symfony.com/sponsor\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://github.com/fabpot\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://github.com/nicolas-grekas\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"install-path\": \"../symfony/polyfill-intl-normalizer\"\n        },\n        {\n            \"name\": \"symfony/polyfill-mbstring\",\n            \"version\": \"v1.38.2\",\n            \"version_normalized\": \"1.38.2.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/symfony/polyfill-mbstring.git\",\n                \"reference\": \"d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/symfony/polyfill-mbstring/zipball/d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6\",\n                \"reference\": \"d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"ext-iconv\": \"*\",\n                \"php\": \">=7.2\"\n            },\n            \"provide\": {\n                \"ext-mbstring\": \"*\"\n            },\n            \"suggest\": {\n                \"ext-mbstring\": \"For best performance\"\n            },\n            \"time\": \"2026-05-27T06:59:30+00:00\",\n            \"type\": \"library\",\n            \"extra\": {\n                \"thanks\": {\n                    \"url\": \"https://github.com/symfony/polyfill\",\n                    \"name\": \"symfony/polyfill\"\n                }\n            },\n            \"installation-source\": \"dist\",\n            \"autoload\": {\n                \"files\": [\n                    \"bootstrap.php\"\n                ],\n                \"psr-4\": {\n                    \"Symfony\\\\Polyfill\\\\Mbstring\\\\\": \"\"\n                }\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Nicolas Grekas\",\n                    \"email\": \"p@tchwork.com\"\n                },\n                {\n                    \"name\": \"Symfony Community\",\n                    \"homepage\": \"https://symfony.com/contributors\"\n                }\n            ],\n            \"description\": \"Symfony polyfill for the Mbstring extension\",\n            \"homepage\": \"https://symfony.com\",\n            \"keywords\": [\n                \"compatibility\",\n                \"mbstring\",\n                \"polyfill\",\n                \"portable\",\n                \"shim\"\n            ],\n            \"support\": {\n                \"source\": \"https://github.com/symfony/polyfill-mbstring/tree/v1.38.2\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://symfony.com/sponsor\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://github.com/fabpot\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://github.com/nicolas-grekas\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"install-path\": \"../symfony/polyfill-mbstring\"\n        },\n        {\n            \"name\": \"symfony/service-contracts\",\n            \"version\": \"v3.7.3\",\n            \"version_normalized\": \"3.7.3.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/symfony/service-contracts.git\",\n                \"reference\": \"15e6a07ec2a2c75ceb1b21dd98105ee8456d2257\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/symfony/service-contracts/zipball/15e6a07ec2a2c75ceb1b21dd98105ee8456d2257\",\n                \"reference\": \"15e6a07ec2a2c75ceb1b21dd98105ee8456d2257\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=8.1\",\n                \"psr/container\": \"^1.1|^2.0\",\n                \"symfony/deprecation-contracts\": \"^2.5|^3\"\n            },\n            \"conflict\": {\n                \"ext-psr\": \"<1.1|>=2\"\n            },\n            \"time\": \"2026-07-27T15:39:01+00:00\",\n            \"type\": \"library\",\n            \"extra\": {\n                \"thanks\": {\n                    \"url\": \"https://github.com/symfony/contracts\",\n                    \"name\": \"symfony/contracts\"\n                },\n                \"branch-alias\": {\n                    \"dev-main\": \"3.7-dev\"\n                }\n            },\n            \"installation-source\": \"dist\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Symfony\\\\Contracts\\\\Service\\\\\": \"\"\n                },\n                \"exclude-from-classmap\": [\n                    \"/Test/\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Nicolas Grekas\",\n                    \"email\": \"p@tchwork.com\"\n                },\n                {\n                    \"name\": \"Symfony Community\",\n                    \"homepage\": \"https://symfony.com/contributors\"\n                }\n            ],\n            \"description\": \"Generic abstractions related to writing services\",\n            \"homepage\": \"https://symfony.com\",\n            \"keywords\": [\n                \"abstractions\",\n                \"contracts\",\n                \"decoupling\",\n                \"interfaces\",\n                \"interoperability\",\n                \"standards\"\n            ],\n            \"support\": {\n                \"source\": \"https://github.com/symfony/service-contracts/tree/v3.7.3\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://symfony.com/sponsor\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://github.com/fabpot\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://github.com/nicolas-grekas\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"install-path\": \"../symfony/service-contracts\"\n        },\n        {\n            \"name\": \"symfony/string\",\n            \"version\": \"v7.4.15\",\n            \"version_normalized\": \"7.4.15.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/symfony/string.git\",\n                \"reference\": \"e394af32256bf9e7bf80849d95e589167c10097b\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/symfony/string/zipball/e394af32256bf9e7bf80849d95e589167c10097b\",\n                \"reference\": \"e394af32256bf9e7bf80849d95e589167c10097b\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=8.2\",\n                \"symfony/deprecation-contracts\": \"^2.5|^3.0\",\n                \"symfony/polyfill-ctype\": \"~1.8\",\n                \"symfony/polyfill-intl-grapheme\": \"~1.33\",\n                \"symfony/polyfill-intl-normalizer\": \"~1.0\",\n                \"symfony/polyfill-mbstring\": \"~1.0\"\n            },\n            \"conflict\": {\n                \"symfony/translation-contracts\": \"<2.5\"\n            },\n            \"require-dev\": {\n                \"symfony/emoji\": \"^7.1|^8.0\",\n                \"symfony/http-client\": \"^6.4|^7.0|^8.0\",\n                \"symfony/intl\": \"^6.4|^7.0|^8.0\",\n                \"symfony/translation-contracts\": \"^2.5|^3.0\",\n                \"symfony/var-exporter\": \"^6.4|^7.0|^8.0\"\n            },\n            \"time\": \"2026-07-28T07:33:02+00:00\",\n            \"type\": \"library\",\n            \"installation-source\": \"dist\",\n            \"autoload\": {\n                \"files\": [\n                    \"Resources/functions.php\"\n                ],\n                \"psr-4\": {\n                    \"Symfony\\\\Component\\\\String\\\\\": \"\"\n                },\n                \"exclude-from-classmap\": [\n                    \"/Tests/\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Nicolas Grekas\",\n                    \"email\": \"p@tchwork.com\"\n                },\n                {\n                    \"name\": \"Symfony Community\",\n                    \"homepage\": \"https://symfony.com/contributors\"\n                }\n            ],\n            \"description\": \"Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way\",\n            \"homepage\": \"https://symfony.com\",\n            \"keywords\": [\n                \"grapheme\",\n                \"i18n\",\n                \"string\",\n                \"unicode\",\n                \"utf-8\",\n                \"utf8\"\n            ],\n            \"support\": {\n                \"source\": \"https://github.com/symfony/string/tree/v7.4.15\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://symfony.com/sponsor\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://github.com/fabpot\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://github.com/nicolas-grekas\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"install-path\": \"../symfony/string\"\n        },\n        {\n            \"name\": \"symfony/yaml\",\n            \"version\": \"v7.4.18\",\n            \"version_normalized\": \"7.4.18.0\",\n            \"source\": {\n                \"type\": \"git\",\n                \"url\": \"https://github.com/symfony/yaml.git\",\n                \"reference\": \"4cef939e55b8a21c5780418de0d98ab00d0736e1\"\n            },\n            \"dist\": {\n                \"type\": \"zip\",\n                \"url\": \"https://api.github.com/repos/symfony/yaml/zipball/4cef939e55b8a21c5780418de0d98ab00d0736e1\",\n                \"reference\": \"4cef939e55b8a21c5780418de0d98ab00d0736e1\",\n                \"shasum\": \"\"\n            },\n            \"require\": {\n                \"php\": \">=8.2\",\n                \"symfony/deprecation-contracts\": \"^2.5|^3\",\n                \"symfony/polyfill-ctype\": \"^1.8\"\n            },\n            \"conflict\": {\n                \"symfony/console\": \"<6.4\"\n            },\n            \"require-dev\": {\n                \"symfony/console\": \"^6.4|^7.0|^8.0\"\n            },\n            \"time\": \"2026-08-30T00:47:26+00:00\",\n            \"bin\": [\n                \"Resources/bin/yaml-lint\"\n            ],\n            \"type\": \"library\",\n            \"installation-source\": \"dist\",\n            \"autoload\": {\n                \"psr-4\": {\n                    \"Symfony\\\\Component\\\\Yaml\\\\\": \"\"\n                },\n                \"exclude-from-classmap\": [\n                    \"/Tests/\"\n                ]\n            },\n            \"notification-url\": \"https://packagist.org/downloads/\",\n            \"license\": [\n                \"MIT\"\n            ],\n            \"authors\": [\n                {\n                    \"name\": \"Fabien Potencier\",\n                    \"email\": \"fabien@symfony.com\"\n                },\n                {\n                    \"name\": \"Symfony Community\",\n                    \"homepage\": \"https://symfony.com/contributors\"\n                }\n            ],\n            \"description\": \"Loads and dumps YAML files\",\n            \"homepage\": \"https://symfony.com\",\n            \"support\": {\n                \"source\": \"https://github.com/symfony/yaml/tree/v7.4.18\"\n            },\n            \"funding\": [\n                {\n                    \"url\": \"https://symfony.com/sponsor\",\n                    \"type\": \"custom\"\n                },\n                {\n                    \"url\": \"https://github.com/fabpot\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://github.com/nicolas-grekas\",\n                    \"type\": \"github\"\n                },\n                {\n                    \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n                    \"type\": \"tidelift\"\n                }\n            ],\n            \"install-path\": \"../symfony/yaml\"\n        }\n    ],\n    \"dev\": false,\n    \"dev-package-names\": []\n}\n","vendor/composer/installed.php":"<?php return array(\n    'root' => array(\n        'name' => 'goktugcy/worker-safety',\n        'pretty_version' => 'dev-main',\n        'version' => 'dev-main',\n        'reference' => 'c2f44958bfbdd6ab2affc677c47c980a2cf6d5ca',\n        'type' => 'library',\n        'install_path' => __DIR__ . '/../../',\n        'aliases' => array(\n            0 => '1.x-dev',\n        ),\n        'dev' => false,\n    ),\n    'versions' => array(\n        'goktugcy/worker-safety' => array(\n            'pretty_version' => 'dev-main',\n            'version' => 'dev-main',\n            'reference' => 'c2f44958bfbdd6ab2affc677c47c980a2cf6d5ca',\n            'type' => 'library',\n            'install_path' => __DIR__ . '/../../',\n            'aliases' => array(\n                0 => '1.x-dev',\n            ),\n            'dev_requirement' => false,\n        ),\n        'nikic/php-parser' => array(\n            'pretty_version' => 'v5.8.0',\n            'version' => '5.8.0.0',\n            'reference' => '044a6a392ff8ad0d61f14370a5fbbd0a0107152f',\n            'type' => 'library',\n            'install_path' => __DIR__ . '/../nikic/php-parser',\n            'aliases' => array(),\n            'dev_requirement' => false,\n        ),\n        'psr/container' => array(\n            'pretty_version' => '2.0.2',\n            'version' => '2.0.2.0',\n            'reference' => 'c71ecc56dfe541dbd90c5360474fbc405f8d5963',\n            'type' => 'library',\n            'install_path' => __DIR__ . '/../psr/container',\n            'aliases' => array(),\n            'dev_requirement' => false,\n        ),\n        'psr/log-implementation' => array(\n            'dev_requirement' => false,\n            'provided' => array(\n                0 => '1.0|2.0|3.0',\n            ),\n        ),\n        'symfony/console' => array(\n            'pretty_version' => 'v7.4.18',\n            'version' => '7.4.18.0',\n            'reference' => '23d6f88a29f6d0eac45bd77d70307adf83ba7ab0',\n            'type' => 'library',\n            'install_path' => __DIR__ . '/../symfony/console',\n            'aliases' => array(),\n            'dev_requirement' => false,\n        ),\n        'symfony/deprecation-contracts' => array(\n            'pretty_version' => 'v3.7.1',\n            'version' => '3.7.1.0',\n            'reference' => 'f3202fa1b5097b0af062dc978b32ecf63404e31d',\n            'type' => 'library',\n            'install_path' => __DIR__ . '/../symfony/deprecation-contracts',\n            'aliases' => array(),\n            'dev_requirement' => false,\n        ),\n        'symfony/polyfill-ctype' => array(\n            'pretty_version' => 'v1.37.0',\n            'version' => '1.37.0.0',\n            'reference' => '141046a8f9477948ff284fa65be2095baafb94f2',\n            'type' => 'library',\n            'install_path' => __DIR__ . '/../symfony/polyfill-ctype',\n            'aliases' => array(),\n            'dev_requirement' => false,\n        ),\n        'symfony/polyfill-intl-grapheme' => array(\n            'pretty_version' => 'v1.41.0',\n            'version' => '1.41.0.0',\n            'reference' => 'bb899c1db0aa8127dc3afe8cda4a67eb24915f8d',\n            'type' => 'library',\n            'install_path' => __DIR__ . '/../symfony/polyfill-intl-grapheme',\n            'aliases' => array(),\n            'dev_requirement' => false,\n        ),\n        'symfony/polyfill-intl-normalizer' => array(\n            'pretty_version' => 'v1.42.0',\n            'version' => '1.42.0.0',\n            'reference' => 'aa20edea75bd9c48cfecc8360922e5a6e5c44502',\n            'type' => 'library',\n            'install_path' => __DIR__ . '/../symfony/polyfill-intl-normalizer',\n            'aliases' => array(),\n            'dev_requirement' => false,\n        ),\n        'symfony/polyfill-mbstring' => array(\n            'pretty_version' => 'v1.38.2',\n            'version' => '1.38.2.0',\n            'reference' => 'd3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6',\n            'type' => 'library',\n            'install_path' => __DIR__ . '/../symfony/polyfill-mbstring',\n            'aliases' => array(),\n            'dev_requirement' => false,\n        ),\n        'symfony/service-contracts' => array(\n            'pretty_version' => 'v3.7.3',\n            'version' => '3.7.3.0',\n            'reference' => '15e6a07ec2a2c75ceb1b21dd98105ee8456d2257',\n            'type' => 'library',\n            'install_path' => __DIR__ . '/../symfony/service-contracts',\n            'aliases' => array(),\n            'dev_requirement' => false,\n        ),\n        'symfony/string' => array(\n            'pretty_version' => 'v7.4.15',\n            'version' => '7.4.15.0',\n            'reference' => 'e394af32256bf9e7bf80849d95e589167c10097b',\n            'type' => 'library',\n            'install_path' => __DIR__ . '/../symfony/string',\n            'aliases' => array(),\n            'dev_requirement' => false,\n        ),\n        'symfony/yaml' => array(\n            'pretty_version' => 'v7.4.18',\n            'version' => '7.4.18.0',\n            'reference' => '4cef939e55b8a21c5780418de0d98ab00d0736e1',\n            'type' => 'library',\n            'install_path' => __DIR__ . '/../symfony/yaml',\n            'aliases' => array(),\n            'dev_requirement' => false,\n        ),\n    ),\n);\n","vendor/composer/platform_check.php":"<?php\n\n// platform_check.php @generated by Composer\n\n$issues = array();\n\nif (!(PHP_VERSION_ID >= 80200)) {\n    $issues[] = 'Your Composer dependencies require a PHP version \">= 8.2.0\". You are running ' . PHP_VERSION . '.';\n}\n\nif ($issues) {\n    if (!headers_sent()) {\n        header('HTTP/1.1 500 Internal Server Error');\n    }\n    if (!ini_get('display_errors')) {\n        if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') {\n            fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL);\n        } elseif (!headers_sent()) {\n            echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL;\n        }\n    }\n    throw new \\RuntimeException(\n        'Composer detected issues in your platform: ' . implode(' ', $issues)\n    );\n}\n","vendor/nikic/php-parser/LICENSE":"BSD 3-Clause License\n\nCopyright (c) 2011, Nikita Popov\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n\n3. Neither the name of the copyright holder nor the names of its\n   contributors may be used to endorse or promote products derived from\n   this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n","vendor/nikic/php-parser/README.md":"PHP Parser\n==========\n\n[![Coverage Status](https://coveralls.io/repos/github/nikic/PHP-Parser/badge.svg?branch=master)](https://coveralls.io/github/nikic/PHP-Parser?branch=master)\n\nThis is a PHP parser written in PHP. Its purpose is to simplify static code analysis and\nmanipulation.\n\n[**Documentation for version 5.x**][doc_master] (current; for running on PHP >= 7.4; for parsing PHP 7.0 to PHP 8.4, with limited support for parsing PHP 5.x).\n\n[Documentation for version 4.x][doc_4_x] (supported; for running on PHP >= 7.0; for parsing PHP 5.2 to PHP 8.3).\n\nFeatures\n--------\n\nThe main features provided by this library are:\n\n * Parsing PHP 7, and PHP 8 code into an abstract syntax tree (AST).\n   * Invalid code can be parsed into a partial AST.\n   * The AST contains accurate location information.\n * Dumping the AST in human-readable form.\n * Converting an AST back to PHP code.\n   * Formatting can be preserved for partially changed ASTs.\n * Infrastructure to traverse and modify ASTs.\n * Resolution of namespaced names.\n * Evaluation of constant expressions.\n * Builders to simplify AST construction for code generation.\n * Converting an AST into JSON and back.\n\nQuick Start\n-----------\n\nInstall the library using [composer](https://getcomposer.org):\n\n    php composer.phar require nikic/php-parser\n\nParse some PHP code into an AST and dump the result in human-readable form:\n\n```php\n<?php\nuse PhpParser\\Error;\nuse PhpParser\\NodeDumper;\nuse PhpParser\\ParserFactory;\n\n$code = <<<'CODE'\n<?php\n\nfunction test($foo)\n{\n    var_dump($foo);\n}\nCODE;\n\n$parser = (new ParserFactory())->createForNewestSupportedVersion();\ntry {\n    $ast = $parser->parse($code);\n} catch (Error $error) {\n    echo \"Parse error: {$error->getMessage()}\\n\";\n    return;\n}\n\n$dumper = new NodeDumper;\necho $dumper->dump($ast) . \"\\n\";\n```\n\nThis dumps an AST looking something like this:\n\n```\narray(\n    0: Stmt_Function(\n        attrGroups: array(\n        )\n        byRef: false\n        name: Identifier(\n            name: test\n        )\n        params: array(\n            0: Param(\n                attrGroups: array(\n                )\n                flags: 0\n                type: null\n                byRef: false\n                variadic: false\n                var: Expr_Variable(\n                    name: foo\n                )\n                default: null\n            )\n        )\n        returnType: null\n        stmts: array(\n            0: Stmt_Expression(\n                expr: Expr_FuncCall(\n                    name: Name(\n                        name: var_dump\n                    )\n                    args: array(\n                        0: Arg(\n                            name: null\n                            value: Expr_Variable(\n                                name: foo\n                            )\n                            byRef: false\n                            unpack: false\n                        )\n                    )\n                )\n            )\n        )\n    )\n)\n```\n\nLet's traverse the AST and perform some kind of modification. For example, drop all function bodies:\n\n```php\nuse PhpParser\\Node;\nuse PhpParser\\Node\\Stmt\\Function_;\nuse PhpParser\\NodeTraverser;\nuse PhpParser\\NodeVisitorAbstract;\n\n$traverser = new NodeTraverser();\n$traverser->addVisitor(new class extends NodeVisitorAbstract {\n    public function enterNode(Node $node) {\n        if ($node instanceof Function_) {\n            // Clean out the function body\n            $node->stmts = [];\n        }\n    }\n});\n\n$ast = $traverser->traverse($ast);\necho $dumper->dump($ast) . \"\\n\";\n```\n\nThis gives us an AST where the `Function_::$stmts` are empty:\n\n```\narray(\n    0: Stmt_Function(\n        attrGroups: array(\n        )\n        byRef: false\n        name: Identifier(\n            name: test\n        )\n        params: array(\n            0: Param(\n                attrGroups: array(\n                )\n                type: null\n                byRef: false\n                variadic: false\n                var: Expr_Variable(\n                    name: foo\n                )\n                default: null\n            )\n        )\n        returnType: null\n        stmts: array(\n        )\n    )\n)\n```\n\nFinally, we can convert the new AST back to PHP code:\n\n```php\nuse PhpParser\\PrettyPrinter;\n\n$prettyPrinter = new PrettyPrinter\\Standard;\necho $prettyPrinter->prettyPrintFile($ast);\n```\n\nThis gives us our original code, minus the `var_dump()` call inside the function:\n\n```php\n<?php\n\nfunction test($foo)\n{\n}\n```\n\nFor a more comprehensive introduction, see the documentation.\n\nDocumentation\n-------------\n\n 1. [Introduction](doc/0_Introduction.markdown)\n 2. [Usage of basic components](doc/2_Usage_of_basic_components.markdown)\n\nComponent documentation:\n\n * [Walking the AST](doc/component/Walking_the_AST.markdown)\n   * Node visitors\n   * Modifying the AST from a visitor\n   * Short-circuiting traversals\n   * Interleaved visitors\n   * Simple node finding API\n   * Parent and sibling references\n * [Name resolution](doc/component/Name_resolution.markdown)\n   * Name resolver options\n   * Name resolution context\n * [Pretty printing](doc/component/Pretty_printing.markdown)\n   * Converting AST back to PHP code\n   * Customizing formatting\n   * Formatting-preserving code transformations\n * [AST builders](doc/component/AST_builders.markdown)\n   * Fluent builders for AST nodes\n * [Lexer](doc/component/Lexer.markdown)\n   * Emulation\n   * Tokens, positions and attributes\n * [Error handling](doc/component/Error_handling.markdown)\n   * Column information for errors\n   * Error recovery (parsing of syntactically incorrect code)\n * [Constant expression evaluation](doc/component/Constant_expression_evaluation.markdown)\n   * Evaluating constant/property/etc initializers\n   * Handling errors and unsupported expressions\n * [JSON representation](doc/component/JSON_representation.markdown)\n   * JSON encoding and decoding of ASTs\n * [Performance](doc/component/Performance.markdown)\n   * Disabling Xdebug\n   * Reusing objects\n   * Garbage collection impact\n * [Frequently asked questions](doc/component/FAQ.markdown)\n   * Parent and sibling references\n\n [doc_3_x]: https://github.com/nikic/PHP-Parser/tree/3.x/doc\n [doc_4_x]: https://github.com/nikic/PHP-Parser/tree/4.x/doc\n [doc_master]: https://github.com/nikic/PHP-Parser/tree/master/doc\n","vendor/nikic/php-parser/bin/php-parse":"#!/usr/bin/env php\n<?php\n\nforeach ([__DIR__ . '/../../../autoload.php', __DIR__ . '/../vendor/autoload.php'] as $file) {\n    if (file_exists($file)) {\n        require $file;\n        break;\n    }\n}\n\nini_set('xdebug.max_nesting_level', 3000);\n\n// Disable Xdebug var_dump() output truncation\nini_set('xdebug.var_display_max_children', -1);\nini_set('xdebug.var_display_max_data', -1);\nini_set('xdebug.var_display_max_depth', -1);\n\nlist($operations, $files, $attributes) = parseArgs($argv);\n\n/* Dump nodes by default */\nif (empty($operations)) {\n    $operations[] = 'dump';\n}\n\nif (empty($files)) {\n    showHelp(\"Must specify at least one file.\");\n}\n\n$parser = (new PhpParser\\ParserFactory())->createForVersion($attributes['version']);\n$dumper = new PhpParser\\NodeDumper([\n    'dumpComments' => true,\n    'dumpPositions' => $attributes['with-positions'],\n]);\n$prettyPrinter = new PhpParser\\PrettyPrinter\\Standard;\n\n$traverser = new PhpParser\\NodeTraverser();\n$traverser->addVisitor(new PhpParser\\NodeVisitor\\NameResolver);\n\nforeach ($files as $file) {\n    if ($file === '-') {\n        $code = file_get_contents('php://stdin');\n        fwrite(STDERR, \"====> Stdin:\\n\");\n    } else if (strpos($file, '<?php') === 0) {\n        $code = $file;\n        fwrite(STDERR, \"====> Code $code\\n\");\n    } else {\n        if (!file_exists($file)) {\n            fwrite(STDERR, \"File $file does not exist.\\n\");\n            exit(1);\n        }\n\n        $code = file_get_contents($file);\n        fwrite(STDERR, \"====> File $file:\\n\");\n    }\n\n    if ($attributes['with-recovery']) {\n        $errorHandler = new PhpParser\\ErrorHandler\\Collecting;\n        $stmts = $parser->parse($code, $errorHandler);\n        foreach ($errorHandler->getErrors() as $error) {\n            $message = formatErrorMessage($error, $code, $attributes['with-column-info']);\n            fwrite(STDERR, $message . \"\\n\");\n        }\n        if (null === $stmts) {\n            continue;\n        }\n    } else {\n        try {\n            $stmts = $parser->parse($code);\n        } catch (PhpParser\\Error $error) {\n            $message = formatErrorMessage($error, $code, $attributes['with-column-info']);\n            fwrite(STDERR, $message . \"\\n\");\n            exit(1);\n        }\n    }\n\n    foreach ($operations as $operation) {\n        if ('dump' === $operation) {\n            fwrite(STDERR, \"==> Node dump:\\n\");\n            echo $dumper->dump($stmts, $code), \"\\n\";\n        } elseif ('pretty-print' === $operation) {\n            fwrite(STDERR, \"==> Pretty print:\\n\");\n            echo $prettyPrinter->prettyPrintFile($stmts), \"\\n\";\n        } elseif ('json-dump' === $operation) {\n            fwrite(STDERR, \"==> JSON dump:\\n\");\n            echo json_encode($stmts, JSON_PRETTY_PRINT), \"\\n\";\n        } elseif ('var-dump' === $operation) {\n            fwrite(STDERR, \"==> var_dump():\\n\");\n            var_dump($stmts);\n        } elseif ('resolve-names' === $operation) {\n            fwrite(STDERR, \"==> Resolved names.\\n\");\n            $stmts = $traverser->traverse($stmts);\n        }\n    }\n}\n\nfunction formatErrorMessage(PhpParser\\Error $e, $code, $withColumnInfo) {\n    if ($withColumnInfo && $e->hasColumnInfo()) {\n        return $e->getMessageWithColumnInfo($code);\n    } else {\n        return $e->getMessage();\n    }\n}\n\nfunction showHelp($error = '') {\n    if ($error) {\n        fwrite(STDERR, $error . \"\\n\\n\");\n    }\n    fwrite($error ? STDERR : STDOUT, <<<'OUTPUT'\nUsage: php-parse [operations] file1.php [file2.php ...]\n   or: php-parse [operations] \"<?php code\"\nTurn PHP source code into an abstract syntax tree.\n\nOperations is a list of the following options (--dump by default):\n\n    -d, --dump              Dump nodes using NodeDumper\n    -p, --pretty-print      Pretty print file using PrettyPrinter\\Standard\n    -j, --json-dump         Print json_encode() result\n        --var-dump          var_dump() nodes (for exact structure)\n    -N, --resolve-names     Resolve names using NodeVisitor\\NameResolver\n    -c, --with-column-info  Show column-numbers for errors (if available)\n    -P, --with-positions    Show positions in node dumps\n    -r, --with-recovery     Use parsing with error recovery\n        --version=VERSION   Target specific PHP version (default: newest)\n    -h, --help              Display this page\n\nExample:\n    php-parse -d -p -N -d file.php\n\n    Dumps nodes, pretty prints them, then resolves names and dumps them again.\n\n\nOUTPUT\n    );\n    exit($error ? 1 : 0);\n}\n\nfunction parseArgs($args) {\n    $operations = [];\n    $files = [];\n    $attributes = [\n        'with-column-info' => false,\n        'with-positions' => false,\n        'with-recovery' => false,\n        'version' => PhpParser\\PhpVersion::getNewestSupported(),\n    ];\n\n    array_shift($args);\n    $parseOptions = true;\n    foreach ($args as $arg) {\n        if (!$parseOptions) {\n            $files[] = $arg;\n            continue;\n        }\n\n        switch ($arg) {\n            case '--dump':\n            case '-d':\n                $operations[] = 'dump';\n                break;\n            case '--pretty-print':\n            case '-p':\n                $operations[] = 'pretty-print';\n                break;\n            case '--json-dump':\n            case '-j':\n                $operations[] = 'json-dump';\n                break;\n            case '--var-dump':\n                $operations[] = 'var-dump';\n                break;\n            case '--resolve-names':\n            case '-N':\n                $operations[] = 'resolve-names';\n                break;\n            case '--with-column-info':\n            case '-c':\n                $attributes['with-column-info'] = true;\n                break;\n            case '--with-positions':\n            case '-P':\n                $attributes['with-positions'] = true;\n                break;\n            case '--with-recovery':\n            case '-r':\n                $attributes['with-recovery'] = true;\n                break;\n            case '--help':\n            case '-h':\n                showHelp();\n                break;\n            case '--':\n                $parseOptions = false;\n                break;\n            default:\n                if (preg_match('/^--version=(.*)$/', $arg, $matches)) {\n                    $attributes['version'] = PhpParser\\PhpVersion::fromString($matches[1]);\n                } elseif ($arg[0] === '-' && \\strlen($arg[0]) > 1) {\n                    showHelp(\"Invalid operation $arg.\");\n                } else {\n                    $files[] = $arg;\n                }\n        }\n    }\n\n    return [$operations, $files, $attributes];\n}\n","vendor/nikic/php-parser/composer.json":"{\n    \"name\": \"nikic/php-parser\",\n    \"type\": \"library\",\n    \"description\": \"A PHP parser written in PHP\",\n    \"keywords\": [\n        \"php\",\n        \"parser\"\n    ],\n    \"license\": \"BSD-3-Clause\",\n    \"authors\": [\n        {\n            \"name\": \"Nikita Popov\"\n        }\n    ],\n    \"require\": {\n        \"php\": \">=7.4\",\n        \"ext-tokenizer\": \"*\",\n        \"ext-json\": \"*\"\n    },\n    \"require-dev\": {\n        \"phpunit/phpunit\": \"^9.0\",\n        \"ircmaxell/php-yacc\": \"^0.0.7\"\n    },\n    \"extra\": {\n        \"branch-alias\": {\n            \"dev-master\": \"5.x-dev\"\n        }\n    },\n    \"autoload\": {\n        \"psr-4\": {\n            \"PhpParser\\\\\": \"lib/PhpParser\"\n        }\n    },\n    \"autoload-dev\": {\n        \"psr-4\": {\n            \"PhpParser\\\\\": \"test/PhpParser/\"\n        }\n    },\n    \"bin\": [\n        \"bin/php-parse\"\n    ]\n}\n","vendor/nikic/php-parser/lib/PhpParser/Builder/ClassConst.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace PhpParser\\Builder;\n\nuse PhpParser;\nuse PhpParser\\BuilderHelpers;\nuse PhpParser\\Modifiers;\nuse PhpParser\\Node;\nuse PhpParser\\Node\\Const_;\nuse PhpParser\\Node\\Identifier;\nuse PhpParser\\Node\\Stmt;\n\nclass ClassConst implements PhpParser\\Builder {\n    protected int $flags = 0;\n    /** @var array<string, mixed> */\n    protected array $attributes = [];\n    /** @var list<Const_> */\n    protected array $constants = [];\n\n    /** @var list<Node\\AttributeGroup> */\n    protected array $attributeGroups = [];\n    /** @var Identifier|Node\\Name|Node\\ComplexType|null */\n    protected ?Node $type = null;\n\n    /**\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     */\n    public function __construct($name, $value) {\n        $this->constants = [new Const_($name, BuilderHelpers::normalizeValue($value))];\n    }\n\n    /**\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     */\n    public function addConst($name, $value) {\n        $this->constants[] = new Const_($name, BuilderHelpers::normalizeValue($value));\n\n        return $this;\n    }\n\n    /**\n     * Makes the constant public.\n     *\n     * @return $this The builder instance (for fluid interface)\n     */\n    public function makePublic() {\n        $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PUBLIC);\n\n        return $this;\n    }\n\n    /**\n     * Makes the constant protected.\n     *\n     * @return $this The builder instance (for fluid interface)\n     */\n    public function makeProtected() {\n        $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PROTECTED);\n\n        return $this;\n    }\n\n    /**\n     * Makes the constant private.\n     *\n     * @return $this The builder instance (for fluid interface)\n     */\n    public function makePrivate() {\n        $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PRIVATE);\n\n        return $this;\n    }\n\n    /**\n     * Makes the constant final.\n     *\n     * @return $this The builder instance (for fluid interface)\n     */\n    public function makeFinal() {\n        $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::FINAL);\n\n        return $this;\n    }\n\n    /**\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     */\n    public function setDocComment($docComment) {\n        $this->attributes = [\n            'comments' => [BuilderHelpers::normalizeDocComment($docComment)]\n        ];\n\n        return $this;\n    }\n\n    /**\n     * Adds an attribute group.\n     *\n     * @param Node\\Attribute|Node\\AttributeGroup $attribute\n     *\n     * @return $this The builder instance (for fluid interface)\n     */\n    public function addAttribute($attribute) {\n        $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute);\n\n        return $this;\n    }\n\n    /**\n     * Sets the constant type.\n     *\n     * @param string|Node\\Name|Identifier|Node\\ComplexType $type\n     *\n     * @return $this\n     */\n    public function setType($type) {\n        $this->type = BuilderHelpers::normalizeType($type);\n\n        return $this;\n    }\n\n    /**\n     * Returns the built class node.\n     *\n     * @return Stmt\\ClassConst The built constant node\n     */\n    public function getNode(): PhpParser\\Node {\n        return new Stmt\\ClassConst(\n            $this->constants,\n            $this->flags,\n            $this->attributes,\n            $this->attributeGroups,\n            $this->type\n        );\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Builder/Class_.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Builder;\n\nuse PhpParser;\nuse PhpParser\\BuilderHelpers;\nuse PhpParser\\Modifiers;\nuse PhpParser\\Node;\nuse PhpParser\\Node\\Name;\nuse PhpParser\\Node\\Stmt;\n\nclass Class_ extends Declaration {\n    protected string $name;\n    protected ?Name $extends = null;\n    /** @var list<Name> */\n    protected array $implements = [];\n    protected int $flags = 0;\n    /** @var list<Stmt\\TraitUse> */\n    protected array $uses = [];\n    /** @var list<Stmt\\ClassConst> */\n    protected array $constants = [];\n    /** @var list<Stmt\\Property> */\n    protected array $properties = [];\n    /** @var list<Stmt\\ClassMethod> */\n    protected array $methods = [];\n    /** @var list<Node\\AttributeGroup> */\n    protected array $attributeGroups = [];\n\n    /**\n     * Creates a class builder.\n     *\n     * @param string $name Name of the class\n     */\n    public function __construct(string $name) {\n        $this->name = $name;\n    }\n\n    /**\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     */\n    public function extend($class) {\n        $this->extends = BuilderHelpers::normalizeName($class);\n\n        return $this;\n    }\n\n    /**\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     */\n    public function implement(...$interfaces) {\n        foreach ($interfaces as $interface) {\n            $this->implements[] = BuilderHelpers::normalizeName($interface);\n        }\n\n        return $this;\n    }\n\n    /**\n     * Makes the class abstract.\n     *\n     * @return $this The builder instance (for fluid interface)\n     */\n    public function makeAbstract() {\n        $this->flags = BuilderHelpers::addClassModifier($this->flags, Modifiers::ABSTRACT);\n\n        return $this;\n    }\n\n    /**\n     * Makes the class final.\n     *\n     * @return $this The builder instance (for fluid interface)\n     */\n    public function makeFinal() {\n        $this->flags = BuilderHelpers::addClassModifier($this->flags, Modifiers::FINAL);\n\n        return $this;\n    }\n\n    /**\n     * Makes the class readonly.\n     *\n     * @return $this The builder instance (for fluid interface)\n     */\n    public function makeReadonly() {\n        $this->flags = BuilderHelpers::addClassModifier($this->flags, Modifiers::READONLY);\n\n        return $this;\n    }\n\n    /**\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     */\n    public function addStmt($stmt) {\n        $stmt = BuilderHelpers::normalizeNode($stmt);\n\n        if ($stmt instanceof Stmt\\Property) {\n            $this->properties[] = $stmt;\n        } elseif ($stmt instanceof Stmt\\ClassMethod) {\n            $this->methods[] = $stmt;\n        } elseif ($stmt instanceof Stmt\\TraitUse) {\n            $this->uses[] = $stmt;\n        } elseif ($stmt instanceof Stmt\\ClassConst) {\n            $this->constants[] = $stmt;\n        } else {\n            throw new \\LogicException(sprintf('Unexpected node of type \"%s\"', $stmt->getType()));\n        }\n\n        return $this;\n    }\n\n    /**\n     * Adds an attribute group.\n     *\n     * @param Node\\Attribute|Node\\AttributeGroup $attribute\n     *\n     * @return $this The builder instance (for fluid interface)\n     */\n    public function addAttribute($attribute) {\n        $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute);\n\n        return $this;\n    }\n\n    /**\n     * Returns the built class node.\n     *\n     * @return Stmt\\Class_ The built class node\n     */\n    public function getNode(): PhpParser\\Node {\n        return new Stmt\\Class_($this->name, [\n            'flags' => $this->flags,\n            'extends' => $this->extends,\n            'implements' => $this->implements,\n            'stmts' => array_merge($this->uses, $this->constants, $this->properties, $this->methods),\n            'attrGroups' => $this->attributeGroups,\n        ], $this->attributes);\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Builder/Declaration.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Builder;\n\nuse PhpParser;\nuse PhpParser\\BuilderHelpers;\n\nabstract class Declaration implements PhpParser\\Builder {\n    /** @var array<string, mixed> */\n    protected array $attributes = [];\n\n    /**\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     */\n    abstract public function addStmt($stmt);\n\n    /**\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     */\n    public function addStmts(array $stmts) {\n        foreach ($stmts as $stmt) {\n            $this->addStmt($stmt);\n        }\n\n        return $this;\n    }\n\n    /**\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     */\n    public function setDocComment($docComment) {\n        $this->attributes['comments'] = [\n            BuilderHelpers::normalizeDocComment($docComment)\n        ];\n\n        return $this;\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Builder/EnumCase.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace PhpParser\\Builder;\n\nuse PhpParser;\nuse PhpParser\\BuilderHelpers;\nuse PhpParser\\Node;\nuse PhpParser\\Node\\Identifier;\nuse PhpParser\\Node\\Stmt;\n\nclass EnumCase implements PhpParser\\Builder {\n    /** @var Identifier|string */\n    protected $name;\n    protected ?Node\\Expr $value = null;\n    /** @var array<string, mixed> */\n    protected array $attributes = [];\n\n    /** @var list<Node\\AttributeGroup> */\n    protected array $attributeGroups = [];\n\n    /**\n     * Creates an enum case builder.\n     *\n     * @param string|Identifier $name Name\n     */\n    public function __construct($name) {\n        $this->name = $name;\n    }\n\n    /**\n     * Sets the value.\n     *\n     * @param Node\\Expr|string|int $value\n     *\n     * @return $this\n     */\n    public function setValue($value) {\n        $this->value = BuilderHelpers::normalizeValue($value);\n\n        return $this;\n    }\n\n    /**\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     */\n    public function setDocComment($docComment) {\n        $this->attributes = [\n            'comments' => [BuilderHelpers::normalizeDocComment($docComment)]\n        ];\n\n        return $this;\n    }\n\n    /**\n     * Adds an attribute group.\n     *\n     * @param Node\\Attribute|Node\\AttributeGroup $attribute\n     *\n     * @return $this The builder instance (for fluid interface)\n     */\n    public function addAttribute($attribute) {\n        $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute);\n\n        return $this;\n    }\n\n    /**\n     * Returns the built enum case node.\n     *\n     * @return Stmt\\EnumCase The built constant node\n     */\n    public function getNode(): PhpParser\\Node {\n        return new Stmt\\EnumCase(\n            $this->name,\n            $this->value,\n            $this->attributeGroups,\n            $this->attributes\n        );\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Builder/Enum_.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Builder;\n\nuse PhpParser;\nuse PhpParser\\BuilderHelpers;\nuse PhpParser\\Node;\nuse PhpParser\\Node\\Identifier;\nuse PhpParser\\Node\\Name;\nuse PhpParser\\Node\\Stmt;\n\nclass Enum_ extends Declaration {\n    protected string $name;\n    protected ?Identifier $scalarType = null;\n    /** @var list<Name> */\n    protected array $implements = [];\n    /** @var list<Stmt\\TraitUse> */\n    protected array $uses = [];\n    /** @var list<Stmt\\EnumCase> */\n    protected array $enumCases = [];\n    /** @var list<Stmt\\ClassConst> */\n    protected array $constants = [];\n    /** @var list<Stmt\\ClassMethod> */\n    protected array $methods = [];\n    /** @var list<Node\\AttributeGroup> */\n    protected array $attributeGroups = [];\n\n    /**\n     * Creates an enum builder.\n     *\n     * @param string $name Name of the enum\n     */\n    public function __construct(string $name) {\n        $this->name = $name;\n    }\n\n    /**\n     * Sets the scalar type.\n     *\n     * @param string|Identifier $scalarType\n     *\n     * @return $this\n     */\n    public function setScalarType($scalarType) {\n        $this->scalarType = BuilderHelpers::normalizeType($scalarType);\n\n        return $this;\n    }\n\n    /**\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     */\n    public function implement(...$interfaces) {\n        foreach ($interfaces as $interface) {\n            $this->implements[] = BuilderHelpers::normalizeName($interface);\n        }\n\n        return $this;\n    }\n\n    /**\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     */\n    public function addStmt($stmt) {\n        $stmt = BuilderHelpers::normalizeNode($stmt);\n\n        if ($stmt instanceof Stmt\\EnumCase) {\n            $this->enumCases[] = $stmt;\n        } elseif ($stmt instanceof Stmt\\ClassMethod) {\n            $this->methods[] = $stmt;\n        } elseif ($stmt instanceof Stmt\\TraitUse) {\n            $this->uses[] = $stmt;\n        } elseif ($stmt instanceof Stmt\\ClassConst) {\n            $this->constants[] = $stmt;\n        } else {\n            throw new \\LogicException(sprintf('Unexpected node of type \"%s\"', $stmt->getType()));\n        }\n\n        return $this;\n    }\n\n    /**\n     * Adds an attribute group.\n     *\n     * @param Node\\Attribute|Node\\AttributeGroup $attribute\n     *\n     * @return $this The builder instance (for fluid interface)\n     */\n    public function addAttribute($attribute) {\n        $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute);\n\n        return $this;\n    }\n\n    /**\n     * Returns the built class node.\n     *\n     * @return Stmt\\Enum_ The built enum node\n     */\n    public function getNode(): PhpParser\\Node {\n        return new Stmt\\Enum_($this->name, [\n            'scalarType' => $this->scalarType,\n            'implements' => $this->implements,\n            'stmts' => array_merge($this->uses, $this->enumCases, $this->constants, $this->methods),\n            'attrGroups' => $this->attributeGroups,\n        ], $this->attributes);\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Builder/FunctionLike.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Builder;\n\nuse PhpParser\\BuilderHelpers;\nuse PhpParser\\Node;\n\nabstract class FunctionLike extends Declaration {\n    protected bool $returnByRef = false;\n    /** @var Node\\Param[] */\n    protected array $params = [];\n\n    /** @var Node\\Identifier|Node\\Name|Node\\ComplexType|null */\n    protected ?Node $returnType = null;\n\n    /**\n     * Make the function return by reference.\n     *\n     * @return $this The builder instance (for fluid interface)\n     */\n    public function makeReturnByRef() {\n        $this->returnByRef = true;\n\n        return $this;\n    }\n\n    /**\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     */\n    public function addParam($param) {\n        $param = BuilderHelpers::normalizeNode($param);\n\n        if (!$param instanceof Node\\Param) {\n            throw new \\LogicException(sprintf('Expected parameter node, got \"%s\"', $param->getType()));\n        }\n\n        $this->params[] = $param;\n\n        return $this;\n    }\n\n    /**\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     */\n    public function addParams(array $params) {\n        foreach ($params as $param) {\n            $this->addParam($param);\n        }\n\n        return $this;\n    }\n\n    /**\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     */\n    public function setReturnType($type) {\n        $this->returnType = BuilderHelpers::normalizeType($type);\n\n        return $this;\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Builder/Function_.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Builder;\n\nuse PhpParser;\nuse PhpParser\\BuilderHelpers;\nuse PhpParser\\Node;\nuse PhpParser\\Node\\Stmt;\n\nclass Function_ extends FunctionLike {\n    protected string $name;\n    /** @var list<Stmt> */\n    protected array $stmts = [];\n\n    /** @var list<Node\\AttributeGroup> */\n    protected array $attributeGroups = [];\n\n    /**\n     * Creates a function builder.\n     *\n     * @param string $name Name of the function\n     */\n    public function __construct(string $name) {\n        $this->name = $name;\n    }\n\n    /**\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     */\n    public function addStmt($stmt) {\n        $this->stmts[] = BuilderHelpers::normalizeStmt($stmt);\n\n        return $this;\n    }\n\n    /**\n     * Adds an attribute group.\n     *\n     * @param Node\\Attribute|Node\\AttributeGroup $attribute\n     *\n     * @return $this The builder instance (for fluid interface)\n     */\n    public function addAttribute($attribute) {\n        $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute);\n\n        return $this;\n    }\n\n    /**\n     * Returns the built function node.\n     *\n     * @return Stmt\\Function_ The built function node\n     */\n    public function getNode(): Node {\n        return new Stmt\\Function_($this->name, [\n            'byRef'      => $this->returnByRef,\n            'params'     => $this->params,\n            'returnType' => $this->returnType,\n            'stmts'      => $this->stmts,\n            'attrGroups' => $this->attributeGroups,\n        ], $this->attributes);\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Builder/Interface_.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Builder;\n\nuse PhpParser;\nuse PhpParser\\BuilderHelpers;\nuse PhpParser\\Node;\nuse PhpParser\\Node\\Name;\nuse PhpParser\\Node\\Stmt;\n\nclass Interface_ extends Declaration {\n    protected string $name;\n    /** @var list<Name> */\n    protected array $extends = [];\n    /** @var list<Stmt\\ClassConst> */\n    protected array $constants = [];\n    /** @var list<Stmt\\ClassMethod> */\n    protected array $methods = [];\n    /** @var list<Node\\AttributeGroup> */\n    protected array $attributeGroups = [];\n\n    /**\n     * Creates an interface builder.\n     *\n     * @param string $name Name of the interface\n     */\n    public function __construct(string $name) {\n        $this->name = $name;\n    }\n\n    /**\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     */\n    public function extend(...$interfaces) {\n        foreach ($interfaces as $interface) {\n            $this->extends[] = BuilderHelpers::normalizeName($interface);\n        }\n\n        return $this;\n    }\n\n    /**\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     */\n    public function addStmt($stmt) {\n        $stmt = BuilderHelpers::normalizeNode($stmt);\n\n        if ($stmt instanceof Stmt\\ClassConst) {\n            $this->constants[] = $stmt;\n        } elseif ($stmt instanceof Stmt\\ClassMethod) {\n            // we erase all statements in the body of an interface method\n            $stmt->stmts = null;\n            $this->methods[] = $stmt;\n        } else {\n            throw new \\LogicException(sprintf('Unexpected node of type \"%s\"', $stmt->getType()));\n        }\n\n        return $this;\n    }\n\n    /**\n     * Adds an attribute group.\n     *\n     * @param Node\\Attribute|Node\\AttributeGroup $attribute\n     *\n     * @return $this The builder instance (for fluid interface)\n     */\n    public function addAttribute($attribute) {\n        $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute);\n\n        return $this;\n    }\n\n    /**\n     * Returns the built interface node.\n     *\n     * @return Stmt\\Interface_ The built interface node\n     */\n    public function getNode(): PhpParser\\Node {\n        return new Stmt\\Interface_($this->name, [\n            'extends' => $this->extends,\n            'stmts' => array_merge($this->constants, $this->methods),\n            'attrGroups' => $this->attributeGroups,\n        ], $this->attributes);\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Builder/Method.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Builder;\n\nuse PhpParser;\nuse PhpParser\\BuilderHelpers;\nuse PhpParser\\Modifiers;\nuse PhpParser\\Node;\nuse PhpParser\\Node\\Stmt;\n\nclass Method extends FunctionLike {\n    protected string $name;\n\n    protected int $flags = 0;\n\n    /** @var list<Stmt>|null */\n    protected ?array $stmts = [];\n\n    /** @var list<Node\\AttributeGroup> */\n    protected array $attributeGroups = [];\n\n    /**\n     * Creates a method builder.\n     *\n     * @param string $name Name of the method\n     */\n    public function __construct(string $name) {\n        $this->name = $name;\n    }\n\n    /**\n     * Makes the method public.\n     *\n     * @return $this The builder instance (for fluid interface)\n     */\n    public function makePublic() {\n        $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PUBLIC);\n\n        return $this;\n    }\n\n    /**\n     * Makes the method protected.\n     *\n     * @return $this The builder instance (for fluid interface)\n     */\n    public function makeProtected() {\n        $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PROTECTED);\n\n        return $this;\n    }\n\n    /**\n     * Makes the method private.\n     *\n     * @return $this The builder instance (for fluid interface)\n     */\n    public function makePrivate() {\n        $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PRIVATE);\n\n        return $this;\n    }\n\n    /**\n     * Makes the method static.\n     *\n     * @return $this The builder instance (for fluid interface)\n     */\n    public function makeStatic() {\n        $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::STATIC);\n\n        return $this;\n    }\n\n    /**\n     * Makes the method abstract.\n     *\n     * @return $this The builder instance (for fluid interface)\n     */\n    public function makeAbstract() {\n        if (!empty($this->stmts)) {\n            throw new \\LogicException('Cannot make method with statements abstract');\n        }\n\n        $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::ABSTRACT);\n        $this->stmts = null; // abstract methods don't have statements\n\n        return $this;\n    }\n\n    /**\n     * Makes the method final.\n     *\n     * @return $this The builder instance (for fluid interface)\n     */\n    public function makeFinal() {\n        $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::FINAL);\n\n        return $this;\n    }\n\n    /**\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     */\n    public function addStmt($stmt) {\n        if (null === $this->stmts) {\n            throw new \\LogicException('Cannot add statements to an abstract method');\n        }\n\n        $this->stmts[] = BuilderHelpers::normalizeStmt($stmt);\n\n        return $this;\n    }\n\n    /**\n     * Adds an attribute group.\n     *\n     * @param Node\\Attribute|Node\\AttributeGroup $attribute\n     *\n     * @return $this The builder instance (for fluid interface)\n     */\n    public function addAttribute($attribute) {\n        $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute);\n\n        return $this;\n    }\n\n    /**\n     * Returns the built method node.\n     *\n     * @return Stmt\\ClassMethod The built method node\n     */\n    public function getNode(): Node {\n        return new Stmt\\ClassMethod($this->name, [\n            'flags'      => $this->flags,\n            'byRef'      => $this->returnByRef,\n            'params'     => $this->params,\n            'returnType' => $this->returnType,\n            'stmts'      => $this->stmts,\n            'attrGroups' => $this->attributeGroups,\n        ], $this->attributes);\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Builder/Namespace_.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Builder;\n\nuse PhpParser;\nuse PhpParser\\BuilderHelpers;\nuse PhpParser\\Node;\nuse PhpParser\\Node\\Stmt;\n\nclass Namespace_ extends Declaration {\n    private ?Node\\Name $name;\n    /** @var Stmt[] */\n    private array $stmts = [];\n\n    /**\n     * Creates a namespace builder.\n     *\n     * @param Node\\Name|string|null $name Name of the namespace\n     */\n    public function __construct($name) {\n        $this->name = null !== $name ? BuilderHelpers::normalizeName($name) : null;\n    }\n\n    /**\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     */\n    public function addStmt($stmt) {\n        $this->stmts[] = BuilderHelpers::normalizeStmt($stmt);\n\n        return $this;\n    }\n\n    /**\n     * Returns the built node.\n     *\n     * @return Stmt\\Namespace_ The built node\n     */\n    public function getNode(): Node {\n        return new Stmt\\Namespace_($this->name, $this->stmts, $this->attributes);\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Builder/Param.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Builder;\n\nuse PhpParser;\nuse PhpParser\\BuilderHelpers;\nuse PhpParser\\Modifiers;\nuse PhpParser\\Node;\n\nclass Param implements PhpParser\\Builder {\n    protected string $name;\n    protected ?Node\\Expr $default = null;\n    /** @var Node\\Identifier|Node\\Name|Node\\ComplexType|null */\n    protected ?Node $type = null;\n    protected bool $byRef = false;\n    protected int $flags = 0;\n    protected bool $variadic = false;\n    /** @var list<Node\\AttributeGroup> */\n    protected array $attributeGroups = [];\n\n    /**\n     * Creates a parameter builder.\n     *\n     * @param string $name Name of the parameter\n     */\n    public function __construct(string $name) {\n        $this->name = $name;\n    }\n\n    /**\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     */\n    public function setDefault($value) {\n        $this->default = BuilderHelpers::normalizeValue($value);\n\n        return $this;\n    }\n\n    /**\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     */\n    public function setType($type) {\n        $this->type = BuilderHelpers::normalizeType($type);\n        if ($this->type == 'void') {\n            throw new \\LogicException('Parameter type cannot be void');\n        }\n\n        return $this;\n    }\n\n    /**\n     * Make the parameter accept the value by reference.\n     *\n     * @return $this The builder instance (for fluid interface)\n     */\n    public function makeByRef() {\n        $this->byRef = true;\n\n        return $this;\n    }\n\n    /**\n     * Make the parameter variadic\n     *\n     * @return $this The builder instance (for fluid interface)\n     */\n    public function makeVariadic() {\n        $this->variadic = true;\n\n        return $this;\n    }\n\n    /**\n     * Makes the (promoted) parameter public.\n     *\n     * @return $this The builder instance (for fluid interface)\n     */\n    public function makePublic() {\n        $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PUBLIC);\n\n        return $this;\n    }\n\n    /**\n     * Makes the (promoted) parameter protected.\n     *\n     * @return $this The builder instance (for fluid interface)\n     */\n    public function makeProtected() {\n        $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PROTECTED);\n\n        return $this;\n    }\n\n    /**\n     * Makes the (promoted) parameter private.\n     *\n     * @return $this The builder instance (for fluid interface)\n     */\n    public function makePrivate() {\n        $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PRIVATE);\n\n        return $this;\n    }\n\n    /**\n     * Makes the (promoted) parameter readonly.\n     *\n     * @return $this The builder instance (for fluid interface)\n     */\n    public function makeReadonly() {\n        $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::READONLY);\n\n        return $this;\n    }\n\n    /**\n     * Gives the promoted property private(set) visibility.\n     *\n     * @return $this The builder instance (for fluid interface)\n     */\n    public function makePrivateSet() {\n        $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PRIVATE_SET);\n\n        return $this;\n    }\n\n    /**\n     * Gives the promoted property protected(set) visibility.\n     *\n     * @return $this The builder instance (for fluid interface)\n     */\n    public function makeProtectedSet() {\n        $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PROTECTED_SET);\n\n        return $this;\n    }\n\n    /**\n     * Adds an attribute group.\n     *\n     * @param Node\\Attribute|Node\\AttributeGroup $attribute\n     *\n     * @return $this The builder instance (for fluid interface)\n     */\n    public function addAttribute($attribute) {\n        $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute);\n\n        return $this;\n    }\n\n    /**\n     * Returns the built parameter node.\n     *\n     * @return Node\\Param The built parameter node\n     */\n    public function getNode(): Node {\n        return new Node\\Param(\n            new Node\\Expr\\Variable($this->name),\n            $this->default, $this->type, $this->byRef, $this->variadic, [], $this->flags, $this->attributeGroups\n        );\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Builder/Property.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Builder;\n\nuse PhpParser;\nuse PhpParser\\BuilderHelpers;\nuse PhpParser\\Modifiers;\nuse PhpParser\\Node;\nuse PhpParser\\Node\\Identifier;\nuse PhpParser\\Node\\Name;\nuse PhpParser\\Node\\Stmt;\nuse PhpParser\\Node\\ComplexType;\n\nclass Property implements PhpParser\\Builder {\n    protected string $name;\n\n    protected int $flags = 0;\n\n    protected ?Node\\Expr $default = null;\n    /** @var array<string, mixed> */\n    protected array $attributes = [];\n    /** @var null|Identifier|Name|ComplexType */\n    protected ?Node $type = null;\n    /** @var list<Node\\AttributeGroup> */\n    protected array $attributeGroups = [];\n    /** @var list<Node\\PropertyHook> */\n    protected array $hooks = [];\n\n    /**\n     * Creates a property builder.\n     *\n     * @param string $name Name of the property\n     */\n    public function __construct(string $name) {\n        $this->name = $name;\n    }\n\n    /**\n     * Makes the property public.\n     *\n     * @return $this The builder instance (for fluid interface)\n     */\n    public function makePublic() {\n        $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PUBLIC);\n\n        return $this;\n    }\n\n    /**\n     * Makes the property protected.\n     *\n     * @return $this The builder instance (for fluid interface)\n     */\n    public function makeProtected() {\n        $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PROTECTED);\n\n        return $this;\n    }\n\n    /**\n     * Makes the property private.\n     *\n     * @return $this The builder instance (for fluid interface)\n     */\n    public function makePrivate() {\n        $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PRIVATE);\n\n        return $this;\n    }\n\n    /**\n     * Makes the property static.\n     *\n     * @return $this The builder instance (for fluid interface)\n     */\n    public function makeStatic() {\n        $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::STATIC);\n\n        return $this;\n    }\n\n    /**\n     * Makes the property readonly.\n     *\n     * @return $this The builder instance (for fluid interface)\n     */\n    public function makeReadonly() {\n        $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::READONLY);\n\n        return $this;\n    }\n\n    /**\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     */\n    public function makeAbstract() {\n        $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::ABSTRACT);\n\n        return $this;\n    }\n\n    /**\n     * Makes the property final.\n     *\n     * @return $this The builder instance (for fluid interface)\n     */\n    public function makeFinal() {\n        $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::FINAL);\n\n        return $this;\n    }\n\n    /**\n     * Gives the property private(set) visibility.\n     *\n     * @return $this The builder instance (for fluid interface)\n     */\n    public function makePrivateSet() {\n        $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PRIVATE_SET);\n\n        return $this;\n    }\n\n    /**\n     * Gives the property protected(set) visibility.\n     *\n     * @return $this The builder instance (for fluid interface)\n     */\n    public function makeProtectedSet() {\n        $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PROTECTED_SET);\n\n        return $this;\n    }\n\n    /**\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     */\n    public function setDefault($value) {\n        $this->default = BuilderHelpers::normalizeValue($value);\n\n        return $this;\n    }\n\n    /**\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     */\n    public function setDocComment($docComment) {\n        $this->attributes = [\n            'comments' => [BuilderHelpers::normalizeDocComment($docComment)]\n        ];\n\n        return $this;\n    }\n\n    /**\n     * Sets the property type for PHP 7.4+.\n     *\n     * @param string|Name|Identifier|ComplexType $type\n     *\n     * @return $this\n     */\n    public function setType($type) {\n        $this->type = BuilderHelpers::normalizeType($type);\n\n        return $this;\n    }\n\n    /**\n     * Adds an attribute group.\n     *\n     * @param Node\\Attribute|Node\\AttributeGroup $attribute\n     *\n     * @return $this The builder instance (for fluid interface)\n     */\n    public function addAttribute($attribute) {\n        $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute);\n\n        return $this;\n    }\n\n    /**\n     * Adds a property hook.\n     *\n     * @return $this The builder instance (for fluid interface)\n     */\n    public function addHook(Node\\PropertyHook $hook) {\n        $this->hooks[] = $hook;\n\n        return $this;\n    }\n\n    /**\n     * Returns the built class node.\n     *\n     * @return Stmt\\Property The built property node\n     */\n    public function getNode(): PhpParser\\Node {\n        if ($this->flags & Modifiers::ABSTRACT && !$this->hooks) {\n            throw new PhpParser\\Error('Only hooked properties may be declared abstract');\n        }\n\n        return new Stmt\\Property(\n            $this->flags !== 0 ? $this->flags : Modifiers::PUBLIC,\n            [\n                new Node\\PropertyItem($this->name, $this->default)\n            ],\n            $this->attributes,\n            $this->type,\n            $this->attributeGroups,\n            $this->hooks\n        );\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Builder/TraitUse.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Builder;\n\nuse PhpParser\\Builder;\nuse PhpParser\\BuilderHelpers;\nuse PhpParser\\Node;\nuse PhpParser\\Node\\Stmt;\n\nclass TraitUse implements Builder {\n    /** @var Node\\Name[] */\n    protected array $traits = [];\n    /** @var Stmt\\TraitUseAdaptation[] */\n    protected array $adaptations = [];\n\n    /**\n     * Creates a trait use builder.\n     *\n     * @param Node\\Name|string ...$traits Names of used traits\n     */\n    public function __construct(...$traits) {\n        foreach ($traits as $trait) {\n            $this->and($trait);\n        }\n    }\n\n    /**\n     * Adds used trait.\n     *\n     * @param Node\\Name|string $trait Trait name\n     *\n     * @return $this The builder instance (for fluid interface)\n     */\n    public function and($trait) {\n        $this->traits[] = BuilderHelpers::normalizeName($trait);\n        return $this;\n    }\n\n    /**\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     */\n    public function with($adaptation) {\n        $adaptation = BuilderHelpers::normalizeNode($adaptation);\n\n        if (!$adaptation instanceof Stmt\\TraitUseAdaptation) {\n            throw new \\LogicException('Adaptation must have type TraitUseAdaptation');\n        }\n\n        $this->adaptations[] = $adaptation;\n        return $this;\n    }\n\n    /**\n     * Returns the built node.\n     *\n     * @return Node The built node\n     */\n    public function getNode(): Node {\n        return new Stmt\\TraitUse($this->traits, $this->adaptations);\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Builder/TraitUseAdaptation.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Builder;\n\nuse PhpParser\\Builder;\nuse PhpParser\\BuilderHelpers;\nuse PhpParser\\Modifiers;\nuse PhpParser\\Node;\nuse PhpParser\\Node\\Stmt;\n\nclass TraitUseAdaptation implements Builder {\n    private const TYPE_UNDEFINED  = 0;\n    private const TYPE_ALIAS      = 1;\n    private const TYPE_PRECEDENCE = 2;\n\n    protected int $type;\n    protected ?Node\\Name $trait;\n    protected Node\\Identifier $method;\n    protected ?int $modifier = null;\n    protected ?Node\\Identifier $alias = null;\n    /** @var Node\\Name[] */\n    protected array $insteadof = [];\n\n    /**\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     */\n    public function __construct($trait, $method) {\n        $this->type = self::TYPE_UNDEFINED;\n\n        $this->trait = is_null($trait) ? null : BuilderHelpers::normalizeName($trait);\n        $this->method = BuilderHelpers::normalizeIdentifier($method);\n    }\n\n    /**\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     */\n    public function as($alias) {\n        if ($this->type === self::TYPE_UNDEFINED) {\n            $this->type = self::TYPE_ALIAS;\n        }\n\n        if ($this->type !== self::TYPE_ALIAS) {\n            throw new \\LogicException('Cannot set alias for not alias adaptation buider');\n        }\n\n        $this->alias = BuilderHelpers::normalizeIdentifier($alias);\n        return $this;\n    }\n\n    /**\n     * Sets adapted method public.\n     *\n     * @return $this The builder instance (for fluid interface)\n     */\n    public function makePublic() {\n        $this->setModifier(Modifiers::PUBLIC);\n        return $this;\n    }\n\n    /**\n     * Sets adapted method protected.\n     *\n     * @return $this The builder instance (for fluid interface)\n     */\n    public function makeProtected() {\n        $this->setModifier(Modifiers::PROTECTED);\n        return $this;\n    }\n\n    /**\n     * Sets adapted method private.\n     *\n     * @return $this The builder instance (for fluid interface)\n     */\n    public function makePrivate() {\n        $this->setModifier(Modifiers::PRIVATE);\n        return $this;\n    }\n\n    /**\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     */\n    public function insteadof(...$traits) {\n        if ($this->type === self::TYPE_UNDEFINED) {\n            if (is_null($this->trait)) {\n                throw new \\LogicException('Precedence adaptation must have trait');\n            }\n\n            $this->type = self::TYPE_PRECEDENCE;\n        }\n\n        if ($this->type !== self::TYPE_PRECEDENCE) {\n            throw new \\LogicException('Cannot add overwritten traits for not precedence adaptation buider');\n        }\n\n        foreach ($traits as $trait) {\n            $this->insteadof[] = BuilderHelpers::normalizeName($trait);\n        }\n\n        return $this;\n    }\n\n    protected function setModifier(int $modifier): void {\n        if ($this->type === self::TYPE_UNDEFINED) {\n            $this->type = self::TYPE_ALIAS;\n        }\n\n        if ($this->type !== self::TYPE_ALIAS) {\n            throw new \\LogicException('Cannot set access modifier for not alias adaptation buider');\n        }\n\n        if (is_null($this->modifier)) {\n            $this->modifier = $modifier;\n        } else {\n            throw new \\LogicException('Multiple access type modifiers are not allowed');\n        }\n    }\n\n    /**\n     * Returns the built node.\n     *\n     * @return Node The built node\n     */\n    public function getNode(): Node {\n        switch ($this->type) {\n            case self::TYPE_ALIAS:\n                return new Stmt\\TraitUseAdaptation\\Alias($this->trait, $this->method, $this->modifier, $this->alias);\n            case self::TYPE_PRECEDENCE:\n                return new Stmt\\TraitUseAdaptation\\Precedence($this->trait, $this->method, $this->insteadof);\n            default:\n                throw new \\LogicException('Type of adaptation is not defined');\n        }\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Builder/Trait_.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Builder;\n\nuse PhpParser;\nuse PhpParser\\BuilderHelpers;\nuse PhpParser\\Node;\nuse PhpParser\\Node\\Stmt;\n\nclass Trait_ extends Declaration {\n    protected string $name;\n    /** @var list<Stmt\\TraitUse> */\n    protected array $uses = [];\n    /** @var list<Stmt\\ClassConst> */\n    protected array $constants = [];\n    /** @var list<Stmt\\Property> */\n    protected array $properties = [];\n    /** @var list<Stmt\\ClassMethod> */\n    protected array $methods = [];\n    /** @var list<Node\\AttributeGroup> */\n    protected array $attributeGroups = [];\n\n    /**\n     * Creates an interface builder.\n     *\n     * @param string $name Name of the interface\n     */\n    public function __construct(string $name) {\n        $this->name = $name;\n    }\n\n    /**\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     */\n    public function addStmt($stmt) {\n        $stmt = BuilderHelpers::normalizeNode($stmt);\n\n        if ($stmt instanceof Stmt\\Property) {\n            $this->properties[] = $stmt;\n        } elseif ($stmt instanceof Stmt\\ClassMethod) {\n            $this->methods[] = $stmt;\n        } elseif ($stmt instanceof Stmt\\TraitUse) {\n            $this->uses[] = $stmt;\n        } elseif ($stmt instanceof Stmt\\ClassConst) {\n            $this->constants[] = $stmt;\n        } else {\n            throw new \\LogicException(sprintf('Unexpected node of type \"%s\"', $stmt->getType()));\n        }\n\n        return $this;\n    }\n\n    /**\n     * Adds an attribute group.\n     *\n     * @param Node\\Attribute|Node\\AttributeGroup $attribute\n     *\n     * @return $this The builder instance (for fluid interface)\n     */\n    public function addAttribute($attribute) {\n        $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute);\n\n        return $this;\n    }\n\n    /**\n     * Returns the built trait node.\n     *\n     * @return Stmt\\Trait_ The built interface node\n     */\n    public function getNode(): PhpParser\\Node {\n        return new Stmt\\Trait_(\n            $this->name, [\n                'stmts' => array_merge($this->uses, $this->constants, $this->properties, $this->methods),\n                'attrGroups' => $this->attributeGroups,\n            ], $this->attributes\n        );\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Builder/Use_.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Builder;\n\nuse PhpParser\\Builder;\nuse PhpParser\\BuilderHelpers;\nuse PhpParser\\Node;\nuse PhpParser\\Node\\Stmt;\n\nclass Use_ implements Builder {\n    protected Node\\Name $name;\n    /** @var Stmt\\Use_::TYPE_* */\n    protected int $type;\n    protected ?string $alias = null;\n\n    /**\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     */\n    public function __construct($name, int $type) {\n        $this->name = BuilderHelpers::normalizeName($name);\n        $this->type = $type;\n    }\n\n    /**\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     */\n    public function as(string $alias) {\n        $this->alias = $alias;\n        return $this;\n    }\n\n    /**\n     * Returns the built node.\n     *\n     * @return Stmt\\Use_ The built node\n     */\n    public function getNode(): Node {\n        return new Stmt\\Use_([\n            new Node\\UseItem($this->name, $this->alias)\n        ], $this->type);\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Builder.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser;\n\ninterface Builder {\n    /**\n     * Returns the built node.\n     *\n     * @return Node The built node\n     */\n    public function getNode(): Node;\n}\n","vendor/nikic/php-parser/lib/PhpParser/BuilderFactory.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser;\n\nuse PhpParser\\Node\\Arg;\nuse PhpParser\\Node\\Expr;\nuse PhpParser\\Node\\Expr\\BinaryOp\\Concat;\nuse PhpParser\\Node\\Identifier;\nuse PhpParser\\Node\\Name;\nuse PhpParser\\Node\\Scalar\\String_;\nuse PhpParser\\Node\\Stmt\\Use_;\n\nclass BuilderFactory {\n    /**\n     * Creates an attribute node.\n     *\n     * @param string|Name $name Name of the attribute\n     * @param array $args Attribute named arguments\n     */\n    public function attribute($name, array $args = []): Node\\Attribute {\n        return new Node\\Attribute(\n            BuilderHelpers::normalizeName($name),\n            $this->args($args)\n        );\n    }\n\n    /**\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     */\n    public function namespace($name): Builder\\Namespace_ {\n        return new Builder\\Namespace_($name);\n    }\n\n    /**\n     * Creates a class builder.\n     *\n     * @param string $name Name of the class\n     *\n     * @return Builder\\Class_ The created class builder\n     */\n    public function class(string $name): Builder\\Class_ {\n        return new Builder\\Class_($name);\n    }\n\n    /**\n     * Creates an interface builder.\n     *\n     * @param string $name Name of the interface\n     *\n     * @return Builder\\Interface_ The created interface builder\n     */\n    public function interface(string $name): Builder\\Interface_ {\n        return new Builder\\Interface_($name);\n    }\n\n    /**\n     * Creates a trait builder.\n     *\n     * @param string $name Name of the trait\n     *\n     * @return Builder\\Trait_ The created trait builder\n     */\n    public function trait(string $name): Builder\\Trait_ {\n        return new Builder\\Trait_($name);\n    }\n\n    /**\n     * Creates an enum builder.\n     *\n     * @param string $name Name of the enum\n     *\n     * @return Builder\\Enum_ The created enum builder\n     */\n    public function enum(string $name): Builder\\Enum_ {\n        return new Builder\\Enum_($name);\n    }\n\n    /**\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     */\n    public function useTrait(...$traits): Builder\\TraitUse {\n        return new Builder\\TraitUse(...$traits);\n    }\n\n    /**\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     */\n    public function traitUseAdaptation($trait, $method = null): Builder\\TraitUseAdaptation {\n        if ($method === null) {\n            $method = $trait;\n            $trait = null;\n        }\n\n        return new Builder\\TraitUseAdaptation($trait, $method);\n    }\n\n    /**\n     * Creates a method builder.\n     *\n     * @param string $name Name of the method\n     *\n     * @return Builder\\Method The created method builder\n     */\n    public function method(string $name): Builder\\Method {\n        return new Builder\\Method($name);\n    }\n\n    /**\n     * Creates a parameter builder.\n     *\n     * @param string $name Name of the parameter\n     *\n     * @return Builder\\Param The created parameter builder\n     */\n    public function param(string $name): Builder\\Param {\n        return new Builder\\Param($name);\n    }\n\n    /**\n     * Creates a property builder.\n     *\n     * @param string $name Name of the property\n     *\n     * @return Builder\\Property The created property builder\n     */\n    public function property(string $name): Builder\\Property {\n        return new Builder\\Property($name);\n    }\n\n    /**\n     * Creates a function builder.\n     *\n     * @param string $name Name of the function\n     *\n     * @return Builder\\Function_ The created function builder\n     */\n    public function function(string $name): Builder\\Function_ {\n        return new Builder\\Function_($name);\n    }\n\n    /**\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     */\n    public function use($name): Builder\\Use_ {\n        return new Builder\\Use_($name, Use_::TYPE_NORMAL);\n    }\n\n    /**\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     */\n    public function useFunction($name): Builder\\Use_ {\n        return new Builder\\Use_($name, Use_::TYPE_FUNCTION);\n    }\n\n    /**\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     */\n    public function useConst($name): Builder\\Use_ {\n        return new Builder\\Use_($name, Use_::TYPE_CONSTANT);\n    }\n\n    /**\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     */\n    public function classConst($name, $value): Builder\\ClassConst {\n        return new Builder\\ClassConst($name, $value);\n    }\n\n    /**\n     * Creates an enum case builder.\n     *\n     * @param string|Identifier $name Name\n     *\n     * @return Builder\\EnumCase The created use const builder\n     */\n    public function enumCase($name): Builder\\EnumCase {\n        return new Builder\\EnumCase($name);\n    }\n\n    /**\n     * Creates node a for a literal value.\n     *\n     * @param Expr|bool|null|int|float|string|array|\\UnitEnum $value $value\n     */\n    public function val($value): Expr {\n        return BuilderHelpers::normalizeValue($value);\n    }\n\n    /**\n     * Creates variable node.\n     *\n     * @param string|Expr $name Name\n     */\n    public function var($name): Expr\\Variable {\n        if (!\\is_string($name) && !$name instanceof Expr) {\n            throw new \\LogicException('Variable name must be string or Expr');\n        }\n\n        return new Expr\\Variable($name);\n    }\n\n    /**\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     */\n    public function args(array $args): array {\n        $normalizedArgs = [];\n        foreach ($args as $key => $arg) {\n            if (!($arg instanceof Arg)) {\n                $arg = new Arg(BuilderHelpers::normalizeValue($arg));\n            }\n            if (\\is_string($key)) {\n                $arg->name = BuilderHelpers::normalizeIdentifier($key);\n            }\n            $normalizedArgs[] = $arg;\n        }\n        return $normalizedArgs;\n    }\n\n    /**\n     * Creates a function call node.\n     *\n     * @param string|Name|Expr $name Function name\n     * @param array $args Function arguments\n     */\n    public function funcCall($name, array $args = []): Expr\\FuncCall {\n        return new Expr\\FuncCall(\n            BuilderHelpers::normalizeNameOrExpr($name),\n            $this->args($args)\n        );\n    }\n\n    /**\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     */\n    public function methodCall(Expr $var, $name, array $args = []): Expr\\MethodCall {\n        return new Expr\\MethodCall(\n            $var,\n            BuilderHelpers::normalizeIdentifierOrExpr($name),\n            $this->args($args)\n        );\n    }\n\n    /**\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     */\n    public function staticCall($class, $name, array $args = []): Expr\\StaticCall {\n        return new Expr\\StaticCall(\n            BuilderHelpers::normalizeNameOrExpr($class),\n            BuilderHelpers::normalizeIdentifierOrExpr($name),\n            $this->args($args)\n        );\n    }\n\n    /**\n     * Creates an object creation node.\n     *\n     * @param string|Name|Expr $class Class name\n     * @param array $args Constructor arguments\n     */\n    public function new($class, array $args = []): Expr\\New_ {\n        return new Expr\\New_(\n            BuilderHelpers::normalizeNameOrExpr($class),\n            $this->args($args)\n        );\n    }\n\n    /**\n     * Creates a constant fetch node.\n     *\n     * @param string|Name $name Constant name\n     */\n    public function constFetch($name): Expr\\ConstFetch {\n        return new Expr\\ConstFetch(BuilderHelpers::normalizeName($name));\n    }\n\n    /**\n     * Creates a property fetch node.\n     *\n     * @param Expr $var Variable holding object\n     * @param string|Identifier|Expr $name Property name\n     */\n    public function propertyFetch(Expr $var, $name): Expr\\PropertyFetch {\n        return new Expr\\PropertyFetch($var, BuilderHelpers::normalizeIdentifierOrExpr($name));\n    }\n\n    /**\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     */\n    public function classConstFetch($class, $name): Expr\\ClassConstFetch {\n        return new Expr\\ClassConstFetch(\n            BuilderHelpers::normalizeNameOrExpr($class),\n            BuilderHelpers::normalizeIdentifierOrExpr($name)\n        );\n    }\n\n    /**\n     * Creates nested Concat nodes from a list of expressions.\n     *\n     * @param Expr|string ...$exprs Expressions or literal strings\n     */\n    public function concat(...$exprs): Concat {\n        $numExprs = count($exprs);\n        if ($numExprs < 2) {\n            throw new \\LogicException('Expected at least two expressions');\n        }\n\n        $lastConcat = $this->normalizeStringExpr($exprs[0]);\n        for ($i = 1; $i < $numExprs; $i++) {\n            $lastConcat = new Concat($lastConcat, $this->normalizeStringExpr($exprs[$i]));\n        }\n        return $lastConcat;\n    }\n\n    /**\n     * @param string|Expr $expr\n     */\n    private function normalizeStringExpr($expr): Expr {\n        if ($expr instanceof Expr) {\n            return $expr;\n        }\n\n        if (\\is_string($expr)) {\n            return new String_($expr);\n        }\n\n        throw new \\LogicException('Expected string or Expr');\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/BuilderHelpers.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser;\n\nuse PhpParser\\Node\\ComplexType;\nuse PhpParser\\Node\\Expr;\nuse PhpParser\\Node\\Identifier;\nuse PhpParser\\Node\\Name;\nuse PhpParser\\Node\\Name\\FullyQualified;\nuse PhpParser\\Node\\NullableType;\nuse PhpParser\\Node\\Scalar;\nuse PhpParser\\Node\\Stmt;\n\n/**\n * This class defines helpers used in the implementation of builders. Don't use it directly.\n *\n * @internal\n */\nfinal class BuilderHelpers {\n    /**\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     */\n    public static function normalizeNode($node): Node {\n        if ($node instanceof Builder) {\n            return $node->getNode();\n        }\n\n        if ($node instanceof Node) {\n            return $node;\n        }\n\n        throw new \\LogicException('Expected node or builder object');\n    }\n\n    /**\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     */\n    public static function normalizeStmt($node): Stmt {\n        $node = self::normalizeNode($node);\n        if ($node instanceof Stmt) {\n            return $node;\n        }\n\n        if ($node instanceof Expr) {\n            return new Stmt\\Expression($node);\n        }\n\n        throw new \\LogicException('Expected statement or expression node');\n    }\n\n    /**\n     * Normalizes strings to Identifier.\n     *\n     * @param string|Identifier $name The identifier to normalize\n     *\n     * @return Identifier The normalized identifier\n     */\n    public static function normalizeIdentifier($name): Identifier {\n        if ($name instanceof Identifier) {\n            return $name;\n        }\n\n        if (\\is_string($name)) {\n            return new Identifier($name);\n        }\n\n        throw new \\LogicException('Expected string or instance of Node\\Identifier');\n    }\n\n    /**\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     */\n    public static function normalizeIdentifierOrExpr($name) {\n        if ($name instanceof Identifier || $name instanceof Expr) {\n            return $name;\n        }\n\n        if (\\is_string($name)) {\n            return new Identifier($name);\n        }\n\n        throw new \\LogicException('Expected string or instance of Node\\Identifier or Node\\Expr');\n    }\n\n    /**\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     */\n    public static function normalizeName($name): Name {\n        if ($name instanceof Name) {\n            return $name;\n        }\n\n        if (is_string($name)) {\n            if (!$name) {\n                throw new \\LogicException('Name cannot be empty');\n            }\n\n            if ($name[0] === '\\\\') {\n                return new Name\\FullyQualified(substr($name, 1));\n            }\n\n            if (0 === strpos($name, 'namespace\\\\')) {\n                return new Name\\Relative(substr($name, strlen('namespace\\\\')));\n            }\n\n            return new Name($name);\n        }\n\n        throw new \\LogicException('Name must be a string or an instance of Node\\Name');\n    }\n\n    /**\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     */\n    public static function normalizeNameOrExpr($name) {\n        if ($name instanceof Expr) {\n            return $name;\n        }\n\n        if (!is_string($name) && !($name instanceof Name)) {\n            throw new \\LogicException(\n                'Name must be a string or an instance of Node\\Name or Node\\Expr'\n            );\n        }\n\n        return self::normalizeName($name);\n    }\n\n    /**\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     */\n    public static function normalizeType($type) {\n        if (!is_string($type)) {\n            if (\n                !$type instanceof Name && !$type instanceof Identifier &&\n                !$type instanceof ComplexType\n            ) {\n                throw new \\LogicException(\n                    'Type must be a string, or an instance of Name, Identifier or ComplexType'\n                );\n            }\n            return $type;\n        }\n\n        $nullable = false;\n        if (strlen($type) > 0 && $type[0] === '?') {\n            $nullable = true;\n            $type = substr($type, 1);\n        }\n\n        $builtinTypes = [\n            'array',\n            'callable',\n            'bool',\n            'int',\n            'float',\n            'string',\n            'iterable',\n            'void',\n            'object',\n            'null',\n            'false',\n            'mixed',\n            'never',\n            'true',\n        ];\n\n        $lowerType = strtolower($type);\n        if (in_array($lowerType, $builtinTypes)) {\n            $type = new Identifier($lowerType);\n        } else {\n            $type = self::normalizeName($type);\n        }\n\n        $notNullableTypes = [\n            'void', 'mixed', 'never',\n        ];\n        if ($nullable && in_array((string) $type, $notNullableTypes)) {\n            throw new \\LogicException(sprintf('%s type cannot be nullable', $type));\n        }\n\n        return $nullable ? new NullableType($type) : $type;\n    }\n\n    /**\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     */\n    public static function normalizeValue($value): Expr {\n        if ($value instanceof Node\\Expr) {\n            return $value;\n        }\n\n        if (is_null($value)) {\n            return new Expr\\ConstFetch(\n                new Name('null')\n            );\n        }\n\n        if (is_bool($value)) {\n            return new Expr\\ConstFetch(\n                new Name($value ? 'true' : 'false')\n            );\n        }\n\n        if (is_int($value)) {\n            return new Scalar\\Int_($value);\n        }\n\n        if (is_float($value)) {\n            return new Scalar\\Float_($value);\n        }\n\n        if (is_string($value)) {\n            return new Scalar\\String_($value);\n        }\n\n        if (is_array($value)) {\n            $items = [];\n            $lastKey = -1;\n            foreach ($value as $itemKey => $itemValue) {\n                // for consecutive, numeric keys don't generate keys\n                if (null !== $lastKey && ++$lastKey === $itemKey) {\n                    $items[] = new Node\\ArrayItem(\n                        self::normalizeValue($itemValue)\n                    );\n                } else {\n                    $lastKey = null;\n                    $items[] = new Node\\ArrayItem(\n                        self::normalizeValue($itemValue),\n                        self::normalizeValue($itemKey)\n                    );\n                }\n            }\n\n            return new Expr\\Array_($items);\n        }\n\n        if ($value instanceof \\UnitEnum) {\n            return new Expr\\ClassConstFetch(new FullyQualified(\\get_class($value)), new Identifier($value->name));\n        }\n\n        throw new \\LogicException('Invalid value');\n    }\n\n    /**\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     */\n    public static function normalizeDocComment($docComment): Comment\\Doc {\n        if ($docComment instanceof Comment\\Doc) {\n            return $docComment;\n        }\n\n        if (is_string($docComment)) {\n            return new Comment\\Doc($docComment);\n        }\n\n        throw new \\LogicException('Doc comment must be a string or an instance of PhpParser\\Comment\\Doc');\n    }\n\n    /**\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     */\n    public static function normalizeAttribute($attribute): Node\\AttributeGroup {\n        if ($attribute instanceof Node\\AttributeGroup) {\n            return $attribute;\n        }\n\n        if (!($attribute instanceof Node\\Attribute)) {\n            throw new \\LogicException('Attribute must be an instance of PhpParser\\Node\\Attribute or PhpParser\\Node\\AttributeGroup');\n        }\n\n        return new Node\\AttributeGroup([$attribute]);\n    }\n\n    /**\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     */\n    public static function addModifier(int $modifiers, int $modifier): int {\n        Modifiers::verifyModifier($modifiers, $modifier);\n        return $modifiers | $modifier;\n    }\n\n    /**\n     * Adds a modifier and returns new modifier bitmask.\n     * @return int New modifiers\n     */\n    public static function addClassModifier(int $existingModifiers, int $modifierToSet): int {\n        Modifiers::verifyClassModifier($existingModifiers, $modifierToSet);\n        return $existingModifiers | $modifierToSet;\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Comment/Doc.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Comment;\n\nclass Doc extends \\PhpParser\\Comment {\n}\n","vendor/nikic/php-parser/lib/PhpParser/Comment.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser;\n\nclass Comment implements \\JsonSerializable {\n    protected string $text;\n    protected int $startLine;\n    protected int $startFilePos;\n    protected int $startTokenPos;\n    protected int $endLine;\n    protected int $endFilePos;\n    protected int $endTokenPos;\n\n    /**\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     */\n    public function __construct(\n        string $text,\n        int $startLine = -1, int $startFilePos = -1, int $startTokenPos = -1,\n        int $endLine = -1, int $endFilePos = -1, int $endTokenPos = -1\n    ) {\n        $this->text = $text;\n        $this->startLine = $startLine;\n        $this->startFilePos = $startFilePos;\n        $this->startTokenPos = $startTokenPos;\n        $this->endLine = $endLine;\n        $this->endFilePos = $endFilePos;\n        $this->endTokenPos = $endTokenPos;\n    }\n\n    /**\n     * Gets the comment text.\n     *\n     * @return string The comment text (including comment delimiters like /*)\n     */\n    public function getText(): string {\n        return $this->text;\n    }\n\n    /**\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     */\n    public function getStartLine(): int {\n        return $this->startLine;\n    }\n\n    /**\n     * Gets the file offset the comment started on.\n     *\n     * @return int File offset (or -1 if not available)\n     */\n    public function getStartFilePos(): int {\n        return $this->startFilePos;\n    }\n\n    /**\n     * Gets the token offset the comment started on.\n     *\n     * @return int Token offset (or -1 if not available)\n     */\n    public function getStartTokenPos(): int {\n        return $this->startTokenPos;\n    }\n\n    /**\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     */\n    public function getEndLine(): int {\n        return $this->endLine;\n    }\n\n    /**\n     * Gets the file offset the comment ends on.\n     *\n     * @return int File offset (or -1 if not available)\n     */\n    public function getEndFilePos(): int {\n        return $this->endFilePos;\n    }\n\n    /**\n     * Gets the token offset the comment ends on.\n     *\n     * @return int Token offset (or -1 if not available)\n     */\n    public function getEndTokenPos(): int {\n        return $this->endTokenPos;\n    }\n\n    /**\n     * Gets the comment text.\n     *\n     * @return string The comment text (including comment delimiters like /*)\n     */\n    public function __toString(): string {\n        return $this->text;\n    }\n\n    /**\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     */\n    public function getReformattedText(): string {\n        $text = str_replace(\"\\r\\n\", \"\\n\", $this->text);\n        $newlinePos = strpos($text, \"\\n\");\n        if (false === $newlinePos) {\n            // Single line comments don't need further processing\n            return $text;\n        }\n        if (preg_match('(^.*(?:\\n\\s+\\*.*)+$)', $text)) {\n            // Multi line comment of the type\n            //\n            //     /*\n            //      * Some text.\n            //      * Some more text.\n            //      */\n            //\n            // is handled by replacing the whitespace sequences before the * by a single space\n            return preg_replace('(^\\s+\\*)m', ' *', $text);\n        }\n        if (preg_match('(^/\\*\\*?\\s*\\n)', $text) && preg_match('(\\n(\\s*)\\*/$)', $text, $matches)) {\n            // Multi line comment of the type\n            //\n            //    /*\n            //        Some text.\n            //        Some more text.\n            //    */\n            //\n            // is handled by removing the whitespace sequence on the line before the closing\n            // */ on all lines. So if the last line is \"    */\", then \"    \" is removed at the\n            // start of all lines.\n            return preg_replace('(^' . preg_quote($matches[1]) . ')m', '', $text);\n        }\n        if (preg_match('(^/\\*\\*?\\s*(?!\\s))', $text, $matches)) {\n            // Multi line comment of the type\n            //\n            //     /* Some text.\n            //        Some more text.\n            //          Indented text.\n            //        Even more text. */\n            //\n            // is handled by removing the difference between the shortest whitespace prefix on all\n            // lines and the length of the \"/* \" opening sequence.\n            $prefixLen = $this->getShortestWhitespacePrefixLen(substr($text, $newlinePos + 1));\n            $removeLen = $prefixLen - strlen($matches[0]);\n            return preg_replace('(^\\s{' . $removeLen . '})m', '', $text);\n        }\n\n        // No idea how to format this comment, so simply return as is\n        return $text;\n    }\n\n    /**\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     */\n    private function getShortestWhitespacePrefixLen(string $str): int {\n        $lines = explode(\"\\n\", $str);\n        $shortestPrefixLen = \\PHP_INT_MAX;\n        foreach ($lines as $line) {\n            preg_match('(^\\s*)', $line, $matches);\n            $prefixLen = strlen($matches[0]);\n            if ($prefixLen < $shortestPrefixLen) {\n                $shortestPrefixLen = $prefixLen;\n            }\n        }\n        return $shortestPrefixLen;\n    }\n\n    /**\n     * @return array{nodeType:string, text:mixed, line:mixed, filePos:mixed}\n     */\n    public function jsonSerialize(): array {\n        // Technically not a node, but we make it look like one anyway\n        $type = $this instanceof Comment\\Doc ? 'Comment_Doc' : 'Comment';\n        return [\n            'nodeType' => $type,\n            'text' => $this->text,\n            // TODO: Rename these to include \"start\".\n            'line' => $this->startLine,\n            'filePos' => $this->startFilePos,\n            'tokenPos' => $this->startTokenPos,\n            'endLine' => $this->endLine,\n            'endFilePos' => $this->endFilePos,\n            'endTokenPos' => $this->endTokenPos,\n        ];\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/ConstExprEvaluationException.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser;\n\nclass ConstExprEvaluationException extends \\Exception {\n}\n","vendor/nikic/php-parser/lib/PhpParser/ConstExprEvaluator.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser;\n\nuse PhpParser\\Node\\Expr;\nuse PhpParser\\Node\\Scalar;\n\nuse function array_merge;\n\n/**\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 */\nclass ConstExprEvaluator {\n    /** @var callable|null */\n    private $fallbackEvaluator;\n\n    /**\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     */\n    public function __construct(?callable $fallbackEvaluator = null) {\n        $this->fallbackEvaluator = $fallbackEvaluator ?? function (Expr $expr) {\n            throw new ConstExprEvaluationException(\n                \"Expression of type {$expr->getType()} cannot be evaluated\"\n            );\n        };\n    }\n\n    /**\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     */\n    public function evaluateSilently(Expr $expr) {\n        set_error_handler(function ($num, $str, $file, $line) {\n            throw new \\ErrorException($str, 0, $num, $file, $line);\n        });\n\n        try {\n            return $this->evaluate($expr);\n        } catch (\\Throwable $e) {\n            if (!$e instanceof ConstExprEvaluationException) {\n                $e = new ConstExprEvaluationException(\n                    \"An error occurred during constant expression evaluation\", 0, $e);\n            }\n            throw $e;\n        } finally {\n            restore_error_handler();\n        }\n    }\n\n    /**\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     */\n    public function evaluateDirectly(Expr $expr) {\n        return $this->evaluate($expr);\n    }\n\n    /** @return mixed */\n    private function evaluate(Expr $expr) {\n        if ($expr instanceof Scalar\\Int_\n            || $expr instanceof Scalar\\Float_\n            || $expr instanceof Scalar\\String_\n        ) {\n            return $expr->value;\n        }\n\n        if ($expr instanceof Expr\\Array_) {\n            return $this->evaluateArray($expr);\n        }\n\n        // Unary operators\n        if ($expr instanceof Expr\\UnaryPlus) {\n            return +$this->evaluate($expr->expr);\n        }\n        if ($expr instanceof Expr\\UnaryMinus) {\n            return -$this->evaluate($expr->expr);\n        }\n        if ($expr instanceof Expr\\BooleanNot) {\n            return !$this->evaluate($expr->expr);\n        }\n        if ($expr instanceof Expr\\BitwiseNot) {\n            return ~$this->evaluate($expr->expr);\n        }\n\n        if ($expr instanceof Expr\\BinaryOp) {\n            return $this->evaluateBinaryOp($expr);\n        }\n\n        if ($expr instanceof Expr\\Ternary) {\n            return $this->evaluateTernary($expr);\n        }\n\n        if ($expr instanceof Expr\\ArrayDimFetch && null !== $expr->dim) {\n            return $this->evaluate($expr->var)[$this->evaluate($expr->dim)];\n        }\n\n        if ($expr instanceof Expr\\ConstFetch) {\n            return $this->evaluateConstFetch($expr);\n        }\n\n        return ($this->fallbackEvaluator)($expr);\n    }\n\n    private function evaluateArray(Expr\\Array_ $expr): array {\n        $array = [];\n        foreach ($expr->items as $item) {\n            if (null !== $item->key) {\n                $array[$this->evaluate($item->key)] = $this->evaluate($item->value);\n            } elseif ($item->unpack) {\n                $array = array_merge($array, $this->evaluate($item->value));\n            } else {\n                $array[] = $this->evaluate($item->value);\n            }\n        }\n        return $array;\n    }\n\n    /** @return mixed */\n    private function evaluateTernary(Expr\\Ternary $expr) {\n        if (null === $expr->if) {\n            return $this->evaluate($expr->cond) ?: $this->evaluate($expr->else);\n        }\n\n        return $this->evaluate($expr->cond)\n            ? $this->evaluate($expr->if)\n            : $this->evaluate($expr->else);\n    }\n\n    /** @return mixed */\n    private function evaluateBinaryOp(Expr\\BinaryOp $expr) {\n        if ($expr instanceof Expr\\BinaryOp\\Coalesce\n            && $expr->left instanceof Expr\\ArrayDimFetch\n        ) {\n            // This needs to be special cased to respect BP_VAR_IS fetch semantics\n            return $this->evaluate($expr->left->var)[$this->evaluate($expr->left->dim)]\n                ?? $this->evaluate($expr->right);\n        }\n\n        // The evaluate() calls are repeated in each branch, because some of the operators are\n        // short-circuiting and evaluating the RHS in advance may be illegal in that case\n        $l = $expr->left;\n        $r = $expr->right;\n        switch ($expr->getOperatorSigil()) {\n            case '&':   return $this->evaluate($l) &   $this->evaluate($r);\n            case '|':   return $this->evaluate($l) |   $this->evaluate($r);\n            case '^':   return $this->evaluate($l) ^   $this->evaluate($r);\n            case '&&':  return $this->evaluate($l) &&  $this->evaluate($r);\n            case '||':  return $this->evaluate($l) ||  $this->evaluate($r);\n            case '??':  return $this->evaluate($l) ??  $this->evaluate($r);\n            case '.':   return $this->evaluate($l) .   $this->evaluate($r);\n            case '/':   return $this->evaluate($l) /   $this->evaluate($r);\n            case '==':  return $this->evaluate($l) ==  $this->evaluate($r);\n            case '>':   return $this->evaluate($l) >   $this->evaluate($r);\n            case '>=':  return $this->evaluate($l) >=  $this->evaluate($r);\n            case '===': return $this->evaluate($l) === $this->evaluate($r);\n            case 'and': return $this->evaluate($l) and $this->evaluate($r);\n            case 'or':  return $this->evaluate($l) or  $this->evaluate($r);\n            case 'xor': return $this->evaluate($l) xor $this->evaluate($r);\n            case '-':   return $this->evaluate($l) -   $this->evaluate($r);\n            case '%':   return $this->evaluate($l) %   $this->evaluate($r);\n            case '*':   return $this->evaluate($l) *   $this->evaluate($r);\n            case '!=':  return $this->evaluate($l) !=  $this->evaluate($r);\n            case '!==': return $this->evaluate($l) !== $this->evaluate($r);\n            case '+':   return $this->evaluate($l) +   $this->evaluate($r);\n            case '**':  return $this->evaluate($l) **  $this->evaluate($r);\n            case '<<':  return $this->evaluate($l) <<  $this->evaluate($r);\n            case '>>':  return $this->evaluate($l) >>  $this->evaluate($r);\n            case '<':   return $this->evaluate($l) <   $this->evaluate($r);\n            case '<=':  return $this->evaluate($l) <=  $this->evaluate($r);\n            case '<=>': return $this->evaluate($l) <=> $this->evaluate($r);\n            case '|>':  return ($this->fallbackEvaluator)($expr);\n        }\n\n        throw new \\Exception('Should not happen');\n    }\n\n    /** @return mixed */\n    private function evaluateConstFetch(Expr\\ConstFetch $expr) {\n        $name = $expr->name->toLowerString();\n        switch ($name) {\n            case 'null': return null;\n            case 'false': return false;\n            case 'true': return true;\n        }\n\n        return ($this->fallbackEvaluator)($expr);\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Error.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser;\n\nclass Error extends \\RuntimeException {\n    protected string $rawMessage;\n    /** @var array<string, mixed> */\n    protected array $attributes;\n\n    /**\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     */\n    public function __construct(string $message, array $attributes = []) {\n        $this->rawMessage = $message;\n        $this->attributes = $attributes;\n        $this->updateMessage();\n    }\n\n    /**\n     * Gets the error message\n     *\n     * @return string Error message\n     */\n    public function getRawMessage(): string {\n        return $this->rawMessage;\n    }\n\n    /**\n     * Gets the line the error starts in.\n     *\n     * @return int Error start line\n     * @phpstan-return -1|positive-int\n     */\n    public function getStartLine(): int {\n        return $this->attributes['startLine'] ?? -1;\n    }\n\n    /**\n     * Gets the line the error ends in.\n     *\n     * @return int Error end line\n     * @phpstan-return -1|positive-int\n     */\n    public function getEndLine(): int {\n        return $this->attributes['endLine'] ?? -1;\n    }\n\n    /**\n     * Gets the attributes of the node/token the error occurred at.\n     *\n     * @return array<string, mixed>\n     */\n    public function getAttributes(): array {\n        return $this->attributes;\n    }\n\n    /**\n     * Sets the attributes of the node/token the error occurred at.\n     *\n     * @param array<string, mixed> $attributes\n     */\n    public function setAttributes(array $attributes): void {\n        $this->attributes = $attributes;\n        $this->updateMessage();\n    }\n\n    /**\n     * Sets the line of the PHP file the error occurred in.\n     *\n     * @param string $message Error message\n     */\n    public function setRawMessage(string $message): void {\n        $this->rawMessage = $message;\n        $this->updateMessage();\n    }\n\n    /**\n     * Sets the line the error starts in.\n     *\n     * @param int $line Error start line\n     */\n    public function setStartLine(int $line): void {\n        $this->attributes['startLine'] = $line;\n        $this->updateMessage();\n    }\n\n    /**\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     */\n    public function hasColumnInfo(): bool {\n        return isset($this->attributes['startFilePos'], $this->attributes['endFilePos']);\n    }\n\n    /**\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     */\n    public function getStartColumn(string $code): int {\n        if (!$this->hasColumnInfo()) {\n            throw new \\RuntimeException('Error does not have column information');\n        }\n\n        return $this->toColumn($code, $this->attributes['startFilePos']);\n    }\n\n    /**\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     */\n    public function getEndColumn(string $code): int {\n        if (!$this->hasColumnInfo()) {\n            throw new \\RuntimeException('Error does not have column information');\n        }\n\n        return $this->toColumn($code, $this->attributes['endFilePos']);\n    }\n\n    /**\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     */\n    public function getMessageWithColumnInfo(string $code): string {\n        return sprintf(\n            '%s from %d:%d to %d:%d', $this->getRawMessage(),\n            $this->getStartLine(), $this->getStartColumn($code),\n            $this->getEndLine(), $this->getEndColumn($code)\n        );\n    }\n\n    /**\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     */\n    private function toColumn(string $code, int $pos): int {\n        if ($pos > strlen($code)) {\n            throw new \\RuntimeException('Invalid position information');\n        }\n\n        $lineStartPos = strrpos($code, \"\\n\", $pos - strlen($code));\n        if (false === $lineStartPos) {\n            $lineStartPos = -1;\n        }\n\n        return $pos - $lineStartPos;\n    }\n\n    /**\n     * Updates the exception message after a change to rawMessage or rawLine.\n     */\n    protected function updateMessage(): void {\n        $this->message = $this->rawMessage;\n\n        if (-1 === $this->getStartLine()) {\n            $this->message .= ' on unknown line';\n        } else {\n            $this->message .= ' on line ' . $this->getStartLine();\n        }\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/ErrorHandler/Collecting.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\ErrorHandler;\n\nuse PhpParser\\Error;\nuse PhpParser\\ErrorHandler;\n\n/**\n * Error handler that collects all errors into an array.\n *\n * This allows graceful handling of errors.\n */\nclass Collecting implements ErrorHandler {\n    /** @var Error[] Collected errors */\n    private array $errors = [];\n\n    public function handleError(Error $error): void {\n        $this->errors[] = $error;\n    }\n\n    /**\n     * Get collected errors.\n     *\n     * @return Error[]\n     */\n    public function getErrors(): array {\n        return $this->errors;\n    }\n\n    /**\n     * Check whether there are any errors.\n     */\n    public function hasErrors(): bool {\n        return !empty($this->errors);\n    }\n\n    /**\n     * Reset/clear collected errors.\n     */\n    public function clearErrors(): void {\n        $this->errors = [];\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/ErrorHandler/Throwing.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\ErrorHandler;\n\nuse PhpParser\\Error;\nuse PhpParser\\ErrorHandler;\n\n/**\n * Error handler that handles all errors by throwing them.\n *\n * This is the default strategy used by all components.\n */\nclass Throwing implements ErrorHandler {\n    public function handleError(Error $error): void {\n        throw $error;\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/ErrorHandler.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser;\n\ninterface ErrorHandler {\n    /**\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     */\n    public function handleError(Error $error): void;\n}\n","vendor/nikic/php-parser/lib/PhpParser/Internal/DiffElem.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Internal;\n\n/**\n * @internal\n */\nclass DiffElem {\n    public const TYPE_KEEP = 0;\n    public const TYPE_REMOVE = 1;\n    public const TYPE_ADD = 2;\n    public const TYPE_REPLACE = 3;\n\n    /** @var int One of the TYPE_* constants */\n    public int $type;\n    /** @var mixed Is null for add operations */\n    public $old;\n    /** @var mixed Is null for remove operations */\n    public $new;\n\n    /**\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     */\n    public function __construct(int $type, $old, $new) {\n        $this->type = $type;\n        $this->old = $old;\n        $this->new = $new;\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Internal/Differ.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Internal;\n\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 */\nclass Differ {\n    /** @var callable(T, T): bool */\n    private $isEqual;\n\n    /**\n     * Create differ over the given equality relation.\n     *\n     * @param callable(T, T): bool $isEqual Equality relation\n     */\n    public function __construct(callable $isEqual) {\n        $this->isEqual = $isEqual;\n    }\n\n    /**\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     */\n    public function diff(array $old, array $new): array {\n        $old = \\array_values($old);\n        $new = \\array_values($new);\n        list($trace, $x, $y) = $this->calculateTrace($old, $new);\n        return $this->extractDiff($trace, $x, $y, $old, $new);\n    }\n\n    /**\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     */\n    public function diffWithReplacements(array $old, array $new): array {\n        return $this->coalesceReplacements($this->diff($old, $new));\n    }\n\n    /**\n     * @param T[] $old\n     * @param T[] $new\n     * @return array{array<int, array<int, int>>, int, int}\n     */\n    private function calculateTrace(array $old, array $new): array {\n        $n = \\count($old);\n        $m = \\count($new);\n        $max = $n + $m;\n        $v = [1 => 0];\n        $trace = [];\n        for ($d = 0; $d <= $max; $d++) {\n            $trace[] = $v;\n            for ($k = -$d; $k <= $d; $k += 2) {\n                if ($k === -$d || ($k !== $d && $v[$k - 1] < $v[$k + 1])) {\n                    $x = $v[$k + 1];\n                } else {\n                    $x = $v[$k - 1] + 1;\n                }\n\n                $y = $x - $k;\n                while ($x < $n && $y < $m && ($this->isEqual)($old[$x], $new[$y])) {\n                    $x++;\n                    $y++;\n                }\n\n                $v[$k] = $x;\n                if ($x >= $n && $y >= $m) {\n                    return [$trace, $x, $y];\n                }\n            }\n        }\n        throw new \\Exception('Should not happen');\n    }\n\n    /**\n     * @param array<int, array<int, int>> $trace\n     * @param T[] $old\n     * @param T[] $new\n     * @return DiffElem[]\n     */\n    private function extractDiff(array $trace, int $x, int $y, array $old, array $new): array {\n        $result = [];\n        for ($d = \\count($trace) - 1; $d >= 0; $d--) {\n            $v = $trace[$d];\n            $k = $x - $y;\n\n            if ($k === -$d || ($k !== $d && $v[$k - 1] < $v[$k + 1])) {\n                $prevK = $k + 1;\n            } else {\n                $prevK = $k - 1;\n            }\n\n            $prevX = $v[$prevK];\n            $prevY = $prevX - $prevK;\n\n            while ($x > $prevX && $y > $prevY) {\n                $result[] = new DiffElem(DiffElem::TYPE_KEEP, $old[$x - 1], $new[$y - 1]);\n                $x--;\n                $y--;\n            }\n\n            if ($d === 0) {\n                break;\n            }\n\n            while ($x > $prevX) {\n                $result[] = new DiffElem(DiffElem::TYPE_REMOVE, $old[$x - 1], null);\n                $x--;\n            }\n\n            while ($y > $prevY) {\n                $result[] = new DiffElem(DiffElem::TYPE_ADD, null, $new[$y - 1]);\n                $y--;\n            }\n        }\n        return array_reverse($result);\n    }\n\n    /**\n     * Coalesce equal-length sequences of remove+add into a replace operation.\n     *\n     * @param DiffElem[] $diff\n     * @return DiffElem[]\n     */\n    private function coalesceReplacements(array $diff): array {\n        $newDiff = [];\n        $c = \\count($diff);\n        for ($i = 0; $i < $c; $i++) {\n            $diffType = $diff[$i]->type;\n            if ($diffType !== DiffElem::TYPE_REMOVE) {\n                $newDiff[] = $diff[$i];\n                continue;\n            }\n\n            $j = $i;\n            while ($j < $c && $diff[$j]->type === DiffElem::TYPE_REMOVE) {\n                $j++;\n            }\n\n            $k = $j;\n            while ($k < $c && $diff[$k]->type === DiffElem::TYPE_ADD) {\n                $k++;\n            }\n\n            if ($j - $i === $k - $j) {\n                $len = $j - $i;\n                for ($n = 0; $n < $len; $n++) {\n                    $newDiff[] = new DiffElem(\n                        DiffElem::TYPE_REPLACE, $diff[$i + $n]->old, $diff[$j + $n]->new\n                    );\n                }\n            } else {\n                for (; $i < $k; $i++) {\n                    $newDiff[] = $diff[$i];\n                }\n            }\n            $i = $k - 1;\n        }\n        return $newDiff;\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Internal/PrintableNewAnonClassNode.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Internal;\n\nuse PhpParser\\Node;\nuse PhpParser\\Node\\Expr;\n\n/**\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 */\nclass PrintableNewAnonClassNode extends Expr {\n    /** @var Node\\AttributeGroup[] PHP attribute groups */\n    public array $attrGroups;\n    /** @var int Modifiers */\n    public int $flags;\n    /** @var (Node\\Arg|Node\\VariadicPlaceholder)[] Arguments */\n    public array $args;\n    /** @var null|Node\\Name Name of extended class */\n    public ?Node\\Name $extends;\n    /** @var Node\\Name[] Names of implemented interfaces */\n    public array $implements;\n    /** @var Node\\Stmt[] Statements */\n    public array $stmts;\n\n    /**\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     */\n    public function __construct(\n        array $attrGroups, int $flags, array $args, ?Node\\Name $extends, array $implements,\n        array $stmts, array $attributes\n    ) {\n        parent::__construct($attributes);\n        $this->attrGroups = $attrGroups;\n        $this->flags = $flags;\n        $this->args = $args;\n        $this->extends = $extends;\n        $this->implements = $implements;\n        $this->stmts = $stmts;\n    }\n\n    public static function fromNewNode(Expr\\New_ $newNode): self {\n        $class = $newNode->class;\n        assert($class instanceof Node\\Stmt\\Class_);\n        // We don't assert that $class->name is null here, to allow consumers to assign unique names\n        // to anonymous classes for their own purposes. We simplify ignore the name here.\n        return new self(\n            $class->attrGroups, $class->flags, $newNode->args, $class->extends, $class->implements,\n            $class->stmts, $newNode->getAttributes()\n        );\n    }\n\n    public function getType(): string {\n        return 'Expr_PrintableNewAnonClass';\n    }\n\n    public function getSubNodeNames(): array {\n        return ['attrGroups', 'flags', 'args', 'extends', 'implements', 'stmts'];\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Internal/TokenPolyfill.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Internal;\n\nif (\\PHP_VERSION_ID >= 80000) {\n    class TokenPolyfill extends \\PhpToken {\n    }\n    return;\n}\n\n/**\n * This is a polyfill for the PhpToken class introduced in PHP 8.0. We do not actually polyfill\n * PhpToken, because composer might end up picking a different polyfill implementation, which does\n * not meet our requirements.\n *\n * @internal\n */\nclass TokenPolyfill {\n    /** @var int The ID of the token. Either a T_* constant of a character code < 256. */\n    public int $id;\n    /** @var string The textual content of the token. */\n    public string $text;\n    /** @var int The 1-based starting line of the token (or -1 if unknown). */\n    public int $line;\n    /** @var int The 0-based starting position of the token (or -1 if unknown). */\n    public int $pos;\n\n    /** @var array<int, bool> Tokens ignored by the PHP parser. */\n    private const IGNORABLE_TOKENS = [\n        \\T_WHITESPACE => true,\n        \\T_COMMENT => true,\n        \\T_DOC_COMMENT => true,\n        \\T_OPEN_TAG => true,\n    ];\n\n    /** @var array<int, bool> Tokens that may be part of a T_NAME_* identifier. */\n    private static array $identifierTokens;\n\n    /**\n     * Create a Token with the given ID and text, as well optional line and position information.\n     */\n    final public function __construct(int $id, string $text, int $line = -1, int $pos = -1) {\n        $this->id = $id;\n        $this->text = $text;\n        $this->line = $line;\n        $this->pos = $pos;\n    }\n\n    /**\n     * Get the name of the token. For single-char tokens this will be the token character.\n     * Otherwise it will be a T_* style name, or null if the token ID is unknown.\n     */\n    public function getTokenName(): ?string {\n        if ($this->id < 256) {\n            return \\chr($this->id);\n        }\n\n        $name = token_name($this->id);\n        return $name === 'UNKNOWN' ? null : $name;\n    }\n\n    /**\n     * Check whether the token is of the given kind. The kind may be either an integer that matches\n     * the token ID, a string that matches the token text, or an array of integers/strings. In the\n     * latter case, the function returns true if any of the kinds in the array match.\n     *\n     * @param int|string|(int|string)[] $kind\n     */\n    public function is($kind): bool {\n        if (\\is_int($kind)) {\n            return $this->id === $kind;\n        }\n        if (\\is_string($kind)) {\n            return $this->text === $kind;\n        }\n        if (\\is_array($kind)) {\n            foreach ($kind as $entry) {\n                if (\\is_int($entry)) {\n                    if ($this->id === $entry) {\n                        return true;\n                    }\n                } elseif (\\is_string($entry)) {\n                    if ($this->text === $entry) {\n                        return true;\n                    }\n                } else {\n                    throw new \\TypeError(\n                        'Argument #1 ($kind) must only have elements of type string|int, ' .\n                        gettype($entry) . ' given');\n                }\n            }\n            return false;\n        }\n        throw new \\TypeError(\n            'Argument #1 ($kind) must be of type string|int|array, ' .gettype($kind) . ' given');\n    }\n\n    /**\n     * Check whether this token would be ignored by the PHP parser. Returns true for T_WHITESPACE,\n     * T_COMMENT, T_DOC_COMMENT and T_OPEN_TAG, and false for everything else.\n     */\n    public function isIgnorable(): bool {\n        return isset(self::IGNORABLE_TOKENS[$this->id]);\n    }\n\n    /**\n     * Return the textual content of the token.\n     */\n    public function __toString(): string {\n        return $this->text;\n    }\n\n    /**\n     * Tokenize the given source code and return an array of tokens.\n     *\n     * This performs certain canonicalizations to match the PHP 8.0 token format:\n     *  * Bad characters are represented using T_BAD_CHARACTER rather than omitted.\n     *  * T_COMMENT does not include trailing newlines, instead the newline is part of a following\n     *    T_WHITESPACE token.\n     *  * Namespaced names are represented using T_NAME_* tokens.\n     *\n     * @return static[]\n     */\n    public static function tokenize(string $code, int $flags = 0): array {\n        self::init();\n\n        $tokens = [];\n        $line = 1;\n        $pos = 0;\n        $origTokens = \\token_get_all($code, $flags);\n\n        $numTokens = \\count($origTokens);\n        for ($i = 0; $i < $numTokens; $i++) {\n            $token = $origTokens[$i];\n            if (\\is_string($token)) {\n                if (\\strlen($token) === 2) {\n                    // b\" and B\" are tokenized as single-char tokens, even though they aren't.\n                    $tokens[] = new static(\\ord('\"'), $token, $line, $pos);\n                    $pos += 2;\n                } else {\n                    $tokens[] = new static(\\ord($token), $token, $line, $pos);\n                    $pos++;\n                }\n            } else {\n                $id = $token[0];\n                $text = $token[1];\n\n                // Emulate PHP 8.0 comment format, which does not include trailing whitespace anymore.\n                if ($id === \\T_COMMENT && \\substr($text, 0, 2) !== '/*' &&\n                    \\preg_match('/(\\r\\n|\\n|\\r)$/D', $text, $matches)\n                ) {\n                    $trailingNewline = $matches[0];\n                    $text = \\substr($text, 0, -\\strlen($trailingNewline));\n                    $tokens[] = new static($id, $text, $line, $pos);\n                    $pos += \\strlen($text);\n\n                    if ($i + 1 < $numTokens && $origTokens[$i + 1][0] === \\T_WHITESPACE) {\n                        // Move trailing newline into following T_WHITESPACE token, if it already exists.\n                        $origTokens[$i + 1][1] = $trailingNewline . $origTokens[$i + 1][1];\n                        $origTokens[$i + 1][2]--;\n                    } else {\n                        // Otherwise, we need to create a new T_WHITESPACE token.\n                        $tokens[] = new static(\\T_WHITESPACE, $trailingNewline, $line, $pos);\n                        $line++;\n                        $pos += \\strlen($trailingNewline);\n                    }\n                    continue;\n                }\n\n                // Emulate PHP 8.0 T_NAME_* tokens, by combining sequences of T_NS_SEPARATOR and\n                // T_STRING into a single token.\n                if (($id === \\T_NS_SEPARATOR || isset(self::$identifierTokens[$id]))) {\n                    $newText = $text;\n                    $lastWasSeparator = $id === \\T_NS_SEPARATOR;\n                    for ($j = $i + 1; $j < $numTokens; $j++) {\n                        if ($lastWasSeparator) {\n                            if (!isset(self::$identifierTokens[$origTokens[$j][0]])) {\n                                break;\n                            }\n                            $lastWasSeparator = false;\n                        } else {\n                            if ($origTokens[$j][0] !== \\T_NS_SEPARATOR) {\n                                break;\n                            }\n                            $lastWasSeparator = true;\n                        }\n                        $newText .= $origTokens[$j][1];\n                    }\n                    if ($lastWasSeparator) {\n                        // Trailing separator is not part of the name.\n                        $j--;\n                        $newText = \\substr($newText, 0, -1);\n                    }\n                    if ($j > $i + 1) {\n                        if ($id === \\T_NS_SEPARATOR) {\n                            $id = \\T_NAME_FULLY_QUALIFIED;\n                        } elseif ($id === \\T_NAMESPACE) {\n                            $id = \\T_NAME_RELATIVE;\n                        } else {\n                            $id = \\T_NAME_QUALIFIED;\n                        }\n                        $tokens[] = new static($id, $newText, $line, $pos);\n                        $pos += \\strlen($newText);\n                        $i = $j - 1;\n                        continue;\n                    }\n                }\n\n                $tokens[] = new static($id, $text, $line, $pos);\n                $line += \\substr_count($text, \"\\n\");\n                $pos += \\strlen($text);\n            }\n        }\n        return $tokens;\n    }\n\n    /** Initialize private static state needed by tokenize(). */\n    private static function init(): void {\n        if (isset(self::$identifierTokens)) {\n            return;\n        }\n\n        // Based on semi_reserved production.\n        self::$identifierTokens = \\array_fill_keys([\n            \\T_STRING,\n            \\T_STATIC, \\T_ABSTRACT, \\T_FINAL, \\T_PRIVATE, \\T_PROTECTED, \\T_PUBLIC, \\T_READONLY,\n            \\T_INCLUDE, \\T_INCLUDE_ONCE, \\T_EVAL, \\T_REQUIRE, \\T_REQUIRE_ONCE, \\T_LOGICAL_OR, \\T_LOGICAL_XOR, \\T_LOGICAL_AND,\n            \\T_INSTANCEOF, \\T_NEW, \\T_CLONE, \\T_EXIT, \\T_IF, \\T_ELSEIF, \\T_ELSE, \\T_ENDIF, \\T_ECHO, \\T_DO, \\T_WHILE,\n            \\T_ENDWHILE, \\T_FOR, \\T_ENDFOR, \\T_FOREACH, \\T_ENDFOREACH, \\T_DECLARE, \\T_ENDDECLARE, \\T_AS, \\T_TRY, \\T_CATCH,\n            \\T_FINALLY, \\T_THROW, \\T_USE, \\T_INSTEADOF, \\T_GLOBAL, \\T_VAR, \\T_UNSET, \\T_ISSET, \\T_EMPTY, \\T_CONTINUE, \\T_GOTO,\n            \\T_FUNCTION, \\T_CONST, \\T_RETURN, \\T_PRINT, \\T_YIELD, \\T_LIST, \\T_SWITCH, \\T_ENDSWITCH, \\T_CASE, \\T_DEFAULT,\n            \\T_BREAK, \\T_ARRAY, \\T_CALLABLE, \\T_EXTENDS, \\T_IMPLEMENTS, \\T_NAMESPACE, \\T_TRAIT, \\T_INTERFACE, \\T_CLASS,\n            \\T_CLASS_C, \\T_TRAIT_C, \\T_FUNC_C, \\T_METHOD_C, \\T_LINE, \\T_FILE, \\T_DIR, \\T_NS_C, \\T_HALT_COMPILER, \\T_FN,\n            \\T_MATCH,\n        ], true);\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Internal/TokenStream.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Internal;\n\nuse PhpParser\\Token;\n\n/**\n * Provides operations on token streams, for use by pretty printer.\n *\n * @internal\n */\nclass TokenStream {\n    /** @var Token[] Tokens (in PhpToken::tokenize() format) */\n    private array $tokens;\n    /** @var int[] Map from position to indentation */\n    private array $indentMap;\n\n    /**\n     * Create token stream instance.\n     *\n     * @param Token[] $tokens Tokens in PhpToken::tokenize() format\n     */\n    public function __construct(array $tokens, int $tabWidth) {\n        $this->tokens = $tokens;\n        $this->indentMap = $this->calcIndentMap($tabWidth);\n    }\n\n    /**\n     * Whether the given position is immediately surrounded by parenthesis.\n     *\n     * @param int $startPos Start position\n     * @param int $endPos End position\n     */\n    public function haveParens(int $startPos, int $endPos): bool {\n        return $this->haveTokenImmediatelyBefore($startPos, '(')\n            && $this->haveTokenImmediatelyAfter($endPos, ')');\n    }\n\n    /**\n     * Whether the given position is immediately surrounded by braces.\n     *\n     * @param int $startPos Start position\n     * @param int $endPos End position\n     */\n    public function haveBraces(int $startPos, int $endPos): bool {\n        return ($this->haveTokenImmediatelyBefore($startPos, '{')\n                || $this->haveTokenImmediatelyBefore($startPos, T_CURLY_OPEN))\n            && $this->haveTokenImmediatelyAfter($endPos, '}');\n    }\n\n    /**\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     */\n    public function haveTokenImmediatelyBefore(int $pos, $expectedTokenType): bool {\n        $tokens = $this->tokens;\n        $pos--;\n        for (; $pos >= 0; $pos--) {\n            $token = $tokens[$pos];\n            if ($token->is($expectedTokenType)) {\n                return true;\n            }\n            if (!$token->isIgnorable()) {\n                break;\n            }\n        }\n        return false;\n    }\n\n    /**\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     */\n    public function haveTokenImmediatelyAfter(int $pos, $expectedTokenType): bool {\n        $tokens = $this->tokens;\n        $pos++;\n        for ($c = \\count($tokens); $pos < $c; $pos++) {\n            $token = $tokens[$pos];\n            if ($token->is($expectedTokenType)) {\n                return true;\n            }\n            if (!$token->isIgnorable()) {\n                break;\n            }\n        }\n        return false;\n    }\n\n    /** @param int|string|(int|string)[] $skipTokenType */\n    public function skipLeft(int $pos, $skipTokenType): int {\n        $tokens = $this->tokens;\n\n        $pos = $this->skipLeftWhitespace($pos);\n        if ($skipTokenType === \\T_WHITESPACE) {\n            return $pos;\n        }\n\n        if (!$tokens[$pos]->is($skipTokenType)) {\n            // Shouldn't happen. The skip token MUST be there\n            throw new \\Exception('Encountered unexpected token');\n        }\n        $pos--;\n\n        return $this->skipLeftWhitespace($pos);\n    }\n\n    /** @param int|string|(int|string)[] $skipTokenType */\n    public function skipRight(int $pos, $skipTokenType): int {\n        $tokens = $this->tokens;\n\n        $pos = $this->skipRightWhitespace($pos);\n        if ($skipTokenType === \\T_WHITESPACE) {\n            return $pos;\n        }\n\n        if (!$tokens[$pos]->is($skipTokenType)) {\n            // Shouldn't happen. The skip token MUST be there\n            throw new \\Exception('Encountered unexpected token');\n        }\n        $pos++;\n\n        return $this->skipRightWhitespace($pos);\n    }\n\n    /**\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     */\n    public function skipLeftWhitespace(int $pos): int {\n        $tokens = $this->tokens;\n        for (; $pos >= 0; $pos--) {\n            if (!$tokens[$pos]->isIgnorable()) {\n                break;\n            }\n        }\n        return $pos;\n    }\n\n    /**\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     */\n    public function skipRightWhitespace(int $pos): int {\n        $tokens = $this->tokens;\n        for ($count = \\count($tokens); $pos < $count; $pos++) {\n            if (!$tokens[$pos]->isIgnorable()) {\n                break;\n            }\n        }\n        return $pos;\n    }\n\n    /** @param int|string|(int|string)[] $findTokenType */\n    public function findRight(int $pos, $findTokenType): int {\n        $tokens = $this->tokens;\n        for ($count = \\count($tokens); $pos < $count; $pos++) {\n            if ($tokens[$pos]->is($findTokenType)) {\n                return $pos;\n            }\n        }\n        return -1;\n    }\n\n    /**\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     */\n    public function haveTokenInRange(int $startPos, int $endPos, $tokenType): bool {\n        $tokens = $this->tokens;\n        for ($pos = $startPos; $pos < $endPos; $pos++) {\n            if ($tokens[$pos]->is($tokenType)) {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    public function haveTagInRange(int $startPos, int $endPos): bool {\n        return $this->haveTokenInRange($startPos, $endPos, \\T_OPEN_TAG)\n            || $this->haveTokenInRange($startPos, $endPos, \\T_CLOSE_TAG);\n    }\n\n    /**\n     * Get indentation before token position.\n     *\n     * @param int $pos Token position\n     *\n     * @return int Indentation depth (in spaces)\n     */\n    public function getIndentationBefore(int $pos): int {\n        return $this->indentMap[$pos];\n    }\n\n    /**\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     */\n    public function getTokenCode(int $from, int $to, int $indent): string {\n        $tokens = $this->tokens;\n        $result = '';\n        for ($pos = $from; $pos < $to; $pos++) {\n            $token = $tokens[$pos];\n            $id = $token->id;\n            $text = $token->text;\n            if ($id === \\T_CONSTANT_ENCAPSED_STRING || $id === \\T_ENCAPSED_AND_WHITESPACE) {\n                $result .= $text;\n            } else {\n                // TODO Handle non-space indentation\n                if ($indent < 0) {\n                    $result .= str_replace(\"\\n\" . str_repeat(\" \", -$indent), \"\\n\", $text);\n                } elseif ($indent > 0) {\n                    $result .= str_replace(\"\\n\", \"\\n\" . str_repeat(\" \", $indent), $text);\n                } else {\n                    $result .= $text;\n                }\n            }\n        }\n        return $result;\n    }\n\n    /**\n     * Precalculate the indentation at every token position.\n     *\n     * @return int[] Token position to indentation map\n     */\n    private function calcIndentMap(int $tabWidth): array {\n        $indentMap = [];\n        $indent = 0;\n        foreach ($this->tokens as $i => $token) {\n            $indentMap[] = $indent;\n\n            if ($token->id === \\T_WHITESPACE) {\n                $content = $token->text;\n                $newlinePos = \\strrpos($content, \"\\n\");\n                if (false !== $newlinePos) {\n                    $indent = $this->getIndent(\\substr($content, $newlinePos + 1), $tabWidth);\n                } elseif ($i === 1 && $this->tokens[0]->id === \\T_OPEN_TAG &&\n                          $this->tokens[0]->text[\\strlen($this->tokens[0]->text) - 1] === \"\\n\") {\n                    // Special case: Newline at the end of opening tag followed by whitespace.\n                    $indent = $this->getIndent($content, $tabWidth);\n                }\n            }\n        }\n\n        // Add a sentinel for one past end of the file\n        $indentMap[] = $indent;\n\n        return $indentMap;\n    }\n\n    private function getIndent(string $ws, int $tabWidth): int {\n        $spaces = \\substr_count($ws, \" \");\n        $tabs = \\substr_count($ws, \"\\t\");\n        assert(\\strlen($ws) === $spaces + $tabs);\n        return $spaces + $tabs * $tabWidth;\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/JsonDecoder.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser;\n\nclass JsonDecoder {\n    /** @var \\ReflectionClass<Node>[] Node type to reflection class map */\n    private array $reflectionClassCache;\n\n    /** @return mixed */\n    public function decode(string $json) {\n        $value = json_decode($json, true);\n        if (json_last_error()) {\n            throw new \\RuntimeException('JSON decoding error: ' . json_last_error_msg());\n        }\n\n        return $this->decodeRecursive($value);\n    }\n\n    /**\n     * @param mixed $value\n     * @return mixed\n     */\n    private function decodeRecursive($value) {\n        if (\\is_array($value)) {\n            if (isset($value['nodeType'])) {\n                if ($value['nodeType'] === 'Comment' || $value['nodeType'] === 'Comment_Doc') {\n                    return $this->decodeComment($value);\n                }\n                return $this->decodeNode($value);\n            }\n            return $this->decodeArray($value);\n        }\n        return $value;\n    }\n\n    private function decodeArray(array $array): array {\n        $decodedArray = [];\n        foreach ($array as $key => $value) {\n            $decodedArray[$key] = $this->decodeRecursive($value);\n        }\n        return $decodedArray;\n    }\n\n    private function decodeNode(array $value): Node {\n        $nodeType = $value['nodeType'];\n        if (!\\is_string($nodeType)) {\n            throw new \\RuntimeException('Node type must be a string');\n        }\n\n        $reflectionClass = $this->reflectionClassFromNodeType($nodeType);\n        $node = $reflectionClass->newInstanceWithoutConstructor();\n\n        if (isset($value['attributes'])) {\n            if (!\\is_array($value['attributes'])) {\n                throw new \\RuntimeException('Attributes must be an array');\n            }\n\n            $node->setAttributes($this->decodeArray($value['attributes']));\n        }\n\n        foreach ($value as $name => $subNode) {\n            if ($name === 'nodeType' || $name === 'attributes') {\n                continue;\n            }\n\n            $node->$name = $this->decodeRecursive($subNode);\n        }\n\n        return $node;\n    }\n\n    private function decodeComment(array $value): Comment {\n        $className = $value['nodeType'] === 'Comment' ? Comment::class : Comment\\Doc::class;\n        if (!isset($value['text'])) {\n            throw new \\RuntimeException('Comment must have text');\n        }\n\n        return new $className(\n            $value['text'],\n            $value['line'] ?? -1, $value['filePos'] ?? -1, $value['tokenPos'] ?? -1,\n            $value['endLine'] ?? -1, $value['endFilePos'] ?? -1, $value['endTokenPos'] ?? -1\n        );\n    }\n\n    /** @return \\ReflectionClass<Node> */\n    private function reflectionClassFromNodeType(string $nodeType): \\ReflectionClass {\n        if (!isset($this->reflectionClassCache[$nodeType])) {\n            $className = $this->classNameFromNodeType($nodeType);\n            $this->reflectionClassCache[$nodeType] = new \\ReflectionClass($className);\n        }\n        return $this->reflectionClassCache[$nodeType];\n    }\n\n    /** @return class-string<Node> */\n    private function classNameFromNodeType(string $nodeType): string {\n        $className = 'PhpParser\\\\Node\\\\' . strtr($nodeType, '_', '\\\\');\n        if (class_exists($className)) {\n            return $className;\n        }\n\n        $className .= '_';\n        if (class_exists($className)) {\n            return $className;\n        }\n\n        throw new \\RuntimeException(\"Unknown node type \\\"$nodeType\\\"\");\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Lexer/Emulative.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Lexer;\n\nuse PhpParser\\Error;\nuse PhpParser\\ErrorHandler;\nuse PhpParser\\Lexer;\nuse PhpParser\\Lexer\\TokenEmulator\\AsymmetricVisibilityTokenEmulator;\nuse PhpParser\\Lexer\\TokenEmulator\\AttributeEmulator;\nuse PhpParser\\Lexer\\TokenEmulator\\EnumTokenEmulator;\nuse PhpParser\\Lexer\\TokenEmulator\\ExplicitOctalEmulator;\nuse PhpParser\\Lexer\\TokenEmulator\\FnTokenEmulator;\nuse PhpParser\\Lexer\\TokenEmulator\\MatchTokenEmulator;\nuse PhpParser\\Lexer\\TokenEmulator\\NullsafeTokenEmulator;\nuse PhpParser\\Lexer\\TokenEmulator\\PipeOperatorEmulator;\nuse PhpParser\\Lexer\\TokenEmulator\\PropertyTokenEmulator;\nuse PhpParser\\Lexer\\TokenEmulator\\ReadonlyFunctionTokenEmulator;\nuse PhpParser\\Lexer\\TokenEmulator\\ReadonlyTokenEmulator;\nuse PhpParser\\Lexer\\TokenEmulator\\ReverseEmulator;\nuse PhpParser\\Lexer\\TokenEmulator\\TokenEmulator;\nuse PhpParser\\Lexer\\TokenEmulator\\VoidCastEmulator;\nuse PhpParser\\PhpVersion;\nuse PhpParser\\Token;\n\nclass Emulative extends Lexer {\n    /** @var array{int, string, string}[] Patches used to reverse changes introduced in the code */\n    private array $patches = [];\n\n    /** @var list<TokenEmulator> */\n    private array $emulators = [];\n\n    private PhpVersion $targetPhpVersion;\n\n    private PhpVersion $hostPhpVersion;\n\n    /**\n     * @param PhpVersion|null $phpVersion PHP version to emulate. Defaults to newest supported.\n     */\n    public function __construct(?PhpVersion $phpVersion = null) {\n        $this->targetPhpVersion = $phpVersion ?? PhpVersion::getNewestSupported();\n        $this->hostPhpVersion = PhpVersion::getHostVersion();\n\n        $emulators = [\n            new FnTokenEmulator(),\n            new MatchTokenEmulator(),\n            new NullsafeTokenEmulator(),\n            new AttributeEmulator(),\n            new EnumTokenEmulator(),\n            new ReadonlyTokenEmulator(),\n            new ExplicitOctalEmulator(),\n            new ReadonlyFunctionTokenEmulator(),\n            new PropertyTokenEmulator(),\n            new AsymmetricVisibilityTokenEmulator(),\n            new PipeOperatorEmulator(),\n            new VoidCastEmulator(),\n        ];\n\n        // Collect emulators that are relevant for the PHP version we're running\n        // and the PHP version we're targeting for emulation.\n        foreach ($emulators as $emulator) {\n            $emulatorPhpVersion = $emulator->getPhpVersion();\n            if ($this->isForwardEmulationNeeded($emulatorPhpVersion)) {\n                $this->emulators[] = $emulator;\n            } elseif ($this->isReverseEmulationNeeded($emulatorPhpVersion)) {\n                $this->emulators[] = new ReverseEmulator($emulator);\n            }\n        }\n    }\n\n    public function tokenize(string $code, ?ErrorHandler $errorHandler = null): array {\n        $emulators = array_filter($this->emulators, function ($emulator) use ($code) {\n            return $emulator->isEmulationNeeded($code);\n        });\n\n        if (empty($emulators)) {\n            // Nothing to emulate, yay\n            return parent::tokenize($code, $errorHandler);\n        }\n\n        if ($errorHandler === null) {\n            $errorHandler = new ErrorHandler\\Throwing();\n        }\n\n        $this->patches = [];\n        foreach ($emulators as $emulator) {\n            $code = $emulator->preprocessCode($code, $this->patches);\n        }\n\n        $collector = new ErrorHandler\\Collecting();\n        $tokens = parent::tokenize($code, $collector);\n        $this->sortPatches();\n        $tokens = $this->fixupTokens($tokens);\n\n        $errors = $collector->getErrors();\n        if (!empty($errors)) {\n            $this->fixupErrors($errors);\n            foreach ($errors as $error) {\n                $errorHandler->handleError($error);\n            }\n        }\n\n        foreach ($emulators as $emulator) {\n            $tokens = $emulator->emulate($code, $tokens);\n        }\n\n        return $tokens;\n    }\n\n    private function isForwardEmulationNeeded(PhpVersion $emulatorPhpVersion): bool {\n        return $this->hostPhpVersion->older($emulatorPhpVersion)\n            && $this->targetPhpVersion->newerOrEqual($emulatorPhpVersion);\n    }\n\n    private function isReverseEmulationNeeded(PhpVersion $emulatorPhpVersion): bool {\n        return $this->hostPhpVersion->newerOrEqual($emulatorPhpVersion)\n            && $this->targetPhpVersion->older($emulatorPhpVersion);\n    }\n\n    private function sortPatches(): void {\n        // Patches may be contributed by different emulators.\n        // Make sure they are sorted by increasing patch position.\n        usort($this->patches, function ($p1, $p2) {\n            return $p1[0] <=> $p2[0];\n        });\n    }\n\n    /**\n     * @param list<Token> $tokens\n     * @return list<Token>\n     */\n    private function fixupTokens(array $tokens): array {\n        if (\\count($this->patches) === 0) {\n            return $tokens;\n        }\n\n        // Load first patch\n        $patchIdx = 0;\n        list($patchPos, $patchType, $patchText) = $this->patches[$patchIdx];\n\n        // We use a manual loop over the tokens, because we modify the array on the fly\n        $posDelta = 0;\n        $lineDelta = 0;\n        for ($i = 0, $c = \\count($tokens); $i < $c; $i++) {\n            $token = $tokens[$i];\n            $pos = $token->pos;\n            $token->pos += $posDelta;\n            $token->line += $lineDelta;\n            $localPosDelta = 0;\n            $len = \\strlen($token->text);\n            while ($patchPos >= $pos && $patchPos < $pos + $len) {\n                $patchTextLen = \\strlen($patchText);\n                if ($patchType === 'remove') {\n                    if ($patchPos === $pos && $patchTextLen === $len) {\n                        // Remove token entirely\n                        array_splice($tokens, $i, 1, []);\n                        $i--;\n                        $c--;\n                    } else {\n                        // Remove from token string\n                        $token->text = substr_replace(\n                            $token->text, '', $patchPos - $pos + $localPosDelta, $patchTextLen\n                        );\n                        $localPosDelta -= $patchTextLen;\n                    }\n                    $lineDelta -= \\substr_count($patchText, \"\\n\");\n                } elseif ($patchType === 'add') {\n                    // Insert into the token string\n                    $token->text = substr_replace(\n                        $token->text, $patchText, $patchPos - $pos + $localPosDelta, 0\n                    );\n                    $localPosDelta += $patchTextLen;\n                    $lineDelta += \\substr_count($patchText, \"\\n\");\n                } elseif ($patchType === 'replace') {\n                    // Replace inside the token string\n                    $token->text = substr_replace(\n                        $token->text, $patchText, $patchPos - $pos + $localPosDelta, $patchTextLen\n                    );\n                } else {\n                    assert(false);\n                }\n\n                // Fetch the next patch\n                $patchIdx++;\n                if ($patchIdx >= \\count($this->patches)) {\n                    // No more patches. However, we still need to adjust position.\n                    $patchPos = \\PHP_INT_MAX;\n                    break;\n                }\n\n                list($patchPos, $patchType, $patchText) = $this->patches[$patchIdx];\n            }\n\n            $posDelta += $localPosDelta;\n        }\n        return $tokens;\n    }\n\n    /**\n     * Fixup line and position information in errors.\n     *\n     * @param Error[] $errors\n     */\n    private function fixupErrors(array $errors): void {\n        foreach ($errors as $error) {\n            $attrs = $error->getAttributes();\n\n            $posDelta = 0;\n            $lineDelta = 0;\n            foreach ($this->patches as $patch) {\n                list($patchPos, $patchType, $patchText) = $patch;\n                if ($patchPos >= $attrs['startFilePos']) {\n                    // No longer relevant\n                    break;\n                }\n\n                if ($patchType === 'add') {\n                    $posDelta += strlen($patchText);\n                    $lineDelta += substr_count($patchText, \"\\n\");\n                } elseif ($patchType === 'remove') {\n                    $posDelta -= strlen($patchText);\n                    $lineDelta -= substr_count($patchText, \"\\n\");\n                }\n            }\n\n            $attrs['startFilePos'] += $posDelta;\n            $attrs['endFilePos'] += $posDelta;\n            $attrs['startLine'] += $lineDelta;\n            $attrs['endLine'] += $lineDelta;\n            $error->setAttributes($attrs);\n        }\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/AsymmetricVisibilityTokenEmulator.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Lexer\\TokenEmulator;\n\nuse PhpParser\\PhpVersion;\nuse PhpParser\\Token;\n\nfinal class AsymmetricVisibilityTokenEmulator extends TokenEmulator {\n    public function getPhpVersion(): PhpVersion {\n        return PhpVersion::fromComponents(8, 4);\n    }\n    public function isEmulationNeeded(string $code): bool {\n        $code = strtolower($code);\n        return strpos($code, 'public(set)') !== false ||\n            strpos($code, 'protected(set)') !== false ||\n            strpos($code, 'private(set)') !== false;\n    }\n\n    public function emulate(string $code, array $tokens): array {\n        $map = [\n            \\T_PUBLIC => \\T_PUBLIC_SET,\n            \\T_PROTECTED => \\T_PROTECTED_SET,\n            \\T_PRIVATE => \\T_PRIVATE_SET,\n        ];\n        for ($i = 0, $c = count($tokens); $i < $c; ++$i) {\n            $token = $tokens[$i];\n            if (isset($map[$token->id]) && $i + 3 < $c && $tokens[$i + 1]->text === '(' &&\n                $tokens[$i + 2]->id === \\T_STRING && \\strtolower($tokens[$i + 2]->text) === 'set' &&\n                $tokens[$i + 3]->text === ')' &&\n                $this->isKeywordContext($tokens, $i)\n            ) {\n                array_splice($tokens, $i, 4, [\n                    new Token(\n                        $map[$token->id], $token->text . '(' . $tokens[$i + 2]->text . ')',\n                        $token->line, $token->pos),\n                ]);\n                $c -= 3;\n            }\n        }\n\n        return $tokens;\n    }\n\n    public function reverseEmulate(string $code, array $tokens): array {\n        $reverseMap = [\n            \\T_PUBLIC_SET => \\T_PUBLIC,\n            \\T_PROTECTED_SET => \\T_PROTECTED,\n            \\T_PRIVATE_SET => \\T_PRIVATE,\n        ];\n        for ($i = 0, $c = count($tokens); $i < $c; ++$i) {\n            $token = $tokens[$i];\n            if (isset($reverseMap[$token->id]) &&\n                \\preg_match('/(public|protected|private)\\((set)\\)/i', $token->text, $matches)\n            ) {\n                [, $modifier, $set] = $matches;\n                $modifierLen = \\strlen($modifier);\n                array_splice($tokens, $i, 1, [\n                    new Token($reverseMap[$token->id], $modifier, $token->line, $token->pos),\n                    new Token(\\ord('('), '(', $token->line, $token->pos + $modifierLen),\n                    new Token(\\T_STRING, $set, $token->line, $token->pos + $modifierLen + 1),\n                    new Token(\\ord(')'), ')', $token->line, $token->pos + $modifierLen + 4),\n                ]);\n                $i += 3;\n                $c += 3;\n            }\n        }\n\n        return $tokens;\n    }\n\n    /** @param Token[] $tokens */\n    protected function isKeywordContext(array $tokens, int $pos): bool {\n        $prevToken = $this->getPreviousNonSpaceToken($tokens, $pos);\n        if ($prevToken === null) {\n            return false;\n        }\n        return $prevToken->id !== \\T_OBJECT_OPERATOR\n            && $prevToken->id !== \\T_NULLSAFE_OBJECT_OPERATOR;\n    }\n\n    /** @param Token[] $tokens */\n    private function getPreviousNonSpaceToken(array $tokens, int $start): ?Token {\n        for ($i = $start - 1; $i >= 0; --$i) {\n            if ($tokens[$i]->id === T_WHITESPACE) {\n                continue;\n            }\n\n            return $tokens[$i];\n        }\n\n        return null;\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/AttributeEmulator.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Lexer\\TokenEmulator;\n\nuse PhpParser\\PhpVersion;\nuse PhpParser\\Token;\n\nfinal class AttributeEmulator extends TokenEmulator {\n    public function getPhpVersion(): PhpVersion {\n        return PhpVersion::fromComponents(8, 0);\n    }\n\n    public function isEmulationNeeded(string $code): bool {\n        return strpos($code, '#[') !== false;\n    }\n\n    public function emulate(string $code, array $tokens): array {\n        // We need to manually iterate and manage a count because we'll change\n        // the tokens array on the way.\n        for ($i = 0, $c = count($tokens); $i < $c; ++$i) {\n            $token = $tokens[$i];\n            if ($token->text === '#' && isset($tokens[$i + 1]) && $tokens[$i + 1]->text === '[') {\n                array_splice($tokens, $i, 2, [\n                    new Token(\\T_ATTRIBUTE, '#[', $token->line, $token->pos),\n                ]);\n                $c--;\n                continue;\n            }\n        }\n\n        return $tokens;\n    }\n\n    public function reverseEmulate(string $code, array $tokens): array {\n        // TODO\n        return $tokens;\n    }\n\n    public function preprocessCode(string $code, array &$patches): string {\n        $pos = 0;\n        while (false !== $pos = strpos($code, '#[', $pos)) {\n            // Replace #[ with %[\n            $code[$pos] = '%';\n            $patches[] = [$pos, 'replace', '#'];\n            $pos += 2;\n        }\n        return $code;\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/EnumTokenEmulator.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Lexer\\TokenEmulator;\n\nuse PhpParser\\PhpVersion;\n\nfinal class EnumTokenEmulator extends KeywordEmulator {\n    public function getPhpVersion(): PhpVersion {\n        return PhpVersion::fromComponents(8, 1);\n    }\n\n    public function getKeywordString(): string {\n        return 'enum';\n    }\n\n    public function getKeywordToken(): int {\n        return \\T_ENUM;\n    }\n\n    protected function isKeywordContext(array $tokens, int $pos): bool {\n        return parent::isKeywordContext($tokens, $pos)\n            && isset($tokens[$pos + 2])\n            && $tokens[$pos + 1]->id === \\T_WHITESPACE\n            && $tokens[$pos + 2]->id === \\T_STRING;\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ExplicitOctalEmulator.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Lexer\\TokenEmulator;\n\nuse PhpParser\\PhpVersion;\nuse PhpParser\\Token;\n\nclass ExplicitOctalEmulator extends TokenEmulator {\n    public function getPhpVersion(): PhpVersion {\n        return PhpVersion::fromComponents(8, 1);\n    }\n\n    public function isEmulationNeeded(string $code): bool {\n        return strpos($code, '0o') !== false || strpos($code, '0O') !== false;\n    }\n\n    public function emulate(string $code, array $tokens): array {\n        for ($i = 0, $c = count($tokens); $i < $c; ++$i) {\n            $token = $tokens[$i];\n            if ($token->id == \\T_LNUMBER && $token->text === '0' &&\n                isset($tokens[$i + 1]) && $tokens[$i + 1]->id == \\T_STRING &&\n                preg_match('/[oO][0-7]+(?:_[0-7]+)*/', $tokens[$i + 1]->text)\n            ) {\n                $tokenKind = $this->resolveIntegerOrFloatToken($tokens[$i + 1]->text);\n                array_splice($tokens, $i, 2, [\n                    new Token($tokenKind, '0' . $tokens[$i + 1]->text, $token->line, $token->pos),\n                ]);\n                $c--;\n            }\n        }\n        return $tokens;\n    }\n\n    private function resolveIntegerOrFloatToken(string $str): int {\n        $str = substr($str, 1);\n        $str = str_replace('_', '', $str);\n        $num = octdec($str);\n        return is_float($num) ? \\T_DNUMBER : \\T_LNUMBER;\n    }\n\n    public function reverseEmulate(string $code, array $tokens): array {\n        // Explicit octals were not legal code previously, don't bother.\n        return $tokens;\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FnTokenEmulator.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Lexer\\TokenEmulator;\n\nuse PhpParser\\PhpVersion;\n\n// Retained for reverse emulation support only.\nfinal class FnTokenEmulator extends KeywordEmulator {\n    public function getPhpVersion(): PhpVersion {\n        return PhpVersion::fromString('7.4');\n    }\n\n    public function getKeywordString(): string {\n        return 'fn';\n    }\n\n    public function getKeywordToken(): int {\n        return \\T_FN;\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/KeywordEmulator.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Lexer\\TokenEmulator;\n\nuse PhpParser\\Token;\n\nabstract class KeywordEmulator extends TokenEmulator {\n    abstract public function getKeywordString(): string;\n    abstract public function getKeywordToken(): int;\n\n    public function isEmulationNeeded(string $code): bool {\n        return strpos(strtolower($code), $this->getKeywordString()) !== false;\n    }\n\n    /** @param Token[] $tokens */\n    protected function isKeywordContext(array $tokens, int $pos): bool {\n        $prevToken = $this->getPreviousNonIgnorableToken($tokens, $pos);\n        if ($prevToken === null) {\n            return false;\n        }\n        return $prevToken->id !== \\T_OBJECT_OPERATOR\n            && $prevToken->id !== \\T_NULLSAFE_OBJECT_OPERATOR;\n    }\n\n    public function emulate(string $code, array $tokens): array {\n        $keywordString = $this->getKeywordString();\n        foreach ($tokens as $i => $token) {\n            if ($token->id === T_STRING && strtolower($token->text) === $keywordString\n                    && $this->isKeywordContext($tokens, $i)) {\n                $token->id = $this->getKeywordToken();\n            }\n        }\n\n        return $tokens;\n    }\n\n    /** @param Token[] $tokens */\n    private function getPreviousNonIgnorableToken(array $tokens, int $start): ?Token {\n        for ($i = $start - 1; $i >= 0; --$i) {\n            $token = $tokens[$i];\n            if ($token->id === T_WHITESPACE || $token->id == T_COMMENT || $token->id === T_DOC_COMMENT) {\n                continue;\n            }\n\n            return $token;\n        }\n\n        return null;\n    }\n\n    public function reverseEmulate(string $code, array $tokens): array {\n        $keywordToken = $this->getKeywordToken();\n        foreach ($tokens as $token) {\n            if ($token->id === $keywordToken) {\n                $token->id = \\T_STRING;\n            }\n        }\n\n        return $tokens;\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/MatchTokenEmulator.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Lexer\\TokenEmulator;\n\nuse PhpParser\\PhpVersion;\n\nfinal class MatchTokenEmulator extends KeywordEmulator {\n    public function getPhpVersion(): PhpVersion {\n        return PhpVersion::fromComponents(8, 0);\n    }\n\n    public function getKeywordString(): string {\n        return 'match';\n    }\n\n    public function getKeywordToken(): int {\n        return \\T_MATCH;\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NullsafeTokenEmulator.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Lexer\\TokenEmulator;\n\nuse PhpParser\\PhpVersion;\nuse PhpParser\\Token;\n\nfinal class NullsafeTokenEmulator extends TokenEmulator {\n    public function getPhpVersion(): PhpVersion {\n        return PhpVersion::fromComponents(8, 0);\n    }\n\n    public function isEmulationNeeded(string $code): bool {\n        return strpos($code, '?->') !== false;\n    }\n\n    public function emulate(string $code, array $tokens): array {\n        // We need to manually iterate and manage a count because we'll change\n        // the tokens array on the way\n        for ($i = 0, $c = count($tokens); $i < $c; ++$i) {\n            $token = $tokens[$i];\n            if ($token->text === '?' && isset($tokens[$i + 1]) && $tokens[$i + 1]->id === \\T_OBJECT_OPERATOR) {\n                array_splice($tokens, $i, 2, [\n                    new Token(\\T_NULLSAFE_OBJECT_OPERATOR, '?->', $token->line, $token->pos),\n                ]);\n                $c--;\n                continue;\n            }\n\n            // Handle ?-> inside encapsed string.\n            if ($token->id === \\T_ENCAPSED_AND_WHITESPACE && isset($tokens[$i - 1])\n                && $tokens[$i - 1]->id === \\T_VARIABLE\n                && preg_match('/^\\?->([a-zA-Z_\\x80-\\xff][a-zA-Z0-9_\\x80-\\xff]*)/', $token->text, $matches)\n            ) {\n                $replacement = [\n                    new Token(\\T_NULLSAFE_OBJECT_OPERATOR, '?->', $token->line, $token->pos),\n                    new Token(\\T_STRING, $matches[1], $token->line, $token->pos + 3),\n                ];\n                $matchLen = \\strlen($matches[0]);\n                if ($matchLen !== \\strlen($token->text)) {\n                    $replacement[] = new Token(\n                        \\T_ENCAPSED_AND_WHITESPACE,\n                        \\substr($token->text, $matchLen),\n                        $token->line, $token->pos + $matchLen\n                    );\n                }\n                array_splice($tokens, $i, 1, $replacement);\n                $c += \\count($replacement) - 1;\n                continue;\n            }\n        }\n\n        return $tokens;\n    }\n\n    public function reverseEmulate(string $code, array $tokens): array {\n        // ?-> was not valid code previously, don't bother.\n        return $tokens;\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/PipeOperatorEmulator.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Lexer\\TokenEmulator;\n\nuse PhpParser\\Lexer\\TokenEmulator\\TokenEmulator;\nuse PhpParser\\PhpVersion;\nuse PhpParser\\Token;\n\nclass PipeOperatorEmulator extends TokenEmulator {\n    public function getPhpVersion(): PhpVersion {\n        return PhpVersion::fromComponents(8, 5);\n    }\n\n    public function isEmulationNeeded(string $code): bool {\n        return \\strpos($code, '|>') !== false;\n    }\n\n    public function emulate(string $code, array $tokens): array {\n        for ($i = 0, $c = count($tokens); $i < $c; ++$i) {\n            $token = $tokens[$i];\n            if ($token->text === '|' && isset($tokens[$i + 1]) && $tokens[$i + 1]->text === '>') {\n                array_splice($tokens, $i, 2, [\n                    new Token(\\T_PIPE, '|>', $token->line, $token->pos),\n                ]);\n                $c--;\n            }\n        }\n        return $tokens;\n    }\n\n    public function reverseEmulate(string $code, array $tokens): array {\n        for ($i = 0, $c = count($tokens); $i < $c; ++$i) {\n            $token = $tokens[$i];\n            if ($token->id === \\T_PIPE) {\n                array_splice($tokens, $i, 1, [\n                    new Token(\\ord('|'), '|', $token->line, $token->pos),\n                    new Token(\\ord('>'), '>', $token->line, $token->pos + 1),\n                ]);\n                $i++;\n                $c++;\n            }\n        }\n        return $tokens;\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/PropertyTokenEmulator.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Lexer\\TokenEmulator;\n\nuse PhpParser\\PhpVersion;\n\nfinal class PropertyTokenEmulator extends KeywordEmulator {\n    public function getPhpVersion(): PhpVersion {\n        return PhpVersion::fromComponents(8, 4);\n    }\n\n    public function getKeywordString(): string {\n        return '__property__';\n    }\n\n    public function getKeywordToken(): int {\n        return \\T_PROPERTY_C;\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyFunctionTokenEmulator.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Lexer\\TokenEmulator;\n\nuse PhpParser\\PhpVersion;\n\n/*\n * In PHP 8.1, \"readonly(\" was special cased in the lexer in order to support functions with\n * name readonly. In PHP 8.2, this may conflict with readonly properties having a DNF type. For\n * this reason, PHP 8.2 instead treats this as T_READONLY and then handles it specially in the\n * parser. This emulator only exists to handle this special case, which is skipped by the\n * PHP 8.1 ReadonlyTokenEmulator.\n */\nclass ReadonlyFunctionTokenEmulator extends KeywordEmulator {\n    public function getKeywordString(): string {\n        return 'readonly';\n    }\n\n    public function getKeywordToken(): int {\n        return \\T_READONLY;\n    }\n\n    public function getPhpVersion(): PhpVersion {\n        return PhpVersion::fromComponents(8, 2);\n    }\n\n    public function reverseEmulate(string $code, array $tokens): array {\n        // Don't bother\n        return $tokens;\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyTokenEmulator.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Lexer\\TokenEmulator;\n\nuse PhpParser\\PhpVersion;\n\nfinal class ReadonlyTokenEmulator extends KeywordEmulator {\n    public function getPhpVersion(): PhpVersion {\n        return PhpVersion::fromComponents(8, 1);\n    }\n\n    public function getKeywordString(): string {\n        return 'readonly';\n    }\n\n    public function getKeywordToken(): int {\n        return \\T_READONLY;\n    }\n\n    protected function isKeywordContext(array $tokens, int $pos): bool {\n        if (!parent::isKeywordContext($tokens, $pos)) {\n            return false;\n        }\n        // Support \"function readonly(\"\n        return !(isset($tokens[$pos + 1]) &&\n                 ($tokens[$pos + 1]->text === '(' ||\n                  ($tokens[$pos + 1]->id === \\T_WHITESPACE &&\n                   isset($tokens[$pos + 2]) &&\n                   $tokens[$pos + 2]->text === '(')));\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReverseEmulator.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Lexer\\TokenEmulator;\n\nuse PhpParser\\PhpVersion;\n\n/**\n * Reverses emulation direction of the inner emulator.\n */\nfinal class ReverseEmulator extends TokenEmulator {\n    /** @var TokenEmulator Inner emulator */\n    private TokenEmulator $emulator;\n\n    public function __construct(TokenEmulator $emulator) {\n        $this->emulator = $emulator;\n    }\n\n    public function getPhpVersion(): PhpVersion {\n        return $this->emulator->getPhpVersion();\n    }\n\n    public function isEmulationNeeded(string $code): bool {\n        return $this->emulator->isEmulationNeeded($code);\n    }\n\n    public function emulate(string $code, array $tokens): array {\n        return $this->emulator->reverseEmulate($code, $tokens);\n    }\n\n    public function reverseEmulate(string $code, array $tokens): array {\n        return $this->emulator->emulate($code, $tokens);\n    }\n\n    public function preprocessCode(string $code, array &$patches): string {\n        return $code;\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/TokenEmulator.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Lexer\\TokenEmulator;\n\nuse PhpParser\\PhpVersion;\nuse PhpParser\\Token;\n\n/** @internal */\nabstract class TokenEmulator {\n    abstract public function getPhpVersion(): PhpVersion;\n\n    abstract public function isEmulationNeeded(string $code): bool;\n\n    /**\n     * @param Token[] $tokens Original tokens\n     * @return Token[] Modified Tokens\n     */\n    abstract public function emulate(string $code, array $tokens): array;\n\n    /**\n     * @param Token[] $tokens Original tokens\n     * @return Token[] Modified Tokens\n     */\n    abstract public function reverseEmulate(string $code, array $tokens): array;\n\n    /** @param array{int, string, string}[] $patches */\n    public function preprocessCode(string $code, array &$patches): string {\n        return $code;\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/VoidCastEmulator.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Lexer\\TokenEmulator;\n\nuse PhpParser\\PhpVersion;\nuse PhpParser\\Token;\n\nclass VoidCastEmulator extends TokenEmulator {\n    public function getPhpVersion(): PhpVersion {\n        return PhpVersion::fromComponents(8, 5);\n    }\n\n    public function isEmulationNeeded(string $code): bool {\n        return (bool)\\preg_match('/\\([ \\t]*void[ \\t]*\\)/i', $code);\n    }\n\n    public function emulate(string $code, array $tokens): array {\n        for ($i = 0, $c = count($tokens); $i < $c; ++$i) {\n            $token = $tokens[$i];\n            if ($token->text !== '(') {\n                continue;\n            }\n\n            $numTokens = 1;\n            $text = '(';\n            $j = $i + 1;\n            if ($j < $c && $tokens[$j]->id === \\T_WHITESPACE && preg_match('/[ \\t]+/', $tokens[$j]->text)) {\n                $text .= $tokens[$j]->text;\n                $numTokens++;\n                $j++;\n            }\n\n            if ($j >= $c || $tokens[$j]->id !== \\T_STRING || \\strtolower($tokens[$j]->text) !== 'void') {\n                continue;\n            }\n\n            $text .= $tokens[$j]->text;\n            $numTokens++;\n            $k = $j + 1;\n            if ($k < $c && $tokens[$k]->id === \\T_WHITESPACE && preg_match('/[ \\t]+/', $tokens[$k]->text)) {\n                $text .= $tokens[$k]->text;\n                $numTokens++;\n                $k++;\n            }\n\n            if ($k >= $c || $tokens[$k]->text !== ')') {\n                continue;\n            }\n\n            $text .= ')';\n            $numTokens++;\n            array_splice($tokens, $i, $numTokens, [\n                new Token(\\T_VOID_CAST, $text, $token->line, $token->pos),\n            ]);\n            $c -= $numTokens - 1;\n        }\n        return $tokens;\n    }\n\n    public function reverseEmulate(string $code, array $tokens): array {\n        for ($i = 0, $c = count($tokens); $i < $c; ++$i) {\n            $token = $tokens[$i];\n            if ($token->id !== \\T_VOID_CAST) {\n                continue;\n            }\n\n            if (!preg_match('/^\\(([ \\t]*)(void)([ \\t]*)\\)$/i', $token->text, $match)) {\n                throw new \\LogicException('Unexpected T_VOID_CAST contents');\n            }\n\n            $newTokens = [];\n            $pos = $token->pos;\n\n            $newTokens[] = new Token(\\ord('('), '(', $token->line, $pos);\n            $pos++;\n\n            if ($match[1] !== '') {\n                $newTokens[] = new Token(\\T_WHITESPACE, $match[1], $token->line, $pos);\n                $pos += \\strlen($match[1]);\n            }\n\n            $newTokens[] = new Token(\\T_STRING, $match[2], $token->line, $pos);\n            $pos += \\strlen($match[2]);\n\n            if ($match[3] !== '') {\n                $newTokens[] = new Token(\\T_WHITESPACE, $match[3], $token->line, $pos);\n                $pos += \\strlen($match[3]);\n            }\n\n            $newTokens[] = new Token(\\ord(')'), ')', $token->line, $pos);\n\n            array_splice($tokens, $i, 1, $newTokens);\n            $i += \\count($newTokens) - 1;\n            $c += \\count($newTokens) - 1;\n        }\n        return $tokens;\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Lexer.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser;\n\nrequire __DIR__ . '/compatibility_tokens.php';\n\nclass Lexer {\n    /**\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     */\n    public function tokenize(string $code, ?ErrorHandler $errorHandler = null): array {\n        if (null === $errorHandler) {\n            $errorHandler = new ErrorHandler\\Throwing();\n        }\n\n        $scream = ini_set('xdebug.scream', '0');\n\n        $tokens = @Token::tokenize($code);\n        $this->postprocessTokens($tokens, $errorHandler);\n\n        if (false !== $scream) {\n            ini_set('xdebug.scream', $scream);\n        }\n\n        return $tokens;\n    }\n\n    private function handleInvalidCharacter(Token $token, ErrorHandler $errorHandler): void {\n        $chr = $token->text;\n        if ($chr === \"\\0\") {\n            // PHP cuts error message after null byte, so need special case\n            $errorMsg = 'Unexpected null byte';\n        } else {\n            $errorMsg = sprintf(\n                'Unexpected character \"%s\" (ASCII %d)', $chr, ord($chr)\n            );\n        }\n\n        $errorHandler->handleError(new Error($errorMsg, [\n            'startLine' => $token->line,\n            'endLine' => $token->line,\n            'startFilePos' => $token->pos,\n            'endFilePos' => $token->pos,\n        ]));\n    }\n\n    private function isUnterminatedComment(Token $token): bool {\n        return $token->is([\\T_COMMENT, \\T_DOC_COMMENT])\n            && substr($token->text, 0, 2) === '/*'\n            && substr($token->text, -2) !== '*/';\n    }\n\n    /**\n     * @param list<Token> $tokens\n     */\n    protected function postprocessTokens(array &$tokens, ErrorHandler $errorHandler): void {\n        // This function reports errors (bad characters and unterminated comments) in the token\n        // array, and performs certain canonicalizations:\n        //  * Use PHP 8.1 T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG and\n        //    T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG tokens used to disambiguate intersection types.\n        //  * Add a sentinel token with ID 0.\n\n        $numTokens = \\count($tokens);\n        if ($numTokens === 0) {\n            // Empty input edge case: Just add the sentinel token.\n            $tokens[] = new Token(0, \"\\0\", 1, 0);\n            return;\n        }\n\n        for ($i = 0; $i < $numTokens; $i++) {\n            $token = $tokens[$i];\n            if ($token->id === \\T_BAD_CHARACTER) {\n                $this->handleInvalidCharacter($token, $errorHandler);\n            }\n\n            if ($token->id === \\ord('&')) {\n                $next = $i + 1;\n                while (isset($tokens[$next]) && $tokens[$next]->id === \\T_WHITESPACE) {\n                    $next++;\n                }\n                $followedByVarOrVarArg = isset($tokens[$next]) &&\n                    $tokens[$next]->is([\\T_VARIABLE, \\T_ELLIPSIS]);\n                $token->id = $followedByVarOrVarArg\n                    ? \\T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG\n                    : \\T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG;\n            }\n        }\n\n        // Check for unterminated comment\n        $lastToken = $tokens[$numTokens - 1];\n        if ($this->isUnterminatedComment($lastToken)) {\n            $errorHandler->handleError(new Error('Unterminated comment', [\n                'startLine' => $lastToken->line,\n                'endLine' => $lastToken->getEndLine(),\n                'startFilePos' => $lastToken->pos,\n                'endFilePos' => $lastToken->getEndPos(),\n            ]));\n        }\n\n        // Add sentinel token.\n        $tokens[] = new Token(0, \"\\0\", $lastToken->getEndLine(), $lastToken->getEndPos());\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Modifiers.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser;\n\n/**\n * Modifiers used (as a bit mask) by various flags subnodes, for example on classes, functions,\n * properties and constants.\n */\nfinal class Modifiers {\n    public const PUBLIC    =  1;\n    public const PROTECTED =  2;\n    public const PRIVATE   =  4;\n    public const STATIC    =  8;\n    public const ABSTRACT  = 16;\n    public const FINAL     = 32;\n    public const READONLY  = 64;\n    public const PUBLIC_SET = 128;\n    public const PROTECTED_SET = 256;\n    public const PRIVATE_SET = 512;\n\n    public const VISIBILITY_MASK = self::PUBLIC | self::PROTECTED | self::PRIVATE;\n\n    public const VISIBILITY_SET_MASK = self::PUBLIC_SET | self::PROTECTED_SET | self::PRIVATE_SET;\n\n    private const TO_STRING_MAP = [\n        self::PUBLIC  => 'public',\n        self::PROTECTED => 'protected',\n        self::PRIVATE => 'private',\n        self::STATIC  => 'static',\n        self::ABSTRACT => 'abstract',\n        self::FINAL  => 'final',\n        self::READONLY  => 'readonly',\n        self::PUBLIC_SET => 'public(set)',\n        self::PROTECTED_SET => 'protected(set)',\n        self::PRIVATE_SET => 'private(set)',\n    ];\n\n    public static function toString(int $modifier): string {\n        if (!isset(self::TO_STRING_MAP[$modifier])) {\n            throw new \\InvalidArgumentException(\"Unknown modifier $modifier\");\n        }\n        return self::TO_STRING_MAP[$modifier];\n    }\n\n    private static function isValidModifier(int $modifier): bool {\n        $isPow2 = ($modifier & ($modifier - 1)) == 0 && $modifier != 0;\n        return $isPow2 && $modifier <= self::PRIVATE_SET;\n    }\n\n    /**\n     * @internal\n     */\n    public static function verifyClassModifier(int $a, int $b): void {\n        assert(self::isValidModifier($b));\n        if (($a & $b) != 0) {\n            throw new Error(\n                'Multiple ' . self::toString($b) . ' modifiers are not allowed');\n        }\n\n        if ($a & 48 && $b & 48) {\n            throw new Error('Cannot use the final modifier on an abstract class');\n        }\n    }\n\n    /**\n     * @internal\n     */\n    public static function verifyModifier(int $a, int $b): void {\n        assert(self::isValidModifier($b));\n        if (($a & Modifiers::VISIBILITY_MASK && $b & Modifiers::VISIBILITY_MASK) ||\n            ($a & Modifiers::VISIBILITY_SET_MASK && $b & Modifiers::VISIBILITY_SET_MASK)\n        ) {\n            throw new Error('Multiple access type modifiers are not allowed');\n        }\n\n        if (($a & $b) != 0) {\n            throw new Error(\n                'Multiple ' . self::toString($b) . ' modifiers are not allowed');\n        }\n\n        if ($a & 48 && $b & 48) {\n            throw new Error('Cannot use the final modifier on an abstract class member');\n        }\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/NameContext.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser;\n\nuse PhpParser\\Node\\Name;\nuse PhpParser\\Node\\Name\\FullyQualified;\nuse PhpParser\\Node\\Stmt;\n\nclass NameContext {\n    /** @var null|Name Current namespace */\n    protected ?Name $namespace;\n\n    /** @var Name[][] Map of format [aliasType => [aliasName => originalName]] */\n    protected array $aliases = [];\n\n    /** @var Name[][] Same as $aliases but preserving original case */\n    protected array $origAliases = [];\n\n    /** @var ErrorHandler Error handler */\n    protected ErrorHandler $errorHandler;\n\n    /**\n     * Create a name context.\n     *\n     * @param ErrorHandler $errorHandler Error handling used to report errors\n     */\n    public function __construct(ErrorHandler $errorHandler) {\n        $this->errorHandler = $errorHandler;\n    }\n\n    /**\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     */\n    public function startNamespace(?Name $namespace = null): void {\n        $this->namespace = $namespace;\n        $this->origAliases = $this->aliases = [\n            Stmt\\Use_::TYPE_NORMAL   => [],\n            Stmt\\Use_::TYPE_FUNCTION => [],\n            Stmt\\Use_::TYPE_CONSTANT => [],\n        ];\n    }\n\n    /**\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     */\n    public function addAlias(Name $name, string $aliasName, int $type, array $errorAttrs = []): void {\n        // Constant names are case sensitive, everything else case insensitive\n        if ($type === Stmt\\Use_::TYPE_CONSTANT) {\n            $aliasLookupName = $aliasName;\n        } else {\n            $aliasLookupName = strtolower($aliasName);\n        }\n\n        if (isset($this->aliases[$type][$aliasLookupName])) {\n            $typeStringMap = [\n                Stmt\\Use_::TYPE_NORMAL   => '',\n                Stmt\\Use_::TYPE_FUNCTION => 'function ',\n                Stmt\\Use_::TYPE_CONSTANT => 'const ',\n            ];\n\n            $this->errorHandler->handleError(new Error(\n                sprintf(\n                    'Cannot use %s%s as %s because the name is already in use',\n                    $typeStringMap[$type], $name, $aliasName\n                ),\n                $errorAttrs\n            ));\n            return;\n        }\n\n        $this->aliases[$type][$aliasLookupName] = $name;\n        $this->origAliases[$type][$aliasName] = $name;\n    }\n\n    /**\n     * Get current namespace.\n     *\n     * @return null|Name Namespace (or null if global namespace)\n     */\n    public function getNamespace(): ?Name {\n        return $this->namespace;\n    }\n\n    /**\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     */\n    public function getResolvedName(Name $name, int $type): ?Name {\n        // don't resolve special class names\n        if ($type === Stmt\\Use_::TYPE_NORMAL && $name->isSpecialClassName()) {\n            if (!$name->isUnqualified()) {\n                $this->errorHandler->handleError(new Error(\n                    sprintf(\"'\\\\%s' is an invalid class name\", $name->toString()),\n                    $name->getAttributes()\n                ));\n            }\n            return $name;\n        }\n\n        // fully qualified names are already resolved\n        if ($name->isFullyQualified()) {\n            return $name;\n        }\n\n        // Try to resolve aliases\n        if (null !== $resolvedName = $this->resolveAlias($name, $type)) {\n            return $resolvedName;\n        }\n\n        if ($type !== Stmt\\Use_::TYPE_NORMAL && $name->isUnqualified()) {\n            if (null === $this->namespace) {\n                // outside of a namespace unaliased unqualified is same as fully qualified\n                return new FullyQualified($name, $name->getAttributes());\n            }\n\n            // Cannot resolve statically\n            return null;\n        }\n\n        // if no alias exists prepend current namespace\n        return FullyQualified::concat($this->namespace, $name, $name->getAttributes());\n    }\n\n    /**\n     * Get resolved class name.\n     *\n     * @param Name $name Class ame to resolve\n     *\n     * @return Name Resolved name\n     */\n    public function getResolvedClassName(Name $name): Name {\n        return $this->getResolvedName($name, Stmt\\Use_::TYPE_NORMAL);\n    }\n\n    /**\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     */\n    public function getPossibleNames(string $name, int $type): array {\n        $lcName = strtolower($name);\n\n        if ($type === Stmt\\Use_::TYPE_NORMAL) {\n            // self, parent and static must always be unqualified\n            if ($lcName === \"self\" || $lcName === \"parent\" || $lcName === \"static\") {\n                return [new Name($name)];\n            }\n        }\n\n        // Collect possible ways to write this name, starting with the fully-qualified name\n        $possibleNames = [new FullyQualified($name)];\n\n        if (null !== $nsRelativeName = $this->getNamespaceRelativeName($name, $lcName, $type)) {\n            // Make sure there is no alias that makes the normally namespace-relative name\n            // into something else\n            if (null === $this->resolveAlias($nsRelativeName, $type)) {\n                $possibleNames[] = $nsRelativeName;\n            }\n        }\n\n        // Check for relevant namespace use statements\n        foreach ($this->origAliases[Stmt\\Use_::TYPE_NORMAL] as $alias => $orig) {\n            $lcOrig = $orig->toLowerString();\n            if (0 === strpos($lcName, $lcOrig . '\\\\')) {\n                $possibleNames[] = new Name($alias . substr($name, strlen($lcOrig)));\n            }\n        }\n\n        // Check for relevant type-specific use statements\n        foreach ($this->origAliases[$type] as $alias => $orig) {\n            if ($type === Stmt\\Use_::TYPE_CONSTANT) {\n                // Constants are complicated-sensitive\n                $normalizedOrig = $this->normalizeConstName($orig->toString());\n                if ($normalizedOrig === $this->normalizeConstName($name)) {\n                    $possibleNames[] = new Name($alias);\n                }\n            } else {\n                // Everything else is case-insensitive\n                if ($orig->toLowerString() === $lcName) {\n                    $possibleNames[] = new Name($alias);\n                }\n            }\n        }\n\n        return $possibleNames;\n    }\n\n    /**\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     */\n    public function getShortName(string $name, int $type): Name {\n        $possibleNames = $this->getPossibleNames($name, $type);\n\n        // Find shortest name\n        $shortestName = null;\n        $shortestLength = \\INF;\n        foreach ($possibleNames as $possibleName) {\n            $length = strlen($possibleName->toCodeString());\n            if ($length < $shortestLength) {\n                $shortestName = $possibleName;\n                $shortestLength = $length;\n            }\n        }\n\n        return $shortestName;\n    }\n\n    private function resolveAlias(Name $name, int $type): ?FullyQualified {\n        $firstPart = $name->getFirst();\n\n        if ($name->isQualified()) {\n            // resolve aliases for qualified names, always against class alias table\n            $checkName = strtolower($firstPart);\n            if (isset($this->aliases[Stmt\\Use_::TYPE_NORMAL][$checkName])) {\n                $alias = $this->aliases[Stmt\\Use_::TYPE_NORMAL][$checkName];\n                return FullyQualified::concat($alias, $name->slice(1), $name->getAttributes());\n            }\n        } elseif ($name->isUnqualified()) {\n            // constant aliases are case-sensitive, function aliases case-insensitive\n            $checkName = $type === Stmt\\Use_::TYPE_CONSTANT ? $firstPart : strtolower($firstPart);\n            if (isset($this->aliases[$type][$checkName])) {\n                // resolve unqualified aliases\n                return new FullyQualified($this->aliases[$type][$checkName], $name->getAttributes());\n            }\n        }\n\n        // No applicable aliases\n        return null;\n    }\n\n    private function getNamespaceRelativeName(string $name, string $lcName, int $type): ?Name {\n        if (null === $this->namespace) {\n            return new Name($name);\n        }\n\n        if ($type === Stmt\\Use_::TYPE_CONSTANT) {\n            // The constants true/false/null always resolve to the global symbols, even inside a\n            // namespace, so they may be used without qualification\n            if ($lcName === \"true\" || $lcName === \"false\" || $lcName === \"null\") {\n                return new Name($name);\n            }\n        }\n\n        $namespacePrefix = strtolower($this->namespace . '\\\\');\n        if (0 === strpos($lcName, $namespacePrefix)) {\n            return new Name(substr($name, strlen($namespacePrefix)));\n        }\n\n        return null;\n    }\n\n    private function normalizeConstName(string $name): string {\n        $nsSep = strrpos($name, '\\\\');\n        if (false === $nsSep) {\n            return $name;\n        }\n\n        // Constants have case-insensitive namespace and case-sensitive short-name\n        $ns = substr($name, 0, $nsSep);\n        $shortName = substr($name, $nsSep + 1);\n        return strtolower($ns) . '\\\\' . $shortName;\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Arg.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node;\n\nuse PhpParser\\NodeAbstract;\n\nclass Arg extends NodeAbstract {\n    /** @var Identifier|null Parameter name (for named parameters) */\n    public ?Identifier $name;\n    /** @var Expr Value to pass */\n    public Expr $value;\n    /** @var bool Whether to pass by ref */\n    public bool $byRef;\n    /** @var bool Whether to unpack the argument */\n    public bool $unpack;\n\n    /**\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     */\n    public function __construct(\n        Expr $value, bool $byRef = false, bool $unpack = false, array $attributes = [],\n        ?Identifier $name = null\n    ) {\n        $this->attributes = $attributes;\n        $this->name = $name;\n        $this->value = $value;\n        $this->byRef = $byRef;\n        $this->unpack = $unpack;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['name', 'value', 'byRef', 'unpack'];\n    }\n\n    public function getType(): string {\n        return 'Arg';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/ArrayItem.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node;\n\nuse PhpParser\\NodeAbstract;\n\nclass ArrayItem extends NodeAbstract {\n    /** @var null|Expr Key */\n    public ?Expr $key;\n    /** @var Expr Value */\n    public Expr $value;\n    /** @var bool Whether to assign by reference */\n    public bool $byRef;\n    /** @var bool Whether to unpack the argument */\n    public bool $unpack;\n\n    /**\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     */\n    public function __construct(Expr $value, ?Expr $key = null, bool $byRef = false, array $attributes = [], bool $unpack = false) {\n        $this->attributes = $attributes;\n        $this->key = $key;\n        $this->value = $value;\n        $this->byRef = $byRef;\n        $this->unpack = $unpack;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['key', 'value', 'byRef', 'unpack'];\n    }\n\n    public function getType(): string {\n        return 'ArrayItem';\n    }\n}\n\n// @deprecated compatibility alias\nclass_alias(ArrayItem::class, Expr\\ArrayItem::class);\n","vendor/nikic/php-parser/lib/PhpParser/Node/Attribute.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node;\n\nuse PhpParser\\Node;\nuse PhpParser\\NodeAbstract;\n\nclass Attribute extends NodeAbstract {\n    /** @var Name Attribute name */\n    public Name $name;\n\n    /** @var list<Arg> Attribute arguments */\n    public array $args;\n\n    /**\n     * @param Node\\Name $name Attribute name\n     * @param list<Arg> $args Attribute arguments\n     * @param array<string, mixed> $attributes Additional node attributes\n     */\n    public function __construct(Name $name, array $args = [], array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->name = $name;\n        $this->args = $args;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['name', 'args'];\n    }\n\n    public function getType(): string {\n        return 'Attribute';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/AttributeGroup.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node;\n\nuse PhpParser\\NodeAbstract;\n\nclass AttributeGroup extends NodeAbstract {\n    /** @var Attribute[] Attributes */\n    public array $attrs;\n\n    /**\n     * @param Attribute[] $attrs PHP attributes\n     * @param array<string, mixed> $attributes Additional node attributes\n     */\n    public function __construct(array $attrs, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->attrs = $attrs;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['attrs'];\n    }\n\n    public function getType(): string {\n        return 'AttributeGroup';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/ClosureUse.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node;\n\nuse PhpParser\\NodeAbstract;\n\nclass ClosureUse extends NodeAbstract {\n    /** @var Expr\\Variable Variable to use */\n    public Expr\\Variable $var;\n    /** @var bool Whether to use by reference */\n    public bool $byRef;\n\n    /**\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     */\n    public function __construct(Expr\\Variable $var, bool $byRef = false, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->var = $var;\n        $this->byRef = $byRef;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['var', 'byRef'];\n    }\n\n    public function getType(): string {\n        return 'ClosureUse';\n    }\n}\n\n// @deprecated compatibility alias\nclass_alias(ClosureUse::class, Expr\\ClosureUse::class);\n","vendor/nikic/php-parser/lib/PhpParser/Node/ComplexType.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node;\n\nuse PhpParser\\NodeAbstract;\n\n/**\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 */\nabstract class ComplexType extends NodeAbstract {\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Const_.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node;\n\nuse PhpParser\\NodeAbstract;\n\nclass Const_ extends NodeAbstract {\n    /** @var Identifier Name */\n    public Identifier $name;\n    /** @var Expr Value */\n    public Expr $value;\n\n    /** @var Name|null Namespaced name (if using NameResolver) */\n    public ?Name $namespacedName;\n\n    /**\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     */\n    public function __construct($name, Expr $value, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->name = \\is_string($name) ? new Identifier($name) : $name;\n        $this->value = $value;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['name', 'value'];\n    }\n\n    public function getType(): string {\n        return 'Const';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/DeclareItem.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node;\n\nuse PhpParser\\Node;\nuse PhpParser\\NodeAbstract;\n\nclass DeclareItem extends NodeAbstract {\n    /** @var Node\\Identifier Key */\n    public Identifier $key;\n    /** @var Node\\Expr Value */\n    public Expr $value;\n\n    /**\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     */\n    public function __construct($key, Node\\Expr $value, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->key = \\is_string($key) ? new Node\\Identifier($key) : $key;\n        $this->value = $value;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['key', 'value'];\n    }\n\n    public function getType(): string {\n        return 'DeclareItem';\n    }\n}\n\n// @deprecated compatibility alias\nclass_alias(DeclareItem::class, Stmt\\DeclareDeclare::class);\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayDimFetch.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr;\n\nuse PhpParser\\Node\\Expr;\n\nclass ArrayDimFetch extends Expr {\n    /** @var Expr Variable */\n    public Expr $var;\n    /** @var null|Expr Array index / dim */\n    public ?Expr $dim;\n\n    /**\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     */\n    public function __construct(Expr $var, ?Expr $dim = null, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->var = $var;\n        $this->dim = $dim;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['var', 'dim'];\n    }\n\n    public function getType(): string {\n        return 'Expr_ArrayDimFetch';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayItem.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr;\n\nrequire __DIR__ . '/../ArrayItem.php';\n\nif (false) {\n    /**\n     * For classmap-authoritative support.\n     *\n     * @deprecated use \\PhpParser\\Node\\ArrayItem instead.\n     */\n    class ArrayItem extends \\PhpParser\\Node\\ArrayItem {\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Array_.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr;\n\nuse PhpParser\\Node\\ArrayItem;\nuse PhpParser\\Node\\Expr;\n\nclass Array_ extends Expr {\n    // For use in \"kind\" attribute\n    public const KIND_LONG = 1;  // array() syntax\n    public const KIND_SHORT = 2; // [] syntax\n\n    /** @var ArrayItem[] Items */\n    public array $items;\n\n    /**\n     * Constructs an array node.\n     *\n     * @param ArrayItem[] $items Items of the array\n     * @param array<string, mixed> $attributes Additional attributes\n     */\n    public function __construct(array $items = [], array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->items = $items;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['items'];\n    }\n\n    public function getType(): string {\n        return 'Expr_Array';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrowFunction.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr;\n\nuse PhpParser\\Node;\nuse PhpParser\\Node\\Expr;\nuse PhpParser\\Node\\FunctionLike;\n\nclass ArrowFunction extends Expr implements FunctionLike {\n    /** @var bool Whether the closure is static */\n    public bool $static;\n\n    /** @var bool Whether to return by reference */\n    public bool $byRef;\n\n    /** @var Node\\Param[] */\n    public array $params = [];\n\n    /** @var null|Node\\Identifier|Node\\Name|Node\\ComplexType */\n    public ?Node $returnType;\n\n    /** @var Expr Expression body */\n    public Expr $expr;\n    /** @var Node\\AttributeGroup[] */\n    public array $attrGroups;\n\n    /**\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     */\n    public function __construct(array $subNodes, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->static = $subNodes['static'] ?? false;\n        $this->byRef = $subNodes['byRef'] ?? false;\n        $this->params = $subNodes['params'] ?? [];\n        $this->returnType = $subNodes['returnType'] ?? null;\n        $this->expr = $subNodes['expr'];\n        $this->attrGroups = $subNodes['attrGroups'] ?? [];\n    }\n\n    public function getSubNodeNames(): array {\n        return ['attrGroups', 'static', 'byRef', 'params', 'returnType', 'expr'];\n    }\n\n    public function returnsByRef(): bool {\n        return $this->byRef;\n    }\n\n    public function getParams(): array {\n        return $this->params;\n    }\n\n    public function getReturnType() {\n        return $this->returnType;\n    }\n\n    public function getAttrGroups(): array {\n        return $this->attrGroups;\n    }\n\n    /**\n     * @return Node\\Stmt\\Return_[]\n     */\n    public function getStmts(): array {\n        return [new Node\\Stmt\\Return_($this->expr)];\n    }\n\n    public function getType(): string {\n        return 'Expr_ArrowFunction';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Assign.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr;\n\nuse PhpParser\\Node\\Expr;\n\nclass Assign extends Expr {\n    /** @var Expr Variable */\n    public Expr $var;\n    /** @var Expr Expression */\n    public Expr $expr;\n\n    /**\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     */\n    public function __construct(Expr $var, Expr $expr, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->var = $var;\n        $this->expr = $expr;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['var', 'expr'];\n    }\n\n    public function getType(): string {\n        return 'Expr_Assign';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseAnd.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr\\AssignOp;\n\nuse PhpParser\\Node\\Expr\\AssignOp;\n\nclass BitwiseAnd extends AssignOp {\n    public function getType(): string {\n        return 'Expr_AssignOp_BitwiseAnd';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseOr.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr\\AssignOp;\n\nuse PhpParser\\Node\\Expr\\AssignOp;\n\nclass BitwiseOr extends AssignOp {\n    public function getType(): string {\n        return 'Expr_AssignOp_BitwiseOr';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseXor.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr\\AssignOp;\n\nuse PhpParser\\Node\\Expr\\AssignOp;\n\nclass BitwiseXor extends AssignOp {\n    public function getType(): string {\n        return 'Expr_AssignOp_BitwiseXor';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Coalesce.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr\\AssignOp;\n\nuse PhpParser\\Node\\Expr\\AssignOp;\n\nclass Coalesce extends AssignOp {\n    public function getType(): string {\n        return 'Expr_AssignOp_Coalesce';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Concat.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr\\AssignOp;\n\nuse PhpParser\\Node\\Expr\\AssignOp;\n\nclass Concat extends AssignOp {\n    public function getType(): string {\n        return 'Expr_AssignOp_Concat';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Div.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr\\AssignOp;\n\nuse PhpParser\\Node\\Expr\\AssignOp;\n\nclass Div extends AssignOp {\n    public function getType(): string {\n        return 'Expr_AssignOp_Div';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Minus.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr\\AssignOp;\n\nuse PhpParser\\Node\\Expr\\AssignOp;\n\nclass Minus extends AssignOp {\n    public function getType(): string {\n        return 'Expr_AssignOp_Minus';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mod.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr\\AssignOp;\n\nuse PhpParser\\Node\\Expr\\AssignOp;\n\nclass Mod extends AssignOp {\n    public function getType(): string {\n        return 'Expr_AssignOp_Mod';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mul.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr\\AssignOp;\n\nuse PhpParser\\Node\\Expr\\AssignOp;\n\nclass Mul extends AssignOp {\n    public function getType(): string {\n        return 'Expr_AssignOp_Mul';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Plus.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr\\AssignOp;\n\nuse PhpParser\\Node\\Expr\\AssignOp;\n\nclass Plus extends AssignOp {\n    public function getType(): string {\n        return 'Expr_AssignOp_Plus';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Pow.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr\\AssignOp;\n\nuse PhpParser\\Node\\Expr\\AssignOp;\n\nclass Pow extends AssignOp {\n    public function getType(): string {\n        return 'Expr_AssignOp_Pow';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftLeft.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr\\AssignOp;\n\nuse PhpParser\\Node\\Expr\\AssignOp;\n\nclass ShiftLeft extends AssignOp {\n    public function getType(): string {\n        return 'Expr_AssignOp_ShiftLeft';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftRight.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr\\AssignOp;\n\nuse PhpParser\\Node\\Expr\\AssignOp;\n\nclass ShiftRight extends AssignOp {\n    public function getType(): string {\n        return 'Expr_AssignOp_ShiftRight';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr;\n\nuse PhpParser\\Node\\Expr;\n\nabstract class AssignOp extends Expr {\n    /** @var Expr Variable */\n    public Expr $var;\n    /** @var Expr Expression */\n    public Expr $expr;\n\n    /**\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     */\n    public function __construct(Expr $var, Expr $expr, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->var = $var;\n        $this->expr = $expr;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['var', 'expr'];\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignRef.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr;\n\nuse PhpParser\\Node\\Expr;\n\nclass AssignRef extends Expr {\n    /** @var Expr Variable reference is assigned to */\n    public Expr $var;\n    /** @var Expr Variable which is referenced */\n    public Expr $expr;\n\n    /**\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     */\n    public function __construct(Expr $var, Expr $expr, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->var = $var;\n        $this->expr = $expr;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['var', 'expr'];\n    }\n\n    public function getType(): string {\n        return 'Expr_AssignRef';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseAnd.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr\\BinaryOp;\n\nuse PhpParser\\Node\\Expr\\BinaryOp;\n\nclass BitwiseAnd extends BinaryOp {\n    public function getOperatorSigil(): string {\n        return '&';\n    }\n\n    public function getType(): string {\n        return 'Expr_BinaryOp_BitwiseAnd';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseOr.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr\\BinaryOp;\n\nuse PhpParser\\Node\\Expr\\BinaryOp;\n\nclass BitwiseOr extends BinaryOp {\n    public function getOperatorSigil(): string {\n        return '|';\n    }\n\n    public function getType(): string {\n        return 'Expr_BinaryOp_BitwiseOr';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseXor.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr\\BinaryOp;\n\nuse PhpParser\\Node\\Expr\\BinaryOp;\n\nclass BitwiseXor extends BinaryOp {\n    public function getOperatorSigil(): string {\n        return '^';\n    }\n\n    public function getType(): string {\n        return 'Expr_BinaryOp_BitwiseXor';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanAnd.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr\\BinaryOp;\n\nuse PhpParser\\Node\\Expr\\BinaryOp;\n\nclass BooleanAnd extends BinaryOp {\n    public function getOperatorSigil(): string {\n        return '&&';\n    }\n\n    public function getType(): string {\n        return 'Expr_BinaryOp_BooleanAnd';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanOr.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr\\BinaryOp;\n\nuse PhpParser\\Node\\Expr\\BinaryOp;\n\nclass BooleanOr extends BinaryOp {\n    public function getOperatorSigil(): string {\n        return '||';\n    }\n\n    public function getType(): string {\n        return 'Expr_BinaryOp_BooleanOr';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Coalesce.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr\\BinaryOp;\n\nuse PhpParser\\Node\\Expr\\BinaryOp;\n\nclass Coalesce extends BinaryOp {\n    public function getOperatorSigil(): string {\n        return '??';\n    }\n\n    public function getType(): string {\n        return 'Expr_BinaryOp_Coalesce';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Concat.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr\\BinaryOp;\n\nuse PhpParser\\Node\\Expr\\BinaryOp;\n\nclass Concat extends BinaryOp {\n    public function getOperatorSigil(): string {\n        return '.';\n    }\n\n    public function getType(): string {\n        return 'Expr_BinaryOp_Concat';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Div.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr\\BinaryOp;\n\nuse PhpParser\\Node\\Expr\\BinaryOp;\n\nclass Div extends BinaryOp {\n    public function getOperatorSigil(): string {\n        return '/';\n    }\n\n    public function getType(): string {\n        return 'Expr_BinaryOp_Div';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Equal.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr\\BinaryOp;\n\nuse PhpParser\\Node\\Expr\\BinaryOp;\n\nclass Equal extends BinaryOp {\n    public function getOperatorSigil(): string {\n        return '==';\n    }\n\n    public function getType(): string {\n        return 'Expr_BinaryOp_Equal';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Greater.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr\\BinaryOp;\n\nuse PhpParser\\Node\\Expr\\BinaryOp;\n\nclass Greater extends BinaryOp {\n    public function getOperatorSigil(): string {\n        return '>';\n    }\n\n    public function getType(): string {\n        return 'Expr_BinaryOp_Greater';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/GreaterOrEqual.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr\\BinaryOp;\n\nuse PhpParser\\Node\\Expr\\BinaryOp;\n\nclass GreaterOrEqual extends BinaryOp {\n    public function getOperatorSigil(): string {\n        return '>=';\n    }\n\n    public function getType(): string {\n        return 'Expr_BinaryOp_GreaterOrEqual';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Identical.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr\\BinaryOp;\n\nuse PhpParser\\Node\\Expr\\BinaryOp;\n\nclass Identical extends BinaryOp {\n    public function getOperatorSigil(): string {\n        return '===';\n    }\n\n    public function getType(): string {\n        return 'Expr_BinaryOp_Identical';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalAnd.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr\\BinaryOp;\n\nuse PhpParser\\Node\\Expr\\BinaryOp;\n\nclass LogicalAnd extends BinaryOp {\n    public function getOperatorSigil(): string {\n        return 'and';\n    }\n\n    public function getType(): string {\n        return 'Expr_BinaryOp_LogicalAnd';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalOr.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr\\BinaryOp;\n\nuse PhpParser\\Node\\Expr\\BinaryOp;\n\nclass LogicalOr extends BinaryOp {\n    public function getOperatorSigil(): string {\n        return 'or';\n    }\n\n    public function getType(): string {\n        return 'Expr_BinaryOp_LogicalOr';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalXor.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr\\BinaryOp;\n\nuse PhpParser\\Node\\Expr\\BinaryOp;\n\nclass LogicalXor extends BinaryOp {\n    public function getOperatorSigil(): string {\n        return 'xor';\n    }\n\n    public function getType(): string {\n        return 'Expr_BinaryOp_LogicalXor';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Minus.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr\\BinaryOp;\n\nuse PhpParser\\Node\\Expr\\BinaryOp;\n\nclass Minus extends BinaryOp {\n    public function getOperatorSigil(): string {\n        return '-';\n    }\n\n    public function getType(): string {\n        return 'Expr_BinaryOp_Minus';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mod.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr\\BinaryOp;\n\nuse PhpParser\\Node\\Expr\\BinaryOp;\n\nclass Mod extends BinaryOp {\n    public function getOperatorSigil(): string {\n        return '%';\n    }\n\n    public function getType(): string {\n        return 'Expr_BinaryOp_Mod';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mul.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr\\BinaryOp;\n\nuse PhpParser\\Node\\Expr\\BinaryOp;\n\nclass Mul extends BinaryOp {\n    public function getOperatorSigil(): string {\n        return '*';\n    }\n\n    public function getType(): string {\n        return 'Expr_BinaryOp_Mul';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotEqual.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr\\BinaryOp;\n\nuse PhpParser\\Node\\Expr\\BinaryOp;\n\nclass NotEqual extends BinaryOp {\n    public function getOperatorSigil(): string {\n        return '!=';\n    }\n\n    public function getType(): string {\n        return 'Expr_BinaryOp_NotEqual';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotIdentical.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr\\BinaryOp;\n\nuse PhpParser\\Node\\Expr\\BinaryOp;\n\nclass NotIdentical extends BinaryOp {\n    public function getOperatorSigil(): string {\n        return '!==';\n    }\n\n    public function getType(): string {\n        return 'Expr_BinaryOp_NotIdentical';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Pipe.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr\\BinaryOp;\n\nuse PhpParser\\Node\\Expr\\BinaryOp;\n\nclass Pipe extends BinaryOp {\n    public function getOperatorSigil(): string {\n        return '|>';\n    }\n\n    public function getType(): string {\n        return 'Expr_BinaryOp_Pipe';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Plus.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr\\BinaryOp;\n\nuse PhpParser\\Node\\Expr\\BinaryOp;\n\nclass Plus extends BinaryOp {\n    public function getOperatorSigil(): string {\n        return '+';\n    }\n\n    public function getType(): string {\n        return 'Expr_BinaryOp_Plus';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Pow.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr\\BinaryOp;\n\nuse PhpParser\\Node\\Expr\\BinaryOp;\n\nclass Pow extends BinaryOp {\n    public function getOperatorSigil(): string {\n        return '**';\n    }\n\n    public function getType(): string {\n        return 'Expr_BinaryOp_Pow';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftLeft.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr\\BinaryOp;\n\nuse PhpParser\\Node\\Expr\\BinaryOp;\n\nclass ShiftLeft extends BinaryOp {\n    public function getOperatorSigil(): string {\n        return '<<';\n    }\n\n    public function getType(): string {\n        return 'Expr_BinaryOp_ShiftLeft';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftRight.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr\\BinaryOp;\n\nuse PhpParser\\Node\\Expr\\BinaryOp;\n\nclass ShiftRight extends BinaryOp {\n    public function getOperatorSigil(): string {\n        return '>>';\n    }\n\n    public function getType(): string {\n        return 'Expr_BinaryOp_ShiftRight';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Smaller.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr\\BinaryOp;\n\nuse PhpParser\\Node\\Expr\\BinaryOp;\n\nclass Smaller extends BinaryOp {\n    public function getOperatorSigil(): string {\n        return '<';\n    }\n\n    public function getType(): string {\n        return 'Expr_BinaryOp_Smaller';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/SmallerOrEqual.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr\\BinaryOp;\n\nuse PhpParser\\Node\\Expr\\BinaryOp;\n\nclass SmallerOrEqual extends BinaryOp {\n    public function getOperatorSigil(): string {\n        return '<=';\n    }\n\n    public function getType(): string {\n        return 'Expr_BinaryOp_SmallerOrEqual';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Spaceship.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr\\BinaryOp;\n\nuse PhpParser\\Node\\Expr\\BinaryOp;\n\nclass Spaceship extends BinaryOp {\n    public function getOperatorSigil(): string {\n        return '<=>';\n    }\n\n    public function getType(): string {\n        return 'Expr_BinaryOp_Spaceship';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr;\n\nuse PhpParser\\Node\\Expr;\n\nabstract class BinaryOp extends Expr {\n    /** @var Expr The left hand side expression */\n    public Expr $left;\n    /** @var Expr The right hand side expression */\n    public Expr $right;\n\n    /**\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     */\n    public function __construct(Expr $left, Expr $right, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->left = $left;\n        $this->right = $right;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['left', 'right'];\n    }\n\n    /**\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     */\n    abstract public function getOperatorSigil(): string;\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BitwiseNot.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr;\n\nuse PhpParser\\Node\\Expr;\n\nclass BitwiseNot extends Expr {\n    /** @var Expr Expression */\n    public Expr $expr;\n\n    /**\n     * Constructs a bitwise not node.\n     *\n     * @param Expr $expr Expression\n     * @param array<string, mixed> $attributes Additional attributes\n     */\n    public function __construct(Expr $expr, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->expr = $expr;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['expr'];\n    }\n\n    public function getType(): string {\n        return 'Expr_BitwiseNot';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BooleanNot.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr;\n\nuse PhpParser\\Node\\Expr;\n\nclass BooleanNot extends Expr {\n    /** @var Expr Expression */\n    public Expr $expr;\n\n    /**\n     * Constructs a boolean not node.\n     *\n     * @param Expr $expr Expression\n     * @param array<string, mixed> $attributes Additional attributes\n     */\n    public function __construct(Expr $expr, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->expr = $expr;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['expr'];\n    }\n\n    public function getType(): string {\n        return 'Expr_BooleanNot';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/CallLike.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr;\n\nuse PhpParser\\Node\\Arg;\nuse PhpParser\\Node\\Expr;\nuse PhpParser\\Node\\VariadicPlaceholder;\n\nabstract class CallLike extends Expr {\n    /**\n     * Return raw arguments, which may be actual Args, or VariadicPlaceholders for first-class\n     * callables.\n     *\n     * @return array<Arg|VariadicPlaceholder>\n     */\n    abstract public function getRawArgs(): array;\n\n    /**\n     * Returns whether this call expression is actually a first class callable.\n     */\n    public function isFirstClassCallable(): bool {\n        $rawArgs = $this->getRawArgs();\n        return count($rawArgs) === 1 && current($rawArgs) instanceof VariadicPlaceholder;\n    }\n\n    /**\n     * Assert that this is not a first-class callable and return only ordinary Args.\n     *\n     * @return Arg[]\n     */\n    public function getArgs(): array {\n        assert(!$this->isFirstClassCallable());\n        return $this->getRawArgs();\n    }\n\n    /**\n     * Retrieves a specific argument from the raw arguments.\n     *\n     * Returns the named argument that matches the given `$name`, or the\n     * positional (unnamed) argument that exists at the given `$position`,\n     * otherwise, returns `null` for first-class callables or if no match is found.\n     */\n    public function getArg(string $name, int $position): ?Arg {\n        if ($this->isFirstClassCallable()) {\n            return null;\n        }\n        foreach ($this->getRawArgs() as $i => $arg) {\n            if ($arg->unpack) {\n                continue;\n            }\n            if (\n                ($arg->name !== null && $arg->name->toString() === $name)\n                || ($arg->name === null && $i === $position)\n            ) {\n                return $arg;\n            }\n        }\n        return null;\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Array_.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr\\Cast;\n\nuse PhpParser\\Node\\Expr\\Cast;\n\nclass Array_ extends Cast {\n    public function getType(): string {\n        return 'Expr_Cast_Array';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Bool_.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr\\Cast;\n\nuse PhpParser\\Node\\Expr\\Cast;\n\nclass Bool_ extends Cast {\n    // For use in \"kind\" attribute\n    public const KIND_BOOL = 1; // \"bool\" syntax\n    public const KIND_BOOLEAN = 2; // \"boolean\" syntax\n\n    public function getType(): string {\n        return 'Expr_Cast_Bool';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Double.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr\\Cast;\n\nuse PhpParser\\Node\\Expr\\Cast;\n\nclass Double extends Cast {\n    // For use in \"kind\" attribute\n    public const KIND_DOUBLE = 1; // \"double\" syntax\n    public const KIND_FLOAT = 2;  // \"float\" syntax\n    public const KIND_REAL = 3; // \"real\" syntax\n\n    public function getType(): string {\n        return 'Expr_Cast_Double';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Int_.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr\\Cast;\n\nuse PhpParser\\Node\\Expr\\Cast;\n\nclass Int_ extends Cast {\n    // For use in \"kind\" attribute\n    public const KIND_INT = 1; // \"int\" syntax\n    public const KIND_INTEGER = 2; // \"integer\" syntax\n\n    public function getType(): string {\n        return 'Expr_Cast_Int';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Object_.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr\\Cast;\n\nuse PhpParser\\Node\\Expr\\Cast;\n\nclass Object_ extends Cast {\n    public function getType(): string {\n        return 'Expr_Cast_Object';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/String_.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr\\Cast;\n\nuse PhpParser\\Node\\Expr\\Cast;\n\nclass String_ extends Cast {\n    // For use in \"kind\" attribute\n    public const KIND_STRING = 1; // \"string\" syntax\n    public const KIND_BINARY = 2; // \"binary\" syntax\n\n    public function getType(): string {\n        return 'Expr_Cast_String';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Unset_.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr\\Cast;\n\nuse PhpParser\\Node\\Expr\\Cast;\n\nclass Unset_ extends Cast {\n    public function getType(): string {\n        return 'Expr_Cast_Unset';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Void_.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr\\Cast;\n\nuse PhpParser\\Node\\Expr\\Cast;\n\nclass Void_ extends Cast {\n    public function getType(): string {\n        return 'Expr_Cast_Void';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr;\n\nuse PhpParser\\Node\\Expr;\n\nabstract class Cast extends Expr {\n    /** @var Expr Expression */\n    public Expr $expr;\n\n    /**\n     * Constructs a cast node.\n     *\n     * @param Expr $expr Expression\n     * @param array<string, mixed> $attributes Additional attributes\n     */\n    public function __construct(Expr $expr, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->expr = $expr;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['expr'];\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClassConstFetch.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr;\n\nuse PhpParser\\Node;\nuse PhpParser\\Node\\Expr;\nuse PhpParser\\Node\\Identifier;\nuse PhpParser\\Node\\Name;\n\nclass ClassConstFetch extends Expr {\n    /** @var Name|Expr Class name */\n    public Node $class;\n    /** @var Identifier|Expr|Error Constant name */\n    public Node $name;\n\n    /**\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     */\n    public function __construct(Node $class, $name, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->class = $class;\n        $this->name = \\is_string($name) ? new Identifier($name) : $name;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['class', 'name'];\n    }\n\n    public function getType(): string {\n        return 'Expr_ClassConstFetch';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Clone_.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr;\n\nuse PhpParser\\Node\\Expr;\n\nclass Clone_ extends Expr {\n    /** @var Expr Expression */\n    public Expr $expr;\n\n    /**\n     * Constructs a clone node.\n     *\n     * @param Expr $expr Expression\n     * @param array<string, mixed> $attributes Additional attributes\n     */\n    public function __construct(Expr $expr, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->expr = $expr;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['expr'];\n    }\n\n    public function getType(): string {\n        return 'Expr_Clone';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Closure.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr;\n\nuse PhpParser\\Node;\nuse PhpParser\\Node\\ClosureUse;\nuse PhpParser\\Node\\Expr;\nuse PhpParser\\Node\\FunctionLike;\n\nclass Closure extends Expr implements FunctionLike {\n    /** @var bool Whether the closure is static */\n    public bool $static;\n    /** @var bool Whether to return by reference */\n    public bool $byRef;\n    /** @var Node\\Param[] Parameters */\n    public array $params;\n    /** @var ClosureUse[] use()s */\n    public array $uses;\n    /** @var null|Node\\Identifier|Node\\Name|Node\\ComplexType Return type */\n    public ?Node $returnType;\n    /** @var Node\\Stmt[] Statements */\n    public array $stmts;\n    /** @var Node\\AttributeGroup[] PHP attribute groups */\n    public array $attrGroups;\n\n    /**\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     */\n    public function __construct(array $subNodes = [], array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->static = $subNodes['static'] ?? false;\n        $this->byRef = $subNodes['byRef'] ?? false;\n        $this->params = $subNodes['params'] ?? [];\n        $this->uses = $subNodes['uses'] ?? [];\n        $this->returnType = $subNodes['returnType'] ?? null;\n        $this->stmts = $subNodes['stmts'] ?? [];\n        $this->attrGroups = $subNodes['attrGroups'] ?? [];\n    }\n\n    public function getSubNodeNames(): array {\n        return ['attrGroups', 'static', 'byRef', 'params', 'uses', 'returnType', 'stmts'];\n    }\n\n    public function returnsByRef(): bool {\n        return $this->byRef;\n    }\n\n    public function getParams(): array {\n        return $this->params;\n    }\n\n    public function getReturnType() {\n        return $this->returnType;\n    }\n\n    /** @return Node\\Stmt[] */\n    public function getStmts(): array {\n        return $this->stmts;\n    }\n\n    public function getAttrGroups(): array {\n        return $this->attrGroups;\n    }\n\n    public function getType(): string {\n        return 'Expr_Closure';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClosureUse.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr;\n\nrequire __DIR__ . '/../ClosureUse.php';\n\nif (false) {\n    /**\n     * For classmap-authoritative support.\n     *\n     * @deprecated use \\PhpParser\\Node\\ClosureUse instead.\n     */\n    class ClosureUse extends \\PhpParser\\Node\\ClosureUse {\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ConstFetch.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr;\n\nuse PhpParser\\Node\\Expr;\nuse PhpParser\\Node\\Name;\n\nclass ConstFetch extends Expr {\n    /** @var Name Constant name */\n    public Name $name;\n\n    /**\n     * Constructs a const fetch node.\n     *\n     * @param Name $name Constant name\n     * @param array<string, mixed> $attributes Additional attributes\n     */\n    public function __construct(Name $name, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->name = $name;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['name'];\n    }\n\n    public function getType(): string {\n        return 'Expr_ConstFetch';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Empty_.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr;\n\nuse PhpParser\\Node\\Expr;\n\nclass Empty_ extends Expr {\n    /** @var Expr Expression */\n    public Expr $expr;\n\n    /**\n     * Constructs an empty() node.\n     *\n     * @param Expr $expr Expression\n     * @param array<string, mixed> $attributes Additional attributes\n     */\n    public function __construct(Expr $expr, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->expr = $expr;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['expr'];\n    }\n\n    public function getType(): string {\n        return 'Expr_Empty';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Error.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr;\n\nuse PhpParser\\Node\\Expr;\n\n/**\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 */\nclass Error extends Expr {\n    /**\n     * Constructs an error node.\n     *\n     * @param array<string, mixed> $attributes Additional attributes\n     */\n    public function __construct(array $attributes = []) {\n        $this->attributes = $attributes;\n    }\n\n    public function getSubNodeNames(): array {\n        return [];\n    }\n\n    public function getType(): string {\n        return 'Expr_Error';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ErrorSuppress.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr;\n\nuse PhpParser\\Node\\Expr;\n\nclass ErrorSuppress extends Expr {\n    /** @var Expr Expression */\n    public Expr $expr;\n\n    /**\n     * Constructs an error suppress node.\n     *\n     * @param Expr $expr Expression\n     * @param array<string, mixed> $attributes Additional attributes\n     */\n    public function __construct(Expr $expr, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->expr = $expr;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['expr'];\n    }\n\n    public function getType(): string {\n        return 'Expr_ErrorSuppress';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Eval_.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr;\n\nuse PhpParser\\Node\\Expr;\n\nclass Eval_ extends Expr {\n    /** @var Expr Expression */\n    public Expr $expr;\n\n    /**\n     * Constructs an eval() node.\n     *\n     * @param Expr $expr Expression\n     * @param array<string, mixed> $attributes Additional attributes\n     */\n    public function __construct(Expr $expr, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->expr = $expr;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['expr'];\n    }\n\n    public function getType(): string {\n        return 'Expr_Eval';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Exit_.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr;\n\nuse PhpParser\\Node\\Expr;\n\nclass Exit_ extends Expr {\n    /* For use in \"kind\" attribute */\n    public const KIND_EXIT = 1;\n    public const KIND_DIE = 2;\n\n    /** @var null|Expr Expression */\n    public ?Expr $expr;\n\n    /**\n     * Constructs an exit() node.\n     *\n     * @param null|Expr $expr Expression\n     * @param array<string, mixed> $attributes Additional attributes\n     */\n    public function __construct(?Expr $expr = null, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->expr = $expr;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['expr'];\n    }\n\n    public function getType(): string {\n        return 'Expr_Exit';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/FuncCall.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr;\n\nuse PhpParser\\Node;\nuse PhpParser\\Node\\Expr;\n\nclass FuncCall extends CallLike {\n    /** @var Node\\Name|Expr Function name */\n    public Node $name;\n    /** @var array<Node\\Arg|Node\\VariadicPlaceholder> Arguments */\n    public array $args;\n\n    /**\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     */\n    public function __construct(Node $name, array $args = [], array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->name = $name;\n        $this->args = $args;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['name', 'args'];\n    }\n\n    public function getType(): string {\n        return 'Expr_FuncCall';\n    }\n\n    public function getRawArgs(): array {\n        return $this->args;\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Include_.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr;\n\nuse PhpParser\\Node\\Expr;\n\nclass Include_ extends Expr {\n    public const TYPE_INCLUDE      = 1;\n    public const TYPE_INCLUDE_ONCE = 2;\n    public const TYPE_REQUIRE      = 3;\n    public const TYPE_REQUIRE_ONCE = 4;\n\n    /** @var Expr Expression */\n    public Expr $expr;\n    /** @var int Type of include */\n    public int $type;\n\n    /**\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     */\n    public function __construct(Expr $expr, int $type, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->expr = $expr;\n        $this->type = $type;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['expr', 'type'];\n    }\n\n    public function getType(): string {\n        return 'Expr_Include';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Instanceof_.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr;\n\nuse PhpParser\\Node;\nuse PhpParser\\Node\\Expr;\nuse PhpParser\\Node\\Name;\n\nclass Instanceof_ extends Expr {\n    /** @var Expr Expression */\n    public Expr $expr;\n    /** @var Name|Expr Class name */\n    public Node $class;\n\n    /**\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     */\n    public function __construct(Expr $expr, Node $class, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->expr = $expr;\n        $this->class = $class;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['expr', 'class'];\n    }\n\n    public function getType(): string {\n        return 'Expr_Instanceof';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Isset_.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr;\n\nuse PhpParser\\Node\\Expr;\n\nclass Isset_ extends Expr {\n    /** @var Expr[] Variables */\n    public array $vars;\n\n    /**\n     * Constructs an array node.\n     *\n     * @param Expr[] $vars Variables\n     * @param array<string, mixed> $attributes Additional attributes\n     */\n    public function __construct(array $vars, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->vars = $vars;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['vars'];\n    }\n\n    public function getType(): string {\n        return 'Expr_Isset';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/List_.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr;\n\nuse PhpParser\\Node\\ArrayItem;\nuse PhpParser\\Node\\Expr;\n\nclass List_ extends Expr {\n    // For use in \"kind\" attribute\n    public const KIND_LIST = 1; // list() syntax\n    public const KIND_ARRAY = 2; // [] syntax\n\n    /** @var (ArrayItem|null)[] List of items to assign to */\n    public array $items;\n\n    /**\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     */\n    public function __construct(array $items, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->items = $items;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['items'];\n    }\n\n    public function getType(): string {\n        return 'Expr_List';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Match_.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr;\n\nuse PhpParser\\Node;\nuse PhpParser\\Node\\MatchArm;\n\nclass Match_ extends Node\\Expr {\n    /** @var Node\\Expr Condition */\n    public Node\\Expr $cond;\n    /** @var MatchArm[] */\n    public array $arms;\n\n    /**\n     * @param Node\\Expr $cond Condition\n     * @param MatchArm[] $arms\n     * @param array<string, mixed> $attributes Additional attributes\n     */\n    public function __construct(Node\\Expr $cond, array $arms = [], array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->cond = $cond;\n        $this->arms = $arms;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['cond', 'arms'];\n    }\n\n    public function getType(): string {\n        return 'Expr_Match';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/MethodCall.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr;\n\nuse PhpParser\\Node;\nuse PhpParser\\Node\\Arg;\nuse PhpParser\\Node\\Expr;\nuse PhpParser\\Node\\Identifier;\nuse PhpParser\\Node\\VariadicPlaceholder;\n\nclass MethodCall extends CallLike {\n    /** @var Expr Variable holding object */\n    public Expr $var;\n    /** @var Identifier|Expr Method name */\n    public Node $name;\n    /** @var array<Arg|VariadicPlaceholder> Arguments */\n    public array $args;\n\n    /**\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     */\n    public function __construct(Expr $var, $name, array $args = [], array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->var = $var;\n        $this->name = \\is_string($name) ? new Identifier($name) : $name;\n        $this->args = $args;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['var', 'name', 'args'];\n    }\n\n    public function getType(): string {\n        return 'Expr_MethodCall';\n    }\n\n    public function getRawArgs(): array {\n        return $this->args;\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/New_.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr;\n\nuse PhpParser\\Node;\nuse PhpParser\\Node\\Arg;\nuse PhpParser\\Node\\Expr;\nuse PhpParser\\Node\\VariadicPlaceholder;\n\nclass New_ extends CallLike {\n    /** @var Node\\Name|Expr|Node\\Stmt\\Class_ Class name */\n    public Node $class;\n    /** @var array<Arg|VariadicPlaceholder> Arguments */\n    public array $args;\n\n    /**\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     */\n    public function __construct(Node $class, array $args = [], array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->class = $class;\n        $this->args = $args;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['class', 'args'];\n    }\n\n    public function getType(): string {\n        return 'Expr_New';\n    }\n\n    public function getRawArgs(): array {\n        return $this->args;\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafeMethodCall.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr;\n\nuse PhpParser\\Node;\nuse PhpParser\\Node\\Arg;\nuse PhpParser\\Node\\Expr;\nuse PhpParser\\Node\\Identifier;\nuse PhpParser\\Node\\VariadicPlaceholder;\n\nclass NullsafeMethodCall extends CallLike {\n    /** @var Expr Variable holding object */\n    public Expr $var;\n    /** @var Identifier|Expr Method name */\n    public Node $name;\n    /** @var array<Arg|VariadicPlaceholder> Arguments */\n    public array $args;\n\n    /**\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     */\n    public function __construct(Expr $var, $name, array $args = [], array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->var = $var;\n        $this->name = \\is_string($name) ? new Identifier($name) : $name;\n        $this->args = $args;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['var', 'name', 'args'];\n    }\n\n    public function getType(): string {\n        return 'Expr_NullsafeMethodCall';\n    }\n\n    public function getRawArgs(): array {\n        return $this->args;\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafePropertyFetch.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr;\n\nuse PhpParser\\Node;\nuse PhpParser\\Node\\Expr;\nuse PhpParser\\Node\\Identifier;\n\nclass NullsafePropertyFetch extends Expr {\n    /** @var Expr Variable holding object */\n    public Expr $var;\n    /** @var Identifier|Expr Property name */\n    public Node $name;\n\n    /**\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     */\n    public function __construct(Expr $var, $name, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->var = $var;\n        $this->name = \\is_string($name) ? new Identifier($name) : $name;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['var', 'name'];\n    }\n\n    public function getType(): string {\n        return 'Expr_NullsafePropertyFetch';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostDec.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr;\n\nuse PhpParser\\Node\\Expr;\n\nclass PostDec extends Expr {\n    /** @var Expr Variable */\n    public Expr $var;\n\n    /**\n     * Constructs a post decrement node.\n     *\n     * @param Expr $var Variable\n     * @param array<string, mixed> $attributes Additional attributes\n     */\n    public function __construct(Expr $var, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->var = $var;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['var'];\n    }\n\n    public function getType(): string {\n        return 'Expr_PostDec';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostInc.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr;\n\nuse PhpParser\\Node\\Expr;\n\nclass PostInc extends Expr {\n    /** @var Expr Variable */\n    public Expr $var;\n\n    /**\n     * Constructs a post increment node.\n     *\n     * @param Expr $var Variable\n     * @param array<string, mixed> $attributes Additional attributes\n     */\n    public function __construct(Expr $var, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->var = $var;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['var'];\n    }\n\n    public function getType(): string {\n        return 'Expr_PostInc';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreDec.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr;\n\nuse PhpParser\\Node\\Expr;\n\nclass PreDec extends Expr {\n    /** @var Expr Variable */\n    public Expr $var;\n\n    /**\n     * Constructs a pre decrement node.\n     *\n     * @param Expr $var Variable\n     * @param array<string, mixed> $attributes Additional attributes\n     */\n    public function __construct(Expr $var, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->var = $var;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['var'];\n    }\n\n    public function getType(): string {\n        return 'Expr_PreDec';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreInc.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr;\n\nuse PhpParser\\Node\\Expr;\n\nclass PreInc extends Expr {\n    /** @var Expr Variable */\n    public Expr $var;\n\n    /**\n     * Constructs a pre increment node.\n     *\n     * @param Expr $var Variable\n     * @param array<string, mixed> $attributes Additional attributes\n     */\n    public function __construct(Expr $var, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->var = $var;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['var'];\n    }\n\n    public function getType(): string {\n        return 'Expr_PreInc';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Print_.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr;\n\nuse PhpParser\\Node\\Expr;\n\nclass Print_ extends Expr {\n    /** @var Expr Expression */\n    public Expr $expr;\n\n    /**\n     * Constructs an print() node.\n     *\n     * @param Expr $expr Expression\n     * @param array<string, mixed> $attributes Additional attributes\n     */\n    public function __construct(Expr $expr, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->expr = $expr;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['expr'];\n    }\n\n    public function getType(): string {\n        return 'Expr_Print';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PropertyFetch.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr;\n\nuse PhpParser\\Node;\nuse PhpParser\\Node\\Expr;\nuse PhpParser\\Node\\Identifier;\n\nclass PropertyFetch extends Expr {\n    /** @var Expr Variable holding object */\n    public Expr $var;\n    /** @var Identifier|Expr Property name */\n    public Node $name;\n\n    /**\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     */\n    public function __construct(Expr $var, $name, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->var = $var;\n        $this->name = \\is_string($name) ? new Identifier($name) : $name;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['var', 'name'];\n    }\n\n    public function getType(): string {\n        return 'Expr_PropertyFetch';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ShellExec.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr;\n\nuse PhpParser\\Node\\Expr;\nuse PhpParser\\Node\\InterpolatedStringPart;\n\nclass ShellExec extends Expr {\n    /** @var (Expr|InterpolatedStringPart)[] Interpolated string array */\n    public array $parts;\n\n    /**\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     */\n    public function __construct(array $parts, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->parts = $parts;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['parts'];\n    }\n\n    public function getType(): string {\n        return 'Expr_ShellExec';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticCall.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr;\n\nuse PhpParser\\Node;\nuse PhpParser\\Node\\Arg;\nuse PhpParser\\Node\\Expr;\nuse PhpParser\\Node\\Identifier;\nuse PhpParser\\Node\\VariadicPlaceholder;\n\nclass StaticCall extends CallLike {\n    /** @var Node\\Name|Expr Class name */\n    public Node $class;\n    /** @var Identifier|Expr Method name */\n    public Node $name;\n    /** @var array<Arg|VariadicPlaceholder> Arguments */\n    public array $args;\n\n    /**\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     */\n    public function __construct(Node $class, $name, array $args = [], array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->class = $class;\n        $this->name = \\is_string($name) ? new Identifier($name) : $name;\n        $this->args = $args;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['class', 'name', 'args'];\n    }\n\n    public function getType(): string {\n        return 'Expr_StaticCall';\n    }\n\n    public function getRawArgs(): array {\n        return $this->args;\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticPropertyFetch.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr;\n\nuse PhpParser\\Node;\nuse PhpParser\\Node\\Expr;\nuse PhpParser\\Node\\Name;\nuse PhpParser\\Node\\VarLikeIdentifier;\n\nclass StaticPropertyFetch extends Expr {\n    /** @var Name|Expr Class name */\n    public Node $class;\n    /** @var VarLikeIdentifier|Expr Property name */\n    public Node $name;\n\n    /**\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     */\n    public function __construct(Node $class, $name, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->class = $class;\n        $this->name = \\is_string($name) ? new VarLikeIdentifier($name) : $name;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['class', 'name'];\n    }\n\n    public function getType(): string {\n        return 'Expr_StaticPropertyFetch';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Ternary.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr;\n\nuse PhpParser\\Node\\Expr;\n\nclass Ternary extends Expr {\n    /** @var Expr Condition */\n    public Expr $cond;\n    /** @var null|Expr Expression for true */\n    public ?Expr $if;\n    /** @var Expr Expression for false */\n    public Expr $else;\n\n    /**\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     */\n    public function __construct(Expr $cond, ?Expr $if, Expr $else, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->cond = $cond;\n        $this->if = $if;\n        $this->else = $else;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['cond', 'if', 'else'];\n    }\n\n    public function getType(): string {\n        return 'Expr_Ternary';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Throw_.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr;\n\nuse PhpParser\\Node;\n\nclass Throw_ extends Node\\Expr {\n    /** @var Node\\Expr Expression */\n    public Node\\Expr $expr;\n\n    /**\n     * Constructs a throw expression node.\n     *\n     * @param Node\\Expr $expr Expression\n     * @param array<string, mixed> $attributes Additional attributes\n     */\n    public function __construct(Node\\Expr $expr, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->expr = $expr;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['expr'];\n    }\n\n    public function getType(): string {\n        return 'Expr_Throw';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryMinus.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr;\n\nuse PhpParser\\Node\\Expr;\n\nclass UnaryMinus extends Expr {\n    /** @var Expr Expression */\n    public Expr $expr;\n\n    /**\n     * Constructs a unary minus node.\n     *\n     * @param Expr $expr Expression\n     * @param array<string, mixed> $attributes Additional attributes\n     */\n    public function __construct(Expr $expr, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->expr = $expr;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['expr'];\n    }\n\n    public function getType(): string {\n        return 'Expr_UnaryMinus';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryPlus.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr;\n\nuse PhpParser\\Node\\Expr;\n\nclass UnaryPlus extends Expr {\n    /** @var Expr Expression */\n    public Expr $expr;\n\n    /**\n     * Constructs a unary plus node.\n     *\n     * @param Expr $expr Expression\n     * @param array<string, mixed> $attributes Additional attributes\n     */\n    public function __construct(Expr $expr, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->expr = $expr;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['expr'];\n    }\n\n    public function getType(): string {\n        return 'Expr_UnaryPlus';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Variable.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr;\n\nuse PhpParser\\Node\\Expr;\n\nclass Variable extends Expr {\n    /** @var string|Expr Name */\n    public $name;\n\n    /**\n     * Constructs a variable node.\n     *\n     * @param string|Expr $name Name\n     * @param array<string, mixed> $attributes Additional attributes\n     */\n    public function __construct($name, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->name = $name;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['name'];\n    }\n\n    public function getType(): string {\n        return 'Expr_Variable';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/YieldFrom.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr;\n\nuse PhpParser\\Node\\Expr;\n\nclass YieldFrom extends Expr {\n    /** @var Expr Expression to yield from */\n    public Expr $expr;\n\n    /**\n     * Constructs an \"yield from\" node.\n     *\n     * @param Expr $expr Expression\n     * @param array<string, mixed> $attributes Additional attributes\n     */\n    public function __construct(Expr $expr, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->expr = $expr;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['expr'];\n    }\n\n    public function getType(): string {\n        return 'Expr_YieldFrom';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Yield_.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Expr;\n\nuse PhpParser\\Node\\Expr;\n\nclass Yield_ extends Expr {\n    /** @var null|Expr Key expression */\n    public ?Expr $key;\n    /** @var null|Expr Value expression */\n    public ?Expr $value;\n\n    /**\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     */\n    public function __construct(?Expr $value = null, ?Expr $key = null, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->key = $key;\n        $this->value = $value;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['key', 'value'];\n    }\n\n    public function getType(): string {\n        return 'Expr_Yield';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Expr.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node;\n\nuse PhpParser\\NodeAbstract;\n\nabstract class Expr extends NodeAbstract {\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/FunctionLike.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node;\n\nuse PhpParser\\Node;\n\ninterface FunctionLike extends Node {\n    /**\n     * Whether to return by reference\n     */\n    public function returnsByRef(): bool;\n\n    /**\n     * List of parameters\n     *\n     * @return Param[]\n     */\n    public function getParams(): array;\n\n    /**\n     * Get the declared return type or null\n     *\n     * @return null|Identifier|Name|ComplexType\n     */\n    public function getReturnType();\n\n    /**\n     * The function body\n     *\n     * @return Stmt[]|null\n     */\n    public function getStmts(): ?array;\n\n    /**\n     * Get PHP attribute groups.\n     *\n     * @return AttributeGroup[]\n     */\n    public function getAttrGroups(): array;\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Identifier.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node;\n\nuse PhpParser\\NodeAbstract;\n\n/**\n * Represents a non-namespaced name. Namespaced names are represented using Name nodes.\n */\nclass Identifier extends NodeAbstract {\n    /**\n     * @psalm-var non-empty-string\n     * @var string Identifier as string\n     */\n    public string $name;\n\n    /** @var array<string, bool> */\n    private static array $specialClassNames = [\n        'self'   => true,\n        'parent' => true,\n        'static' => true,\n    ];\n\n    /**\n     * Constructs an identifier node.\n     *\n     * @param string $name Identifier as string\n     * @param array<string, mixed> $attributes Additional attributes\n     */\n    public function __construct(string $name, array $attributes = []) {\n        if ($name === '') {\n            throw new \\InvalidArgumentException('Identifier name cannot be empty');\n        }\n\n        $this->attributes = $attributes;\n        $this->name = $name;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['name'];\n    }\n\n    /**\n     * Get identifier as string.\n     *\n     * @psalm-return non-empty-string\n     * @return string Identifier as string.\n     */\n    public function toString(): string {\n        return $this->name;\n    }\n\n    /**\n     * Get lowercased identifier as string.\n     *\n     * @psalm-return non-empty-string&lowercase-string\n     * @return string Lowercased identifier as string\n     */\n    public function toLowerString(): string {\n        return strtolower($this->name);\n    }\n\n    /**\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     */\n    public function isSpecialClassName(): bool {\n        return isset(self::$specialClassNames[strtolower($this->name)]);\n    }\n\n    /**\n     * Get identifier as string.\n     *\n     * @psalm-return non-empty-string\n     * @return string Identifier as string\n     */\n    public function __toString(): string {\n        return $this->name;\n    }\n\n    public function getType(): string {\n        return 'Identifier';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/InterpolatedStringPart.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node;\n\nuse PhpParser\\NodeAbstract;\n\nclass InterpolatedStringPart extends NodeAbstract {\n    /** @var string String value */\n    public string $value;\n\n    /**\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     */\n    public function __construct(string $value, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->value = $value;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['value'];\n    }\n\n    public function getType(): string {\n        return 'InterpolatedStringPart';\n    }\n}\n\n// @deprecated compatibility alias\nclass_alias(InterpolatedStringPart::class, Scalar\\EncapsedStringPart::class);\n","vendor/nikic/php-parser/lib/PhpParser/Node/IntersectionType.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node;\n\nclass IntersectionType extends ComplexType {\n    /** @var (Identifier|Name)[] Types */\n    public array $types;\n\n    /**\n     * Constructs an intersection type.\n     *\n     * @param (Identifier|Name)[] $types Types\n     * @param array<string, mixed> $attributes Additional attributes\n     */\n    public function __construct(array $types, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->types = $types;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['types'];\n    }\n\n    public function getType(): string {\n        return 'IntersectionType';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/MatchArm.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node;\n\nuse PhpParser\\Node;\nuse PhpParser\\NodeAbstract;\n\nclass MatchArm extends NodeAbstract {\n    /** @var null|list<Node\\Expr> */\n    public ?array $conds;\n    public Expr $body;\n\n    /**\n     * @param null|list<Node\\Expr> $conds\n     */\n    public function __construct(?array $conds, Node\\Expr $body, array $attributes = []) {\n        $this->conds = $conds;\n        $this->body = $body;\n        $this->attributes = $attributes;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['conds', 'body'];\n    }\n\n    public function getType(): string {\n        return 'MatchArm';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Name/FullyQualified.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Name;\n\nclass FullyQualified extends \\PhpParser\\Node\\Name {\n    /**\n     * Checks whether the name is unqualified. (E.g. Name)\n     *\n     * @return bool Whether the name is unqualified\n     */\n    public function isUnqualified(): bool {\n        return false;\n    }\n\n    /**\n     * Checks whether the name is qualified. (E.g. Name\\Name)\n     *\n     * @return bool Whether the name is qualified\n     */\n    public function isQualified(): bool {\n        return false;\n    }\n\n    /**\n     * Checks whether the name is fully qualified. (E.g. \\Name)\n     *\n     * @return bool Whether the name is fully qualified\n     */\n    public function isFullyQualified(): bool {\n        return true;\n    }\n\n    /**\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     */\n    public function isRelative(): bool {\n        return false;\n    }\n\n    public function toCodeString(): string {\n        return '\\\\' . $this->toString();\n    }\n\n    public function getType(): string {\n        return 'Name_FullyQualified';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Name/Relative.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Name;\n\nclass Relative extends \\PhpParser\\Node\\Name {\n    /**\n     * Checks whether the name is unqualified. (E.g. Name)\n     *\n     * @return bool Whether the name is unqualified\n     */\n    public function isUnqualified(): bool {\n        return false;\n    }\n\n    /**\n     * Checks whether the name is qualified. (E.g. Name\\Name)\n     *\n     * @return bool Whether the name is qualified\n     */\n    public function isQualified(): bool {\n        return false;\n    }\n\n    /**\n     * Checks whether the name is fully qualified. (E.g. \\Name)\n     *\n     * @return bool Whether the name is fully qualified\n     */\n    public function isFullyQualified(): bool {\n        return false;\n    }\n\n    /**\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     */\n    public function isRelative(): bool {\n        return true;\n    }\n\n    public function toCodeString(): string {\n        return 'namespace\\\\' . $this->toString();\n    }\n\n    public function getType(): string {\n        return 'Name_Relative';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Name.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node;\n\nuse PhpParser\\NodeAbstract;\n\nclass Name extends NodeAbstract {\n    /**\n     * @psalm-var non-empty-string\n     * @var string Name as string\n     */\n    public string $name;\n\n    /** @var array<string, bool> */\n    private static array $specialClassNames = [\n        'self'   => true,\n        'parent' => true,\n        'static' => true,\n    ];\n\n    /**\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     */\n    final public function __construct($name, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->name = self::prepareName($name);\n    }\n\n    public function getSubNodeNames(): array {\n        return ['name'];\n    }\n\n    /**\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     */\n    public function getParts(): array {\n        return \\explode('\\\\', $this->name);\n    }\n\n    /**\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     */\n    public function getFirst(): string {\n        if (false !== $pos = \\strpos($this->name, '\\\\')) {\n            return \\substr($this->name, 0, $pos);\n        }\n        return $this->name;\n    }\n\n    /**\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     */\n    public function getLast(): string {\n        if (false !== $pos = \\strrpos($this->name, '\\\\')) {\n            return \\substr($this->name, $pos + 1);\n        }\n        return $this->name;\n    }\n\n    /**\n     * Checks whether the name is unqualified. (E.g. Name)\n     *\n     * @return bool Whether the name is unqualified\n     */\n    public function isUnqualified(): bool {\n        return false === \\strpos($this->name, '\\\\');\n    }\n\n    /**\n     * Checks whether the name is qualified. (E.g. Name\\Name)\n     *\n     * @return bool Whether the name is qualified\n     */\n    public function isQualified(): bool {\n        return false !== \\strpos($this->name, '\\\\');\n    }\n\n    /**\n     * Checks whether the name is fully qualified. (E.g. \\Name)\n     *\n     * @return bool Whether the name is fully qualified\n     */\n    public function isFullyQualified(): bool {\n        return false;\n    }\n\n    /**\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     */\n    public function isRelative(): bool {\n        return false;\n    }\n\n    /**\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     */\n    public function toString(): string {\n        return $this->name;\n    }\n\n    /**\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     */\n    public function toCodeString(): string {\n        return $this->toString();\n    }\n\n    /**\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     */\n    public function toLowerString(): string {\n        return strtolower($this->name);\n    }\n\n    /**\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     */\n    public function isSpecialClassName(): bool {\n        return isset(self::$specialClassNames[strtolower($this->name)]);\n    }\n\n    /**\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     */\n    public function __toString(): string {\n        return $this->name;\n    }\n\n    /**\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     */\n    public function slice(int $offset, ?int $length = null) {\n        if ($offset === 1 && $length === null) {\n            // Short-circuit the common case.\n            if (false !== $pos = \\strpos($this->name, '\\\\')) {\n                return new static(\\substr($this->name, $pos + 1));\n            }\n            return null;\n        }\n\n        $parts = \\explode('\\\\', $this->name);\n        $numParts = \\count($parts);\n\n        $realOffset = $offset < 0 ? $offset + $numParts : $offset;\n        if ($realOffset < 0 || $realOffset > $numParts) {\n            throw new \\OutOfBoundsException(sprintf('Offset %d is out of bounds', $offset));\n        }\n\n        if (null === $length) {\n            $realLength = $numParts - $realOffset;\n        } else {\n            $realLength = $length < 0 ? $length + $numParts - $realOffset : $length;\n            if ($realLength < 0 || $realLength > $numParts - $realOffset) {\n                throw new \\OutOfBoundsException(sprintf('Length %d is out of bounds', $length));\n            }\n        }\n\n        if ($realLength === 0) {\n            // Empty slice is represented as null\n            return null;\n        }\n\n        return new static(array_slice($parts, $realOffset, $realLength), $this->attributes);\n    }\n\n    /**\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     */\n    public static function concat($name1, $name2, array $attributes = []) {\n        if (null === $name1 && null === $name2) {\n            return null;\n        }\n        if (null === $name1) {\n            return new static($name2, $attributes);\n        }\n        if (null === $name2) {\n            return new static($name1, $attributes);\n        } else {\n            return new static(\n                self::prepareName($name1) . '\\\\' . self::prepareName($name2), $attributes\n            );\n        }\n    }\n\n    /**\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     */\n    private static function prepareName($name): string {\n        if (\\is_string($name)) {\n            if ('' === $name) {\n                throw new \\InvalidArgumentException('Name cannot be empty');\n            }\n\n            return $name;\n        }\n        if (\\is_array($name)) {\n            if (empty($name)) {\n                throw new \\InvalidArgumentException('Name cannot be empty');\n            }\n\n            return implode('\\\\', $name);\n        }\n        if ($name instanceof self) {\n            return $name->name;\n        }\n\n        throw new \\InvalidArgumentException(\n            'Expected string, array of parts or Name instance'\n        );\n    }\n\n    public function getType(): string {\n        return 'Name';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/NullableType.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node;\n\nuse PhpParser\\Node;\n\nclass NullableType extends ComplexType {\n    /** @var Identifier|Name Type */\n    public Node $type;\n\n    /**\n     * Constructs a nullable type (wrapping another type).\n     *\n     * @param Identifier|Name $type Type\n     * @param array<string, mixed> $attributes Additional attributes\n     */\n    public function __construct(Node $type, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->type = $type;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['type'];\n    }\n\n    public function getType(): string {\n        return 'NullableType';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Param.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node;\n\nuse PhpParser\\Modifiers;\nuse PhpParser\\Node;\nuse PhpParser\\NodeAbstract;\n\nclass Param extends NodeAbstract {\n    /** @var null|Identifier|Name|ComplexType Type declaration */\n    public ?Node $type;\n    /** @var bool Whether parameter is passed by reference */\n    public bool $byRef;\n    /** @var bool Whether this is a variadic argument */\n    public bool $variadic;\n    /** @var Expr\\Variable|Expr\\Error Parameter variable */\n    public Expr $var;\n    /** @var null|Expr Default value */\n    public ?Expr $default;\n    /** @var int Optional visibility flags */\n    public int $flags;\n    /** @var AttributeGroup[] PHP attribute groups */\n    public array $attrGroups;\n    /** @var PropertyHook[] Property hooks for promoted properties */\n    public array $hooks;\n\n    /**\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     */\n    public function __construct(\n        Expr $var, ?Expr $default = null, ?Node $type = null,\n        bool $byRef = false, bool $variadic = false,\n        array $attributes = [],\n        int $flags = 0,\n        array $attrGroups = [],\n        array $hooks = []\n    ) {\n        $this->attributes = $attributes;\n        $this->type = $type;\n        $this->byRef = $byRef;\n        $this->variadic = $variadic;\n        $this->var = $var;\n        $this->default = $default;\n        $this->flags = $flags;\n        $this->attrGroups = $attrGroups;\n        $this->hooks = $hooks;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['attrGroups', 'flags', 'type', 'byRef', 'variadic', 'var', 'default', 'hooks'];\n    }\n\n    public function getType(): string {\n        return 'Param';\n    }\n\n    /**\n     * Whether this parameter uses constructor property promotion.\n     */\n    public function isPromoted(): bool {\n        return $this->flags !== 0 || $this->hooks !== [];\n    }\n\n    public function isFinal(): bool {\n        return (bool) ($this->flags & Modifiers::FINAL);\n    }\n\n    public function isPublic(): bool {\n        $public = (bool) ($this->flags & Modifiers::PUBLIC);\n        if ($public) {\n            return true;\n        }\n\n        if (!$this->isPromoted()) {\n            return false;\n        }\n\n        return ($this->flags & Modifiers::VISIBILITY_MASK) === 0;\n    }\n\n    public function isProtected(): bool {\n        return (bool) ($this->flags & Modifiers::PROTECTED);\n    }\n\n    public function isPrivate(): bool {\n        return (bool) ($this->flags & Modifiers::PRIVATE);\n    }\n\n    public function isReadonly(): bool {\n        return (bool) ($this->flags & Modifiers::READONLY);\n    }\n\n    /**\n     * Whether the promoted property has explicit public(set) visibility.\n     */\n    public function isPublicSet(): bool {\n        return (bool) ($this->flags & Modifiers::PUBLIC_SET);\n    }\n\n    /**\n     * Whether the promoted property has explicit protected(set) visibility.\n     */\n    public function isProtectedSet(): bool {\n        return (bool) ($this->flags & Modifiers::PROTECTED_SET);\n    }\n\n    /**\n     * Whether the promoted property has explicit private(set) visibility.\n     */\n    public function isPrivateSet(): bool {\n        return (bool) ($this->flags & Modifiers::PRIVATE_SET);\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/PropertyHook.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node;\n\nuse PhpParser\\Modifiers;\nuse PhpParser\\Node\\Expr\\Assign;\nuse PhpParser\\Node\\Expr\\PropertyFetch;\nuse PhpParser\\Node\\Expr\\Variable;\nuse PhpParser\\Node\\Stmt\\Expression;\nuse PhpParser\\Node\\Stmt\\Return_;\nuse PhpParser\\NodeAbstract;\n\nclass PropertyHook extends NodeAbstract implements FunctionLike {\n    /** @var AttributeGroup[] PHP attribute groups */\n    public array $attrGroups;\n    /** @var int Modifiers */\n    public int $flags;\n    /** @var bool Whether hook returns by reference */\n    public bool $byRef;\n    /** @var Identifier Hook name */\n    public Identifier $name;\n    /** @var Param[] Parameters */\n    public array $params;\n    /** @var null|Expr|Stmt[] Hook body */\n    public $body;\n\n    /**\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     */\n    public function __construct($name, $body, array $subNodes = [], array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->name = \\is_string($name) ? new Identifier($name) : $name;\n        $this->body = $body;\n        $this->flags = $subNodes['flags'] ?? 0;\n        $this->byRef = $subNodes['byRef'] ?? false;\n        $this->params = $subNodes['params'] ?? [];\n        $this->attrGroups = $subNodes['attrGroups'] ?? [];\n    }\n\n    public function returnsByRef(): bool {\n        return $this->byRef;\n    }\n\n    public function getParams(): array {\n        return $this->params;\n    }\n\n    public function getReturnType() {\n        return null;\n    }\n\n    /**\n     * Whether the property hook is final.\n     */\n    public function isFinal(): bool {\n        return (bool) ($this->flags & Modifiers::FINAL);\n    }\n\n    public function getStmts(): ?array {\n        if ($this->body instanceof Expr) {\n            $name = $this->name->toLowerString();\n            if ($name === 'get') {\n                return [new Return_($this->body)];\n            }\n            if ($name === 'set') {\n                if (!$this->hasAttribute('propertyName')) {\n                    throw new \\LogicException(\n                        'Can only use getStmts() on a \"set\" hook if the \"propertyName\" attribute is set');\n                }\n\n                $propName = $this->getAttribute('propertyName');\n                $prop = new PropertyFetch(new Variable('this'), (string) $propName);\n                return [new Expression(new Assign($prop, $this->body))];\n            }\n            throw new \\LogicException('Unknown property hook \"' . $name . '\"');\n        }\n        return $this->body;\n    }\n\n    public function getAttrGroups(): array {\n        return $this->attrGroups;\n    }\n\n    public function getType(): string {\n        return 'PropertyHook';\n    }\n\n    public function getSubNodeNames(): array {\n        return ['attrGroups', 'flags', 'byRef', 'name', 'params', 'body'];\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/PropertyItem.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node;\n\nuse PhpParser\\Node;\nuse PhpParser\\NodeAbstract;\n\nclass PropertyItem extends NodeAbstract {\n    /** @var Node\\VarLikeIdentifier Name */\n    public VarLikeIdentifier $name;\n    /** @var null|Node\\Expr Default */\n    public ?Expr $default;\n\n    /**\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     */\n    public function __construct($name, ?Node\\Expr $default = null, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->name = \\is_string($name) ? new Node\\VarLikeIdentifier($name) : $name;\n        $this->default = $default;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['name', 'default'];\n    }\n\n    public function getType(): string {\n        return 'PropertyItem';\n    }\n}\n\n// @deprecated compatibility alias\nclass_alias(PropertyItem::class, Stmt\\PropertyProperty::class);\n","vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/DNumber.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Scalar;\n\nrequire __DIR__ . '/Float_.php';\n\nif (false) {\n    /**\n     * For classmap-authoritative support.\n     *\n     * @deprecated use \\PhpParser\\Node\\Scalar\\Float_ instead.\n     */\n    class DNumber extends Float_ {\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/Encapsed.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Scalar;\n\nrequire __DIR__ . '/InterpolatedString.php';\n\nif (false) {\n    /**\n     * For classmap-authoritative support.\n     *\n     * @deprecated use \\PhpParser\\Node\\Scalar\\InterpolatedString instead.\n     */\n    class Encapsed extends InterpolatedString {\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/EncapsedStringPart.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Scalar;\n\nuse PhpParser\\Node\\InterpolatedStringPart;\n\nrequire __DIR__ . '/../InterpolatedStringPart.php';\n\nif (false) {\n    /**\n     * For classmap-authoritative support.\n     *\n     * @deprecated use \\PhpParser\\Node\\InterpolatedStringPart instead.\n     */\n    class EncapsedStringPart extends InterpolatedStringPart {\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/Float_.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Scalar;\n\nuse PhpParser\\Node\\Scalar;\n\nclass Float_ extends Scalar {\n    /** @var float Number value */\n    public float $value;\n\n    /**\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     */\n    public function __construct(float $value, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->value = $value;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['value'];\n    }\n\n    /**\n     * @param mixed[] $attributes\n     */\n    public static function fromString(string $str, array $attributes = []): Float_ {\n        $attributes['rawValue'] = $str;\n        $float = self::parse($str);\n\n        return new Float_($float, $attributes);\n    }\n\n    /**\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     */\n    public static function parse(string $str): float {\n        $str = str_replace('_', '', $str);\n\n        // Check whether this is one of the special integer notations.\n        if ('0' === $str[0]) {\n            // hex\n            if ('x' === $str[1] || 'X' === $str[1]) {\n                return hexdec($str);\n            }\n\n            // bin\n            if ('b' === $str[1] || 'B' === $str[1]) {\n                return bindec($str);\n            }\n\n            // oct, but only if the string does not contain any of '.eE'.\n            if (false === strpbrk($str, '.eE')) {\n                // substr($str, 0, strcspn($str, '89')) cuts the string at the first invalid digit\n                // (8 or 9) so that only the digits before that are used.\n                return octdec(substr($str, 0, strcspn($str, '89')));\n            }\n        }\n\n        // dec\n        return (float) $str;\n    }\n\n    public function getType(): string {\n        return 'Scalar_Float';\n    }\n}\n\n// @deprecated compatibility alias\nclass_alias(Float_::class, DNumber::class);\n","vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/Int_.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Scalar;\n\nuse PhpParser\\Error;\nuse PhpParser\\Node\\Scalar;\n\nclass Int_ extends Scalar {\n    /* For use in \"kind\" attribute */\n    public const KIND_BIN = 2;\n    public const KIND_OCT = 8;\n    public const KIND_DEC = 10;\n    public const KIND_HEX = 16;\n\n    /** @var int Number value */\n    public int $value;\n\n    /**\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     */\n    public function __construct(int $value, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->value = $value;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['value'];\n    }\n\n    /**\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     */\n    public static function fromString(string $str, array $attributes = [], bool $allowInvalidOctal = false): Int_ {\n        $attributes['rawValue'] = $str;\n\n        $str = str_replace('_', '', $str);\n\n        if ('0' !== $str[0] || '0' === $str) {\n            $attributes['kind'] = Int_::KIND_DEC;\n            return new Int_((int) $str, $attributes);\n        }\n\n        if ('x' === $str[1] || 'X' === $str[1]) {\n            $attributes['kind'] = Int_::KIND_HEX;\n            return new Int_(hexdec($str), $attributes);\n        }\n\n        if ('b' === $str[1] || 'B' === $str[1]) {\n            $attributes['kind'] = Int_::KIND_BIN;\n            return new Int_(bindec($str), $attributes);\n        }\n\n        if (!$allowInvalidOctal && strpbrk($str, '89')) {\n            throw new Error('Invalid numeric literal', $attributes);\n        }\n\n        // Strip optional explicit octal prefix.\n        if ('o' === $str[1] || 'O' === $str[1]) {\n            $str = substr($str, 2);\n        }\n\n        // use intval instead of octdec to get proper cutting behavior with malformed numbers\n        $attributes['kind'] = Int_::KIND_OCT;\n        return new Int_(intval($str, 8), $attributes);\n    }\n\n    public function getType(): string {\n        return 'Scalar_Int';\n    }\n}\n\n// @deprecated compatibility alias\nclass_alias(Int_::class, LNumber::class);\n","vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/InterpolatedString.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Scalar;\n\nuse PhpParser\\Node\\Expr;\nuse PhpParser\\Node\\InterpolatedStringPart;\nuse PhpParser\\Node\\Scalar;\n\nclass InterpolatedString extends Scalar {\n    /** @var (Expr|InterpolatedStringPart)[] list of string parts */\n    public array $parts;\n\n    /**\n     * Constructs an interpolated string node.\n     *\n     * @param (Expr|InterpolatedStringPart)[] $parts Interpolated string parts\n     * @param array<string, mixed> $attributes Additional attributes\n     */\n    public function __construct(array $parts, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->parts = $parts;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['parts'];\n    }\n\n    public function getType(): string {\n        return 'Scalar_InterpolatedString';\n    }\n}\n\n// @deprecated compatibility alias\nclass_alias(InterpolatedString::class, Encapsed::class);\n","vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/LNumber.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Scalar;\n\nrequire __DIR__ . '/Int_.php';\n\nif (false) {\n    /**\n     * For classmap-authoritative support.\n     *\n     * @deprecated use \\PhpParser\\Node\\Scalar\\Int_ instead.\n     */\n    class LNumber extends Int_ {\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Class_.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Scalar\\MagicConst;\n\nuse PhpParser\\Node\\Scalar\\MagicConst;\n\nclass Class_ extends MagicConst {\n    public function getName(): string {\n        return '__CLASS__';\n    }\n\n    public function getType(): string {\n        return 'Scalar_MagicConst_Class';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Dir.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Scalar\\MagicConst;\n\nuse PhpParser\\Node\\Scalar\\MagicConst;\n\nclass Dir extends MagicConst {\n    public function getName(): string {\n        return '__DIR__';\n    }\n\n    public function getType(): string {\n        return 'Scalar_MagicConst_Dir';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/File.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Scalar\\MagicConst;\n\nuse PhpParser\\Node\\Scalar\\MagicConst;\n\nclass File extends MagicConst {\n    public function getName(): string {\n        return '__FILE__';\n    }\n\n    public function getType(): string {\n        return 'Scalar_MagicConst_File';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Function_.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Scalar\\MagicConst;\n\nuse PhpParser\\Node\\Scalar\\MagicConst;\n\nclass Function_ extends MagicConst {\n    public function getName(): string {\n        return '__FUNCTION__';\n    }\n\n    public function getType(): string {\n        return 'Scalar_MagicConst_Function';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Line.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Scalar\\MagicConst;\n\nuse PhpParser\\Node\\Scalar\\MagicConst;\n\nclass Line extends MagicConst {\n    public function getName(): string {\n        return '__LINE__';\n    }\n\n    public function getType(): string {\n        return 'Scalar_MagicConst_Line';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Method.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Scalar\\MagicConst;\n\nuse PhpParser\\Node\\Scalar\\MagicConst;\n\nclass Method extends MagicConst {\n    public function getName(): string {\n        return '__METHOD__';\n    }\n\n    public function getType(): string {\n        return 'Scalar_MagicConst_Method';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Namespace_.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Scalar\\MagicConst;\n\nuse PhpParser\\Node\\Scalar\\MagicConst;\n\nclass Namespace_ extends MagicConst {\n    public function getName(): string {\n        return '__NAMESPACE__';\n    }\n\n    public function getType(): string {\n        return 'Scalar_MagicConst_Namespace';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Property.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Scalar\\MagicConst;\n\nuse PhpParser\\Node\\Scalar\\MagicConst;\n\nclass Property extends MagicConst {\n    public function getName(): string {\n        return '__PROPERTY__';\n    }\n\n    public function getType(): string {\n        return 'Scalar_MagicConst_Property';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Trait_.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Scalar\\MagicConst;\n\nuse PhpParser\\Node\\Scalar\\MagicConst;\n\nclass Trait_ extends MagicConst {\n    public function getName(): string {\n        return '__TRAIT__';\n    }\n\n    public function getType(): string {\n        return 'Scalar_MagicConst_Trait';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Scalar;\n\nuse PhpParser\\Node\\Scalar;\n\nabstract class MagicConst extends Scalar {\n    /**\n     * Constructs a magic constant node.\n     *\n     * @param array<string, mixed> $attributes Additional attributes\n     */\n    public function __construct(array $attributes = []) {\n        $this->attributes = $attributes;\n    }\n\n    public function getSubNodeNames(): array {\n        return [];\n    }\n\n    /**\n     * Get name of magic constant.\n     *\n     * @return string Name of magic constant\n     */\n    abstract public function getName(): string;\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/String_.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Scalar;\n\nuse PhpParser\\Error;\nuse PhpParser\\Node\\Scalar;\n\nclass String_ extends Scalar {\n    /* For use in \"kind\" attribute */\n    public const KIND_SINGLE_QUOTED = 1;\n    public const KIND_DOUBLE_QUOTED = 2;\n    public const KIND_HEREDOC = 3;\n    public const KIND_NOWDOC = 4;\n\n    /** @var string String value */\n    public string $value;\n\n    /** @var array<string, string> Escaped character to its decoded value */\n    protected static array $replacements = [\n        '\\\\' => '\\\\',\n        '$'  =>  '$',\n        'n'  => \"\\n\",\n        'r'  => \"\\r\",\n        't'  => \"\\t\",\n        'f'  => \"\\f\",\n        'v'  => \"\\v\",\n        'e'  => \"\\x1B\",\n    ];\n\n    /**\n     * Constructs a string scalar node.\n     *\n     * @param string $value Value of the string\n     * @param array<string, mixed> $attributes Additional attributes\n     */\n    public function __construct(string $value, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->value = $value;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['value'];\n    }\n\n    /**\n     * @param array<string, mixed> $attributes\n     * @param bool $parseUnicodeEscape Whether to parse PHP 7 \\u escapes\n     */\n    public static function fromString(string $str, array $attributes = [], bool $parseUnicodeEscape = true): self {\n        $attributes['kind'] = ($str[0] === \"'\" || ($str[1] === \"'\" && ($str[0] === 'b' || $str[0] === 'B')))\n            ? Scalar\\String_::KIND_SINGLE_QUOTED\n            : Scalar\\String_::KIND_DOUBLE_QUOTED;\n\n        $attributes['rawValue'] = $str;\n\n        $string = self::parse($str, $parseUnicodeEscape);\n\n        return new self($string, $attributes);\n    }\n\n    /**\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     */\n    public static function parse(string $str, bool $parseUnicodeEscape = true): string {\n        $bLength = 0;\n        if ('b' === $str[0] || 'B' === $str[0]) {\n            $bLength = 1;\n        }\n\n        if ('\\'' === $str[$bLength]) {\n            return str_replace(\n                ['\\\\\\\\', '\\\\\\''],\n                ['\\\\', '\\''],\n                substr($str, $bLength + 1, -1)\n            );\n        } else {\n            return self::parseEscapeSequences(\n                substr($str, $bLength + 1, -1), '\"', $parseUnicodeEscape\n            );\n        }\n    }\n\n    /**\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     */\n    public static function parseEscapeSequences(string $str, ?string $quote, bool $parseUnicodeEscape = true): string {\n        if (null !== $quote) {\n            $str = str_replace('\\\\' . $quote, $quote, $str);\n        }\n\n        $extra = '';\n        if ($parseUnicodeEscape) {\n            $extra = '|u\\{([0-9a-fA-F]+)\\}';\n        }\n\n        return preg_replace_callback(\n            '~\\\\\\\\([\\\\\\\\$nrtfve]|[xX][0-9a-fA-F]{1,2}|[0-7]{1,3}' . $extra . ')~',\n            function ($matches) {\n                $str = $matches[1];\n\n                if (isset(self::$replacements[$str])) {\n                    return self::$replacements[$str];\n                }\n                if ('x' === $str[0] || 'X' === $str[0]) {\n                    return chr(hexdec(substr($str, 1)));\n                }\n                if ('u' === $str[0]) {\n                    $dec = hexdec($matches[2]);\n                    // If it overflowed to float, treat as INT_MAX, it will throw an error anyway.\n                    return self::codePointToUtf8(\\is_int($dec) ? $dec : \\PHP_INT_MAX);\n                } else {\n                    return chr(octdec($str) & 255);\n                }\n            },\n            $str\n        );\n    }\n\n    /**\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     */\n    private static function codePointToUtf8(int $num): string {\n        if ($num <= 0x7F) {\n            return chr($num);\n        }\n        if ($num <= 0x7FF) {\n            return chr(($num >> 6) + 0xC0) . chr(($num & 0x3F) + 0x80);\n        }\n        if ($num <= 0xFFFF) {\n            return chr(($num >> 12) + 0xE0) . chr((($num >> 6) & 0x3F) + 0x80) . chr(($num & 0x3F) + 0x80);\n        }\n        if ($num <= 0x1FFFFF) {\n            return chr(($num >> 18) + 0xF0) . chr((($num >> 12) & 0x3F) + 0x80)\n                 . chr((($num >> 6) & 0x3F) + 0x80) . chr(($num & 0x3F) + 0x80);\n        }\n        throw new Error('Invalid UTF-8 codepoint escape sequence: Codepoint too large');\n    }\n\n    public function getType(): string {\n        return 'Scalar_String';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Scalar.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node;\n\nabstract class Scalar extends Expr {\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/StaticVar.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node;\n\nuse PhpParser\\Node;\nuse PhpParser\\NodeAbstract;\n\nclass StaticVar extends NodeAbstract {\n    /** @var Expr\\Variable Variable */\n    public Expr\\Variable $var;\n    /** @var null|Node\\Expr Default value */\n    public ?Expr $default;\n\n    /**\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     */\n    public function __construct(\n        Expr\\Variable $var, ?Node\\Expr $default = null, array $attributes = []\n    ) {\n        $this->attributes = $attributes;\n        $this->var = $var;\n        $this->default = $default;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['var', 'default'];\n    }\n\n    public function getType(): string {\n        return 'StaticVar';\n    }\n}\n\n// @deprecated compatibility alias\nclass_alias(StaticVar::class, Stmt\\StaticVar::class);\n","vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Block.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Stmt;\n\nuse PhpParser\\Node\\Stmt;\n\nclass Block extends Stmt {\n    /** @var Stmt[] Statements */\n    public array $stmts;\n\n    /**\n     * A block of statements.\n     *\n     * @param Stmt[] $stmts Statements\n     * @param array<string, mixed> $attributes Additional attributes\n     */\n    public function __construct(array $stmts, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->stmts = $stmts;\n    }\n\n    public function getType(): string {\n        return 'Stmt_Block';\n    }\n\n    public function getSubNodeNames(): array {\n        return ['stmts'];\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Break_.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Stmt;\n\nuse PhpParser\\Node;\n\nclass Break_ extends Node\\Stmt {\n    /** @var null|Node\\Expr Number of loops to break */\n    public ?Node\\Expr $num;\n\n    /**\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     */\n    public function __construct(?Node\\Expr $num = null, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->num = $num;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['num'];\n    }\n\n    public function getType(): string {\n        return 'Stmt_Break';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Case_.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Stmt;\n\nuse PhpParser\\Node;\n\nclass Case_ extends Node\\Stmt {\n    /** @var null|Node\\Expr Condition (null for default) */\n    public ?Node\\Expr $cond;\n    /** @var Node\\Stmt[] Statements */\n    public array $stmts;\n\n    /**\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     */\n    public function __construct(?Node\\Expr $cond, array $stmts = [], array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->cond = $cond;\n        $this->stmts = $stmts;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['cond', 'stmts'];\n    }\n\n    public function getType(): string {\n        return 'Stmt_Case';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Catch_.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Stmt;\n\nuse PhpParser\\Node;\nuse PhpParser\\Node\\Expr;\n\nclass Catch_ extends Node\\Stmt {\n    /** @var Node\\Name[] Types of exceptions to catch */\n    public array $types;\n    /** @var Expr\\Variable|null Variable for exception */\n    public ?Expr\\Variable $var;\n    /** @var Node\\Stmt[] Statements */\n    public array $stmts;\n\n    /**\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     */\n    public function __construct(\n        array $types, ?Expr\\Variable $var = null, array $stmts = [], array $attributes = []\n    ) {\n        $this->attributes = $attributes;\n        $this->types = $types;\n        $this->var = $var;\n        $this->stmts = $stmts;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['types', 'var', 'stmts'];\n    }\n\n    public function getType(): string {\n        return 'Stmt_Catch';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassConst.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Stmt;\n\nuse PhpParser\\Modifiers;\nuse PhpParser\\Node;\n\nclass ClassConst extends Node\\Stmt {\n    /** @var int Modifiers */\n    public int $flags;\n    /** @var Node\\Const_[] Constant declarations */\n    public array $consts;\n    /** @var Node\\AttributeGroup[] PHP attribute groups */\n    public array $attrGroups;\n    /** @var Node\\Identifier|Node\\Name|Node\\ComplexType|null Type declaration */\n    public ?Node $type;\n\n    /**\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     */\n    public function __construct(\n        array $consts,\n        int $flags = 0,\n        array $attributes = [],\n        array $attrGroups = [],\n        ?Node $type = null\n    ) {\n        $this->attributes = $attributes;\n        $this->flags = $flags;\n        $this->consts = $consts;\n        $this->attrGroups = $attrGroups;\n        $this->type = $type;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['attrGroups', 'flags', 'type', 'consts'];\n    }\n\n    /**\n     * Whether constant is explicitly or implicitly public.\n     */\n    public function isPublic(): bool {\n        return ($this->flags & Modifiers::PUBLIC) !== 0\n            || ($this->flags & Modifiers::VISIBILITY_MASK) === 0;\n    }\n\n    /**\n     * Whether constant is protected.\n     */\n    public function isProtected(): bool {\n        return (bool) ($this->flags & Modifiers::PROTECTED);\n    }\n\n    /**\n     * Whether constant is private.\n     */\n    public function isPrivate(): bool {\n        return (bool) ($this->flags & Modifiers::PRIVATE);\n    }\n\n    /**\n     * Whether constant is final.\n     */\n    public function isFinal(): bool {\n        return (bool) ($this->flags & Modifiers::FINAL);\n    }\n\n    public function getType(): string {\n        return 'Stmt_ClassConst';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassLike.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Stmt;\n\nuse PhpParser\\Node;\nuse PhpParser\\Node\\PropertyItem;\n\nabstract class ClassLike extends Node\\Stmt {\n    /** @var Node\\Identifier|null Name */\n    public ?Node\\Identifier $name;\n    /** @var Node\\Stmt[] Statements */\n    public array $stmts;\n    /** @var Node\\AttributeGroup[] PHP attribute groups */\n    public array $attrGroups;\n\n    /** @var Node\\Name|null Namespaced name (if using NameResolver) */\n    public ?Node\\Name $namespacedName;\n\n    /**\n     * @return list<TraitUse>\n     */\n    public function getTraitUses(): array {\n        $traitUses = [];\n        foreach ($this->stmts as $stmt) {\n            if ($stmt instanceof TraitUse) {\n                $traitUses[] = $stmt;\n            }\n        }\n        return $traitUses;\n    }\n\n    /**\n     * @return list<ClassConst>\n     */\n    public function getConstants(): array {\n        $constants = [];\n        foreach ($this->stmts as $stmt) {\n            if ($stmt instanceof ClassConst) {\n                $constants[] = $stmt;\n            }\n        }\n        return $constants;\n    }\n\n    /**\n     * @return list<Property>\n     */\n    public function getProperties(): array {\n        $properties = [];\n        foreach ($this->stmts as $stmt) {\n            if ($stmt instanceof Property) {\n                $properties[] = $stmt;\n            }\n        }\n        return $properties;\n    }\n\n    /**\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     */\n    public function getProperty(string $name): ?Property {\n        foreach ($this->stmts as $stmt) {\n            if ($stmt instanceof Property) {\n                foreach ($stmt->props as $prop) {\n                    if ($prop instanceof PropertyItem && $name === $prop->name->toString()) {\n                        return $stmt;\n                    }\n                }\n            }\n        }\n        return null;\n    }\n\n    /**\n     * Gets all methods defined directly in this class/interface/trait\n     *\n     * @return list<ClassMethod>\n     */\n    public function getMethods(): array {\n        $methods = [];\n        foreach ($this->stmts as $stmt) {\n            if ($stmt instanceof ClassMethod) {\n                $methods[] = $stmt;\n            }\n        }\n        return $methods;\n    }\n\n    /**\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     */\n    public function getMethod(string $name): ?ClassMethod {\n        $lowerName = strtolower($name);\n        foreach ($this->stmts as $stmt) {\n            if ($stmt instanceof ClassMethod && $lowerName === $stmt->name->toLowerString()) {\n                return $stmt;\n            }\n        }\n        return null;\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassMethod.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Stmt;\n\nuse PhpParser\\Modifiers;\nuse PhpParser\\Node;\nuse PhpParser\\Node\\FunctionLike;\n\nclass ClassMethod extends Node\\Stmt implements FunctionLike {\n    /** @var int Flags */\n    public int $flags;\n    /** @var bool Whether to return by reference */\n    public bool $byRef;\n    /** @var Node\\Identifier Name */\n    public Node\\Identifier $name;\n    /** @var Node\\Param[] Parameters */\n    public array $params;\n    /** @var null|Node\\Identifier|Node\\Name|Node\\ComplexType Return type */\n    public ?Node $returnType;\n    /** @var Node\\Stmt[]|null Statements */\n    public ?array $stmts;\n    /** @var Node\\AttributeGroup[] PHP attribute groups */\n    public array $attrGroups;\n\n    /** @var array<string, bool> */\n    private static array $magicNames = [\n        '__construct'   => true,\n        '__destruct'    => true,\n        '__call'        => true,\n        '__callstatic'  => true,\n        '__get'         => true,\n        '__set'         => true,\n        '__isset'       => true,\n        '__unset'       => true,\n        '__sleep'       => true,\n        '__wakeup'      => true,\n        '__tostring'    => true,\n        '__set_state'   => true,\n        '__clone'       => true,\n        '__invoke'      => true,\n        '__debuginfo'   => true,\n        '__serialize'   => true,\n        '__unserialize' => true,\n    ];\n\n    /**\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     */\n    public function __construct($name, array $subNodes = [], array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->flags = $subNodes['flags'] ?? $subNodes['type'] ?? 0;\n        $this->byRef = $subNodes['byRef'] ?? false;\n        $this->name = \\is_string($name) ? new Node\\Identifier($name) : $name;\n        $this->params = $subNodes['params'] ?? [];\n        $this->returnType = $subNodes['returnType'] ?? null;\n        $this->stmts = array_key_exists('stmts', $subNodes) ? $subNodes['stmts'] : [];\n        $this->attrGroups = $subNodes['attrGroups'] ?? [];\n    }\n\n    public function getSubNodeNames(): array {\n        return ['attrGroups', 'flags', 'byRef', 'name', 'params', 'returnType', 'stmts'];\n    }\n\n    public function returnsByRef(): bool {\n        return $this->byRef;\n    }\n\n    public function getParams(): array {\n        return $this->params;\n    }\n\n    public function getReturnType() {\n        return $this->returnType;\n    }\n\n    public function getStmts(): ?array {\n        return $this->stmts;\n    }\n\n    public function getAttrGroups(): array {\n        return $this->attrGroups;\n    }\n\n    /**\n     * Whether the method is explicitly or implicitly public.\n     */\n    public function isPublic(): bool {\n        return ($this->flags & Modifiers::PUBLIC) !== 0\n            || ($this->flags & Modifiers::VISIBILITY_MASK) === 0;\n    }\n\n    /**\n     * Whether the method is protected.\n     */\n    public function isProtected(): bool {\n        return (bool) ($this->flags & Modifiers::PROTECTED);\n    }\n\n    /**\n     * Whether the method is private.\n     */\n    public function isPrivate(): bool {\n        return (bool) ($this->flags & Modifiers::PRIVATE);\n    }\n\n    /**\n     * Whether the method is abstract.\n     */\n    public function isAbstract(): bool {\n        return (bool) ($this->flags & Modifiers::ABSTRACT);\n    }\n\n    /**\n     * Whether the method is final.\n     */\n    public function isFinal(): bool {\n        return (bool) ($this->flags & Modifiers::FINAL);\n    }\n\n    /**\n     * Whether the method is static.\n     */\n    public function isStatic(): bool {\n        return (bool) ($this->flags & Modifiers::STATIC);\n    }\n\n    /**\n     * Whether the method is magic.\n     */\n    public function isMagic(): bool {\n        return isset(self::$magicNames[$this->name->toLowerString()]);\n    }\n\n    public function getType(): string {\n        return 'Stmt_ClassMethod';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Class_.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Stmt;\n\nuse PhpParser\\Modifiers;\nuse PhpParser\\Node;\n\nclass Class_ extends ClassLike {\n    /** @deprecated Use Modifiers::PUBLIC instead */\n    public const MODIFIER_PUBLIC    =  1;\n    /** @deprecated Use Modifiers::PROTECTED instead */\n    public const MODIFIER_PROTECTED =  2;\n    /** @deprecated Use Modifiers::PRIVATE instead */\n    public const MODIFIER_PRIVATE   =  4;\n    /** @deprecated Use Modifiers::STATIC instead */\n    public const MODIFIER_STATIC    =  8;\n    /** @deprecated Use Modifiers::ABSTRACT instead */\n    public const MODIFIER_ABSTRACT  = 16;\n    /** @deprecated Use Modifiers::FINAL instead */\n    public const MODIFIER_FINAL     = 32;\n    /** @deprecated Use Modifiers::READONLY instead */\n    public const MODIFIER_READONLY  = 64;\n\n    /** @deprecated Use Modifiers::VISIBILITY_MASK instead */\n    public const VISIBILITY_MODIFIER_MASK = 7; // 1 | 2 | 4\n\n    /** @var int Modifiers */\n    public int $flags;\n    /** @var null|Node\\Name Name of extended class */\n    public ?Node\\Name $extends;\n    /** @var Node\\Name[] Names of implemented interfaces */\n    public array $implements;\n\n    /**\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     */\n    public function __construct($name, array $subNodes = [], array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->flags = $subNodes['flags'] ?? $subNodes['type'] ?? 0;\n        $this->name = \\is_string($name) ? new Node\\Identifier($name) : $name;\n        $this->extends = $subNodes['extends'] ?? null;\n        $this->implements = $subNodes['implements'] ?? [];\n        $this->stmts = $subNodes['stmts'] ?? [];\n        $this->attrGroups = $subNodes['attrGroups'] ?? [];\n    }\n\n    public function getSubNodeNames(): array {\n        return ['attrGroups', 'flags', 'name', 'extends', 'implements', 'stmts'];\n    }\n\n    /**\n     * Whether the class is explicitly abstract.\n     */\n    public function isAbstract(): bool {\n        return (bool) ($this->flags & Modifiers::ABSTRACT);\n    }\n\n    /**\n     * Whether the class is final.\n     */\n    public function isFinal(): bool {\n        return (bool) ($this->flags & Modifiers::FINAL);\n    }\n\n    public function isReadonly(): bool {\n        return (bool) ($this->flags & Modifiers::READONLY);\n    }\n\n    /**\n     * Whether the class is anonymous.\n     */\n    public function isAnonymous(): bool {\n        return null === $this->name;\n    }\n\n    public function getType(): string {\n        return 'Stmt_Class';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Const_.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Stmt;\n\nuse PhpParser\\Node;\n\nclass Const_ extends Node\\Stmt {\n    /** @var Node\\Const_[] Constant declarations */\n    public array $consts;\n    /** @var Node\\AttributeGroup[] PHP attribute groups */\n    public array $attrGroups;\n\n    /**\n     * Constructs a const list node.\n     *\n     * @param Node\\Const_[] $consts Constant declarations\n     * @param array<string, mixed> $attributes Additional attributes\n     * @param list<Node\\AttributeGroup> $attrGroups PHP attribute groups\n     */\n    public function __construct(\n        array $consts,\n        array $attributes = [],\n        array $attrGroups = []\n    ) {\n        $this->attributes = $attributes;\n        $this->attrGroups = $attrGroups;\n        $this->consts = $consts;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['attrGroups', 'consts'];\n    }\n\n    public function getType(): string {\n        return 'Stmt_Const';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Continue_.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Stmt;\n\nuse PhpParser\\Node;\n\nclass Continue_ extends Node\\Stmt {\n    /** @var null|Node\\Expr Number of loops to continue */\n    public ?Node\\Expr $num;\n\n    /**\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     */\n    public function __construct(?Node\\Expr $num = null, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->num = $num;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['num'];\n    }\n\n    public function getType(): string {\n        return 'Stmt_Continue';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/DeclareDeclare.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Stmt;\n\nuse PhpParser\\Node\\DeclareItem;\n\nrequire __DIR__ . '/../DeclareItem.php';\n\nif (false) {\n    /**\n     * For classmap-authoritative support.\n     *\n     * @deprecated use \\PhpParser\\Node\\DeclareItem instead.\n     */\n    class DeclareDeclare extends DeclareItem {\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Declare_.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Stmt;\n\nuse PhpParser\\Node;\nuse PhpParser\\Node\\DeclareItem;\n\nclass Declare_ extends Node\\Stmt {\n    /** @var DeclareItem[] List of declares */\n    public array $declares;\n    /** @var Node\\Stmt[]|null Statements */\n    public ?array $stmts;\n\n    /**\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     */\n    public function __construct(array $declares, ?array $stmts = null, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->declares = $declares;\n        $this->stmts = $stmts;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['declares', 'stmts'];\n    }\n\n    public function getType(): string {\n        return 'Stmt_Declare';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Do_.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Stmt;\n\nuse PhpParser\\Node;\n\nclass Do_ extends Node\\Stmt {\n    /** @var Node\\Stmt[] Statements */\n    public array $stmts;\n    /** @var Node\\Expr Condition */\n    public Node\\Expr $cond;\n\n    /**\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     */\n    public function __construct(Node\\Expr $cond, array $stmts = [], array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->cond = $cond;\n        $this->stmts = $stmts;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['stmts', 'cond'];\n    }\n\n    public function getType(): string {\n        return 'Stmt_Do';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Echo_.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Stmt;\n\nuse PhpParser\\Node;\n\nclass Echo_ extends Node\\Stmt {\n    /** @var Node\\Expr[] Expressions */\n    public array $exprs;\n\n    /**\n     * Constructs an echo node.\n     *\n     * @param Node\\Expr[] $exprs Expressions\n     * @param array<string, mixed> $attributes Additional attributes\n     */\n    public function __construct(array $exprs, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->exprs = $exprs;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['exprs'];\n    }\n\n    public function getType(): string {\n        return 'Stmt_Echo';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ElseIf_.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Stmt;\n\nuse PhpParser\\Node;\n\nclass ElseIf_ extends Node\\Stmt {\n    /** @var Node\\Expr Condition */\n    public Node\\Expr $cond;\n    /** @var Node\\Stmt[] Statements */\n    public array $stmts;\n\n    /**\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     */\n    public function __construct(Node\\Expr $cond, array $stmts = [], array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->cond = $cond;\n        $this->stmts = $stmts;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['cond', 'stmts'];\n    }\n\n    public function getType(): string {\n        return 'Stmt_ElseIf';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Else_.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Stmt;\n\nuse PhpParser\\Node;\n\nclass Else_ extends Node\\Stmt {\n    /** @var Node\\Stmt[] Statements */\n    public array $stmts;\n\n    /**\n     * Constructs an else node.\n     *\n     * @param Node\\Stmt[] $stmts Statements\n     * @param array<string, mixed> $attributes Additional attributes\n     */\n    public function __construct(array $stmts = [], array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->stmts = $stmts;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['stmts'];\n    }\n\n    public function getType(): string {\n        return 'Stmt_Else';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/EnumCase.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Stmt;\n\nuse PhpParser\\Node;\nuse PhpParser\\Node\\AttributeGroup;\n\nclass EnumCase extends Node\\Stmt {\n    /** @var Node\\Identifier Enum case name */\n    public Node\\Identifier $name;\n    /** @var Node\\Expr|null Enum case expression */\n    public ?Node\\Expr $expr;\n    /** @var Node\\AttributeGroup[] PHP attribute groups */\n    public array $attrGroups;\n\n    /**\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     */\n    public function __construct($name, ?Node\\Expr $expr = null, array $attrGroups = [], array $attributes = []) {\n        parent::__construct($attributes);\n        $this->name = \\is_string($name) ? new Node\\Identifier($name) : $name;\n        $this->expr = $expr;\n        $this->attrGroups = $attrGroups;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['attrGroups', 'name', 'expr'];\n    }\n\n    public function getType(): string {\n        return 'Stmt_EnumCase';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Enum_.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Stmt;\n\nuse PhpParser\\Node;\n\nclass Enum_ extends ClassLike {\n    /** @var null|Node\\Identifier Scalar Type */\n    public ?Node $scalarType;\n    /** @var Node\\Name[] Names of implemented interfaces */\n    public array $implements;\n\n    /**\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     */\n    public function __construct($name, array $subNodes = [], array $attributes = []) {\n        $this->name = \\is_string($name) ? new Node\\Identifier($name) : $name;\n        $this->scalarType = $subNodes['scalarType'] ?? null;\n        $this->implements = $subNodes['implements'] ?? [];\n        $this->stmts = $subNodes['stmts'] ?? [];\n        $this->attrGroups = $subNodes['attrGroups'] ?? [];\n\n        parent::__construct($attributes);\n    }\n\n    public function getSubNodeNames(): array {\n        return ['attrGroups', 'name', 'scalarType', 'implements', 'stmts'];\n    }\n\n    public function getType(): string {\n        return 'Stmt_Enum';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Expression.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Stmt;\n\nuse PhpParser\\Node;\n\n/**\n * Represents statements of type \"expr;\"\n */\nclass Expression extends Node\\Stmt {\n    /** @var Node\\Expr Expression */\n    public Node\\Expr $expr;\n\n    /**\n     * Constructs an expression statement.\n     *\n     * @param Node\\Expr $expr Expression\n     * @param array<string, mixed> $attributes Additional attributes\n     */\n    public function __construct(Node\\Expr $expr, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->expr = $expr;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['expr'];\n    }\n\n    public function getType(): string {\n        return 'Stmt_Expression';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Finally_.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Stmt;\n\nuse PhpParser\\Node;\n\nclass Finally_ extends Node\\Stmt {\n    /** @var Node\\Stmt[] Statements */\n    public array $stmts;\n\n    /**\n     * Constructs a finally node.\n     *\n     * @param Node\\Stmt[] $stmts Statements\n     * @param array<string, mixed> $attributes Additional attributes\n     */\n    public function __construct(array $stmts = [], array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->stmts = $stmts;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['stmts'];\n    }\n\n    public function getType(): string {\n        return 'Stmt_Finally';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/For_.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Stmt;\n\nuse PhpParser\\Node;\n\nclass For_ extends Node\\Stmt {\n    /** @var Node\\Expr[] Init expressions */\n    public array $init;\n    /** @var Node\\Expr[] Loop conditions */\n    public array $cond;\n    /** @var Node\\Expr[] Loop expressions */\n    public array $loop;\n    /** @var Node\\Stmt[] Statements */\n    public array $stmts;\n\n    /**\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     */\n    public function __construct(array $subNodes = [], array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->init = $subNodes['init'] ?? [];\n        $this->cond = $subNodes['cond'] ?? [];\n        $this->loop = $subNodes['loop'] ?? [];\n        $this->stmts = $subNodes['stmts'] ?? [];\n    }\n\n    public function getSubNodeNames(): array {\n        return ['init', 'cond', 'loop', 'stmts'];\n    }\n\n    public function getType(): string {\n        return 'Stmt_For';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Foreach_.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Stmt;\n\nuse PhpParser\\Node;\n\nclass Foreach_ extends Node\\Stmt {\n    /** @var Node\\Expr Expression to iterate */\n    public Node\\Expr $expr;\n    /** @var null|Node\\Expr Variable to assign key to */\n    public ?Node\\Expr $keyVar;\n    /** @var bool Whether to assign value by reference */\n    public bool $byRef;\n    /** @var Node\\Expr Variable to assign value to */\n    public Node\\Expr $valueVar;\n    /** @var Node\\Stmt[] Statements */\n    public array $stmts;\n\n    /**\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     */\n    public function __construct(Node\\Expr $expr, Node\\Expr $valueVar, array $subNodes = [], array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->expr = $expr;\n        $this->keyVar = $subNodes['keyVar'] ?? null;\n        $this->byRef = $subNodes['byRef'] ?? false;\n        $this->valueVar = $valueVar;\n        $this->stmts = $subNodes['stmts'] ?? [];\n    }\n\n    public function getSubNodeNames(): array {\n        return ['expr', 'keyVar', 'byRef', 'valueVar', 'stmts'];\n    }\n\n    public function getType(): string {\n        return 'Stmt_Foreach';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Function_.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Stmt;\n\nuse PhpParser\\Node;\nuse PhpParser\\Node\\FunctionLike;\n\nclass Function_ extends Node\\Stmt implements FunctionLike {\n    /** @var bool Whether function returns by reference */\n    public bool $byRef;\n    /** @var Node\\Identifier Name */\n    public Node\\Identifier $name;\n    /** @var Node\\Param[] Parameters */\n    public array $params;\n    /** @var null|Node\\Identifier|Node\\Name|Node\\ComplexType Return type */\n    public ?Node $returnType;\n    /** @var Node\\Stmt[] Statements */\n    public array $stmts;\n    /** @var Node\\AttributeGroup[] PHP attribute groups */\n    public array $attrGroups;\n\n    /** @var Node\\Name|null Namespaced name (if using NameResolver) */\n    public ?Node\\Name $namespacedName;\n\n    /**\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     */\n    public function __construct($name, array $subNodes = [], array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->byRef = $subNodes['byRef'] ?? false;\n        $this->name = \\is_string($name) ? new Node\\Identifier($name) : $name;\n        $this->params = $subNodes['params'] ?? [];\n        $this->returnType = $subNodes['returnType'] ?? null;\n        $this->stmts = $subNodes['stmts'] ?? [];\n        $this->attrGroups = $subNodes['attrGroups'] ?? [];\n    }\n\n    public function getSubNodeNames(): array {\n        return ['attrGroups', 'byRef', 'name', 'params', 'returnType', 'stmts'];\n    }\n\n    public function returnsByRef(): bool {\n        return $this->byRef;\n    }\n\n    public function getParams(): array {\n        return $this->params;\n    }\n\n    public function getReturnType() {\n        return $this->returnType;\n    }\n\n    public function getAttrGroups(): array {\n        return $this->attrGroups;\n    }\n\n    /** @return Node\\Stmt[] */\n    public function getStmts(): array {\n        return $this->stmts;\n    }\n\n    public function getType(): string {\n        return 'Stmt_Function';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Global_.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Stmt;\n\nuse PhpParser\\Node;\n\nclass Global_ extends Node\\Stmt {\n    /** @var Node\\Expr[] Variables */\n    public array $vars;\n\n    /**\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     */\n    public function __construct(array $vars, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->vars = $vars;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['vars'];\n    }\n\n    public function getType(): string {\n        return 'Stmt_Global';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Goto_.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Stmt;\n\nuse PhpParser\\Node\\Identifier;\nuse PhpParser\\Node\\Stmt;\n\nclass Goto_ extends Stmt {\n    /** @var Identifier Name of label to jump to */\n    public Identifier $name;\n\n    /**\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     */\n    public function __construct($name, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->name = \\is_string($name) ? new Identifier($name) : $name;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['name'];\n    }\n\n    public function getType(): string {\n        return 'Stmt_Goto';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/GroupUse.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Stmt;\n\nuse PhpParser\\Node\\Name;\nuse PhpParser\\Node\\Stmt;\nuse PhpParser\\Node\\UseItem;\n\nclass GroupUse extends Stmt {\n    /**\n     * @var Use_::TYPE_* Type of group use\n     */\n    public int $type;\n    /** @var Name Prefix for uses */\n    public Name $prefix;\n    /** @var UseItem[] Uses */\n    public array $uses;\n\n    /**\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     */\n    public function __construct(Name $prefix, array $uses, int $type = Use_::TYPE_NORMAL, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->type = $type;\n        $this->prefix = $prefix;\n        $this->uses = $uses;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['type', 'prefix', 'uses'];\n    }\n\n    public function getType(): string {\n        return 'Stmt_GroupUse';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/HaltCompiler.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Stmt;\n\nuse PhpParser\\Node\\Stmt;\n\nclass HaltCompiler extends Stmt {\n    /** @var string Remaining text after halt compiler statement. */\n    public string $remaining;\n\n    /**\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     */\n    public function __construct(string $remaining, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->remaining = $remaining;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['remaining'];\n    }\n\n    public function getType(): string {\n        return 'Stmt_HaltCompiler';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/If_.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Stmt;\n\nuse PhpParser\\Node;\n\nclass If_ extends Node\\Stmt {\n    /** @var Node\\Expr Condition expression */\n    public Node\\Expr $cond;\n    /** @var Node\\Stmt[] Statements */\n    public array $stmts;\n    /** @var ElseIf_[] Elseif clauses */\n    public array $elseifs;\n    /** @var null|Else_ Else clause */\n    public ?Else_ $else;\n\n    /**\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     */\n    public function __construct(Node\\Expr $cond, array $subNodes = [], array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->cond = $cond;\n        $this->stmts = $subNodes['stmts'] ?? [];\n        $this->elseifs = $subNodes['elseifs'] ?? [];\n        $this->else = $subNodes['else'] ?? null;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['cond', 'stmts', 'elseifs', 'else'];\n    }\n\n    public function getType(): string {\n        return 'Stmt_If';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/InlineHTML.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Stmt;\n\nuse PhpParser\\Node\\Stmt;\n\nclass InlineHTML extends Stmt {\n    /** @var string String */\n    public string $value;\n\n    /**\n     * Constructs an inline HTML node.\n     *\n     * @param string $value String\n     * @param array<string, mixed> $attributes Additional attributes\n     */\n    public function __construct(string $value, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->value = $value;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['value'];\n    }\n\n    public function getType(): string {\n        return 'Stmt_InlineHTML';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Interface_.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Stmt;\n\nuse PhpParser\\Node;\n\nclass Interface_ extends ClassLike {\n    /** @var Node\\Name[] Extended interfaces */\n    public array $extends;\n\n    /**\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     */\n    public function __construct($name, array $subNodes = [], array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->name = \\is_string($name) ? new Node\\Identifier($name) : $name;\n        $this->extends = $subNodes['extends'] ?? [];\n        $this->stmts = $subNodes['stmts'] ?? [];\n        $this->attrGroups = $subNodes['attrGroups'] ?? [];\n    }\n\n    public function getSubNodeNames(): array {\n        return ['attrGroups', 'name', 'extends', 'stmts'];\n    }\n\n    public function getType(): string {\n        return 'Stmt_Interface';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Label.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Stmt;\n\nuse PhpParser\\Node\\Identifier;\nuse PhpParser\\Node\\Stmt;\n\nclass Label extends Stmt {\n    /** @var Identifier Name */\n    public Identifier $name;\n\n    /**\n     * Constructs a label node.\n     *\n     * @param string|Identifier $name Name\n     * @param array<string, mixed> $attributes Additional attributes\n     */\n    public function __construct($name, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->name = \\is_string($name) ? new Identifier($name) : $name;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['name'];\n    }\n\n    public function getType(): string {\n        return 'Stmt_Label';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Namespace_.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Stmt;\n\nuse PhpParser\\Node;\n\nclass Namespace_ extends Node\\Stmt {\n    /* For use in the \"kind\" attribute */\n    public const KIND_SEMICOLON = 1;\n    public const KIND_BRACED = 2;\n\n    /** @var null|Node\\Name Name */\n    public ?Node\\Name $name;\n    /** @var Node\\Stmt[] Statements */\n    public $stmts;\n\n    /**\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     */\n    public function __construct(?Node\\Name $name = null, ?array $stmts = [], array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->name = $name;\n        $this->stmts = $stmts;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['name', 'stmts'];\n    }\n\n    public function getType(): string {\n        return 'Stmt_Namespace';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Nop.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Stmt;\n\nuse PhpParser\\Node;\n\n/** Nop/empty statement (;). */\nclass Nop extends Node\\Stmt {\n    public function getSubNodeNames(): array {\n        return [];\n    }\n\n    public function getType(): string {\n        return 'Stmt_Nop';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Property.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Stmt;\n\nuse PhpParser\\Modifiers;\nuse PhpParser\\Node;\nuse PhpParser\\Node\\ComplexType;\nuse PhpParser\\Node\\Identifier;\nuse PhpParser\\Node\\Name;\nuse PhpParser\\Node\\PropertyItem;\n\nclass Property extends Node\\Stmt {\n    /** @var int Modifiers */\n    public int $flags;\n    /** @var PropertyItem[] Properties */\n    public array $props;\n    /** @var null|Identifier|Name|ComplexType Type declaration */\n    public ?Node $type;\n    /** @var Node\\AttributeGroup[] PHP attribute groups */\n    public array $attrGroups;\n    /** @var Node\\PropertyHook[] Property hooks */\n    public array $hooks;\n\n    /**\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     */\n    public function __construct(int $flags, array $props, array $attributes = [], ?Node $type = null, array $attrGroups = [], array $hooks = []) {\n        $this->attributes = $attributes;\n        $this->flags = $flags;\n        $this->props = $props;\n        $this->type = $type;\n        $this->attrGroups = $attrGroups;\n        $this->hooks = $hooks;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['attrGroups', 'flags', 'type', 'props', 'hooks'];\n    }\n\n    /**\n     * Whether the property is explicitly or implicitly public.\n     */\n    public function isPublic(): bool {\n        return ($this->flags & Modifiers::PUBLIC) !== 0\n            || ($this->flags & Modifiers::VISIBILITY_MASK) === 0;\n    }\n\n    /**\n     * Whether the property is protected.\n     */\n    public function isProtected(): bool {\n        return (bool) ($this->flags & Modifiers::PROTECTED);\n    }\n\n    /**\n     * Whether the property is private.\n     */\n    public function isPrivate(): bool {\n        return (bool) ($this->flags & Modifiers::PRIVATE);\n    }\n\n    /**\n     * Whether the property is static.\n     */\n    public function isStatic(): bool {\n        return (bool) ($this->flags & Modifiers::STATIC);\n    }\n\n    /**\n     * Whether the property is readonly.\n     */\n    public function isReadonly(): bool {\n        return (bool) ($this->flags & Modifiers::READONLY);\n    }\n\n    /**\n     * Whether the property is abstract.\n     */\n    public function isAbstract(): bool {\n        return (bool) ($this->flags & Modifiers::ABSTRACT);\n    }\n\n    /**\n     * Whether the property is final.\n     */\n    public function isFinal(): bool {\n        return (bool) ($this->flags & Modifiers::FINAL);\n    }\n\n    /**\n     * Whether the property has explicit public(set) visibility.\n     */\n    public function isPublicSet(): bool {\n        return (bool) ($this->flags & Modifiers::PUBLIC_SET);\n    }\n\n    /**\n     * Whether the property has explicit protected(set) visibility.\n     */\n    public function isProtectedSet(): bool {\n        return (bool) ($this->flags & Modifiers::PROTECTED_SET);\n    }\n\n    /**\n     * Whether the property has explicit private(set) visibility.\n     */\n    public function isPrivateSet(): bool {\n        return (bool) ($this->flags & Modifiers::PRIVATE_SET);\n    }\n\n    public function getType(): string {\n        return 'Stmt_Property';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/PropertyProperty.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Stmt;\n\nuse PhpParser\\Node\\PropertyItem;\n\nrequire __DIR__ . '/../PropertyItem.php';\n\nif (false) {\n    /**\n     * For classmap-authoritative support.\n     *\n     * @deprecated use \\PhpParser\\Node\\PropertyItem instead.\n     */\n    class PropertyProperty extends PropertyItem {\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Return_.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Stmt;\n\nuse PhpParser\\Node;\n\nclass Return_ extends Node\\Stmt {\n    /** @var null|Node\\Expr Expression */\n    public ?Node\\Expr $expr;\n\n    /**\n     * Constructs a return node.\n     *\n     * @param null|Node\\Expr $expr Expression\n     * @param array<string, mixed> $attributes Additional attributes\n     */\n    public function __construct(?Node\\Expr $expr = null, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->expr = $expr;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['expr'];\n    }\n\n    public function getType(): string {\n        return 'Stmt_Return';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/StaticVar.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Stmt;\n\nrequire __DIR__ . '/../StaticVar.php';\n\nif (false) {\n    /**\n     * For classmap-authoritative support.\n     *\n     * @deprecated use \\PhpParser\\Node\\StaticVar instead.\n     */\n    class StaticVar extends \\PhpParser\\Node\\StaticVar {\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Static_.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Stmt;\n\nuse PhpParser\\Node\\StaticVar;\nuse PhpParser\\Node\\Stmt;\n\nclass Static_ extends Stmt {\n    /** @var StaticVar[] Variable definitions */\n    public array $vars;\n\n    /**\n     * Constructs a static variables list node.\n     *\n     * @param StaticVar[] $vars Variable definitions\n     * @param array<string, mixed> $attributes Additional attributes\n     */\n    public function __construct(array $vars, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->vars = $vars;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['vars'];\n    }\n\n    public function getType(): string {\n        return 'Stmt_Static';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Switch_.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Stmt;\n\nuse PhpParser\\Node;\n\nclass Switch_ extends Node\\Stmt {\n    /** @var Node\\Expr Condition */\n    public Node\\Expr $cond;\n    /** @var Case_[] Case list */\n    public array $cases;\n\n    /**\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     */\n    public function __construct(Node\\Expr $cond, array $cases, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->cond = $cond;\n        $this->cases = $cases;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['cond', 'cases'];\n    }\n\n    public function getType(): string {\n        return 'Stmt_Switch';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUse.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Stmt;\n\nuse PhpParser\\Node;\n\nclass TraitUse extends Node\\Stmt {\n    /** @var Node\\Name[] Traits */\n    public array $traits;\n    /** @var TraitUseAdaptation[] Adaptations */\n    public array $adaptations;\n\n    /**\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     */\n    public function __construct(array $traits, array $adaptations = [], array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->traits = $traits;\n        $this->adaptations = $adaptations;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['traits', 'adaptations'];\n    }\n\n    public function getType(): string {\n        return 'Stmt_TraitUse';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Alias.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Stmt\\TraitUseAdaptation;\n\nuse PhpParser\\Node;\n\nclass Alias extends Node\\Stmt\\TraitUseAdaptation {\n    /** @var null|int New modifier */\n    public ?int $newModifier;\n    /** @var null|Node\\Identifier New name */\n    public ?Node\\Identifier $newName;\n\n    /**\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     */\n    public function __construct(?Node\\Name $trait, $method, ?int $newModifier, $newName, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->trait = $trait;\n        $this->method = \\is_string($method) ? new Node\\Identifier($method) : $method;\n        $this->newModifier = $newModifier;\n        $this->newName = \\is_string($newName) ? new Node\\Identifier($newName) : $newName;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['trait', 'method', 'newModifier', 'newName'];\n    }\n\n    public function getType(): string {\n        return 'Stmt_TraitUseAdaptation_Alias';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Precedence.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Stmt\\TraitUseAdaptation;\n\nuse PhpParser\\Node;\n\nclass Precedence extends Node\\Stmt\\TraitUseAdaptation {\n    /** @var Node\\Name[] Overwritten traits */\n    public array $insteadof;\n\n    /**\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     */\n    public function __construct(Node\\Name $trait, $method, array $insteadof, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->trait = $trait;\n        $this->method = \\is_string($method) ? new Node\\Identifier($method) : $method;\n        $this->insteadof = $insteadof;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['trait', 'method', 'insteadof'];\n    }\n\n    public function getType(): string {\n        return 'Stmt_TraitUseAdaptation_Precedence';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Stmt;\n\nuse PhpParser\\Node;\n\nabstract class TraitUseAdaptation extends Node\\Stmt {\n    /** @var Node\\Name|null Trait name */\n    public ?Node\\Name $trait;\n    /** @var Node\\Identifier Method name */\n    public Node\\Identifier $method;\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Trait_.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Stmt;\n\nuse PhpParser\\Node;\n\nclass Trait_ extends ClassLike {\n    /**\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     */\n    public function __construct($name, array $subNodes = [], array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->name = \\is_string($name) ? new Node\\Identifier($name) : $name;\n        $this->stmts = $subNodes['stmts'] ?? [];\n        $this->attrGroups = $subNodes['attrGroups'] ?? [];\n    }\n\n    public function getSubNodeNames(): array {\n        return ['attrGroups', 'name', 'stmts'];\n    }\n\n    public function getType(): string {\n        return 'Stmt_Trait';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TryCatch.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Stmt;\n\nuse PhpParser\\Node;\n\nclass TryCatch extends Node\\Stmt {\n    /** @var Node\\Stmt[] Statements */\n    public array $stmts;\n    /** @var Catch_[] Catches */\n    public array $catches;\n    /** @var null|Finally_ Optional finally node */\n    public ?Finally_ $finally;\n\n    /**\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     */\n    public function __construct(array $stmts, array $catches, ?Finally_ $finally = null, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->stmts = $stmts;\n        $this->catches = $catches;\n        $this->finally = $finally;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['stmts', 'catches', 'finally'];\n    }\n\n    public function getType(): string {\n        return 'Stmt_TryCatch';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Unset_.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Stmt;\n\nuse PhpParser\\Node;\n\nclass Unset_ extends Node\\Stmt {\n    /** @var Node\\Expr[] Variables to unset */\n    public array $vars;\n\n    /**\n     * Constructs an unset node.\n     *\n     * @param Node\\Expr[] $vars Variables to unset\n     * @param array<string, mixed> $attributes Additional attributes\n     */\n    public function __construct(array $vars, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->vars = $vars;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['vars'];\n    }\n\n    public function getType(): string {\n        return 'Stmt_Unset';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/UseUse.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Stmt;\n\nuse PhpParser\\Node\\UseItem;\n\nrequire __DIR__ . '/../UseItem.php';\n\nif (false) {\n    /**\n     * For classmap-authoritative support.\n     *\n     * @deprecated use \\PhpParser\\Node\\UseItem instead.\n     */\n    class UseUse extends UseItem {\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Use_.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Stmt;\n\nuse PhpParser\\Node\\Stmt;\nuse PhpParser\\Node\\UseItem;\n\nclass Use_ extends Stmt {\n    /**\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     */\n    public const TYPE_UNKNOWN = 0;\n    /** Class or namespace import */\n    public const TYPE_NORMAL = 1;\n    /** Function import */\n    public const TYPE_FUNCTION = 2;\n    /** Constant import */\n    public const TYPE_CONSTANT = 3;\n\n    /** @var self::TYPE_* Type of alias */\n    public int $type;\n    /** @var UseItem[] Aliases */\n    public array $uses;\n\n    /**\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     */\n    public function __construct(array $uses, int $type = self::TYPE_NORMAL, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->type = $type;\n        $this->uses = $uses;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['type', 'uses'];\n    }\n\n    public function getType(): string {\n        return 'Stmt_Use';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/While_.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node\\Stmt;\n\nuse PhpParser\\Node;\n\nclass While_ extends Node\\Stmt {\n    /** @var Node\\Expr Condition */\n    public Node\\Expr $cond;\n    /** @var Node\\Stmt[] Statements */\n    public array $stmts;\n\n    /**\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     */\n    public function __construct(Node\\Expr $cond, array $stmts = [], array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->cond = $cond;\n        $this->stmts = $stmts;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['cond', 'stmts'];\n    }\n\n    public function getType(): string {\n        return 'Stmt_While';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/Stmt.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node;\n\nuse PhpParser\\NodeAbstract;\n\nabstract class Stmt extends NodeAbstract {\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/UnionType.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node;\n\nclass UnionType extends ComplexType {\n    /** @var (Identifier|Name|IntersectionType)[] Types */\n    public array $types;\n\n    /**\n     * Constructs a union type.\n     *\n     * @param (Identifier|Name|IntersectionType)[] $types Types\n     * @param array<string, mixed> $attributes Additional attributes\n     */\n    public function __construct(array $types, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->types = $types;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['types'];\n    }\n\n    public function getType(): string {\n        return 'UnionType';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/UseItem.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node;\n\nuse PhpParser\\Node;\nuse PhpParser\\NodeAbstract;\nuse PhpParser\\Node\\Stmt\\Use_;\n\nclass UseItem extends NodeAbstract {\n    /**\n     * @var Use_::TYPE_* One of the Stmt\\Use_::TYPE_* constants. Will only differ from TYPE_UNKNOWN for mixed group uses\n     */\n    public int $type;\n    /** @var Node\\Name Namespace, class, function or constant to alias */\n    public Name $name;\n    /** @var Identifier|null Alias */\n    public ?Identifier $alias;\n\n    /**\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     */\n    public function __construct(Node\\Name $name, $alias = null, int $type = Use_::TYPE_UNKNOWN, array $attributes = []) {\n        $this->attributes = $attributes;\n        $this->type = $type;\n        $this->name = $name;\n        $this->alias = \\is_string($alias) ? new Identifier($alias) : $alias;\n    }\n\n    public function getSubNodeNames(): array {\n        return ['type', 'name', 'alias'];\n    }\n\n    /**\n     * Get alias. If not explicitly given this is the last component of the used name.\n     */\n    public function getAlias(): Identifier {\n        if (null !== $this->alias) {\n            return $this->alias;\n        }\n\n        return new Identifier($this->name->getLast());\n    }\n\n    public function getType(): string {\n        return 'UseItem';\n    }\n}\n\n// @deprecated compatibility alias\nclass_alias(UseItem::class, Stmt\\UseUse::class);\n","vendor/nikic/php-parser/lib/PhpParser/Node/VarLikeIdentifier.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node;\n\n/**\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 */\nclass VarLikeIdentifier extends Identifier {\n    public function getType(): string {\n        return 'VarLikeIdentifier';\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node/VariadicPlaceholder.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Node;\n\nuse PhpParser\\NodeAbstract;\n\n/**\n * Represents the \"...\" in \"foo(...)\" of the first-class callable syntax.\n */\nclass VariadicPlaceholder extends NodeAbstract {\n    /**\n     * Create a variadic argument placeholder (first-class callable syntax).\n     *\n     * @param array<string, mixed> $attributes Additional attributes\n     */\n    public function __construct(array $attributes = []) {\n        $this->attributes = $attributes;\n    }\n\n    public function getType(): string {\n        return 'VariadicPlaceholder';\n    }\n\n    public function getSubNodeNames(): array {\n        return [];\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Node.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser;\n\ninterface Node {\n    /**\n     * Gets the type of the node.\n     *\n     * @psalm-return non-empty-string\n     * @return string Type of the node\n     */\n    public function getType(): string;\n\n    /**\n     * Gets the names of the sub nodes.\n     *\n     * @return string[] Names of sub nodes\n     */\n    public function getSubNodeNames(): array;\n\n    /**\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     */\n    public function getLine(): int;\n\n    /**\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     */\n    public function getStartLine(): int;\n\n    /**\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     */\n    public function getEndLine(): int;\n\n    /**\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     */\n    public function getStartTokenPos(): int;\n\n    /**\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     */\n    public function getEndTokenPos(): int;\n\n    /**\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     */\n    public function getStartFilePos(): int;\n\n    /**\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     */\n    public function getEndFilePos(): int;\n\n    /**\n     * Gets all comments directly preceding this node.\n     *\n     * The comments are also available through the \"comments\" attribute.\n     *\n     * @return Comment[]\n     */\n    public function getComments(): array;\n\n    /**\n     * Gets the doc comment of the node.\n     *\n     * @return null|Comment\\Doc Doc comment object or null\n     */\n    public function getDocComment(): ?Comment\\Doc;\n\n    /**\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     */\n    public function setDocComment(Comment\\Doc $docComment): void;\n\n    /**\n     * Sets an attribute on a node.\n     *\n     * @param mixed $value\n     */\n    public function setAttribute(string $key, $value): void;\n\n    /**\n     * Returns whether an attribute exists.\n     */\n    public function hasAttribute(string $key): bool;\n\n    /**\n     * Returns the value of an attribute.\n     *\n     * @param mixed $default\n     *\n     * @return mixed\n     */\n    public function getAttribute(string $key, $default = null);\n\n    /**\n     * Returns all the attributes of this node.\n     *\n     * @return array<string, mixed>\n     */\n    public function getAttributes(): array;\n\n    /**\n     * Replaces all the attributes of this node.\n     *\n     * @param array<string, mixed> $attributes\n     */\n    public function setAttributes(array $attributes): void;\n}\n","vendor/nikic/php-parser/lib/PhpParser/NodeAbstract.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser;\n\nabstract class NodeAbstract implements Node, \\JsonSerializable {\n    /** @var array<string, mixed> Attributes */\n    protected array $attributes;\n\n    /**\n     * Creates a Node.\n     *\n     * @param array<string, mixed> $attributes Array of attributes\n     */\n    public function __construct(array $attributes = []) {\n        $this->attributes = $attributes;\n    }\n\n    /**\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    public function getLine(): int {\n        return $this->attributes['startLine'] ?? -1;\n    }\n\n    /**\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     */\n    public function getStartLine(): int {\n        return $this->attributes['startLine'] ?? -1;\n    }\n\n    /**\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     */\n    public function getEndLine(): int {\n        return $this->attributes['endLine'] ?? -1;\n    }\n\n    /**\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     */\n    public function getStartTokenPos(): int {\n        return $this->attributes['startTokenPos'] ?? -1;\n    }\n\n    /**\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     */\n    public function getEndTokenPos(): int {\n        return $this->attributes['endTokenPos'] ?? -1;\n    }\n\n    /**\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     */\n    public function getStartFilePos(): int {\n        return $this->attributes['startFilePos'] ?? -1;\n    }\n\n    /**\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     */\n    public function getEndFilePos(): int {\n        return $this->attributes['endFilePos'] ?? -1;\n    }\n\n    /**\n     * Gets all comments directly preceding this node.\n     *\n     * The comments are also available through the \"comments\" attribute.\n     *\n     * @return Comment[]\n     */\n    public function getComments(): array {\n        return $this->attributes['comments'] ?? [];\n    }\n\n    /**\n     * Gets the doc comment of the node.\n     *\n     * @return null|Comment\\Doc Doc comment object or null\n     */\n    public function getDocComment(): ?Comment\\Doc {\n        $comments = $this->getComments();\n        for ($i = count($comments) - 1; $i >= 0; $i--) {\n            $comment = $comments[$i];\n            if ($comment instanceof Comment\\Doc) {\n                return $comment;\n            }\n        }\n\n        return null;\n    }\n\n    /**\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     */\n    public function setDocComment(Comment\\Doc $docComment): void {\n        $comments = $this->getComments();\n        for ($i = count($comments) - 1; $i >= 0; $i--) {\n            if ($comments[$i] instanceof Comment\\Doc) {\n                // Replace existing doc comment.\n                $comments[$i] = $docComment;\n                $this->setAttribute('comments', $comments);\n                return;\n            }\n        }\n\n        // Append new doc comment.\n        $comments[] = $docComment;\n        $this->setAttribute('comments', $comments);\n    }\n\n    public function setAttribute(string $key, $value): void {\n        $this->attributes[$key] = $value;\n    }\n\n    public function hasAttribute(string $key): bool {\n        return array_key_exists($key, $this->attributes);\n    }\n\n    public function getAttribute(string $key, $default = null) {\n        if (array_key_exists($key, $this->attributes)) {\n            return $this->attributes[$key];\n        }\n\n        return $default;\n    }\n\n    public function getAttributes(): array {\n        return $this->attributes;\n    }\n\n    public function setAttributes(array $attributes): void {\n        $this->attributes = $attributes;\n    }\n\n    /**\n     * @return array<string, mixed>\n     */\n    public function jsonSerialize(): array {\n        return ['nodeType' => $this->getType()] + get_object_vars($this);\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/NodeDumper.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser;\n\nuse PhpParser\\Node\\Expr\\Array_;\nuse PhpParser\\Node\\Expr\\Include_;\nuse PhpParser\\Node\\Expr\\List_;\nuse PhpParser\\Node\\Scalar\\Int_;\nuse PhpParser\\Node\\Scalar\\InterpolatedString;\nuse PhpParser\\Node\\Scalar\\String_;\nuse PhpParser\\Node\\Stmt\\GroupUse;\nuse PhpParser\\Node\\Stmt\\Use_;\nuse PhpParser\\Node\\UseItem;\n\nclass NodeDumper {\n    private bool $dumpComments;\n    private bool $dumpPositions;\n    private bool $dumpOtherAttributes;\n    private ?string $code;\n    private string $res;\n    private string $nl;\n\n    private const IGNORE_ATTRIBUTES = [\n        'comments' => true,\n        'startLine' => true,\n        'endLine' => true,\n        'startFilePos' => true,\n        'endFilePos' => true,\n        'startTokenPos' => true,\n        'endTokenPos' => true,\n    ];\n\n    /**\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     */\n    public function __construct(array $options = []) {\n        $this->dumpComments = !empty($options['dumpComments']);\n        $this->dumpPositions = !empty($options['dumpPositions']);\n        $this->dumpOtherAttributes = !empty($options['dumpOtherAttributes']);\n    }\n\n    /**\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     */\n    public function dump($node, ?string $code = null): string {\n        $this->code = $code;\n        $this->res = '';\n        $this->nl = \"\\n\";\n        $this->dumpRecursive($node, false);\n        return $this->res;\n    }\n\n    /** @param mixed $node */\n    protected function dumpRecursive($node, bool $indent = true): void {\n        if ($indent) {\n            $this->nl .= \"    \";\n        }\n        if ($node instanceof Node) {\n            $this->res .= $node->getType();\n            if ($this->dumpPositions && null !== $p = $this->dumpPosition($node)) {\n                $this->res .= $p;\n            }\n            $this->res .= '(';\n\n            foreach ($node->getSubNodeNames() as $key) {\n                $this->res .= \"$this->nl    \" . $key . ': ';\n\n                $value = $node->$key;\n                if (\\is_int($value)) {\n                    if ('flags' === $key || 'newModifier' === $key) {\n                        $this->res .= $this->dumpFlags($value);\n                        continue;\n                    }\n                    if ('type' === $key && $node instanceof Include_) {\n                        $this->res .= $this->dumpIncludeType($value);\n                        continue;\n                    }\n                    if ('type' === $key\n                            && ($node instanceof Use_ || $node instanceof UseItem || $node instanceof GroupUse)) {\n                        $this->res .= $this->dumpUseType($value);\n                        continue;\n                    }\n                }\n                $this->dumpRecursive($value);\n            }\n\n            if ($this->dumpComments && $comments = $node->getComments()) {\n                $this->res .= \"$this->nl    comments: \";\n                $this->dumpRecursive($comments);\n            }\n\n            if ($this->dumpOtherAttributes) {\n                foreach ($node->getAttributes() as $key => $value) {\n                    if (isset(self::IGNORE_ATTRIBUTES[$key])) {\n                        continue;\n                    }\n\n                    $this->res .= \"$this->nl    $key: \";\n                    if (\\is_int($value)) {\n                        if ('kind' === $key) {\n                            if ($node instanceof Int_) {\n                                $this->res .= $this->dumpIntKind($value);\n                                continue;\n                            }\n                            if ($node instanceof String_ || $node instanceof InterpolatedString) {\n                                $this->res .= $this->dumpStringKind($value);\n                                continue;\n                            }\n                            if ($node instanceof Array_) {\n                                $this->res .= $this->dumpArrayKind($value);\n                                continue;\n                            }\n                            if ($node instanceof List_) {\n                                $this->res .= $this->dumpListKind($value);\n                                continue;\n                            }\n                        }\n                    }\n                    $this->dumpRecursive($value);\n                }\n            }\n            $this->res .= \"$this->nl)\";\n        } elseif (\\is_array($node)) {\n            $this->res .= 'array(';\n            foreach ($node as $key => $value) {\n                $this->res .= \"$this->nl    \" . $key . ': ';\n                $this->dumpRecursive($value);\n            }\n            $this->res .= \"$this->nl)\";\n        } elseif ($node instanceof Comment) {\n            $this->res .= \\str_replace(\"\\n\", $this->nl, $node->getReformattedText());\n        } elseif (\\is_string($node)) {\n            $this->res .= \\str_replace(\"\\n\", $this->nl, $node);\n        } elseif (\\is_int($node) || \\is_float($node)) {\n            $this->res .= $node;\n        } elseif (null === $node) {\n            $this->res .= 'null';\n        } elseif (false === $node) {\n            $this->res .= 'false';\n        } elseif (true === $node) {\n            $this->res .= 'true';\n        } else {\n            throw new \\InvalidArgumentException('Can only dump nodes and arrays.');\n        }\n        if ($indent) {\n            $this->nl = \\substr($this->nl, 0, -4);\n        }\n    }\n\n    protected function dumpFlags(int $flags): string {\n        $strs = [];\n        if ($flags & Modifiers::PUBLIC) {\n            $strs[] = 'PUBLIC';\n        }\n        if ($flags & Modifiers::PROTECTED) {\n            $strs[] = 'PROTECTED';\n        }\n        if ($flags & Modifiers::PRIVATE) {\n            $strs[] = 'PRIVATE';\n        }\n        if ($flags & Modifiers::ABSTRACT) {\n            $strs[] = 'ABSTRACT';\n        }\n        if ($flags & Modifiers::STATIC) {\n            $strs[] = 'STATIC';\n        }\n        if ($flags & Modifiers::FINAL) {\n            $strs[] = 'FINAL';\n        }\n        if ($flags & Modifiers::READONLY) {\n            $strs[] = 'READONLY';\n        }\n        if ($flags & Modifiers::PUBLIC_SET) {\n            $strs[] = 'PUBLIC_SET';\n        }\n        if ($flags & Modifiers::PROTECTED_SET) {\n            $strs[] = 'PROTECTED_SET';\n        }\n        if ($flags & Modifiers::PRIVATE_SET) {\n            $strs[] = 'PRIVATE_SET';\n        }\n\n        if ($strs) {\n            return implode(' | ', $strs) . ' (' . $flags . ')';\n        } else {\n            return (string) $flags;\n        }\n    }\n\n    /** @param array<int, string> $map */\n    private function dumpEnum(int $value, array $map): string {\n        if (!isset($map[$value])) {\n            return (string) $value;\n        }\n        return $map[$value] . ' (' . $value . ')';\n    }\n\n    private function dumpIncludeType(int $type): string {\n        return $this->dumpEnum($type, [\n            Include_::TYPE_INCLUDE      => 'TYPE_INCLUDE',\n            Include_::TYPE_INCLUDE_ONCE => 'TYPE_INCLUDE_ONCE',\n            Include_::TYPE_REQUIRE      => 'TYPE_REQUIRE',\n            Include_::TYPE_REQUIRE_ONCE => 'TYPE_REQUIRE_ONCE',\n        ]);\n    }\n\n    private function dumpUseType(int $type): string {\n        return $this->dumpEnum($type, [\n            Use_::TYPE_UNKNOWN  => 'TYPE_UNKNOWN',\n            Use_::TYPE_NORMAL   => 'TYPE_NORMAL',\n            Use_::TYPE_FUNCTION => 'TYPE_FUNCTION',\n            Use_::TYPE_CONSTANT => 'TYPE_CONSTANT',\n        ]);\n    }\n\n    private function dumpIntKind(int $kind): string {\n        return $this->dumpEnum($kind, [\n            Int_::KIND_BIN => 'KIND_BIN',\n            Int_::KIND_OCT => 'KIND_OCT',\n            Int_::KIND_DEC => 'KIND_DEC',\n            Int_::KIND_HEX => 'KIND_HEX',\n        ]);\n    }\n\n    private function dumpStringKind(int $kind): string {\n        return $this->dumpEnum($kind, [\n            String_::KIND_SINGLE_QUOTED => 'KIND_SINGLE_QUOTED',\n            String_::KIND_DOUBLE_QUOTED => 'KIND_DOUBLE_QUOTED',\n            String_::KIND_HEREDOC => 'KIND_HEREDOC',\n            String_::KIND_NOWDOC => 'KIND_NOWDOC',\n        ]);\n    }\n\n    private function dumpArrayKind(int $kind): string {\n        return $this->dumpEnum($kind, [\n            Array_::KIND_LONG => 'KIND_LONG',\n            Array_::KIND_SHORT => 'KIND_SHORT',\n        ]);\n    }\n\n    private function dumpListKind(int $kind): string {\n        return $this->dumpEnum($kind, [\n            List_::KIND_LIST => 'KIND_LIST',\n            List_::KIND_ARRAY => 'KIND_ARRAY',\n        ]);\n    }\n\n    /**\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     */\n    protected function dumpPosition(Node $node): ?string {\n        if (!$node->hasAttribute('startLine') || !$node->hasAttribute('endLine')) {\n            return null;\n        }\n\n        $start = $node->getStartLine();\n        $end = $node->getEndLine();\n        if ($node->hasAttribute('startFilePos') && $node->hasAttribute('endFilePos')\n            && null !== $this->code\n        ) {\n            $start .= ':' . $this->toColumn($this->code, $node->getStartFilePos());\n            $end .= ':' . $this->toColumn($this->code, $node->getEndFilePos());\n        }\n        return \"[$start - $end]\";\n    }\n\n    // Copied from Error class\n    private function toColumn(string $code, int $pos): int {\n        if ($pos > strlen($code)) {\n            throw new \\RuntimeException('Invalid position information');\n        }\n\n        $lineStartPos = strrpos($code, \"\\n\", $pos - strlen($code));\n        if (false === $lineStartPos) {\n            $lineStartPos = -1;\n        }\n\n        return $pos - $lineStartPos;\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/NodeFinder.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser;\n\nuse PhpParser\\NodeVisitor\\FindingVisitor;\nuse PhpParser\\NodeVisitor\\FirstFindingVisitor;\n\nclass NodeFinder {\n    /**\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     */\n    public function find($nodes, callable $filter): array {\n        if ($nodes === []) {\n            return [];\n        }\n\n        if (!is_array($nodes)) {\n            $nodes = [$nodes];\n        }\n\n        $visitor = new FindingVisitor($filter);\n\n        $traverser = new NodeTraverser($visitor);\n        $traverser->traverse($nodes);\n\n        return $visitor->getFoundNodes();\n    }\n\n    /**\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     */\n    public function findInstanceOf($nodes, string $class): array {\n        return $this->find($nodes, function ($node) use ($class) {\n            return $node instanceof $class;\n        });\n    }\n\n    /**\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     */\n    public function findFirst($nodes, callable $filter): ?Node {\n        if ($nodes === []) {\n            return null;\n        }\n\n        if (!is_array($nodes)) {\n            $nodes = [$nodes];\n        }\n\n        $visitor = new FirstFindingVisitor($filter);\n\n        $traverser = new NodeTraverser($visitor);\n        $traverser->traverse($nodes);\n\n        return $visitor->getFoundNode();\n    }\n\n    /**\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     */\n    public function findFirstInstanceOf($nodes, string $class): ?Node {\n        return $this->findFirst($nodes, function ($node) use ($class) {\n            return $node instanceof $class;\n        });\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser;\n\nclass NodeTraverser implements NodeTraverserInterface {\n    /**\n     * @deprecated Use NodeVisitor::DONT_TRAVERSE_CHILDREN instead.\n     */\n    public const DONT_TRAVERSE_CHILDREN = NodeVisitor::DONT_TRAVERSE_CHILDREN;\n\n    /**\n     * @deprecated Use NodeVisitor::STOP_TRAVERSAL instead.\n     */\n    public const STOP_TRAVERSAL = NodeVisitor::STOP_TRAVERSAL;\n\n    /**\n     * @deprecated Use NodeVisitor::REMOVE_NODE instead.\n     */\n    public const REMOVE_NODE = NodeVisitor::REMOVE_NODE;\n\n    /**\n     * @deprecated Use NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN instead.\n     */\n    public const DONT_TRAVERSE_CURRENT_AND_CHILDREN = NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN;\n\n    /** @var list<NodeVisitor> Visitors */\n    protected array $visitors = [];\n\n    /** @var bool Whether traversal should be stopped */\n    protected bool $stopTraversal;\n\n    /**\n     * Create a traverser with the given visitors.\n     *\n     * @param NodeVisitor ...$visitors Node visitors\n     */\n    public function __construct(NodeVisitor ...$visitors) {\n        $this->visitors = $visitors;\n    }\n\n    /**\n     * Adds a visitor.\n     *\n     * @param NodeVisitor $visitor Visitor to add\n     */\n    public function addVisitor(NodeVisitor $visitor): void {\n        $this->visitors[] = $visitor;\n    }\n\n    /**\n     * Removes an added visitor.\n     */\n    public function removeVisitor(NodeVisitor $visitor): void {\n        $index = array_search($visitor, $this->visitors);\n        if ($index !== false) {\n            array_splice($this->visitors, $index, 1, []);\n        }\n    }\n\n    /**\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     */\n    public function traverse(array $nodes): array {\n        $this->stopTraversal = false;\n\n        foreach ($this->visitors as $visitor) {\n            if (null !== $return = $visitor->beforeTraverse($nodes)) {\n                $nodes = $return;\n            }\n        }\n\n        $nodes = $this->traverseArray($nodes);\n\n        for ($i = \\count($this->visitors) - 1; $i >= 0; --$i) {\n            $visitor = $this->visitors[$i];\n            if (null !== $return = $visitor->afterTraverse($nodes)) {\n                $nodes = $return;\n            }\n        }\n\n        return $nodes;\n    }\n\n    /**\n     * Recursively traverse a node.\n     *\n     * @param Node $node Node to traverse.\n     */\n    protected function traverseNode(Node $node): void {\n        foreach ($node->getSubNodeNames() as $name) {\n            $subNode = $node->$name;\n\n            if (\\is_array($subNode)) {\n                $node->$name = $this->traverseArray($subNode);\n                if ($this->stopTraversal) {\n                    break;\n                }\n\n                continue;\n            }\n\n            if (!$subNode instanceof Node) {\n                continue;\n            }\n\n            $traverseChildren = true;\n            $visitorIndex = -1;\n\n            foreach ($this->visitors as $visitorIndex => $visitor) {\n                $return = $visitor->enterNode($subNode);\n                if (null !== $return) {\n                    if ($return instanceof Node) {\n                        $this->ensureReplacementReasonable($subNode, $return);\n                        $subNode = $node->$name = $return;\n                    } elseif (NodeVisitor::DONT_TRAVERSE_CHILDREN === $return) {\n                        $traverseChildren = false;\n                    } elseif (NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN === $return) {\n                        $traverseChildren = false;\n                        break;\n                    } elseif (NodeVisitor::STOP_TRAVERSAL === $return) {\n                        $this->stopTraversal = true;\n                        break 2;\n                    } elseif (NodeVisitor::REPLACE_WITH_NULL === $return) {\n                        $node->$name = null;\n                        continue 2;\n                    } else {\n                        throw new \\LogicException(\n                            'enterNode() returned invalid value of type ' . gettype($return)\n                        );\n                    }\n                }\n            }\n\n            if ($traverseChildren) {\n                $this->traverseNode($subNode);\n                if ($this->stopTraversal) {\n                    break;\n                }\n            }\n\n            for (; $visitorIndex >= 0; --$visitorIndex) {\n                $visitor = $this->visitors[$visitorIndex];\n                $return = $visitor->leaveNode($subNode);\n\n                if (null !== $return) {\n                    if ($return instanceof Node) {\n                        $this->ensureReplacementReasonable($subNode, $return);\n                        $subNode = $node->$name = $return;\n                    } elseif (NodeVisitor::STOP_TRAVERSAL === $return) {\n                        $this->stopTraversal = true;\n                        break 2;\n                    } elseif (NodeVisitor::REPLACE_WITH_NULL === $return) {\n                        $node->$name = null;\n                        break;\n                    } elseif (\\is_array($return)) {\n                        throw new \\LogicException(\n                            'leaveNode() may only return an array ' .\n                            'if the parent structure is an array'\n                        );\n                    } else {\n                        throw new \\LogicException(\n                            'leaveNode() returned invalid value of type ' . gettype($return)\n                        );\n                    }\n                }\n            }\n        }\n    }\n\n    /**\n     * Recursively traverse array (usually of nodes).\n     *\n     * @param Node[] $nodes Array to traverse\n     *\n     * @return Node[] Result of traversal (may be original array or changed one)\n     */\n    protected function traverseArray(array $nodes): array {\n        $doNodes = [];\n\n        foreach ($nodes as $i => $node) {\n            if (!$node instanceof Node) {\n                if (\\is_array($node)) {\n                    throw new \\LogicException('Invalid node structure: Contains nested arrays');\n                }\n                continue;\n            }\n\n            $traverseChildren = true;\n            $visitorIndex = -1;\n\n            foreach ($this->visitors as $visitorIndex => $visitor) {\n                $return = $visitor->enterNode($node);\n                if (null !== $return) {\n                    if ($return instanceof Node) {\n                        $this->ensureReplacementReasonable($node, $return);\n                        $nodes[$i] = $node = $return;\n                    } elseif (\\is_array($return)) {\n                        $doNodes[] = [$i, $return];\n                        continue 2;\n                    } elseif (NodeVisitor::REMOVE_NODE === $return) {\n                        $doNodes[] = [$i, []];\n                        continue 2;\n                    } elseif (NodeVisitor::DONT_TRAVERSE_CHILDREN === $return) {\n                        $traverseChildren = false;\n                    } elseif (NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN === $return) {\n                        $traverseChildren = false;\n                        break;\n                    } elseif (NodeVisitor::STOP_TRAVERSAL === $return) {\n                        $this->stopTraversal = true;\n                        break 2;\n                    } elseif (NodeVisitor::REPLACE_WITH_NULL === $return) {\n                        throw new \\LogicException(\n                            'REPLACE_WITH_NULL can not be used if the parent structure is an array');\n                    } else {\n                        throw new \\LogicException(\n                            'enterNode() returned invalid value of type ' . gettype($return)\n                        );\n                    }\n                }\n            }\n\n            if ($traverseChildren) {\n                $this->traverseNode($node);\n                if ($this->stopTraversal) {\n                    break;\n                }\n            }\n\n            for (; $visitorIndex >= 0; --$visitorIndex) {\n                $visitor = $this->visitors[$visitorIndex];\n                $return = $visitor->leaveNode($node);\n\n                if (null !== $return) {\n                    if ($return instanceof Node) {\n                        $this->ensureReplacementReasonable($node, $return);\n                        $nodes[$i] = $node = $return;\n                    } elseif (\\is_array($return)) {\n                        $doNodes[] = [$i, $return];\n                        break;\n                    } elseif (NodeVisitor::REMOVE_NODE === $return) {\n                        $doNodes[] = [$i, []];\n                        break;\n                    } elseif (NodeVisitor::STOP_TRAVERSAL === $return) {\n                        $this->stopTraversal = true;\n                        break 2;\n                    } elseif (NodeVisitor::REPLACE_WITH_NULL === $return) {\n                        throw new \\LogicException(\n                            'REPLACE_WITH_NULL can not be used if the parent structure is an array');\n                    } else {\n                        throw new \\LogicException(\n                            'leaveNode() returned invalid value of type ' . gettype($return)\n                        );\n                    }\n                }\n            }\n        }\n\n        if (!empty($doNodes)) {\n            while (list($i, $replace) = array_pop($doNodes)) {\n                array_splice($nodes, $i, 1, $replace);\n            }\n        }\n\n        return $nodes;\n    }\n\n    private function ensureReplacementReasonable(Node $old, Node $new): void {\n        if ($old instanceof Node\\Stmt && $new instanceof Node\\Expr) {\n            throw new \\LogicException(\n                \"Trying to replace statement ({$old->getType()}) \" .\n                \"with expression ({$new->getType()}). Are you missing a \" .\n                \"Stmt_Expression wrapper?\"\n            );\n        }\n\n        if ($old instanceof Node\\Expr && $new instanceof Node\\Stmt) {\n            throw new \\LogicException(\n                \"Trying to replace expression ({$old->getType()}) \" .\n                \"with statement ({$new->getType()})\"\n            );\n        }\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/NodeTraverserInterface.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser;\n\ninterface NodeTraverserInterface {\n    /**\n     * Adds a visitor.\n     *\n     * @param NodeVisitor $visitor Visitor to add\n     */\n    public function addVisitor(NodeVisitor $visitor): void;\n\n    /**\n     * Removes an added visitor.\n     */\n    public function removeVisitor(NodeVisitor $visitor): void;\n\n    /**\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     */\n    public function traverse(array $nodes): array;\n}\n","vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/CloningVisitor.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\NodeVisitor;\n\nuse PhpParser\\Node;\nuse PhpParser\\NodeVisitorAbstract;\n\n/**\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 */\nclass CloningVisitor extends NodeVisitorAbstract {\n    public function enterNode(Node $origNode) {\n        $node = clone $origNode;\n        $node->setAttribute('origNode', $origNode);\n        return $node;\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/CommentAnnotatingVisitor.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\NodeVisitor;\n\nuse PhpParser\\Comment;\nuse PhpParser\\Node;\nuse PhpParser\\NodeVisitorAbstract;\nuse PhpParser\\Token;\n\nclass CommentAnnotatingVisitor extends NodeVisitorAbstract {\n    /** @var int Last seen token start position */\n    private int $pos = 0;\n    /** @var Token[] Token array */\n    private array $tokens;\n    /** @var list<int> Token positions of comments */\n    private array $commentPositions = [];\n\n    /**\n     * Create a comment annotation visitor.\n     *\n     * @param Token[] $tokens Token array\n     */\n    public function __construct(array $tokens) {\n        $this->tokens = $tokens;\n\n        // Collect positions of comments. We use this to avoid traversing parts of the AST where\n        // there are no comments.\n        foreach ($tokens as $i => $token) {\n            if ($token->id === \\T_COMMENT || $token->id === \\T_DOC_COMMENT) {\n                $this->commentPositions[] = $i;\n            }\n        }\n    }\n\n    public function enterNode(Node $node) {\n        $nextCommentPos = current($this->commentPositions);\n        if ($nextCommentPos === false) {\n            // No more comments.\n            return self::STOP_TRAVERSAL;\n        }\n\n        $oldPos = $this->pos;\n        $this->pos = $pos = $node->getStartTokenPos();\n        if ($nextCommentPos > $oldPos && $nextCommentPos < $pos) {\n            $comments = [];\n            while (--$pos >= $oldPos) {\n                $token = $this->tokens[$pos];\n                if ($token->id === \\T_DOC_COMMENT) {\n                    $comments[] = new Comment\\Doc(\n                        $token->text, $token->line, $token->pos, $pos,\n                        $token->getEndLine(), $token->getEndPos() - 1, $pos);\n                    continue;\n                }\n                if ($token->id === \\T_COMMENT) {\n                    $comments[] = new Comment(\n                        $token->text, $token->line, $token->pos, $pos,\n                        $token->getEndLine(), $token->getEndPos() - 1, $pos);\n                    continue;\n                }\n                if ($token->id !== \\T_WHITESPACE) {\n                    break;\n                }\n            }\n            if (!empty($comments)) {\n                $node->setAttribute('comments', array_reverse($comments));\n            }\n\n            do {\n                $nextCommentPos = next($this->commentPositions);\n            } while ($nextCommentPos !== false && $nextCommentPos < $this->pos);\n        }\n\n        $endPos = $node->getEndTokenPos();\n        if ($nextCommentPos > $endPos) {\n            // Skip children if there are no comments located inside this node.\n            $this->pos = $endPos;\n            return self::DONT_TRAVERSE_CHILDREN;\n        }\n\n        return null;\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/FindingVisitor.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\NodeVisitor;\n\nuse PhpParser\\Node;\nuse PhpParser\\NodeVisitorAbstract;\n\n/**\n * This visitor can be used to find and collect all nodes satisfying some criterion determined by\n * a filter callback.\n */\nclass FindingVisitor extends NodeVisitorAbstract {\n    /** @var callable Filter callback */\n    protected $filterCallback;\n    /** @var list<Node> Found nodes */\n    protected array $foundNodes;\n\n    public function __construct(callable $filterCallback) {\n        $this->filterCallback = $filterCallback;\n    }\n\n    /**\n     * Get found nodes satisfying the filter callback.\n     *\n     * Nodes are returned in pre-order.\n     *\n     * @return list<Node> Found nodes\n     */\n    public function getFoundNodes(): array {\n        return $this->foundNodes;\n    }\n\n    public function beforeTraverse(array $nodes): ?array {\n        $this->foundNodes = [];\n\n        return null;\n    }\n\n    public function enterNode(Node $node) {\n        $filterCallback = $this->filterCallback;\n        if ($filterCallback($node)) {\n            $this->foundNodes[] = $node;\n        }\n\n        return null;\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/FirstFindingVisitor.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\NodeVisitor;\n\nuse PhpParser\\Node;\nuse PhpParser\\NodeVisitor;\nuse PhpParser\\NodeVisitorAbstract;\n\n/**\n * This visitor can be used to find the first node satisfying some criterion determined by\n * a filter callback.\n */\nclass FirstFindingVisitor extends NodeVisitorAbstract {\n    /** @var callable Filter callback */\n    protected $filterCallback;\n    /** @var null|Node Found node */\n    protected ?Node $foundNode;\n\n    public function __construct(callable $filterCallback) {\n        $this->filterCallback = $filterCallback;\n    }\n\n    /**\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     */\n    public function getFoundNode(): ?Node {\n        return $this->foundNode;\n    }\n\n    public function beforeTraverse(array $nodes): ?array {\n        $this->foundNode = null;\n\n        return null;\n    }\n\n    public function enterNode(Node $node) {\n        $filterCallback = $this->filterCallback;\n        if ($filterCallback($node)) {\n            $this->foundNode = $node;\n            return NodeVisitor::STOP_TRAVERSAL;\n        }\n\n        return null;\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/NameResolver.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\NodeVisitor;\n\nuse PhpParser\\ErrorHandler;\nuse PhpParser\\NameContext;\nuse PhpParser\\Node;\nuse PhpParser\\Node\\Expr;\nuse PhpParser\\Node\\Name;\nuse PhpParser\\Node\\Name\\FullyQualified;\nuse PhpParser\\Node\\Stmt;\nuse PhpParser\\NodeVisitorAbstract;\n\nclass NameResolver extends NodeVisitorAbstract {\n    /** @var NameContext Naming context */\n    protected NameContext $nameContext;\n\n    /** @var bool Whether to preserve original names */\n    protected bool $preserveOriginalNames;\n\n    /** @var bool Whether to replace resolved nodes in place, or to add resolvedNode attributes */\n    protected bool $replaceNodes;\n\n    /**\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     */\n    public function __construct(?ErrorHandler $errorHandler = null, array $options = []) {\n        $this->nameContext = new NameContext($errorHandler ?? new ErrorHandler\\Throwing());\n        $this->preserveOriginalNames = $options['preserveOriginalNames'] ?? false;\n        $this->replaceNodes = $options['replaceNodes'] ?? true;\n    }\n\n    /**\n     * Get name resolution context.\n     */\n    public function getNameContext(): NameContext {\n        return $this->nameContext;\n    }\n\n    public function beforeTraverse(array $nodes): ?array {\n        $this->nameContext->startNamespace();\n        return null;\n    }\n\n    public function enterNode(Node $node) {\n        if ($node instanceof Stmt\\Namespace_) {\n            $this->nameContext->startNamespace($node->name);\n        } elseif ($node instanceof Stmt\\Use_) {\n            foreach ($node->uses as $use) {\n                $this->addAlias($use, $node->type, null);\n            }\n        } elseif ($node instanceof Stmt\\GroupUse) {\n            foreach ($node->uses as $use) {\n                $this->addAlias($use, $node->type, $node->prefix);\n            }\n        } elseif ($node instanceof Stmt\\Class_) {\n            if (null !== $node->extends) {\n                $node->extends = $this->resolveClassName($node->extends);\n            }\n\n            foreach ($node->implements as &$interface) {\n                $interface = $this->resolveClassName($interface);\n            }\n\n            $this->resolveAttrGroups($node);\n            if (null !== $node->name) {\n                $this->addNamespacedName($node);\n            } else {\n                $node->namespacedName = null;\n            }\n        } elseif ($node instanceof Stmt\\Interface_) {\n            foreach ($node->extends as &$interface) {\n                $interface = $this->resolveClassName($interface);\n            }\n\n            $this->resolveAttrGroups($node);\n            $this->addNamespacedName($node);\n        } elseif ($node instanceof Stmt\\Enum_) {\n            foreach ($node->implements as &$interface) {\n                $interface = $this->resolveClassName($interface);\n            }\n\n            $this->resolveAttrGroups($node);\n            $this->addNamespacedName($node);\n        } elseif ($node instanceof Stmt\\Trait_) {\n            $this->resolveAttrGroups($node);\n            $this->addNamespacedName($node);\n        } elseif ($node instanceof Stmt\\Function_) {\n            $this->resolveSignature($node);\n            $this->resolveAttrGroups($node);\n            $this->addNamespacedName($node);\n        } elseif ($node instanceof Stmt\\ClassMethod\n                  || $node instanceof Expr\\Closure\n                  || $node instanceof Expr\\ArrowFunction\n        ) {\n            $this->resolveSignature($node);\n            $this->resolveAttrGroups($node);\n        } elseif ($node instanceof Stmt\\Property) {\n            if (null !== $node->type) {\n                $node->type = $this->resolveType($node->type);\n            }\n            $this->resolveAttrGroups($node);\n        } elseif ($node instanceof Node\\PropertyHook) {\n            foreach ($node->params as $param) {\n                $param->type = $this->resolveType($param->type);\n                $this->resolveAttrGroups($param);\n            }\n            $this->resolveAttrGroups($node);\n        } elseif ($node instanceof Stmt\\Const_) {\n            foreach ($node->consts as $const) {\n                $this->addNamespacedName($const);\n            }\n            $this->resolveAttrGroups($node);\n        } elseif ($node instanceof Stmt\\ClassConst) {\n            if (null !== $node->type) {\n                $node->type = $this->resolveType($node->type);\n            }\n            $this->resolveAttrGroups($node);\n        } elseif ($node instanceof Stmt\\EnumCase) {\n            $this->resolveAttrGroups($node);\n        } elseif ($node instanceof Expr\\StaticCall\n                  || $node instanceof Expr\\StaticPropertyFetch\n                  || $node instanceof Expr\\ClassConstFetch\n                  || $node instanceof Expr\\New_\n                  || $node instanceof Expr\\Instanceof_\n        ) {\n            if ($node->class instanceof Name) {\n                $node->class = $this->resolveClassName($node->class);\n            }\n        } elseif ($node instanceof Stmt\\Catch_) {\n            foreach ($node->types as &$type) {\n                $type = $this->resolveClassName($type);\n            }\n        } elseif ($node instanceof Expr\\FuncCall) {\n            if ($node->name instanceof Name) {\n                $node->name = $this->resolveName($node->name, Stmt\\Use_::TYPE_FUNCTION);\n            }\n        } elseif ($node instanceof Expr\\ConstFetch) {\n            $node->name = $this->resolveName($node->name, Stmt\\Use_::TYPE_CONSTANT);\n        } elseif ($node instanceof Stmt\\TraitUse) {\n            foreach ($node->traits as &$trait) {\n                $trait = $this->resolveClassName($trait);\n            }\n\n            foreach ($node->adaptations as $adaptation) {\n                if (null !== $adaptation->trait) {\n                    $adaptation->trait = $this->resolveClassName($adaptation->trait);\n                }\n\n                if ($adaptation instanceof Stmt\\TraitUseAdaptation\\Precedence) {\n                    foreach ($adaptation->insteadof as &$insteadof) {\n                        $insteadof = $this->resolveClassName($insteadof);\n                    }\n                }\n            }\n        }\n\n        return null;\n    }\n\n    /** @param Stmt\\Use_::TYPE_* $type */\n    private function addAlias(Node\\UseItem $use, int $type, ?Name $prefix = null): void {\n        // Add prefix for group uses\n        $name = $prefix ? Name::concat($prefix, $use->name) : $use->name;\n        // Type is determined either by individual element or whole use declaration\n        $type |= $use->type;\n\n        $this->nameContext->addAlias(\n            $name, (string) $use->getAlias(), $type, $use->getAttributes()\n        );\n    }\n\n    /** @param Stmt\\Function_|Stmt\\ClassMethod|Expr\\Closure|Expr\\ArrowFunction $node */\n    private function resolveSignature($node): void {\n        foreach ($node->params as $param) {\n            $param->type = $this->resolveType($param->type);\n            $this->resolveAttrGroups($param);\n        }\n        $node->returnType = $this->resolveType($node->returnType);\n    }\n\n    /**\n     * @template T of Node\\Identifier|Name|Node\\ComplexType|null\n     * @param T $node\n     * @return T\n     */\n    private function resolveType(?Node $node): ?Node {\n        if ($node instanceof Name) {\n            return $this->resolveClassName($node);\n        }\n        if ($node instanceof Node\\NullableType) {\n            $node->type = $this->resolveType($node->type);\n            return $node;\n        }\n        if ($node instanceof Node\\UnionType || $node instanceof Node\\IntersectionType) {\n            foreach ($node->types as &$type) {\n                $type = $this->resolveType($type);\n            }\n            return $node;\n        }\n        return $node;\n    }\n\n    /**\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     */\n    protected function resolveName(Name $name, int $type): Name {\n        if (!$this->replaceNodes) {\n            $resolvedName = $this->nameContext->getResolvedName($name, $type);\n            if (null !== $resolvedName) {\n                $name->setAttribute('resolvedName', $resolvedName);\n            } else {\n                $name->setAttribute('namespacedName', FullyQualified::concat(\n                    $this->nameContext->getNamespace(), $name, $name->getAttributes()));\n            }\n            return $name;\n        }\n\n        if ($this->preserveOriginalNames) {\n            // Save the original name\n            $originalName = $name;\n            $name = clone $originalName;\n            $name->setAttribute('originalName', $originalName);\n        }\n\n        $resolvedName = $this->nameContext->getResolvedName($name, $type);\n        if (null !== $resolvedName) {\n            return $resolvedName;\n        }\n\n        // unqualified names inside a namespace cannot be resolved at compile-time\n        // add the namespaced version of the name as an attribute\n        $name->setAttribute('namespacedName', FullyQualified::concat(\n            $this->nameContext->getNamespace(), $name, $name->getAttributes()));\n        return $name;\n    }\n\n    protected function resolveClassName(Name $name): Name {\n        return $this->resolveName($name, Stmt\\Use_::TYPE_NORMAL);\n    }\n\n    protected function addNamespacedName(Node $node): void {\n        $node->namespacedName = Name::concat(\n            $this->nameContext->getNamespace(), (string) $node->name);\n    }\n\n    protected function resolveAttrGroups(Node $node): void {\n        foreach ($node->attrGroups as $attrGroup) {\n            foreach ($attrGroup->attrs as $attr) {\n                $attr->name = $this->resolveClassName($attr->name);\n            }\n        }\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/NodeConnectingVisitor.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\NodeVisitor;\n\nuse PhpParser\\Node;\nuse PhpParser\\NodeVisitorAbstract;\n\n/**\n * Visitor that connects a child node to its parent node\n * as well as its sibling nodes.\n *\n * With <code>$weakReferences=false</code> 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 *\n * With <code>$weakReferences=true</code> attribute names are prefixed by \"weak_\", e.g. \"weak_parent\".\n */\nfinal class NodeConnectingVisitor extends NodeVisitorAbstract {\n    /**\n     * @var Node[]\n     */\n    private array $stack = [];\n\n    /**\n     * @var ?Node\n     */\n    private $previous;\n\n    private bool $weakReferences;\n\n    public function __construct(bool $weakReferences = false) {\n        $this->weakReferences = $weakReferences;\n    }\n\n    public function beforeTraverse(array $nodes) {\n        $this->stack    = [];\n        $this->previous = null;\n    }\n\n    public function enterNode(Node $node) {\n        if (!empty($this->stack)) {\n            $parent = $this->stack[count($this->stack) - 1];\n            if ($this->weakReferences) {\n                $node->setAttribute('weak_parent', \\WeakReference::create($parent));\n            } else {\n                $node->setAttribute('parent', $parent);\n            }\n        }\n\n        if ($this->previous !== null) {\n            if (\n                $this->weakReferences\n            ) {\n                if ($this->previous->getAttribute('weak_parent') === $node->getAttribute('weak_parent')) {\n                    $node->setAttribute('weak_previous', \\WeakReference::create($this->previous));\n                    $this->previous->setAttribute('weak_next', \\WeakReference::create($node));\n                }\n            } elseif ($this->previous->getAttribute('parent') === $node->getAttribute('parent')) {\n                $node->setAttribute('previous', $this->previous);\n                $this->previous->setAttribute('next', $node);\n            }\n        }\n\n        $this->stack[] = $node;\n    }\n\n    public function leaveNode(Node $node) {\n        $this->previous = $node;\n\n        array_pop($this->stack);\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/ParentConnectingVisitor.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\NodeVisitor;\n\nuse PhpParser\\Node;\nuse PhpParser\\NodeVisitorAbstract;\n\nuse function array_pop;\nuse function count;\n\n/**\n * Visitor that connects a child node to its parent node.\n *\n * With <code>$weakReferences=false</code> on the child node, the parent node can be accessed through\n * <code>$node->getAttribute('parent')</code>.\n *\n * With <code>$weakReferences=true</code> the attribute name is \"weak_parent\" instead.\n */\nfinal class ParentConnectingVisitor extends NodeVisitorAbstract {\n    /**\n     * @var Node[]\n     */\n    private array $stack = [];\n\n    private bool $weakReferences;\n\n    public function __construct(bool $weakReferences = false) {\n        $this->weakReferences = $weakReferences;\n    }\n\n    public function beforeTraverse(array $nodes) {\n        $this->stack = [];\n    }\n\n    public function enterNode(Node $node) {\n        if (!empty($this->stack)) {\n            $parent = $this->stack[count($this->stack) - 1];\n            if ($this->weakReferences) {\n                $node->setAttribute('weak_parent', \\WeakReference::create($parent));\n            } else {\n                $node->setAttribute('parent', $parent);\n            }\n        }\n\n        $this->stack[] = $node;\n    }\n\n    public function leaveNode(Node $node) {\n        array_pop($this->stack);\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/NodeVisitor.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser;\n\ninterface NodeVisitor {\n    /**\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     */\n    public const DONT_TRAVERSE_CHILDREN = 1;\n\n    /**\n     * If NodeVisitor::enterNode() or NodeVisitor::leaveNode() returns\n     * STOP_TRAVERSAL, traversal is aborted.\n     *\n     * The afterTraverse() method will still be invoked.\n     */\n    public const STOP_TRAVERSAL = 2;\n\n    /**\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     */\n    public const REMOVE_NODE = 3;\n\n    /**\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     */\n    public const DONT_TRAVERSE_CURRENT_AND_CHILDREN = 4;\n\n    /**\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     */\n    public const REPLACE_WITH_NULL = 5;\n\n    /**\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     */\n    public function beforeTraverse(array $nodes);\n\n    /**\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     */\n    public function enterNode(Node $node);\n\n    /**\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     */\n    public function leaveNode(Node $node);\n\n    /**\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     */\n    public function afterTraverse(array $nodes);\n}\n","vendor/nikic/php-parser/lib/PhpParser/NodeVisitorAbstract.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser;\n\n/**\n * @codeCoverageIgnore\n */\nabstract class NodeVisitorAbstract implements NodeVisitor {\n    public function beforeTraverse(array $nodes) {\n        return null;\n    }\n\n    public function enterNode(Node $node) {\n        return null;\n    }\n\n    public function leaveNode(Node $node) {\n        return null;\n    }\n\n    public function afterTraverse(array $nodes) {\n        return null;\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Parser/Php7.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Parser;\n\nuse PhpParser\\Error;\nuse PhpParser\\Modifiers;\nuse PhpParser\\Node;\nuse PhpParser\\Node\\Expr;\nuse PhpParser\\Node\\Name;\nuse PhpParser\\Node\\Scalar;\nuse PhpParser\\Node\\Stmt;\n\n/* This is an automatically GENERATED file, which should not be manually edited.\n * Instead edit one of the following:\n *  * the grammar file grammar/php.y\n *  * the skeleton file grammar/parser.template\n *  * the preprocessing script grammar/rebuildParsers.php\n */\nclass Php7 extends \\PhpParser\\ParserAbstract\n{\n    public const YYERRTOK = 256;\n    public const T_VOID_CAST = 257;\n    public const T_THROW = 258;\n    public const T_INCLUDE = 259;\n    public const T_INCLUDE_ONCE = 260;\n    public const T_EVAL = 261;\n    public const T_REQUIRE = 262;\n    public const T_REQUIRE_ONCE = 263;\n    public const T_LOGICAL_OR = 264;\n    public const T_LOGICAL_XOR = 265;\n    public const T_LOGICAL_AND = 266;\n    public const T_PRINT = 267;\n    public const T_YIELD = 268;\n    public const T_DOUBLE_ARROW = 269;\n    public const T_YIELD_FROM = 270;\n    public const T_PLUS_EQUAL = 271;\n    public const T_MINUS_EQUAL = 272;\n    public const T_MUL_EQUAL = 273;\n    public const T_DIV_EQUAL = 274;\n    public const T_CONCAT_EQUAL = 275;\n    public const T_MOD_EQUAL = 276;\n    public const T_AND_EQUAL = 277;\n    public const T_OR_EQUAL = 278;\n    public const T_XOR_EQUAL = 279;\n    public const T_SL_EQUAL = 280;\n    public const T_SR_EQUAL = 281;\n    public const T_POW_EQUAL = 282;\n    public const T_COALESCE_EQUAL = 283;\n    public const T_COALESCE = 284;\n    public const T_BOOLEAN_OR = 285;\n    public const T_BOOLEAN_AND = 286;\n    public const T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG = 287;\n    public const T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG = 288;\n    public const T_IS_EQUAL = 289;\n    public const T_IS_NOT_EQUAL = 290;\n    public const T_IS_IDENTICAL = 291;\n    public const T_IS_NOT_IDENTICAL = 292;\n    public const T_SPACESHIP = 293;\n    public const T_IS_SMALLER_OR_EQUAL = 294;\n    public const T_IS_GREATER_OR_EQUAL = 295;\n    public const T_SL = 296;\n    public const T_SR = 297;\n    public const T_INSTANCEOF = 298;\n    public const T_INC = 299;\n    public const T_DEC = 300;\n    public const T_INT_CAST = 301;\n    public const T_DOUBLE_CAST = 302;\n    public const T_STRING_CAST = 303;\n    public const T_ARRAY_CAST = 304;\n    public const T_OBJECT_CAST = 305;\n    public const T_BOOL_CAST = 306;\n    public const T_UNSET_CAST = 307;\n    public const T_POW = 308;\n    public const T_NEW = 309;\n    public const T_CLONE = 310;\n    public const T_EXIT = 311;\n    public const T_IF = 312;\n    public const T_ELSEIF = 313;\n    public const T_ELSE = 314;\n    public const T_ENDIF = 315;\n    public const T_LNUMBER = 316;\n    public const T_DNUMBER = 317;\n    public const T_STRING = 318;\n    public const T_STRING_VARNAME = 319;\n    public const T_VARIABLE = 320;\n    public const T_NUM_STRING = 321;\n    public const T_INLINE_HTML = 322;\n    public const T_ENCAPSED_AND_WHITESPACE = 323;\n    public const T_CONSTANT_ENCAPSED_STRING = 324;\n    public const T_ECHO = 325;\n    public const T_DO = 326;\n    public const T_WHILE = 327;\n    public const T_ENDWHILE = 328;\n    public const T_FOR = 329;\n    public const T_ENDFOR = 330;\n    public const T_FOREACH = 331;\n    public const T_ENDFOREACH = 332;\n    public const T_DECLARE = 333;\n    public const T_ENDDECLARE = 334;\n    public const T_AS = 335;\n    public const T_SWITCH = 336;\n    public const T_MATCH = 337;\n    public const T_ENDSWITCH = 338;\n    public const T_CASE = 339;\n    public const T_DEFAULT = 340;\n    public const T_BREAK = 341;\n    public const T_CONTINUE = 342;\n    public const T_GOTO = 343;\n    public const T_FUNCTION = 344;\n    public const T_FN = 345;\n    public const T_CONST = 346;\n    public const T_RETURN = 347;\n    public const T_TRY = 348;\n    public const T_CATCH = 349;\n    public const T_FINALLY = 350;\n    public const T_USE = 351;\n    public const T_INSTEADOF = 352;\n    public const T_GLOBAL = 353;\n    public const T_STATIC = 354;\n    public const T_ABSTRACT = 355;\n    public const T_FINAL = 356;\n    public const T_PRIVATE = 357;\n    public const T_PROTECTED = 358;\n    public const T_PUBLIC = 359;\n    public const T_READONLY = 360;\n    public const T_PUBLIC_SET = 361;\n    public const T_PROTECTED_SET = 362;\n    public const T_PRIVATE_SET = 363;\n    public const T_VAR = 364;\n    public const T_UNSET = 365;\n    public const T_ISSET = 366;\n    public const T_EMPTY = 367;\n    public const T_HALT_COMPILER = 368;\n    public const T_CLASS = 369;\n    public const T_TRAIT = 370;\n    public const T_INTERFACE = 371;\n    public const T_ENUM = 372;\n    public const T_EXTENDS = 373;\n    public const T_IMPLEMENTS = 374;\n    public const T_OBJECT_OPERATOR = 375;\n    public const T_NULLSAFE_OBJECT_OPERATOR = 376;\n    public const T_LIST = 377;\n    public const T_ARRAY = 378;\n    public const T_CALLABLE = 379;\n    public const T_CLASS_C = 380;\n    public const T_TRAIT_C = 381;\n    public const T_METHOD_C = 382;\n    public const T_FUNC_C = 383;\n    public const T_PROPERTY_C = 384;\n    public const T_LINE = 385;\n    public const T_FILE = 386;\n    public const T_START_HEREDOC = 387;\n    public const T_END_HEREDOC = 388;\n    public const T_DOLLAR_OPEN_CURLY_BRACES = 389;\n    public const T_CURLY_OPEN = 390;\n    public const T_PAAMAYIM_NEKUDOTAYIM = 391;\n    public const T_NAMESPACE = 392;\n    public const T_NS_C = 393;\n    public const T_DIR = 394;\n    public const T_NS_SEPARATOR = 395;\n    public const T_ELLIPSIS = 396;\n    public const T_NAME_FULLY_QUALIFIED = 397;\n    public const T_NAME_QUALIFIED = 398;\n    public const T_NAME_RELATIVE = 399;\n    public const T_ATTRIBUTE = 400;\n\n    protected int $tokenToSymbolMapSize = 401;\n    protected int $actionTableSize = 1578;\n    protected int $gotoTableSize = 698;\n\n    protected int $invalidSymbol = 173;\n    protected int $errorSymbol = 1;\n    protected int $defaultAction = -32766;\n    protected int $unexpectedTokenRule = 32767;\n\n    protected int $YY2TBLSTATE = 445;\n    protected int $numNonLeafStates = 754;\n\n    protected array $symbolToName = array(\n        \"EOF\",\n        \"error\",\n        \"T_VOID_CAST\",\n        \"T_THROW\",\n        \"T_INCLUDE\",\n        \"T_INCLUDE_ONCE\",\n        \"T_EVAL\",\n        \"T_REQUIRE\",\n        \"T_REQUIRE_ONCE\",\n        \"','\",\n        \"T_LOGICAL_OR\",\n        \"T_LOGICAL_XOR\",\n        \"T_LOGICAL_AND\",\n        \"T_PRINT\",\n        \"T_YIELD\",\n        \"T_DOUBLE_ARROW\",\n        \"T_YIELD_FROM\",\n        \"'='\",\n        \"T_PLUS_EQUAL\",\n        \"T_MINUS_EQUAL\",\n        \"T_MUL_EQUAL\",\n        \"T_DIV_EQUAL\",\n        \"T_CONCAT_EQUAL\",\n        \"T_MOD_EQUAL\",\n        \"T_AND_EQUAL\",\n        \"T_OR_EQUAL\",\n        \"T_XOR_EQUAL\",\n        \"T_SL_EQUAL\",\n        \"T_SR_EQUAL\",\n        \"T_POW_EQUAL\",\n        \"T_COALESCE_EQUAL\",\n        \"'?'\",\n        \"':'\",\n        \"T_COALESCE\",\n        \"T_BOOLEAN_OR\",\n        \"T_BOOLEAN_AND\",\n        \"'|'\",\n        \"'^'\",\n        \"T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG\",\n        \"T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG\",\n        \"T_IS_EQUAL\",\n        \"T_IS_NOT_EQUAL\",\n        \"T_IS_IDENTICAL\",\n        \"T_IS_NOT_IDENTICAL\",\n        \"T_SPACESHIP\",\n        \"'<'\",\n        \"T_IS_SMALLER_OR_EQUAL\",\n        \"'>'\",\n        \"T_IS_GREATER_OR_EQUAL\",\n        \"T_SL\",\n        \"T_SR\",\n        \"'+'\",\n        \"'-'\",\n        \"'.'\",\n        \"'*'\",\n        \"'/'\",\n        \"'%'\",\n        \"'!'\",\n        \"T_INSTANCEOF\",\n        \"'~'\",\n        \"T_INC\",\n        \"T_DEC\",\n        \"T_INT_CAST\",\n        \"T_DOUBLE_CAST\",\n        \"T_STRING_CAST\",\n        \"T_ARRAY_CAST\",\n        \"T_OBJECT_CAST\",\n        \"T_BOOL_CAST\",\n        \"T_UNSET_CAST\",\n        \"'@'\",\n        \"T_POW\",\n        \"'['\",\n        \"T_NEW\",\n        \"T_CLONE\",\n        \"T_EXIT\",\n        \"T_IF\",\n        \"T_ELSEIF\",\n        \"T_ELSE\",\n        \"T_ENDIF\",\n        \"T_LNUMBER\",\n        \"T_DNUMBER\",\n        \"T_STRING\",\n        \"T_STRING_VARNAME\",\n        \"T_VARIABLE\",\n        \"T_NUM_STRING\",\n        \"T_INLINE_HTML\",\n        \"T_ENCAPSED_AND_WHITESPACE\",\n        \"T_CONSTANT_ENCAPSED_STRING\",\n        \"T_ECHO\",\n        \"T_DO\",\n        \"T_WHILE\",\n        \"T_ENDWHILE\",\n        \"T_FOR\",\n        \"T_ENDFOR\",\n        \"T_FOREACH\",\n        \"T_ENDFOREACH\",\n        \"T_DECLARE\",\n        \"T_ENDDECLARE\",\n        \"T_AS\",\n        \"T_SWITCH\",\n        \"T_MATCH\",\n        \"T_ENDSWITCH\",\n        \"T_CASE\",\n        \"T_DEFAULT\",\n        \"T_BREAK\",\n        \"T_CONTINUE\",\n        \"T_GOTO\",\n        \"T_FUNCTION\",\n        \"T_FN\",\n        \"T_CONST\",\n        \"T_RETURN\",\n        \"T_TRY\",\n        \"T_CATCH\",\n        \"T_FINALLY\",\n        \"T_USE\",\n        \"T_INSTEADOF\",\n        \"T_GLOBAL\",\n        \"T_STATIC\",\n        \"T_ABSTRACT\",\n        \"T_FINAL\",\n        \"T_PRIVATE\",\n        \"T_PROTECTED\",\n        \"T_PUBLIC\",\n        \"T_READONLY\",\n        \"T_PUBLIC_SET\",\n        \"T_PROTECTED_SET\",\n        \"T_PRIVATE_SET\",\n        \"T_VAR\",\n        \"T_UNSET\",\n        \"T_ISSET\",\n        \"T_EMPTY\",\n        \"T_HALT_COMPILER\",\n        \"T_CLASS\",\n        \"T_TRAIT\",\n        \"T_INTERFACE\",\n        \"T_ENUM\",\n        \"T_EXTENDS\",\n        \"T_IMPLEMENTS\",\n        \"T_OBJECT_OPERATOR\",\n        \"T_NULLSAFE_OBJECT_OPERATOR\",\n        \"T_LIST\",\n        \"T_ARRAY\",\n        \"T_CALLABLE\",\n        \"T_CLASS_C\",\n        \"T_TRAIT_C\",\n        \"T_METHOD_C\",\n        \"T_FUNC_C\",\n        \"T_PROPERTY_C\",\n        \"T_LINE\",\n        \"T_FILE\",\n        \"T_START_HEREDOC\",\n        \"T_END_HEREDOC\",\n        \"T_DOLLAR_OPEN_CURLY_BRACES\",\n        \"T_CURLY_OPEN\",\n        \"T_PAAMAYIM_NEKUDOTAYIM\",\n        \"T_NAMESPACE\",\n        \"T_NS_C\",\n        \"T_DIR\",\n        \"T_NS_SEPARATOR\",\n        \"T_ELLIPSIS\",\n        \"T_NAME_FULLY_QUALIFIED\",\n        \"T_NAME_QUALIFIED\",\n        \"T_NAME_RELATIVE\",\n        \"T_ATTRIBUTE\",\n        \"';'\",\n        \"']'\",\n        \"'('\",\n        \"')'\",\n        \"'{'\",\n        \"'}'\",\n        \"'`'\",\n        \"'\\\"'\",\n        \"'$'\"\n    );\n\n    protected array $tokenToSymbol = array(\n            0,  173,  173,  173,  173,  173,  173,  173,  173,  173,\n          173,  173,  173,  173,  173,  173,  173,  173,  173,  173,\n          173,  173,  173,  173,  173,  173,  173,  173,  173,  173,\n          173,  173,  173,   57,  171,  173,  172,   56,  173,  173,\n          166,  167,   54,   51,    9,   52,   53,   55,  173,  173,\n          173,  173,  173,  173,  173,  173,  173,  173,   32,  164,\n           45,   17,   47,   31,   69,  173,  173,  173,  173,  173,\n          173,  173,  173,  173,  173,  173,  173,  173,  173,  173,\n          173,  173,  173,  173,  173,  173,  173,  173,  173,  173,\n          173,   71,  173,  165,   37,  173,  170,  173,  173,  173,\n          173,  173,  173,  173,  173,  173,  173,  173,  173,  173,\n          173,  173,  173,  173,  173,  173,  173,  173,  173,  173,\n          173,  173,  173,  168,   36,  169,   59,  173,  173,  173,\n          173,  173,  173,  173,  173,  173,  173,  173,  173,  173,\n          173,  173,  173,  173,  173,  173,  173,  173,  173,  173,\n          173,  173,  173,  173,  173,  173,  173,  173,  173,  173,\n          173,  173,  173,  173,  173,  173,  173,  173,  173,  173,\n          173,  173,  173,  173,  173,  173,  173,  173,  173,  173,\n          173,  173,  173,  173,  173,  173,  173,  173,  173,  173,\n          173,  173,  173,  173,  173,  173,  173,  173,  173,  173,\n          173,  173,  173,  173,  173,  173,  173,  173,  173,  173,\n          173,  173,  173,  173,  173,  173,  173,  173,  173,  173,\n          173,  173,  173,  173,  173,  173,  173,  173,  173,  173,\n          173,  173,  173,  173,  173,  173,  173,  173,  173,  173,\n          173,  173,  173,  173,  173,  173,  173,  173,  173,  173,\n          173,  173,  173,  173,  173,  173,    1,    2,    3,    4,\n            5,    6,    7,    8,   10,   11,   12,   13,   14,   15,\n           16,   18,   19,   20,   21,   22,   23,   24,   25,   26,\n           27,   28,   29,   30,   33,   34,   35,   38,   39,   40,\n           41,   42,   43,   44,   46,   48,   49,   50,   58,   60,\n           61,   62,   63,   64,   65,   66,   67,   68,   70,   72,\n           73,   74,   75,   76,   77,   78,   79,   80,   81,   82,\n           83,   84,   85,   86,   87,   88,   89,   90,   91,   92,\n           93,   94,   95,   96,   97,   98,   99,  100,  101,  102,\n          103,  104,  105,  106,  107,  108,  109,  110,  111,  112,\n          113,  114,  115,  116,  117,  118,  119,  120,  121,  122,\n          123,  124,  125,  126,  127,  128,  129,  130,  131,  132,\n          133,  134,  135,  136,  137,  138,  139,  140,  141,  142,\n          143,  144,  145,  146,  147,  148,  149,  150,  151,  152,\n          153,  154,  155,  156,  157,  158,  159,  160,  161,  162,\n          163\n    );\n\n    protected array $action = array(\n          133,  134,  135,  575,  136,  137, 1049,  766,  767,  768,\n          138,   41,  850, -341,  495, 1390,-32766,-32766,-32766, 1008,\n          841, 1145, 1146, 1147, 1141, 1140, 1139, 1148, 1142, 1143,\n         1144,-32766,-32766,-32766, -195,  760,  759,-32766, -194,-32766,\n        -32766,-32766,-32766,-32766,-32766,-32766,-32767,-32767,-32767,-32767,\n        -32767,    0,-32766,    3,    4,  769, 1145, 1146, 1147, 1141,\n         1140, 1139, 1148, 1142, 1143, 1144,  388,  389,  448,  272,\n           53,  391,  773,  774,  775,  776,  433,    5,  434,  571,\n          337,   39,  254,   29,  298,  830,  777,  778,  779,  780,\n          781,  782,  783,  784,  785,  786,  806,  576,  807,  808,\n          809,  810,  798,  799,  353,  354,  801,  802,  787,  788,\n          789,  791,  792,  793,  364,  833,  834,  835,  836,  837,\n          577, -382,  306, -382,  794,  795,  578,  579,  244,  818,\n          816,  817,  829,  813,  814, 1313,   38,  580,  581,  812,\n          582,  583,  584,  585, 1325,  586,  587,  481,  482, -628,\n          496, 1009,  815,  588,  589,  140,  139, -628,  133,  134,\n          135,  575,  136,  137, 1085,  766,  767,  768,  138,   41,\n        -32766, -341, 1046, 1041, 1040, 1039, 1045, 1042, 1043, 1044,\n        -32766,-32766,-32766,-32767,-32767,-32767,-32767,  106,  107,  108,\n          109,  110, -195,  760,  759, 1058, -194,-32766,-32766,-32766,\n          149,-32766,  852,-32766,-32766,-32766,-32766,-32766,-32766,-32766,\n          936,  303,  257,  769,-32766,-32766,-32766,  850,-32766,  297,\n        -32766,-32766,-32766,-32766,-32766, 1371, 1355,  272,   53,  391,\n          773,  774,  775,  776, -625,-32766,  434,-32766,-32766,-32766,\n        -32766,  730, -625,  830,  777,  778,  779,  780,  781,  782,\n          783,  784,  785,  786,  806,  576,  807,  808,  809,  810,\n          798,  799,  353,  354,  801,  802,  787,  788,  789,  791,\n          792,  793,  364,  833,  834,  835,  836,  837,  577, -579,\n         -275,  317,  794,  795,  578,  579, -577,  818,  816,  817,\n          829,  813,  814,  957,  926,  580,  581,  812,  582,  583,\n          584,  585,  144,  586,  587,  841,  336,-32766,-32766,-32766,\n          815,  588,  589, -628,  139, -628,  133,  134,  135,  575,\n          136,  137, 1082,  766,  767,  768,  138,   41,-32766, 1375,\n        -32766,-32766,-32766,-32766,-32766,-32766,-32766, 1374,  629,  388,\n          389,-32766,-32766,-32766,-32766,-32766, -579, -579, 1081,  433,\n          321,  760,  759, -577, -577,-32766, 1293,-32766,-32766,  111,\n          112,  113, -579,  282,  843,  851,  623, 1400,  936, -577,\n         1401,  769,  333,  938, -585,  114, -579,  725,  294,  298,\n         1119, -584,  349, -577,  752,  272,   53,  391,  773,  774,\n          775,  776,  145,   86,  434,  306,  336,  336, -625,  731,\n         -625,  830,  777,  778,  779,  780,  781,  782,  783,  784,\n          785,  786,  806,  576,  807,  808,  809,  810,  798,  799,\n          353,  354,  801,  802,  787,  788,  789,  791,  792,  793,\n          364,  833,  834,  835,  836,  837,  577, -576,  850, -578,\n          794,  795,  578,  579,  845,  818,  816,  817,  829,  813,\n          814,  727,  926,  580,  581,  812,  582,  583,  584,  585,\n          740,  586,  587,  243, 1055,-32766,-32766,  -85,  815,  588,\n          589,  878,  152,  879,  133,  134,  135,  575,  136,  137,\n         1087,  766,  767,  768,  138,   41,  350,  961,  960, 1058,\n         1058, 1058,-32766,-32766,-32766,  841,-32766,  131,  977,  978,\n          400, 1055,   10,  979, -576, -576, -578, -578,  378,  760,\n          759,  936,  973,  290,  297,  297,-32766,  846,  936,  154,\n         -576,   79, -578,  382,  849,  936, 1058,  336,  878,  769,\n          879,  938, -583,  -85, -576,  725, -578,  959,  108,  109,\n          110, 1058,  732,  272,   53,  391,  773,  774,  775,  776,\n          290,  155,  434,  470,  471,  472,  735,  760,  759,  830,\n          777,  778,  779,  780,  781,  782,  783,  784,  785,  786,\n          806,  576,  807,  808,  809,  810,  798,  799,  353,  354,\n          801,  802,  787,  788,  789,  791,  792,  793,  364,  833,\n          834,  835,  836,  837,  577,  926,  434,  847,  794,  795,\n          578,  579,  926,  818,  816,  817,  829,  813,  814,  926,\n          398,  580,  581,  812,  582,  583,  584,  585,  452,  586,\n          587,  157,   87,   88,   89,  453,  815,  588,  589,  454,\n          152,  790,  761,  762,  763,  764,  765,  158,  766,  767,\n          768,  803,  804,   40,   27,   90,   91,   92,   93,   94,\n           95,   96,   97,   98,   99,  100,  101,  102,  103,  104,\n          105,  106,  107,  108,  109,  110,  111,  112,  113, 1134,\n          282, 1055,  455,-32766,  994, 1288, 1287, 1289,  725,  390,\n          389,  938,  114,  856, 1120,  725,  769,  159,  938,  433,\n          672,   23,  725, 1118,  691,  692, 1058,-32766,  153,  416,\n          770,  771,  772,  773,  774,  775,  776,  -78, -619,  839,\n         -619, -581,  386,  387,  392,  393,  830,  777,  778,  779,\n          780,  781,  782,  783,  784,  785,  786,  806,  828,  807,\n          808,  809,  810,  798,  799,  800,  827,  801,  802,  787,\n          788,  789,  791,  792,  793,  832,  833,  834,  835,  836,\n          837,  838,  161,  663,  664,  794,  795,  796,  797,   36,\n          818,  816,  817,  829,  813,  814,  -58,  -57,  805,  811,\n          812,  819,  820,  822,  821,  -87,  823,  824, -581, -581,\n          128,  129,  141,  815,  826,  825,   54,   55,   56,   57,\n          527,   58,   59,  142, -110,  148,  162,   60,   61, -110,\n           62, -110,  936,  163,  164,  165,  313,  166, -581, -110,\n         -110, -110, -110, -110, -110, -110, -110, -110, -110, -110,\n         1293,  -84,  953,  -78,  -73,  -72,  -71,  -70,  -69,  -68,\n          -67,  -66,  -65,  742,  -46,   63,   64,  -18, -575, 1286,\n          146,   65,   51,   66,  251,  252,   67,   68,   69,   70,\n           71,   72,   73,   74,  281,   31,  273,   47,  450,  528,\n          291, -357,  741, 1319, 1320,  529,  744,  850,  935,  151,\n          295, 1317,   45,   22,  530, 1284,  531, -309,  532, -305,\n          533,  286,  936,  534,  535,  287,  926,  292,   48,   49,\n          456,  385,  384,  293,   50,  536,  342,  296,  282, 1057,\n          376,  348,  850,  299,  300, -575, -575, 1279,  114,  307,\n          308,  701,  538,  539,  540,  150,  841,-32766, 1288, 1287,\n         1289, -575,  850,  294,  542,  543, 1402, 1305, 1306, 1307,\n         1308, 1310, 1302, 1303,  305, -575,  716, -110, -110,  130,\n         1309, 1304, -110,  593, 1288, 1287, 1289,  306,   13,  673,\n           75, -110, 1152,  678,  331,  332,  336, -154, -154, -154,\n        -32766,  718,  694,   -4,  936,  938,  926,  314,  478,  725,\n          506, 1324, -154,  705, -154,  679, -154,  695, -154,  974,\n         1326, -541,  306,  312,  311,   79,  849,  661,  383,   43,\n          320,  336,   37, 1252,    0,    0,   52,    0,    0,  977,\n          978,    0,  760,  759,  537,-32766,    0,    0,    0,  706,\n            0,    0,  912,  973, -110, -110, -110,   35,  115,  116,\n          117,  118,  119,  120,  121,  122,  123,  124,  125,  126,\n          127, -531,   11,  707,  708,   31,  274,   30,  380,  955,\n          599, -613,  306,  627,    0,  938,    0,  850,  926,  725,\n         -154, 1317, 1288, 1287, 1289,   44, -612,  749,  290,  750,\n         1194, 1196,  869,  309,  310,  917, 1018,  995, 1002,  992,\n          383, -575,  446, 1003,  915,  990, 1123,  304, 1126,  381,\n         1127,  977,  978, 1124, 1125, 1131,  537, 1279, 1314,  861,\n          330,  760,  759,  132,  541,  973, -110, -110, -110, 1341,\n         1359, 1393, 1293,  666,  542,  543, -611, 1305, 1306, 1307,\n         1308, 1310, 1302, 1303, -585, -584, -583, -582,   21, -525,\n         1309, 1304,    1,   32,  760,  759,   33,  938,-32766, -278,\n           77,  725,   -4,  -16, 1286,  332,  336,   42, -575, -575,\n           46,-32766,-32766,-32766,   76,-32766,   80,-32766,   81,-32766,\n           82,   83,-32766,   84, -575,   85,  147,-32766,-32766,-32766,\n          156,-32766,  160,-32766,-32766,  249,  379, 1286, -575,-32766,\n          430,   31,  273,  338,-32766,-32766,-32766,  365,-32766,  366,\n        -32766,-32766,-32766,  850,  850,-32766,  367, 1317,  368,  369,\n        -32766,-32766,-32766,  370,  371,  372,-32766,-32766,  373,  374,\n          375,  377,-32766,  430,  447,  570,   31,  274, -276, -275,\n           15,   16,   78,   17,-32766,   18,   20,  414,  850, -110,\n         -110,  497, 1317, 1279, -110,  498,  505,  508,  509,  510,\n          511,  515,  516, -110,  517,  525,  604,  711, 1088, 1084,\n         1234,  543,-32766, 1305, 1306, 1307, 1308, 1310, 1302, 1303,\n         1315, 1086, 1083,  -50, 1064, 1274, 1309, 1304, 1279, 1060,\n         -280, -102,   14,   19,  306,   24,   77,   79,  415,  303,\n          413,  332,  336,  336,  618,  624,  543,  652, 1305, 1306,\n         1307, 1308, 1310, 1302, 1303,  717,  143, 1238, 1292, 1235,\n         1372, 1309, 1304,  726,  729,  733,-32766,  734,  736,  737,\n          738,   77, 1286,  419,  739,  743,  332,  336,  728,-32766,\n        -32766,-32766,  746,-32766,  913,-32766, 1397,-32766, 1399,  872,\n        -32766,  871,  967, 1010, 1398,-32766,-32766,-32766,  966,-32766,\n          964,-32766,-32766,  965,  968, 1286, 1267,-32766,  430,  946,\n          956,  944,-32766,-32766,-32766, 1000,-32766, 1001,-32766,-32766,\n        -32766,  650, 1396,-32766, 1353, 1342, 1360, 1369,-32766,-32766,\n        -32766, 1318,-32766,  336,-32766,-32766,  936,    0, 1286,    0,\n        -32766,  430,    0,    0,    0,-32766,-32766,-32766,    0,-32766,\n            0,-32766,-32766,-32766,    0,    0,-32766,    0,    0,  936,\n            0,-32766,-32766,-32766,    0,-32766,    0,-32766,-32766,    0,\n            0, 1286,    0,-32766,  430,    0,    0,    0,-32766,-32766,\n        -32766,    0,-32766,    0,-32766,-32766,-32766,    0,    0,-32766,\n            0,    0,    0,  501,-32766,-32766,-32766,    0,-32766,    0,\n        -32766,-32766,    0,    0, 1286,  606,-32766,  430,    0,    0,\n            0,-32766,-32766,-32766,    0,-32766,    0,-32766,-32766,-32766,\n          926,    0,-32766,    2,    0,    0,    0,-32766,-32766,-32766,\n            0,    0,    0,-32766,-32766,    0, -253, -253, -253,-32766,\n          430,    0,  383,  926,    0,    0,    0,    0,    0,    0,\n            0,-32766,    0,  977,  978,    0,    0,    0,  537, -252,\n         -252, -252,    0,    0,    0,  383,  912,  973, -110, -110,\n         -110,    0,    0,    0,    0,    0,  977,  978,    0,    0,\n            0,  537,    0,    0,    0,    0,    0,    0,    0,  912,\n          973, -110, -110, -110,-32766,    0,    0,    0,    0,  938,\n         1286,    0,    0,  725, -253,    0,    0,-32766,-32766,-32766,\n            0,-32766,    0,-32766,    0,-32766,    0,    0,-32766,    0,\n            0,    0,  938,-32766,-32766,-32766,  725, -252,    0,-32766,\n        -32766,    0,    0,    0,    0,-32766,  430,    0,    0,    0,\n            0,    0,    0,    0,    0,    0,    0,-32766\n    );\n\n    protected array $actionCheck = array(\n            3,    4,    5,    6,    7,    8,    1,   10,   11,   12,\n           13,   14,   83,    9,   32,   86,   10,   11,   12,   32,\n           81,  117,  118,  119,  120,  121,  122,  123,  124,  125,\n          126,   10,   11,   12,    9,   38,   39,   31,    9,   33,\n           34,   35,   36,   37,   38,   39,   40,   41,   42,   43,\n           44,    0,   31,    9,    9,   58,  117,  118,  119,  120,\n          121,  122,  123,  124,  125,  126,  107,  108,  109,   72,\n           73,   74,   75,   76,   77,   78,  117,    9,   81,   86,\n           71,  152,  153,    9,   31,   88,   89,   90,   91,   92,\n           93,   94,   95,   96,   97,   98,   99,  100,  101,  102,\n          103,  104,  105,  106,  107,  108,  109,  110,  111,  112,\n          113,  114,  115,  116,  117,  118,  119,  120,  121,  122,\n          123,  107,  163,  109,  127,  128,  129,  130,   15,  132,\n          133,  134,  135,  136,  137,    1,    9,  140,  141,  142,\n          143,  144,  145,  146,  151,  148,  149,  138,  139,    1,\n          168,  164,  155,  156,  157,    9,  159,    9,    3,    4,\n            5,    6,    7,    8,  167,   10,   11,   12,   13,   14,\n          117,  167,  119,  120,  121,  122,  123,  124,  125,  126,\n           10,   11,   12,   45,   46,   47,   48,   49,   50,   51,\n           52,   53,  167,   38,   39,  142,  167,   10,   11,   12,\n            9,   31,    1,   33,   34,   35,   36,   37,   38,   39,\n            1,  167,    9,   58,   10,   11,   12,   83,   31,  166,\n           33,   34,   35,   36,   37,    1,    1,   72,   73,   74,\n           75,   76,   77,   78,    1,   31,   81,   33,   34,   35,\n           36,   32,    9,   88,   89,   90,   91,   92,   93,   94,\n           95,   96,   97,   98,   99,  100,  101,  102,  103,  104,\n          105,  106,  107,  108,  109,  110,  111,  112,  113,  114,\n          115,  116,  117,  118,  119,  120,  121,  122,  123,   71,\n          167,    9,  127,  128,  129,  130,   71,  132,  133,  134,\n          135,  136,  137,    1,   85,  140,  141,  142,  143,  144,\n          145,  146,  168,  148,  149,   81,  172,   10,   11,   12,\n          155,  156,  157,  165,  159,  167,    3,    4,    5,    6,\n            7,    8,  167,   10,   11,   12,   13,   14,   31,    1,\n           33,   34,   35,   10,   10,   11,   12,    9,   52,  107,\n          108,   10,   11,   12,   10,   11,  138,  139,    1,  117,\n            9,   38,   39,  138,  139,   31,    1,   33,   34,   54,\n           55,   56,  154,   58,   81,  164,    1,   81,    1,  154,\n           84,   58,    9,  164,  166,   70,  168,  168,   31,   31,\n          164,  166,    9,  168,  168,   72,   73,   74,   75,   76,\n           77,   78,  168,  168,   81,  163,  172,  172,  165,   32,\n          167,   88,   89,   90,   91,   92,   93,   94,   95,   96,\n           97,   98,   99,  100,  101,  102,  103,  104,  105,  106,\n          107,  108,  109,  110,  111,  112,  113,  114,  115,  116,\n          117,  118,  119,  120,  121,  122,  123,   71,   83,   71,\n          127,  128,  129,  130,  161,  132,  133,  134,  135,  136,\n          137,  168,   85,  140,  141,  142,  143,  144,  145,  146,\n          168,  148,  149,   98,  117,  117,  117,   32,  155,  156,\n          157,  107,  159,  109,    3,    4,    5,    6,    7,    8,\n          167,   10,   11,   12,   13,   14,    9,   73,   74,  142,\n          142,  142,   10,   11,   12,   81,  141,   15,  118,  119,\n          107,  117,  109,  123,  138,  139,  138,  139,    9,   38,\n           39,    1,  132,  166,  166,  166,  117,   81,    1,   15,\n          154,  166,  154,    9,  160,    1,  142,  172,  107,   58,\n          109,  164,  166,   98,  168,  168,  168,  123,   51,   52,\n           53,  142,   32,   72,   73,   74,   75,   76,   77,   78,\n          166,   15,   81,  133,  134,  135,   32,   38,   39,   88,\n           89,   90,   91,   92,   93,   94,   95,   96,   97,   98,\n           99,  100,  101,  102,  103,  104,  105,  106,  107,  108,\n          109,  110,  111,  112,  113,  114,  115,  116,  117,  118,\n          119,  120,  121,  122,  123,   85,   81,  161,  127,  128,\n          129,  130,   85,  132,  133,  134,  135,  136,  137,   85,\n            9,  140,  141,  142,  143,  144,  145,  146,    9,  148,\n          149,   15,   10,   11,   12,    9,  155,  156,  157,    9,\n          159,    3,    4,    5,    6,    7,    8,   15,   10,   11,\n           12,   13,   14,   31,  102,   33,   34,   35,   36,   37,\n           38,   39,   40,   41,   42,   43,   44,   45,   46,   47,\n           48,   49,   50,   51,   52,   53,   54,   55,   56,  127,\n           58,  117,    9,  117,  164,  160,  161,  162,  168,  107,\n          108,  164,   70,    9,  169,  168,   58,   15,  164,  117,\n           76,   77,  168,    1,   76,   77,  142,  141,  102,  103,\n           72,   73,   74,   75,   76,   77,   78,   17,  165,   81,\n          167,   71,  107,  108,  107,  108,   88,   89,   90,   91,\n           92,   93,   94,   95,   96,   97,   98,   99,  100,  101,\n          102,  103,  104,  105,  106,  107,  108,  109,  110,  111,\n          112,  113,  114,  115,  116,  117,  118,  119,  120,  121,\n          122,  123,   15,  112,  113,  127,  128,  129,  130,   15,\n          132,  133,  134,  135,  136,  137,   17,   17,  140,  141,\n          142,  143,  144,  145,  146,   32,  148,  149,  138,  139,\n           17,   17,   17,  155,  156,  157,    2,    3,    4,    5,\n            6,    7,    8,   17,  102,   17,   17,   13,   14,  107,\n           16,  109,    1,   17,   17,   17,  114,   17,  168,  117,\n          118,  119,  120,  121,  122,  123,  124,  125,  126,  127,\n            1,   32,   39,   32,   32,   32,   32,   32,   32,   32,\n           32,   32,   32,   32,   32,   51,   52,   32,   71,   81,\n           32,   57,   71,   59,   60,   61,   62,   63,   64,   65,\n           66,   67,   68,   69,   32,   71,   72,   73,   74,   75,\n           32,  169,   32,   79,   80,   81,   32,   83,   32,   32,\n           38,   87,   88,   89,   90,  117,   92,   36,   94,   36,\n           96,   36,    1,   99,  100,   36,   85,   36,  104,  105,\n          106,  107,  108,   36,  110,  111,   36,   38,   58,  141,\n          116,  117,   83,   38,   38,  138,  139,  123,   70,  138,\n          139,   78,  128,  129,  130,   71,   81,   86,  160,  161,\n          162,  154,   83,   31,  140,  141,   84,  143,  144,  145,\n          146,  147,  148,  149,  150,  168,   81,  118,  119,  168,\n          156,  157,  123,   90,  160,  161,  162,  163,   98,   91,\n          166,  132,   83,   97,  170,  171,  172,   76,   77,   78,\n          141,   93,   95,    0,    1,  164,   85,  115,   98,  168,\n           98,  151,   91,   81,   93,  101,   95,  101,   97,  132,\n          151,  154,  163,  137,  136,  166,  160,  114,  107,  164,\n          136,  172,  168,  170,   -1,   -1,   71,   -1,   -1,  118,\n          119,   -1,   38,   39,  123,  141,   -1,   -1,   -1,  117,\n           -1,   -1,  131,  132,  133,  134,  135,   17,   18,   19,\n           20,   21,   22,   23,   24,   25,   26,   27,   28,   29,\n           30,  154,  154,  141,  142,   71,   72,  154,  154,  159,\n          158,  166,  163,  158,   -1,  164,   -1,   83,   85,  168,\n          169,   87,  160,  161,  162,  164,  166,  164,  166,  164,\n           60,   61,  164,  138,  139,  164,  164,  164,  164,  164,\n          107,   71,  109,  164,  164,  164,  164,  114,  164,  154,\n          164,  118,  119,  164,  164,  164,  123,  123,  165,  165,\n          168,   38,   39,  168,  131,  132,  133,  134,  135,  165,\n          165,  165,    1,  165,  140,  141,  166,  143,  144,  145,\n          146,  147,  148,  149,  166,  166,  166,  166,  155,  166,\n          156,  157,  166,  166,   38,   39,  166,  164,   75,  167,\n          166,  168,  169,   32,   81,  171,  172,  166,  138,  139,\n          166,   88,   89,   90,  166,   92,  166,   94,  166,   96,\n          166,  166,   99,  166,  154,  166,  166,  104,  105,  106,\n          166,   75,  166,  110,  111,  166,  168,   81,  168,  116,\n          117,   71,   72,  166,   88,   89,   90,  166,   92,  166,\n           94,  128,   96,   83,   83,   99,  166,   87,  166,  166,\n          104,  105,  106,  166,  166,  166,  110,  111,  166,  166,\n          166,  166,  116,  117,  166,  166,   71,   72,  167,  167,\n          167,  167,  159,  167,  128,  167,  167,  167,   83,  118,\n          119,  167,   87,  123,  123,  167,  167,  167,  167,  167,\n          167,  167,  167,  132,  167,  167,  167,  167,  167,  167,\n          167,  141,  141,  143,  144,  145,  146,  147,  148,  149,\n          167,  167,  167,   32,  167,  167,  156,  157,  123,  167,\n          167,  167,  167,  167,  163,  167,  166,  166,  169,  167,\n          167,  171,  172,  172,  167,  167,  141,  167,  143,  144,\n          145,  146,  147,  148,  149,  167,   32,  167,  167,  167,\n          167,  156,  157,  168,  168,  168,   75,  168,  168,  168,\n          168,  166,   81,  169,  168,  168,  171,  172,  168,   88,\n           89,   90,  169,   92,  169,   94,  169,   96,  169,  169,\n           99,  169,  169,  169,  169,  104,  105,  106,  169,   75,\n          169,  110,  111,  169,  169,   81,  169,  116,  117,  169,\n          169,  169,   88,   89,   90,  169,   92,  169,   94,  128,\n           96,  169,  169,   99,  169,  169,  169,  169,  104,  105,\n          106,  171,   75,  172,  110,  111,    1,   -1,   81,   -1,\n          116,  117,   -1,   -1,   -1,   88,   89,   90,   -1,   92,\n           -1,   94,  128,   96,   -1,   -1,   99,   -1,   -1,    1,\n           -1,  104,  105,  106,   -1,   75,   -1,  110,  111,   -1,\n           -1,   81,   -1,  116,  117,   -1,   -1,   -1,   88,   89,\n           90,   -1,   92,   -1,   94,  128,   96,   -1,   -1,   99,\n           -1,   -1,   -1,  103,  104,  105,  106,   -1,   75,   -1,\n          110,  111,   -1,   -1,   81,   82,  116,  117,   -1,   -1,\n           -1,   88,   89,   90,   -1,   92,   -1,   94,  128,   96,\n           85,   -1,   99,  166,   -1,   -1,   -1,  104,  105,  106,\n           -1,   -1,   -1,  110,  111,   -1,  101,  102,  103,  116,\n          117,   -1,  107,   85,   -1,   -1,   -1,   -1,   -1,   -1,\n           -1,  128,   -1,  118,  119,   -1,   -1,   -1,  123,  101,\n          102,  103,   -1,   -1,   -1,  107,  131,  132,  133,  134,\n          135,   -1,   -1,   -1,   -1,   -1,  118,  119,   -1,   -1,\n           -1,  123,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  131,\n          132,  133,  134,  135,   75,   -1,   -1,   -1,   -1,  164,\n           81,   -1,   -1,  168,  169,   -1,   -1,   88,   89,   90,\n           -1,   92,   -1,   94,   -1,   96,   -1,   -1,   99,   -1,\n           -1,   -1,  164,  104,  105,  106,  168,  169,   -1,  110,\n          111,   -1,   -1,   -1,   -1,  116,  117,   -1,   -1,   -1,\n           -1,   -1,   -1,   -1,   -1,   -1,   -1,  128\n    );\n\n    protected array $actionBase = array(\n            0,  155,   -3,  313,  471,  471,  881,  963, 1365, 1388,\n          892,  134,  515,  -61,  367,  524,  524,  801,  524,  209,\n          510,  283,  517,  517,  517,  920,  855,  628,  628,  855,\n          628, 1053, 1053, 1053, 1053, 1086, 1086, 1320, 1320, 1353,\n         1254, 1221, 1449, 1449, 1449, 1449, 1449, 1287, 1449, 1449,\n         1449, 1449, 1449, 1287, 1449, 1449, 1449, 1449, 1449, 1449,\n         1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449,\n         1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449,\n         1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449,\n         1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449,\n         1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449,\n         1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449,\n         1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449,\n         1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449,\n         1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449,\n         1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449,\n         1449, 1449, 1449, 1449, 1449, 1449, 1449,  201,  -13,   44,\n          365,  744, 1102, 1120, 1107, 1121, 1096, 1095, 1103, 1108,\n         1122, 1183, 1185,  837, 1186, 1187, 1182, 1188, 1110,  938,\n         1098, 1118,  612,  612,  612,  612,  612,  612,  612,  612,\n          612,  612,  612,  612,  612,  612,  612,  612,  612,  612,\n          612,  612,  612,  612,  612,  612,  612,  612,  612,  612,\n          323,  482,  334,  331,  331,  331,  331,  331,  331,  331,\n          331,  331,  331,  331,  331,  331,  331,  331,  331,  331,\n          331,  331,  331,  964,  964,   21,   21,   21,  324, 1135,\n         1100, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135,  297,\n          204, 1000,  187,  170,  170,    6,    6,    6,    6,    6,\n          692,   53, 1101,  819,  819,  138,  138,  138,  138,  542,\n           14,  347,  355,  -41,  348,  232,  384,  384,  487,  487,\n          554,  554,  349,  349,  554,  554,  554,  399,  399,  399,\n          399,  208,  215,  366,  364,   -7,  864,  224,  224,  224,\n          224,  864,  864,  864,  864,  829, 1190,  864, 1011, 1027,\n          864,  864,  368,  767,  767,  925,  305,  305,  305,  767,\n          421,  -71,  -71,  421,  380,  -71,  225,  286,  556,  847,\n          572,  543,  556,  640,  771,  233,  148,  826,  605,  826,\n         1094,  831,  831,  802,  792,  921, 1140, 1123,  874, 1176,\n          876, 1178,  420,    9,  791, 1093, 1093, 1093, 1093, 1093,\n         1093, 1093, 1093, 1093, 1093, 1093, 1191,  519, 1094,  436,\n         1191, 1191, 1191,  519,  519,  519,  519,  519,  519,  519,\n          519,  805,  519,  519,  641,  436,  614,  618,  436,  860,\n          519,  877,  201,  201,  201,  201,  201,  201,  201,  201,\n          201,  201,  201,  -18,  201,  201,  -13,  292,  292,  201,\n          216,    5,  292,  292,  292,  292,  201,  201,  201,  201,\n          605,  840,  882,  607,  435,  885,   29,  840,  840,  840,\n            4,  113,   25,  841,  843,  393,  835,  835,  835,  869,\n          956,  956,  835,  839,  835,  869,  835,  835,  956,  956,\n          879,  956,  146,  609,  373,  514,  616,  956,  272,  835,\n          835,  835,  835,  854,  956,   45,   68,  620,  835,  203,\n          191,  835,  835,  854,  848,  828,  846,  956,  956,  956,\n          854,  499,  846,  846,  846,  893,  895,  873,  822,  363,\n          341,  674,  127,  783,  822,  822,  835,  601,  873,  822,\n          873,  822,  880,  822,  822,  822,  873,  822,  839,  477,\n          822,  779,  786,  663,   74,  822,   51,  978,  980,  743,\n          982,  971,  984, 1038,  985,  987, 1125,  953,  999,  974,\n          989, 1039,  960,  957,  836,  763,  764,  878,  827,  951,\n          838,  838,  838,  948,  949,  838,  838,  838,  838,  838,\n          838,  838,  838,  763,  923,  884,  853, 1013,  765,  776,\n         1069,  820, 1145,  823, 1011,  978,  987,  789,  974,  989,\n          960,  957,  800,  799,  797,  798,  796,  795,  793,  794,\n          808, 1071, 1072,  990,  825,  778, 1049, 1020, 1143,  922,\n         1022, 1023, 1050, 1073,  898, 1083, 1147,  844, 1149, 1150,\n          924, 1028, 1126,  838,  940,  875,  934, 1027,  950,  763,\n          935, 1084, 1085, 1043,  824, 1054, 1058,  998,  870,  842,\n          936, 1152, 1029, 1032, 1033, 1127, 1129,  891, 1044,  962,\n         1059,  872, 1099, 1060, 1061, 1062, 1063, 1130, 1153, 1131,\n          890, 1132,  901,  858, 1041,  856, 1154,  504,  851,  857,\n          866, 1035,  536, 1007, 1136, 1134, 1155, 1064, 1065, 1067,\n         1159, 1161,  994,  902, 1046,  867, 1048, 1042,  903,  904,\n          606,  865, 1087,  845,  849,  859,  622,  672, 1164, 1165,\n         1167,  996,  830,  833,  905,  909, 1088,  832, 1092, 1170,\n          737,  910, 1171, 1070,  787,  788,  690,  750,  749,  790,\n          868, 1137,  883,  852,  850, 1034,  788,  834,  911, 1172,\n          912,  914,  916, 1068,  919,    0,    0,    0,    0,    0,\n            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n            0,    0,    0,    0,    0,  784,  784,  784,  784,  784,\n          784,  784,  784,  784,  628,  628,  628,  628,  784,  784,\n          784,  784,  784,  784,  784,  628,  784,  784,  784,  628,\n          628,    0,    0,  628,    0,  784,  784,  784,  784,  784,\n          784,  784,  784,  784,  784,  784,  784,  784,  784,  784,\n          784,  784,  784,  784,  784,  784,  784,  784,  784,  784,\n          784,  784,  784,  784,  784,  784,  784,  784,  784,  784,\n          784,  784,  784,  784,  784,  784,  784,  784,  784,  784,\n          784,  784,  784,  784,  784,  784,  784,  784,  784,  784,\n          784,  784,  784,  784,  784,  784,  784,  784,  784,  784,\n          784,  784,  784,  784,  784,  784,  784,  784,  784,  784,\n          784,  784,  784,  784,  784,  784,  784,  784,  784,  784,\n          784,  784,  784,  784,  784,  784,  784,  784,  784,  784,\n          784,  784,  784,  784,  784,  784,  784,  784,  784,  784,\n          784,  784,  784,  784,  784,  784,  784,  784,  784,  784,\n          784,  784,  784,  784,  784,  784,  784,  784,  784,  784,\n          784,  784,  784,  784,  784,  784,  784,  784,  784,  784,\n          784,  612,  612,  612,  612,  612,  612,  612,  612,  612,\n          612,  612,  612,  612,  612,  612,  612,  612,  612,  612,\n          612,  612,  612,  612,  612,  612,    0,    0,    0,    0,\n            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n            0,    0,    0,    0,  612,  612,  612,  612,  612,  612,\n          612,  612,  612,  612,  612,  612,  612,  612,  612,  612,\n          612,  612,  612,  612,  612,  612,  612,  758,  758,  612,\n          612,  612,  612,  758,  758,  758,  758,  758,  758,  758,\n          758,  758,  758,  612,  612,    0,  612,  612,  612,  612,\n          612,  612,  612,  612,  879,  758,  758,  758,  758,  305,\n          305,  305,  305,  -96,  -96,  758,  758,  380,  758,  380,\n          758,  758,  305,  305,  758,  758,  758,  758,  758,  758,\n          758,  758,  758,  758,  758,    0,    0,    0,  436,  -71,\n          758,  839,  839,  839,  839,  758,  758,  758,  758,  -71,\n          -71,  758,  414,  414,  758,  758,    0,    0,    0,    0,\n            0,    0,    0,    0,  436,    0,    0,  436,    0,    0,\n          839,  839,  758,  380,  879,  328,  758,    0,    0,    0,\n            0,  436,  839,  436,  519,  -71,  -71,  519,  519,  292,\n          201,  328,  596,  596,  596,  596,    0,    0,  605,  879,\n          879,  879,  879,  879,  879,  879,  879,  879,  879,  879,\n          839,    0,  879,    0,  839,  839,  839,    0,    0,    0,\n            0,    0,    0,    0,    0,  956,    0,    0,    0,    0,\n            0,    0,    0,  839,    0,  956,    0,    0,    0,    0,\n            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n            0,    0,    0,    0,    0,  839,    0,    0,    0,    0,\n            0,    0,    0,    0,    0,  838,  870,    0,    0,  870,\n            0,  838,  838,  838,    0,    0,    0,  865,  832\n    );\n\n    protected array $actionDefault = array(\n            3,32767,32767,32767,  102,  102,32767,32767,32767,32767,\n        32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,\n        32767,32767,32767,32767,32767,32767,32767,32767,32767,  100,\n        32767,  631,  631,  631,  631,32767,32767,  257,  102,32767,\n        32767,  500,  415,  415,  415,32767,32767,32767,  573,  573,\n          573,  573,  573,   17,32767,32767,32767,32767,32767,32767,\n        32767,  500,32767,32767,32767,32767,32767,32767,32767,32767,\n        32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,\n        32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,\n        32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,\n        32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,\n        32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,\n        32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,\n        32767,32767,32767,   36,    7,    8,   10,   11,   49,  338,\n          100,32767,32767,32767,32767,32767,32767,32767,32767,  102,\n        32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,\n        32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,\n        32767,  624,32767,32767,32767,32767,32767,32767,32767,32767,\n        32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,\n        32767,32767,  403,  494,  504,  482,  483,  485,  486,  414,\n          574,  630,  344,  627,  342,  413,  146,  354,  343,  245,\n          261,  505,  262,  506,  509,  510,  218,  400,  150,  151,\n          446,  501,  448,  499,  503,  447,  420,  427,  428,  429,\n          430,  431,  432,  433,  434,  435,  436,  437,  438,  439,\n          418,  419,  502,32767,32767,  479,  478,  477,  444,32767,\n        32767,32767,32767,32767,32767,32767,32767,  102,32767,  445,\n          449,  417,  452,  450,  451,  468,  469,  466,  467,  470,\n        32767,  323,32767,32767,32767,  471,  472,  473,  474,  381,\n          379,32767,32767,  111,  323,  111,32767,32767,  459,  460,\n        32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,\n        32767,  517,  567,  476,32767,32767,32767,32767,32767,32767,\n        32767,32767,32767,32767,32767,32767,32767,  102,32767,32767,\n        32767,  100,  569,  441,  443,  537,  454,  455,  453,  421,\n        32767,  542,32767,  102,32767,  544,32767,32767,32767,32767,\n        32767,32767,32767,  568,32767,  575,  575,32767,  530,  100,\n          196,32767,  543,  196,  196,32767,32767,32767,32767,32767,\n        32767,32767,32767,  638,  530,  110,  110,  110,  110,  110,\n          110,  110,  110,  110,  110,  110,32767,  196,  110,32767,\n        32767,32767,  100,  196,  196,  196,  196,  196,  196,  196,\n          196,  545,  196,  196,  191,32767,  271,  273,  102,  592,\n          196,  547,32767,32767,32767,32767,32767,32767,32767,32767,\n        32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,\n        32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,\n          530,  464,  139,32767,  532,  139,  575,  456,  457,  458,\n          575,  575,  575,  319,  296,32767,32767,32767,32767,32767,\n          545,  545,  100,  100,  100,  100,32767,32767,32767,32767,\n          111,  516,   99,   99,   99,   99,   99,  103,  101,32767,\n        32767,32767,32767,  226,32767,  101,  101,   99,32767,  101,\n          101,32767,32767,  226,  228,  215,  230,32767,  596,  597,\n          226,  101,  230,  230,  230,  250,  250,  519,  325,  101,\n           99,  101,  101,  198,  325,  325,32767,  101,  519,  325,\n          519,  325,  200,  325,  325,  325,  519,  325,32767,  101,\n          325,  217,  403,   99,   99,  325,32767,32767,32767,  532,\n        32767,32767,32767,32767,32767,32767,32767,  225,32767,32767,\n        32767,32767,32767,32767,32767,32767,  562,32767,  580,  594,\n          462,  463,  465,  579,  577,  487,  488,  489,  490,  491,\n          492,  493,  496,  626,32767,  536,32767,32767,32767,  353,\n        32767,  636,32767,32767,32767,    9,   74,  525,   42,   43,\n           51,   57,  551,  552,  553,  554,  548,  549,  555,  550,\n        32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,\n        32767,32767,32767,32767,32767,32767,  637,32767,  575,32767,\n        32767,32767,32767,  461,  557,  602,32767,32767,  576,  629,\n        32767,32767,32767,32767,32767,32767,32767,32767,  139,32767,\n        32767,32767,32767,32767,32767,32767,32767,32767,32767,  562,\n        32767,  137,32767,32767,32767,32767,32767,32767,32767,32767,\n          558,32767,32767,32767,  575,32767,32767,32767,32767,  321,\n          318,32767,32767,32767,32767,32767,32767,32767,32767,32767,\n        32767,32767,32767,32767,32767,32767,32767,  575,32767,32767,\n        32767,32767,32767,  298,32767,  315,32767,32767,32767,32767,\n        32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,\n        32767,32767,32767,32767,  399,  532,  301,  303,  304,32767,\n        32767,32767,32767,  375,32767,32767,32767,32767,32767,32767,\n        32767,32767,32767,32767,32767,  153,  153,    3,    3,  356,\n          153,  153,  153,  356,  356,  153,  356,  356,  356,  153,\n          153,  153,  153,  153,  153,  283,  186,  265,  268,  250,\n          250,  153,  367,  153\n    );\n\n    protected array $goto = array(\n          202,  169,  202,  202,  202, 1056,  842,  712,  359,  670,\n          671,  598,  688,  689,  690,  748,  653,  655,  591,  929,\n          675,  930, 1090,  721,  699,  702, 1028,  710,  719, 1024,\n          171,  171,  171,  171,  226,  203,  199,  199,  181,  183,\n          221,  199,  199,  199,  199,  199, 1180,  200,  200,  200,\n          200,  200, 1180,  193,  194,  195,  196,  197,  198,  223,\n          221,  224,  550,  551,  431,  552,  555,  556,  557,  558,\n          559,  560,  561,  562,  172,  173,  174,  201,  175,  176,\n          177,  170,  178,  179,  180,  182,  220,  222,  225,  245,\n          248,  259,  260,  262,  263,  264,  265,  266,  267,  268,\n          269,  275,  276,  277,  278,  288,  289,  326,  327,  328,\n          437,  438,  439,  613,  227,  228,  229,  230,  231,  232,\n          233,  234,  235,  236,  237,  238,  239,  240,  241,  184,\n          242,  185,  194,  195,  196,  197,  198,  223,  204,  205,\n          206,  207,  246,  186,  187,  208,  188,  209,  205,  189,\n          247,  204,  168,  210,  211,  190,  212,  213,  214,  191,\n          215,  216,  192,  217,  218,  219,  285,  283,  285,  285,\n          870, 1089, 1091, 1094,  615,  255,  255,  255,  255,  255,\n          441,  677,  614, 1130,  884,  867,  436,  329,  323,  324,\n          345,  608,  440,  346,  442,  654,  724,  492,  521,  715,\n          896, 1128,  993,  883,  494,  253,  253,  253,  253,  250,\n          256,  489, 1361, 1362, 1386, 1386,  925,  920,  921,  934,\n          876,  922,  873,  923,  924,  874,  877,  363,  928,  881,\n          480,  480,  868,  880, 1386,  848,  474,  363,  363,  480,\n         1117, 1112, 1113, 1114, 1229,  351,  362,  362,  362,  362,\n         1389, 1389,  429,  363,  363, 1017,  902,  363,  989, 1403,\n          747,  360,  361,  566, 1026, 1021, 1056, 1285, 1285, 1285,\n          569,  352,  351,  363,  363,  605, 1056, 1285,  848, 1056,\n          848, 1056, 1056, 1137, 1138, 1056, 1056, 1056, 1056, 1056,\n         1056, 1056, 1056, 1056, 1056, 1056,  357, 1261,  962,  637,\n          674, 1285, 1262, 1265,  963, 1266, 1285, 1285, 1285, 1285,\n         1376,  435, 1285,  628,  402, 1285, 1285, 1368, 1368, 1368,\n         1368, 1347,  574,  567, 1062, 1061, 1059, 1059,  958,  958,\n          697,  970, 1014,  942, 1051, 1067, 1068,  943,  565,  565,\n          565,  603,  513,  522,  514,  863,  676,  863,  565,  709,\n          520, 1176,  318,  567,  574,  600,  601,  319,  611,  617,\n          844,  633,  634, 1080,    8,  709,    9,  449,  709,   28,\n         1065, 1066,  467,  335,  316,  569,  698,  987,  987,  987,\n          987, 1363, 1364,  467,  639,  639,  981,  988,  609,  631,\n         1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316,\n         1335, 1335,  863,  469,  682,  469, 1335, 1335, 1335, 1335,\n         1335, 1335, 1335, 1335, 1335, 1335,  347,  258,  258,  626,\n          640,  643,  644,  645,  646,  667,  668,  669,  723,  632,\n          460,  860,  460,  460,  460, 1358, 1358, 1358,  553,  553,\n         1278,  985,  420,  720,  553, 1358,  553,  553,  553,  553,\n          553,  553,  553,  553,  451,  889,  568,  595,  568,  647,\n          649,  651,  568,  976,  595,  411,  405,  473,  886, 1276,\n         1370, 1370, 1370, 1370,  909,  866,  909,  909, 1036,  483,\n          612,  484,  485,  751,  563,  563,  563,  563,  894,  619,\n         1101, 1394, 1395,  412, 1332, 1332,  898,  490, 1151, 1354,\n         1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332,\n          279, 1105,  334,  334,  334,  998,  892,    0, 1280, 1047,\n            0,    0,  863,    0,    0,  460,  460,  460,  460,  460,\n          460,  460,  460,  460,  460,  460,    0,    0,  460, 1103,\n          554,  554,    0, 1356, 1356, 1103,  554,  554,  554,  554,\n          554,  554,  554,  554,  554,  554,  621,  622,  417,  418,\n          947, 1166,    0,  686,    0,  687,    0,  422,  423,  424,\n            0,  700, 1033,    0,  425, 1281, 1282,    0, 1268,  355,\n          888,    0,  680, 1012,  858,    0,    0,    0,  882,  443,\n            0, 1268,    0,  897,  885, 1100, 1104,    0,    0,    0,\n         1275,    0,  443,    0, 1283, 1344, 1345,  996,    0,    0,\n         1063, 1063,    0,    0,    0,  681, 1074, 1070, 1071,  404,\n          407,  616,  620,    0,    0,    0,    0,    0,    0,    0,\n          986,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n            0,    0,    0, 1149,  901,    0,    0,    0,    0,    0,\n            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n            0,    0,    0,    0,    0,    0, 1031, 1031\n    );\n\n    protected array $gotoCheck = array(\n           42,   42,   42,   42,   42,   73,    6,   73,   97,   86,\n           86,   48,   86,   86,   86,   48,   48,   48,  127,   65,\n           48,   65,  131,    9,   48,   48,   48,   48,   48,   48,\n           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,\n           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,\n           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,\n           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,\n           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,\n           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,\n           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,\n           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,\n           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,\n           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,\n           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,\n           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,\n           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,\n           42,   42,   42,   42,   42,   42,   23,   23,   23,   23,\n           15,  130,  130,  130,  134,    5,    5,    5,    5,    5,\n           66,   66,    8,    8,   35,   26,   66,   66,   66,   66,\n           66,   66,   66,   66,   66,   66,    8,   84,    8,    8,\n           35,    8,   49,   35,   84,    5,    5,    5,    5,    5,\n            5,  185,  185,  185,  191,  191,   15,   15,   15,   15,\n           15,   15,   15,   15,   15,   15,   15,   14,   15,   15,\n          157,  157,   27,   15,  191,   12,  159,   14,   14,  157,\n           15,   15,   15,   15,  159,  177,   24,   24,   24,   24,\n          191,  191,   43,   14,   14,   50,   45,   14,   50,   14,\n           50,   97,   97,   50,   50,   50,   73,   73,   73,   73,\n           14,  177,  177,   14,   14,  181,   73,   73,   12,   73,\n           12,   73,   73,  148,  148,   73,   73,   73,   73,   73,\n           73,   73,   73,   73,   73,   73,  188,   79,   79,   56,\n           56,   73,   79,   79,   79,   79,   73,   73,   73,   73,\n          190,   13,   73,   13,   62,   73,   73,    9,    9,    9,\n            9,   14,   76,   76,  119,  119,   89,   89,    9,    9,\n           89,   89,  103,   73,   89,   89,   89,   73,   19,   19,\n           19,  104,  163,   14,  163,   22,   64,   22,   19,    7,\n          163,  158,   76,   76,   76,   76,   76,   76,   76,   76,\n            7,   76,   76,  115,   46,    7,   46,  113,    7,   76,\n          120,  120,   19,  178,  178,   14,  117,   19,   19,   19,\n           19,  187,  187,   19,  108,  108,   19,   19,    2,    2,\n          108,  108,  108,  108,  108,  108,  108,  108,  108,  108,\n          179,  179,   22,   83,  121,   83,  179,  179,  179,  179,\n          179,  179,  179,  179,  179,  179,   29,    5,    5,   81,\n           81,   81,   81,   81,   81,   81,   81,   81,   81,   80,\n           23,   18,   23,   23,   23,  134,  134,  134,  165,  165,\n           14,   93,   93,   93,  165,  134,  165,  165,  165,  165,\n          165,  165,  165,  165,   83,   39,    9,    9,    9,   85,\n           85,   85,    9,   92,    9,   28,    9,    9,   37,  169,\n          134,  134,  134,  134,   25,   25,   25,   25,  110,    9,\n            9,    9,    9,   99,  107,  107,  107,  107,    9,  107,\n          133,    9,    9,   31,  180,  180,   41,  160,  151,  134,\n          180,  180,  180,  180,  180,  180,  180,  180,  180,  180,\n           24,  136,   24,   24,   24,   96,    9,   -1,   20,  114,\n           -1,   -1,   22,   -1,   -1,   23,   23,   23,   23,   23,\n           23,   23,   23,   23,   23,   23,   -1,   -1,   23,  134,\n          182,  182,   -1,  134,  134,  134,  182,  182,  182,  182,\n          182,  182,  182,  182,  182,  182,   17,   17,   82,   82,\n           17,   17,   -1,   82,   -1,   82,   -1,   82,   82,   82,\n           -1,   82,   17,   -1,   82,   20,   20,   -1,   20,   82,\n           17,   -1,   17,   17,   20,   -1,   -1,   -1,   17,  118,\n           -1,   20,   -1,   16,   16,   16,   16,   -1,   -1,   -1,\n           17,   -1,  118,   -1,   20,   20,   20,   16,   -1,   -1,\n          118,  118,   -1,   -1,   -1,  118,  118,  118,  118,   59,\n           59,   59,   59,   -1,   -1,   -1,   -1,   -1,   -1,   -1,\n           16,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,\n           -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,\n           -1,   -1,   -1,   16,   16,   -1,   -1,   -1,   -1,   -1,\n           -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,\n           -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,\n           -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,\n           -1,   -1,   -1,   -1,   -1,   -1,  107,  107\n    );\n\n    protected array $gotoBase = array(\n            0,    0, -339,    0,    0,  174,   -7,  339,  171,   10,\n            0,    0,  -69,  -36,  -78, -186,  130,   81,  114,   66,\n          117,    0,   62,  160,  240,  468,  178,  225,  118,  112,\n            0,   45,    0,    0,    0, -195,    0,  119,    0,  122,\n            0,   44,   -1,  226,    0,  227, -387,    0, -715,  182,\n          241,    0,    0,    0,    0,    0,  256,    0,    0,  570,\n            0,    0,  269,    0,  102,    3,  -63,    0,    0,    0,\n            0,    0,    0,   -5,    0,    0,  -31,    0,    0, -120,\n          110,   53,   54,  120, -286,  -33, -724,    0,    0,   40,\n            0,    0,  124,  129,    0,    0,   61, -488,    0,   67,\n            0,    0,    0,  294,  295,    0,    0,  453,  141,    0,\n          100,    0,    0,   83,   -3,   82,    0,   86,  318,   38,\n           78,  107,    0,    0,    0,    0,    0,   16,    0,    0,\n          168,   20,    0,  108,  163,    0,   58,    0,    0,    0,\n            0,    0,    0,    0,    0,    0,    0,    0,    4,    0,\n            0,   43,    0,    0,    0,    0,    0,  193,  101,  -38,\n           46,    0,    0, -166,    0,  195,    0,    0,    0,   92,\n            0,    0,    0,    0,    0,    0,    0,  -60,   42,  157,\n          251,  243,  297,    0,    0,  -97,    0,    1,  263,    0,\n          276, -101,    0,    0\n    );\n\n    protected array $gotoDefault = array(\n        -32768,  526,  755,    7,  756,  951,  831,  840,  590,  544,\n          722,  356,  641,  432, 1352,  927, 1165,  610,  859, 1294,\n         1300,  468,  862,  340,  745,  939,  910,  911,  408,  395,\n          875,  406,  665,  642,  507,  895,  464,  887,  499,  890,\n          463,  899,  167,  428,  524,  903,    6,  906,  572,  937,\n          991,  396,  914,  397,  693,  916,  594,  918,  919,  403,\n          409,  410, 1170,  602,  638,  931,  261,  596,  932,  394,\n          933,  941,  399,  401,  703,  479,  518,  512,  421, 1132,\n          597,  625,  662,  457,  486,  636,  648,  635,  493,  444,\n          426,  339,  975,  983,  500,  477,  997,  358, 1005,  753,\n         1178,  656,  502, 1013,  657, 1020, 1023,  545,  546,  491,\n         1035,  271, 1038,  503, 1048,   26,  683, 1053, 1054,  684,\n          658, 1076,  659,  685,  660, 1078,  476,  592, 1179,  475,\n         1093, 1099,  465, 1102, 1340,  466, 1106,  270, 1109,  284,\n          427,  445, 1115, 1116,   12, 1122,  713,  714,   25,  280,\n          523, 1150,  704,-32768,-32768,-32768,-32768,  462, 1177,  461,\n         1249, 1251,  573,  504, 1269,  301, 1272,  696,  519, 1277,\n          458, 1343,  459,  547,  487,  325,  548, 1387,  315,  343,\n          322,  564,  302,  344,  549,  488, 1349, 1357,  341,   34,\n         1377, 1388,  607,  630\n    );\n\n    protected array $ruleToNonTerminal = array(\n            0,    1,    3,    3,    2,    5,    5,    6,    6,    6,\n            6,    6,    6,    6,    6,    6,    6,    6,    6,    6,\n            6,    6,    6,    6,    6,    6,    6,    6,    6,    6,\n            6,    6,    6,    6,    6,    6,    6,    6,    6,    6,\n            6,    6,    6,    6,    6,    6,    6,    6,    6,    6,\n            6,    6,    6,    6,    6,    6,    6,    6,    6,    6,\n            6,    6,    6,    6,    6,    6,    6,    6,    6,    6,\n            6,    6,    6,    6,    6,    6,    6,    7,    7,    7,\n            7,    7,    7,    7,    7,    8,    8,    9,   10,   11,\n           11,   11,   12,   12,   13,   13,   14,   15,   15,   16,\n           16,   17,   17,   18,   18,   21,   21,   22,   23,   23,\n           24,   24,    4,    4,    4,    4,    4,    4,    4,    4,\n            4,    4,    4,    4,   29,   29,   30,   30,   32,   34,\n           34,   28,   36,   36,   33,   38,   38,   35,   35,   37,\n           37,   39,   39,   31,   40,   40,   41,   43,   44,   44,\n           45,   45,   46,   46,   48,   47,   47,   47,   47,   49,\n           49,   49,   49,   49,   49,   49,   49,   49,   49,   49,\n           49,   49,   49,   49,   49,   49,   49,   49,   49,   49,\n           49,   49,   49,   25,   25,   50,   69,   69,   72,   72,\n           71,   70,   70,   63,   75,   75,   76,   76,   77,   77,\n           78,   78,   79,   79,   80,   80,   80,   80,   26,   26,\n           27,   27,   27,   27,   27,   88,   88,   90,   90,   83,\n           83,   91,   91,   92,   92,   92,   84,   84,   87,   87,\n           85,   85,   93,   94,   94,   57,   57,   65,   65,   68,\n           68,   68,   67,   95,   95,   96,   58,   58,   58,   58,\n           97,   97,   98,   98,   99,   99,  100,  101,  101,  102,\n          102,  103,  103,   55,   55,   51,   51,  105,   53,   53,\n          106,   52,   52,   54,   54,   64,   64,   64,   64,   81,\n           81,  109,  109,  111,  111,  112,  112,  112,  112,  112,\n          112,  112,  112,  110,  110,  110,  115,  115,  115,  115,\n           89,   89,  118,  118,  118,  119,  119,  116,  116,  120,\n          120,  122,  122,  123,  123,  117,  124,  124,  121,  125,\n          125,  125,  125,  113,  113,   82,   82,   82,   20,   20,\n           20,  128,  128,  128,  128,  129,  129,  129,  127,  126,\n          126,  131,  131,  131,  130,  130,   60,  132,  132,  133,\n           61,  135,  135,  136,  136,  137,  137,   86,  138,  138,\n          138,  138,  138,  138,  138,  143,  143,  144,  144,  145,\n          145,  145,  145,  145,  146,  147,  147,  142,  142,  139,\n          139,  141,  141,  149,  149,  148,  148,  148,  148,  148,\n          148,  148,  148,  148,  148,  140,  150,  150,  152,  151,\n          151,  153,  153,  114,  154,  154,  156,  156,  156,  155,\n          155,   62,  104,  157,  157,   56,   56,   42,   42,   42,\n           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,\n           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,\n           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,\n           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,\n           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,\n           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,\n           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,\n           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,\n           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,\n           42,   42,   42,  164,  165,  165,  166,  158,  158,  163,\n          163,  167,  168,  168,  169,  170,  171,  171,  171,  171,\n           19,   19,   73,   73,   73,   73,  159,  159,  159,  159,\n          173,  173,  162,  162,  162,  160,  160,  179,  179,  179,\n          179,  179,  179,  179,  179,  179,  179,  180,  180,  180,\n          108,  182,  182,  182,  182,  161,  161,  161,  161,  161,\n          161,  161,  161,   59,   59,  176,  176,  176,  176,  176,\n          183,  183,  172,  172,  172,  172,  184,  184,  184,  184,\n          184,  184,   74,   74,   66,   66,   66,   66,  134,  134,\n          134,  134,  187,  186,  175,  175,  175,  175,  175,  175,\n          175,  174,  174,  174,  185,  185,  185,  185,  107,  181,\n          189,  189,  188,  188,  190,  190,  190,  190,  190,  190,\n          190,  190,  178,  178,  178,  178,  177,  192,  191,  191,\n          191,  191,  191,  191,  191,  191,  193,  193,  193,  193\n    );\n\n    protected array $ruleToLength = array(\n            1,    1,    2,    0,    1,    1,    1,    1,    1,    1,\n            1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n            1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n            1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n            1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n            1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n            1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n            1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n            1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n            1,    1,    1,    1,    1,    1,    1,    1,    1,    0,\n            1,    0,    1,    1,    2,    1,    3,    4,    1,    2,\n            0,    1,    1,    1,    1,    4,    3,    5,    4,    3,\n            4,    1,    3,    4,    1,    1,    8,    7,    2,    3,\n            1,    2,    3,    1,    2,    3,    1,    1,    3,    1,\n            3,    1,    2,    2,    3,    1,    3,    2,    3,    1,\n            3,    3,    2,    0,    1,    1,    1,    1,    1,    3,\n            7,   10,    5,    7,    9,    5,    3,    3,    3,    3,\n            3,    3,    1,    2,    5,    7,    9,    6,    5,    6,\n            3,    2,    1,    1,    1,    1,    0,    2,    1,    3,\n            8,    0,    4,    2,    1,    3,    0,    1,    0,    1,\n            0,    1,    3,    1,    1,    1,    1,    1,    8,    9,\n            7,    8,    7,    6,    8,    0,    2,    0,    2,    1,\n            2,    1,    2,    1,    1,    1,    0,    2,    0,    2,\n            0,    2,    2,    1,    3,    1,    4,    1,    4,    1,\n            1,    4,    2,    1,    3,    3,    3,    4,    4,    5,\n            0,    2,    4,    3,    1,    1,    7,    0,    2,    1,\n            3,    3,    4,    1,    4,    0,    2,    5,    0,    2,\n            6,    0,    2,    0,    3,    1,    2,    1,    1,    2,\n            0,    1,    3,    0,    2,    1,    1,    1,    1,    1,\n            1,    1,    1,    7,    9,    6,    1,    2,    1,    1,\n            1,    1,    1,    1,    1,    1,    3,    3,    3,    1,\n            3,    3,    3,    3,    3,    1,    3,    3,    1,    1,\n            2,    1,    1,    0,    1,    0,    2,    2,    2,    4,\n            3,    2,    4,    4,    3,    3,    1,    3,    1,    1,\n            3,    2,    2,    3,    1,    1,    2,    3,    1,    1,\n            2,    3,    1,    1,    3,    2,    0,    1,    5,    5,\n            6,   10,    3,    5,    1,    1,    3,    0,    2,    4,\n            5,    4,    4,    4,    3,    1,    1,    1,    1,    1,\n            1,    0,    1,    1,    2,    1,    1,    1,    1,    1,\n            1,    1,    1,    1,    1,    2,    1,    3,    1,    1,\n            3,    0,    2,    0,    5,    8,    1,    3,    3,    0,\n            2,    2,    2,    3,    1,    0,    1,    1,    3,    3,\n            3,    4,    4,    1,    1,    2,    2,    3,    3,    3,\n            3,    3,    3,    3,    3,    3,    3,    3,    3,    3,\n            2,    2,    2,    2,    3,    3,    3,    3,    3,    3,\n            3,    3,    3,    3,    3,    3,    3,    3,    3,    3,\n            3,    3,    2,    2,    2,    2,    3,    3,    3,    3,\n            3,    3,    3,    3,    3,    3,    3,    5,    4,    3,\n            4,    4,    2,    2,    4,    2,    2,    2,    2,    2,\n            2,    2,    2,    2,    2,    2,    2,    1,    3,    2,\n            1,    2,    4,    2,    2,    8,    9,    8,    9,    9,\n           10,    9,   10,    8,    3,    2,    2,    1,    1,    0,\n            4,    2,    1,    3,    2,    1,    2,    2,    2,    4,\n            1,    1,    1,    1,    1,    1,    1,    1,    3,    1,\n            1,    1,    0,    1,    1,    0,    1,    1,    1,    1,\n            1,    1,    1,    1,    1,    1,    1,    3,    5,    3,\n            3,    4,    1,    1,    3,    1,    1,    1,    1,    1,\n            3,    2,    3,    0,    1,    1,    3,    1,    1,    1,\n            1,    1,    1,    3,    1,    1,    1,    4,    4,    1,\n            4,    4,    0,    1,    1,    1,    3,    3,    1,    4,\n            2,    2,    1,    3,    1,    4,    4,    3,    3,    3,\n            3,    1,    3,    1,    1,    3,    1,    1,    4,    1,\n            1,    1,    3,    1,    1,    2,    1,    3,    4,    3,\n            2,    0,    2,    2,    1,    2,    1,    1,    1,    4,\n            3,    3,    3,    3,    6,    3,    1,    1,    2,    1\n    );\n\n    protected function initReduceCallbacks(): void {\n        $this->reduceCallbacks = [\n            0 => null,\n            1 => static function ($self, $stackPos) {\n                 $self->semValue = $self->handleNamespaces($self->semStack[$stackPos-(1-1)]);\n            },\n            2 => static function ($self, $stackPos) {\n                 if ($self->semStack[$stackPos-(2-2)] !== null) { $self->semStack[$stackPos-(2-1)][] = $self->semStack[$stackPos-(2-2)]; } $self->semValue = $self->semStack[$stackPos-(2-1)];;\n            },\n            3 => static function ($self, $stackPos) {\n                 $self->semValue = array();\n            },\n            4 => static function ($self, $stackPos) {\n                 $nop = $self->maybeCreateZeroLengthNop($self->tokenPos);;\n            if ($nop !== null) { $self->semStack[$stackPos-(1-1)][] = $nop; } $self->semValue = $self->semStack[$stackPos-(1-1)];\n            },\n            5 => null,\n            6 => null,\n            7 => null,\n            8 => null,\n            9 => null,\n            10 => null,\n            11 => null,\n            12 => null,\n            13 => null,\n            14 => null,\n            15 => null,\n            16 => null,\n            17 => null,\n            18 => null,\n            19 => null,\n            20 => null,\n            21 => null,\n            22 => null,\n            23 => null,\n            24 => null,\n            25 => null,\n            26 => null,\n            27 => null,\n            28 => null,\n            29 => null,\n            30 => null,\n            31 => null,\n            32 => null,\n            33 => null,\n            34 => null,\n            35 => null,\n            36 => null,\n            37 => null,\n            38 => null,\n            39 => null,\n            40 => null,\n            41 => null,\n            42 => null,\n            43 => null,\n            44 => null,\n            45 => null,\n            46 => null,\n            47 => null,\n            48 => null,\n            49 => null,\n            50 => null,\n            51 => null,\n            52 => null,\n            53 => null,\n            54 => null,\n            55 => null,\n            56 => null,\n            57 => null,\n            58 => null,\n            59 => null,\n            60 => null,\n            61 => null,\n            62 => null,\n            63 => null,\n            64 => null,\n            65 => null,\n            66 => null,\n            67 => null,\n            68 => null,\n            69 => null,\n            70 => null,\n            71 => null,\n            72 => null,\n            73 => null,\n            74 => null,\n            75 => null,\n            76 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(1-1)]; if ($self->semValue === \"<?=\") $self->emitError(new Error('Cannot use \"<?=\" as an identifier', $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])));\n            },\n            77 => null,\n            78 => null,\n            79 => null,\n            80 => null,\n            81 => null,\n            82 => null,\n            83 => null,\n            84 => null,\n            85 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\Identifier($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            86 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\Identifier($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            87 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\Identifier($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            88 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\Identifier($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            89 => static function ($self, $stackPos) {\n                 $self->semValue = new Name($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            90 => static function ($self, $stackPos) {\n                 $self->semValue = new Name($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            91 => static function ($self, $stackPos) {\n                 $self->semValue = new Name($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            92 => static function ($self, $stackPos) {\n                 $self->semValue = new Name($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            93 => static function ($self, $stackPos) {\n                 $self->semValue = new Name($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            94 => null,\n            95 => static function ($self, $stackPos) {\n                 $self->semValue = new Name(substr($self->semStack[$stackPos-(1-1)], 1), $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            96 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Variable(substr($self->semStack[$stackPos-(1-1)], 1), $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            97 => static function ($self, $stackPos) {\n                 /* nothing */\n            },\n            98 => static function ($self, $stackPos) {\n                 /* nothing */\n            },\n            99 => static function ($self, $stackPos) {\n                 /* nothing */\n            },\n            100 => static function ($self, $stackPos) {\n                 $self->emitError(new Error('A trailing comma is not allowed here', $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])));\n            },\n            101 => null,\n            102 => null,\n            103 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\Attribute($self->semStack[$stackPos-(1-1)], [], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            104 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\Attribute($self->semStack[$stackPos-(2-1)], $self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            105 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(1-1)]);\n            },\n            106 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)];\n            },\n            107 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\AttributeGroup($self->semStack[$stackPos-(4-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]));\n            },\n            108 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(1-1)]);\n            },\n            109 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(2-1)][] = $self->semStack[$stackPos-(2-2)]; $self->semValue = $self->semStack[$stackPos-(2-1)];\n            },\n            110 => static function ($self, $stackPos) {\n                 $self->semValue = [];\n            },\n            111 => null,\n            112 => null,\n            113 => null,\n            114 => null,\n            115 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\HaltCompiler($self->handleHaltCompiler(), $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]));\n            },\n            116 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Namespace_($self->semStack[$stackPos-(3-2)], null, $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            $self->semValue->setAttribute('kind', Stmt\\Namespace_::KIND_SEMICOLON);\n            $self->checkNamespace($self->semValue);\n            },\n            117 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Namespace_($self->semStack[$stackPos-(5-2)], $self->semStack[$stackPos-(5-4)], $self->getAttributes($self->tokenStartStack[$stackPos-(5-1)], $self->tokenEndStack[$stackPos]));\n            $self->semValue->setAttribute('kind', Stmt\\Namespace_::KIND_BRACED);\n            $self->checkNamespace($self->semValue);\n            },\n            118 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Namespace_(null, $self->semStack[$stackPos-(4-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]));\n            $self->semValue->setAttribute('kind', Stmt\\Namespace_::KIND_BRACED);\n            $self->checkNamespace($self->semValue);\n            },\n            119 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Use_($self->semStack[$stackPos-(3-2)], Stmt\\Use_::TYPE_NORMAL, $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            120 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Use_($self->semStack[$stackPos-(4-3)], $self->semStack[$stackPos-(4-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]));\n            },\n            121 => null,\n            122 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Const_($self->semStack[$stackPos-(3-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]), []);\n            },\n            123 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Const_($self->semStack[$stackPos-(4-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]), $self->semStack[$stackPos-(4-1)]);\n            $self->checkConstantAttributes($self->semValue);\n            },\n            124 => static function ($self, $stackPos) {\n                 $self->semValue = Stmt\\Use_::TYPE_FUNCTION;\n            },\n            125 => static function ($self, $stackPos) {\n                 $self->semValue = Stmt\\Use_::TYPE_CONSTANT;\n            },\n            126 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\GroupUse($self->semStack[$stackPos-(8-3)], $self->semStack[$stackPos-(8-6)], $self->semStack[$stackPos-(8-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(8-1)], $self->tokenEndStack[$stackPos]));\n            },\n            127 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\GroupUse($self->semStack[$stackPos-(7-2)], $self->semStack[$stackPos-(7-5)], Stmt\\Use_::TYPE_UNKNOWN, $self->getAttributes($self->tokenStartStack[$stackPos-(7-1)], $self->tokenEndStack[$stackPos]));\n            },\n            128 => null,\n            129 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)];\n            },\n            130 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(1-1)]);\n            },\n            131 => null,\n            132 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)];\n            },\n            133 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(1-1)]);\n            },\n            134 => null,\n            135 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)];\n            },\n            136 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(1-1)]);\n            },\n            137 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\UseItem($self->semStack[$stackPos-(1-1)], null, Stmt\\Use_::TYPE_UNKNOWN, $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); $self->checkUseUse($self->semValue, $stackPos-(1-1));\n            },\n            138 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\UseItem($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], Stmt\\Use_::TYPE_UNKNOWN, $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); $self->checkUseUse($self->semValue, $stackPos-(3-3));\n            },\n            139 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\UseItem($self->semStack[$stackPos-(1-1)], null, Stmt\\Use_::TYPE_UNKNOWN, $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); $self->checkUseUse($self->semValue, $stackPos-(1-1));\n            },\n            140 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\UseItem($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], Stmt\\Use_::TYPE_UNKNOWN, $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); $self->checkUseUse($self->semValue, $stackPos-(3-3));\n            },\n            141 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(1-1)]; $self->semValue->type = Stmt\\Use_::TYPE_NORMAL;\n            },\n            142 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(2-2)]; $self->semValue->type = $self->semStack[$stackPos-(2-1)];\n            },\n            143 => null,\n            144 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)];\n            },\n            145 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(1-1)]);\n            },\n            146 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\Const_($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            147 => null,\n            148 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)];\n            },\n            149 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(1-1)]);\n            },\n            150 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\Const_(new Node\\Identifier($self->semStack[$stackPos-(3-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)],  $self->tokenEndStack[$stackPos-(3-1)])), $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            151 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\Const_(new Node\\Identifier($self->semStack[$stackPos-(3-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)],  $self->tokenEndStack[$stackPos-(3-1)])), $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            152 => static function ($self, $stackPos) {\n                 if ($self->semStack[$stackPos-(2-2)] !== null) { $self->semStack[$stackPos-(2-1)][] = $self->semStack[$stackPos-(2-2)]; } $self->semValue = $self->semStack[$stackPos-(2-1)];;\n            },\n            153 => static function ($self, $stackPos) {\n                 $self->semValue = array();\n            },\n            154 => static function ($self, $stackPos) {\n                 $nop = $self->maybeCreateZeroLengthNop($self->tokenPos);;\n            if ($nop !== null) { $self->semStack[$stackPos-(1-1)][] = $nop; } $self->semValue = $self->semStack[$stackPos-(1-1)];\n            },\n            155 => null,\n            156 => null,\n            157 => null,\n            158 => static function ($self, $stackPos) {\n                 throw new Error('__HALT_COMPILER() can only be used from the outermost scope', $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            159 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Block($self->semStack[$stackPos-(3-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            160 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\If_($self->semStack[$stackPos-(7-3)], ['stmts' => $self->semStack[$stackPos-(7-5)], 'elseifs' => $self->semStack[$stackPos-(7-6)], 'else' => $self->semStack[$stackPos-(7-7)]], $self->getAttributes($self->tokenStartStack[$stackPos-(7-1)], $self->tokenEndStack[$stackPos]));\n            },\n            161 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\If_($self->semStack[$stackPos-(10-3)], ['stmts' => $self->semStack[$stackPos-(10-6)], 'elseifs' => $self->semStack[$stackPos-(10-7)], 'else' => $self->semStack[$stackPos-(10-8)]], $self->getAttributes($self->tokenStartStack[$stackPos-(10-1)], $self->tokenEndStack[$stackPos]));\n            },\n            162 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\While_($self->semStack[$stackPos-(5-3)], $self->semStack[$stackPos-(5-5)], $self->getAttributes($self->tokenStartStack[$stackPos-(5-1)], $self->tokenEndStack[$stackPos]));\n            },\n            163 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Do_($self->semStack[$stackPos-(7-5)], $self->semStack[$stackPos-(7-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(7-1)], $self->tokenEndStack[$stackPos]));\n            },\n            164 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\For_(['init' => $self->semStack[$stackPos-(9-3)], 'cond' => $self->semStack[$stackPos-(9-5)], 'loop' => $self->semStack[$stackPos-(9-7)], 'stmts' => $self->semStack[$stackPos-(9-9)]], $self->getAttributes($self->tokenStartStack[$stackPos-(9-1)], $self->tokenEndStack[$stackPos]));\n            },\n            165 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Switch_($self->semStack[$stackPos-(5-3)], $self->semStack[$stackPos-(5-5)], $self->getAttributes($self->tokenStartStack[$stackPos-(5-1)], $self->tokenEndStack[$stackPos]));\n            },\n            166 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Break_($self->semStack[$stackPos-(3-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            167 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Continue_($self->semStack[$stackPos-(3-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            168 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Return_($self->semStack[$stackPos-(3-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            169 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Global_($self->semStack[$stackPos-(3-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            170 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Static_($self->semStack[$stackPos-(3-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            171 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Echo_($self->semStack[$stackPos-(3-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            172 => static function ($self, $stackPos) {\n\n        $self->semValue = new Stmt\\InlineHTML($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n        $self->semValue->setAttribute('hasLeadingNewline', $self->inlineHtmlHasLeadingNewline($stackPos-(1-1)));\n\n            },\n            173 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Expression($self->semStack[$stackPos-(2-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            174 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Unset_($self->semStack[$stackPos-(5-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(5-1)], $self->tokenEndStack[$stackPos]));\n            },\n            175 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Foreach_($self->semStack[$stackPos-(7-3)], $self->semStack[$stackPos-(7-5)][0], ['keyVar' => null, 'byRef' => $self->semStack[$stackPos-(7-5)][1], 'stmts' => $self->semStack[$stackPos-(7-7)]], $self->getAttributes($self->tokenStartStack[$stackPos-(7-1)], $self->tokenEndStack[$stackPos]));\n            },\n            176 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Foreach_($self->semStack[$stackPos-(9-3)], $self->semStack[$stackPos-(9-7)][0], ['keyVar' => $self->semStack[$stackPos-(9-5)], 'byRef' => $self->semStack[$stackPos-(9-7)][1], 'stmts' => $self->semStack[$stackPos-(9-9)]], $self->getAttributes($self->tokenStartStack[$stackPos-(9-1)], $self->tokenEndStack[$stackPos]));\n            },\n            177 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Foreach_($self->semStack[$stackPos-(6-3)], new Expr\\Error($self->getAttributes($self->tokenStartStack[$stackPos-(6-4)],  $self->tokenEndStack[$stackPos-(6-4)])), ['stmts' => $self->semStack[$stackPos-(6-6)]], $self->getAttributes($self->tokenStartStack[$stackPos-(6-1)], $self->tokenEndStack[$stackPos]));\n            },\n            178 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Declare_($self->semStack[$stackPos-(5-3)], $self->semStack[$stackPos-(5-5)], $self->getAttributes($self->tokenStartStack[$stackPos-(5-1)], $self->tokenEndStack[$stackPos]));\n            },\n            179 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\TryCatch($self->semStack[$stackPos-(6-3)], $self->semStack[$stackPos-(6-5)], $self->semStack[$stackPos-(6-6)], $self->getAttributes($self->tokenStartStack[$stackPos-(6-1)], $self->tokenEndStack[$stackPos])); $self->checkTryCatch($self->semValue);\n            },\n            180 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Goto_($self->semStack[$stackPos-(3-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            181 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Label($self->semStack[$stackPos-(2-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            182 => static function ($self, $stackPos) {\n                 $self->semValue = null; /* means: no statement */\n            },\n            183 => null,\n            184 => static function ($self, $stackPos) {\n                 $self->semValue = $self->maybeCreateNop($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]);\n            },\n            185 => static function ($self, $stackPos) {\n                 if ($self->semStack[$stackPos-(1-1)] instanceof Stmt\\Block) { $self->semValue = $self->semStack[$stackPos-(1-1)]->stmts; } else if ($self->semStack[$stackPos-(1-1)] === null) { $self->semValue = []; } else { $self->semValue = [$self->semStack[$stackPos-(1-1)]]; };\n            },\n            186 => static function ($self, $stackPos) {\n                 $self->semValue = array();\n            },\n            187 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(2-1)][] = $self->semStack[$stackPos-(2-2)]; $self->semValue = $self->semStack[$stackPos-(2-1)];\n            },\n            188 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(1-1)]);\n            },\n            189 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)];\n            },\n            190 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Catch_($self->semStack[$stackPos-(8-3)], $self->semStack[$stackPos-(8-4)], $self->semStack[$stackPos-(8-7)], $self->getAttributes($self->tokenStartStack[$stackPos-(8-1)], $self->tokenEndStack[$stackPos]));\n            },\n            191 => static function ($self, $stackPos) {\n                 $self->semValue = null;\n            },\n            192 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Finally_($self->semStack[$stackPos-(4-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]));\n            },\n            193 => null,\n            194 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(1-1)]);\n            },\n            195 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)];\n            },\n            196 => static function ($self, $stackPos) {\n                 $self->semValue = false;\n            },\n            197 => static function ($self, $stackPos) {\n                 $self->semValue = true;\n            },\n            198 => static function ($self, $stackPos) {\n                 $self->semValue = false;\n            },\n            199 => static function ($self, $stackPos) {\n                 $self->semValue = true;\n            },\n            200 => static function ($self, $stackPos) {\n                 $self->semValue = false;\n            },\n            201 => static function ($self, $stackPos) {\n                 $self->semValue = true;\n            },\n            202 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(3-2)];\n            },\n            203 => static function ($self, $stackPos) {\n                 $self->semValue = [];\n            },\n            204 => null,\n            205 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\Identifier($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            206 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\Identifier($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            207 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\Identifier($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            208 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Function_($self->semStack[$stackPos-(8-3)], ['byRef' => $self->semStack[$stackPos-(8-2)], 'params' => $self->semStack[$stackPos-(8-5)], 'returnType' => $self->semStack[$stackPos-(8-7)], 'stmts' => $self->semStack[$stackPos-(8-8)], 'attrGroups' => []], $self->getAttributes($self->tokenStartStack[$stackPos-(8-1)], $self->tokenEndStack[$stackPos]));\n            },\n            209 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Function_($self->semStack[$stackPos-(9-4)], ['byRef' => $self->semStack[$stackPos-(9-3)], 'params' => $self->semStack[$stackPos-(9-6)], 'returnType' => $self->semStack[$stackPos-(9-8)], 'stmts' => $self->semStack[$stackPos-(9-9)], 'attrGroups' => $self->semStack[$stackPos-(9-1)]], $self->getAttributes($self->tokenStartStack[$stackPos-(9-1)], $self->tokenEndStack[$stackPos]));\n            },\n            210 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Class_($self->semStack[$stackPos-(7-2)], ['type' => $self->semStack[$stackPos-(7-1)], 'extends' => $self->semStack[$stackPos-(7-3)], 'implements' => $self->semStack[$stackPos-(7-4)], 'stmts' => $self->semStack[$stackPos-(7-6)], 'attrGroups' => []], $self->getAttributes($self->tokenStartStack[$stackPos-(7-1)], $self->tokenEndStack[$stackPos]));\n            $self->checkClass($self->semValue, $stackPos-(7-2));\n            },\n            211 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Class_($self->semStack[$stackPos-(8-3)], ['type' => $self->semStack[$stackPos-(8-2)], 'extends' => $self->semStack[$stackPos-(8-4)], 'implements' => $self->semStack[$stackPos-(8-5)], 'stmts' => $self->semStack[$stackPos-(8-7)], 'attrGroups' => $self->semStack[$stackPos-(8-1)]], $self->getAttributes($self->tokenStartStack[$stackPos-(8-1)], $self->tokenEndStack[$stackPos]));\n            $self->checkClass($self->semValue, $stackPos-(8-3));\n            },\n            212 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Interface_($self->semStack[$stackPos-(7-3)], ['extends' => $self->semStack[$stackPos-(7-4)], 'stmts' => $self->semStack[$stackPos-(7-6)], 'attrGroups' => $self->semStack[$stackPos-(7-1)]], $self->getAttributes($self->tokenStartStack[$stackPos-(7-1)], $self->tokenEndStack[$stackPos]));\n            $self->checkInterface($self->semValue, $stackPos-(7-3));\n            },\n            213 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Trait_($self->semStack[$stackPos-(6-3)], ['stmts' => $self->semStack[$stackPos-(6-5)], 'attrGroups' => $self->semStack[$stackPos-(6-1)]], $self->getAttributes($self->tokenStartStack[$stackPos-(6-1)], $self->tokenEndStack[$stackPos]));\n            },\n            214 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Enum_($self->semStack[$stackPos-(8-3)], ['scalarType' => $self->semStack[$stackPos-(8-4)], 'implements' => $self->semStack[$stackPos-(8-5)], 'stmts' => $self->semStack[$stackPos-(8-7)], 'attrGroups' => $self->semStack[$stackPos-(8-1)]], $self->getAttributes($self->tokenStartStack[$stackPos-(8-1)], $self->tokenEndStack[$stackPos]));\n            $self->checkEnum($self->semValue, $stackPos-(8-3));\n            },\n            215 => static function ($self, $stackPos) {\n                 $self->semValue = null;\n            },\n            216 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(2-2)];\n            },\n            217 => static function ($self, $stackPos) {\n                 $self->semValue = null;\n            },\n            218 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(2-2)];\n            },\n            219 => static function ($self, $stackPos) {\n                 $self->semValue = 0;\n            },\n            220 => null,\n            221 => null,\n            222 => static function ($self, $stackPos) {\n                 $self->checkClassModifier($self->semStack[$stackPos-(2-1)], $self->semStack[$stackPos-(2-2)], $stackPos-(2-2)); $self->semValue = $self->semStack[$stackPos-(2-1)] | $self->semStack[$stackPos-(2-2)];\n            },\n            223 => static function ($self, $stackPos) {\n                 $self->semValue = Modifiers::ABSTRACT;\n            },\n            224 => static function ($self, $stackPos) {\n                 $self->semValue = Modifiers::FINAL;\n            },\n            225 => static function ($self, $stackPos) {\n                 $self->semValue = Modifiers::READONLY;\n            },\n            226 => static function ($self, $stackPos) {\n                 $self->semValue = null;\n            },\n            227 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(2-2)];\n            },\n            228 => static function ($self, $stackPos) {\n                 $self->semValue = array();\n            },\n            229 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(2-2)];\n            },\n            230 => static function ($self, $stackPos) {\n                 $self->semValue = array();\n            },\n            231 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(2-2)];\n            },\n            232 => null,\n            233 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(1-1)]);\n            },\n            234 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)];\n            },\n            235 => null,\n            236 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(4-2)];\n            },\n            237 => null,\n            238 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(4-2)];\n            },\n            239 => static function ($self, $stackPos) {\n                 if ($self->semStack[$stackPos-(1-1)] instanceof Stmt\\Block) { $self->semValue = $self->semStack[$stackPos-(1-1)]->stmts; } else if ($self->semStack[$stackPos-(1-1)] === null) { $self->semValue = []; } else { $self->semValue = [$self->semStack[$stackPos-(1-1)]]; };\n            },\n            240 => static function ($self, $stackPos) {\n                 $self->semValue = null;\n            },\n            241 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(4-2)];\n            },\n            242 => null,\n            243 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(1-1)]);\n            },\n            244 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)];\n            },\n            245 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\DeclareItem($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            246 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(3-2)];\n            },\n            247 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(4-3)];\n            },\n            248 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(4-2)];\n            },\n            249 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(5-3)];\n            },\n            250 => static function ($self, $stackPos) {\n                 $self->semValue = array();\n            },\n            251 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(2-1)][] = $self->semStack[$stackPos-(2-2)]; $self->semValue = $self->semStack[$stackPos-(2-1)];\n            },\n            252 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Case_($self->semStack[$stackPos-(4-2)], $self->semStack[$stackPos-(4-4)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]));\n            },\n            253 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Case_(null, $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            254 => null,\n            255 => null,\n            256 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Match_($self->semStack[$stackPos-(7-3)], $self->semStack[$stackPos-(7-6)], $self->getAttributes($self->tokenStartStack[$stackPos-(7-1)], $self->tokenEndStack[$stackPos]));\n            },\n            257 => static function ($self, $stackPos) {\n                 $self->semValue = [];\n            },\n            258 => null,\n            259 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(1-1)]);\n            },\n            260 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)];\n            },\n            261 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\MatchArm($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            262 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\MatchArm(null, $self->semStack[$stackPos-(4-4)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]));\n            },\n            263 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(1-1)];\n            },\n            264 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(4-2)];\n            },\n            265 => static function ($self, $stackPos) {\n                 $self->semValue = array();\n            },\n            266 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(2-1)][] = $self->semStack[$stackPos-(2-2)]; $self->semValue = $self->semStack[$stackPos-(2-1)];\n            },\n            267 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\ElseIf_($self->semStack[$stackPos-(5-3)], $self->semStack[$stackPos-(5-5)], $self->getAttributes($self->tokenStartStack[$stackPos-(5-1)], $self->tokenEndStack[$stackPos]));\n            },\n            268 => static function ($self, $stackPos) {\n                 $self->semValue = array();\n            },\n            269 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(2-1)][] = $self->semStack[$stackPos-(2-2)]; $self->semValue = $self->semStack[$stackPos-(2-1)];\n            },\n            270 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\ElseIf_($self->semStack[$stackPos-(6-3)], $self->semStack[$stackPos-(6-6)], $self->getAttributes($self->tokenStartStack[$stackPos-(6-1)], $self->tokenEndStack[$stackPos])); $self->fixupAlternativeElse($self->semValue);\n            },\n            271 => static function ($self, $stackPos) {\n                 $self->semValue = null;\n            },\n            272 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Else_($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            273 => static function ($self, $stackPos) {\n                 $self->semValue = null;\n            },\n            274 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Else_($self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); $self->fixupAlternativeElse($self->semValue);\n            },\n            275 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(1-1)], false);\n            },\n            276 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(2-2)], true);\n            },\n            277 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(1-1)], false);\n            },\n            278 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->fixupArrayDestructuring($self->semStack[$stackPos-(1-1)]), false);\n            },\n            279 => null,\n            280 => static function ($self, $stackPos) {\n                 $self->semValue = array();\n            },\n            281 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(1-1)]);\n            },\n            282 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)];\n            },\n            283 => static function ($self, $stackPos) {\n                 $self->semValue = 0;\n            },\n            284 => static function ($self, $stackPos) {\n                 $self->checkModifier($self->semStack[$stackPos-(2-1)], $self->semStack[$stackPos-(2-2)], $stackPos-(2-2)); $self->semValue = $self->semStack[$stackPos-(2-1)] | $self->semStack[$stackPos-(2-2)];\n            },\n            285 => static function ($self, $stackPos) {\n                 $self->semValue = Modifiers::PUBLIC;\n            },\n            286 => static function ($self, $stackPos) {\n                 $self->semValue = Modifiers::PROTECTED;\n            },\n            287 => static function ($self, $stackPos) {\n                 $self->semValue = Modifiers::PRIVATE;\n            },\n            288 => static function ($self, $stackPos) {\n                 $self->semValue = Modifiers::PUBLIC_SET;\n            },\n            289 => static function ($self, $stackPos) {\n                 $self->semValue = Modifiers::PROTECTED_SET;\n            },\n            290 => static function ($self, $stackPos) {\n                 $self->semValue = Modifiers::PRIVATE_SET;\n            },\n            291 => static function ($self, $stackPos) {\n                 $self->semValue = Modifiers::READONLY;\n            },\n            292 => static function ($self, $stackPos) {\n                 $self->semValue = Modifiers::FINAL;\n            },\n            293 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\Param($self->semStack[$stackPos-(7-6)], null, $self->semStack[$stackPos-(7-3)], $self->semStack[$stackPos-(7-4)], $self->semStack[$stackPos-(7-5)], $self->getAttributes($self->tokenStartStack[$stackPos-(7-1)], $self->tokenEndStack[$stackPos]), $self->semStack[$stackPos-(7-2)], $self->semStack[$stackPos-(7-1)], $self->semStack[$stackPos-(7-7)]);\n            $self->checkParam($self->semValue);\n            $self->addPropertyNameToHooks($self->semValue);\n            },\n            294 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\Param($self->semStack[$stackPos-(9-6)], $self->semStack[$stackPos-(9-8)], $self->semStack[$stackPos-(9-3)], $self->semStack[$stackPos-(9-4)], $self->semStack[$stackPos-(9-5)], $self->getAttributes($self->tokenStartStack[$stackPos-(9-1)], $self->tokenEndStack[$stackPos]), $self->semStack[$stackPos-(9-2)], $self->semStack[$stackPos-(9-1)], $self->semStack[$stackPos-(9-9)]);\n            $self->checkParam($self->semValue);\n            $self->addPropertyNameToHooks($self->semValue);\n            },\n            295 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\Param(new Expr\\Error($self->getAttributes($self->tokenStartStack[$stackPos-(6-1)], $self->tokenEndStack[$stackPos])), null, $self->semStack[$stackPos-(6-3)], $self->semStack[$stackPos-(6-4)], $self->semStack[$stackPos-(6-5)], $self->getAttributes($self->tokenStartStack[$stackPos-(6-1)], $self->tokenEndStack[$stackPos]), $self->semStack[$stackPos-(6-2)], $self->semStack[$stackPos-(6-1)]);\n            },\n            296 => null,\n            297 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\NullableType($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            298 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\UnionType($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            299 => null,\n            300 => null,\n            301 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\Name('static', $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            302 => static function ($self, $stackPos) {\n                 $self->semValue = $self->handleBuiltinTypes($self->semStack[$stackPos-(1-1)]);\n            },\n            303 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\Identifier('array', $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            304 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\Identifier('callable', $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            305 => null,\n            306 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(3-2)];\n            },\n            307 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)]);\n            },\n            308 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)];\n            },\n            309 => null,\n            310 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(3-2)];\n            },\n            311 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)]);\n            },\n            312 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)];\n            },\n            313 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)]);\n            },\n            314 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)];\n            },\n            315 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\IntersectionType($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            316 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)]);\n            },\n            317 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)];\n            },\n            318 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\IntersectionType($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            319 => null,\n            320 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\NullableType($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            321 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\UnionType($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            322 => null,\n            323 => static function ($self, $stackPos) {\n                 $self->semValue = null;\n            },\n            324 => null,\n            325 => static function ($self, $stackPos) {\n                 $self->semValue = null;\n            },\n            326 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(2-2)];\n            },\n            327 => static function ($self, $stackPos) {\n                 $self->semValue = null;\n            },\n            328 => static function ($self, $stackPos) {\n                 $self->semValue = array();\n            },\n            329 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(4-2)];\n            },\n            330 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(3-2)]);\n            },\n            331 => static function ($self, $stackPos) {\n                 $self->semValue = array();\n            },\n            332 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(4-2)];\n            },\n            333 => static function ($self, $stackPos) {\n                 $self->semValue = array(new Node\\Arg($self->semStack[$stackPos-(4-2)], false, false, $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos])));\n            },\n            334 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(3-2)]);\n            },\n            335 => static function ($self, $stackPos) {\n                 $self->semValue = array(new Node\\Arg($self->semStack[$stackPos-(3-1)], false, false, $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)],  $self->tokenEndStack[$stackPos-(3-1)])), $self->semStack[$stackPos-(3-3)]);\n            },\n            336 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(1-1)]);\n            },\n            337 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)];\n            },\n            338 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\VariadicPlaceholder($self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            339 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(1-1)]);\n            },\n            340 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)];\n            },\n            341 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\Arg($self->semStack[$stackPos-(2-2)], true, false, $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            342 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\Arg($self->semStack[$stackPos-(2-2)], false, true, $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            343 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\Arg($self->semStack[$stackPos-(3-3)], false, false, $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]), $self->semStack[$stackPos-(3-1)]);\n            },\n            344 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\Arg($self->semStack[$stackPos-(1-1)], false, false, $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            345 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(1-1)];\n            },\n            346 => null,\n            347 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)];\n            },\n            348 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(1-1)]);\n            },\n            349 => null,\n            350 => null,\n            351 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)];\n            },\n            352 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(1-1)]);\n            },\n            353 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\StaticVar($self->semStack[$stackPos-(1-1)], null, $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            354 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\StaticVar($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            355 => static function ($self, $stackPos) {\n                 if ($self->semStack[$stackPos-(2-2)] !== null) { $self->semStack[$stackPos-(2-1)][] = $self->semStack[$stackPos-(2-2)]; $self->semValue = $self->semStack[$stackPos-(2-1)]; } else { $self->semValue = $self->semStack[$stackPos-(2-1)]; }\n            },\n            356 => static function ($self, $stackPos) {\n                 $self->semValue = array();\n            },\n            357 => static function ($self, $stackPos) {\n                 $nop = $self->maybeCreateZeroLengthNop($self->tokenPos);;\n            if ($nop !== null) { $self->semStack[$stackPos-(1-1)][] = $nop; } $self->semValue = $self->semStack[$stackPos-(1-1)];\n            },\n            358 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Property($self->semStack[$stackPos-(5-2)], $self->semStack[$stackPos-(5-4)], $self->getAttributes($self->tokenStartStack[$stackPos-(5-1)], $self->tokenEndStack[$stackPos]), $self->semStack[$stackPos-(5-3)], $self->semStack[$stackPos-(5-1)]);\n            },\n            359 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\ClassConst($self->semStack[$stackPos-(5-4)], $self->semStack[$stackPos-(5-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(5-1)], $self->tokenEndStack[$stackPos]), $self->semStack[$stackPos-(5-1)]);\n            $self->checkClassConst($self->semValue, $stackPos-(5-2));\n            },\n            360 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\ClassConst($self->semStack[$stackPos-(6-5)], $self->semStack[$stackPos-(6-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(6-1)], $self->tokenEndStack[$stackPos]), $self->semStack[$stackPos-(6-1)], $self->semStack[$stackPos-(6-4)]);\n            $self->checkClassConst($self->semValue, $stackPos-(6-2));\n            },\n            361 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\ClassMethod($self->semStack[$stackPos-(10-5)], ['type' => $self->semStack[$stackPos-(10-2)], 'byRef' => $self->semStack[$stackPos-(10-4)], 'params' => $self->semStack[$stackPos-(10-7)], 'returnType' => $self->semStack[$stackPos-(10-9)], 'stmts' => $self->semStack[$stackPos-(10-10)], 'attrGroups' => $self->semStack[$stackPos-(10-1)]], $self->getAttributes($self->tokenStartStack[$stackPos-(10-1)], $self->tokenEndStack[$stackPos]));\n            $self->checkClassMethod($self->semValue, $stackPos-(10-2));\n            },\n            362 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\TraitUse($self->semStack[$stackPos-(3-2)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            363 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\EnumCase($self->semStack[$stackPos-(5-3)], $self->semStack[$stackPos-(5-4)], $self->semStack[$stackPos-(5-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(5-1)], $self->tokenEndStack[$stackPos]));\n            },\n            364 => static function ($self, $stackPos) {\n                 $self->semValue = null; /* will be skipped */\n            },\n            365 => static function ($self, $stackPos) {\n                 $self->semValue = array();\n            },\n            366 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(3-2)];\n            },\n            367 => static function ($self, $stackPos) {\n                 $self->semValue = array();\n            },\n            368 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(2-1)][] = $self->semStack[$stackPos-(2-2)]; $self->semValue = $self->semStack[$stackPos-(2-1)];\n            },\n            369 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\TraitUseAdaptation\\Precedence($self->semStack[$stackPos-(4-1)][0], $self->semStack[$stackPos-(4-1)][1], $self->semStack[$stackPos-(4-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]));\n            },\n            370 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\TraitUseAdaptation\\Alias($self->semStack[$stackPos-(5-1)][0], $self->semStack[$stackPos-(5-1)][1], $self->semStack[$stackPos-(5-3)], $self->semStack[$stackPos-(5-4)], $self->getAttributes($self->tokenStartStack[$stackPos-(5-1)], $self->tokenEndStack[$stackPos]));\n            },\n            371 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\TraitUseAdaptation\\Alias($self->semStack[$stackPos-(4-1)][0], $self->semStack[$stackPos-(4-1)][1], $self->semStack[$stackPos-(4-3)], null, $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]));\n            },\n            372 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\TraitUseAdaptation\\Alias($self->semStack[$stackPos-(4-1)][0], $self->semStack[$stackPos-(4-1)][1], null, $self->semStack[$stackPos-(4-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]));\n            },\n            373 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\TraitUseAdaptation\\Alias($self->semStack[$stackPos-(4-1)][0], $self->semStack[$stackPos-(4-1)][1], null, $self->semStack[$stackPos-(4-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]));\n            },\n            374 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)]);\n            },\n            375 => null,\n            376 => static function ($self, $stackPos) {\n                 $self->semValue = array(null, $self->semStack[$stackPos-(1-1)]);\n            },\n            377 => static function ($self, $stackPos) {\n                 $self->semValue = null;\n            },\n            378 => null,\n            379 => null,\n            380 => static function ($self, $stackPos) {\n                 $self->semValue = 0;\n            },\n            381 => static function ($self, $stackPos) {\n                 $self->semValue = 0;\n            },\n            382 => null,\n            383 => null,\n            384 => static function ($self, $stackPos) {\n                 $self->checkModifier($self->semStack[$stackPos-(2-1)], $self->semStack[$stackPos-(2-2)], $stackPos-(2-2)); $self->semValue = $self->semStack[$stackPos-(2-1)] | $self->semStack[$stackPos-(2-2)];\n            },\n            385 => static function ($self, $stackPos) {\n                 $self->semValue = Modifiers::PUBLIC;\n            },\n            386 => static function ($self, $stackPos) {\n                 $self->semValue = Modifiers::PROTECTED;\n            },\n            387 => static function ($self, $stackPos) {\n                 $self->semValue = Modifiers::PRIVATE;\n            },\n            388 => static function ($self, $stackPos) {\n                 $self->semValue = Modifiers::PUBLIC_SET;\n            },\n            389 => static function ($self, $stackPos) {\n                 $self->semValue = Modifiers::PROTECTED_SET;\n            },\n            390 => static function ($self, $stackPos) {\n                 $self->semValue = Modifiers::PRIVATE_SET;\n            },\n            391 => static function ($self, $stackPos) {\n                 $self->semValue = Modifiers::STATIC;\n            },\n            392 => static function ($self, $stackPos) {\n                 $self->semValue = Modifiers::ABSTRACT;\n            },\n            393 => static function ($self, $stackPos) {\n                 $self->semValue = Modifiers::FINAL;\n            },\n            394 => static function ($self, $stackPos) {\n                 $self->semValue = Modifiers::READONLY;\n            },\n            395 => null,\n            396 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(1-1)]);\n            },\n            397 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)];\n            },\n            398 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\VarLikeIdentifier(substr($self->semStack[$stackPos-(1-1)], 1), $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            399 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\PropertyItem($self->semStack[$stackPos-(1-1)], null, $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            400 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\PropertyItem($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            401 => static function ($self, $stackPos) {\n                 $self->semValue = [];\n            },\n            402 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(2-1)][] = $self->semStack[$stackPos-(2-2)]; $self->semValue = $self->semStack[$stackPos-(2-1)];\n            },\n            403 => static function ($self, $stackPos) {\n                 $self->semValue = [];\n            },\n            404 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\PropertyHook($self->semStack[$stackPos-(5-4)], $self->semStack[$stackPos-(5-5)], ['flags' => $self->semStack[$stackPos-(5-2)], 'byRef' => $self->semStack[$stackPos-(5-3)], 'params' => [], 'attrGroups' => $self->semStack[$stackPos-(5-1)]], $self->getAttributes($self->tokenStartStack[$stackPos-(5-1)], $self->tokenEndStack[$stackPos]));\n            $self->checkPropertyHook($self->semValue, null);\n            },\n            405 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\PropertyHook($self->semStack[$stackPos-(8-4)], $self->semStack[$stackPos-(8-8)], ['flags' => $self->semStack[$stackPos-(8-2)], 'byRef' => $self->semStack[$stackPos-(8-3)], 'params' => $self->semStack[$stackPos-(8-6)], 'attrGroups' => $self->semStack[$stackPos-(8-1)]], $self->getAttributes($self->tokenStartStack[$stackPos-(8-1)], $self->tokenEndStack[$stackPos]));\n            $self->checkPropertyHook($self->semValue, $stackPos-(8-5));\n            },\n            406 => static function ($self, $stackPos) {\n                 $self->semValue = null;\n            },\n            407 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(3-2)];\n            },\n            408 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(3-2)];\n            },\n            409 => static function ($self, $stackPos) {\n                 $self->semValue = 0;\n            },\n            410 => static function ($self, $stackPos) {\n                 $self->checkPropertyHookModifiers($self->semStack[$stackPos-(2-1)], $self->semStack[$stackPos-(2-2)], $stackPos-(2-2)); $self->semValue = $self->semStack[$stackPos-(2-1)] | $self->semStack[$stackPos-(2-2)];\n            },\n            411 => null,\n            412 => null,\n            413 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)];\n            },\n            414 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(1-1)]);\n            },\n            415 => static function ($self, $stackPos) {\n                 $self->semValue = array();\n            },\n            416 => null,\n            417 => null,\n            418 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Assign($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            419 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Assign($self->fixupArrayDestructuring($self->semStack[$stackPos-(3-1)]), $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            420 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Assign($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            421 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\AssignRef($self->semStack[$stackPos-(4-1)], $self->semStack[$stackPos-(4-4)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]));\n            },\n            422 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\AssignRef($self->semStack[$stackPos-(4-1)], $self->semStack[$stackPos-(4-4)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]));\n            if (!$self->phpVersion->allowsAssignNewByReference()) {\n                $self->emitError(new Error('Cannot assign new by reference', $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos])));\n            }\n\n            },\n            423 => null,\n            424 => null,\n            425 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\FuncCall(new Node\\Name($self->semStack[$stackPos-(2-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)],  $self->tokenEndStack[$stackPos-(2-1)])), $self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            426 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Clone_($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            427 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\AssignOp\\Plus($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            428 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\AssignOp\\Minus($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            429 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\AssignOp\\Mul($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            430 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\AssignOp\\Div($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            431 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\AssignOp\\Concat($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            432 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\AssignOp\\Mod($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            433 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\AssignOp\\BitwiseAnd($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            434 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\AssignOp\\BitwiseOr($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            435 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\AssignOp\\BitwiseXor($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            436 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\AssignOp\\ShiftLeft($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            437 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\AssignOp\\ShiftRight($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            438 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\AssignOp\\Pow($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            439 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\AssignOp\\Coalesce($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            440 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\PostInc($self->semStack[$stackPos-(2-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            441 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\PreInc($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            442 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\PostDec($self->semStack[$stackPos-(2-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            443 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\PreDec($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            444 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\BinaryOp\\BooleanOr($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            445 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\BinaryOp\\BooleanAnd($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            446 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\BinaryOp\\LogicalOr($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            447 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\BinaryOp\\LogicalAnd($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            448 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\BinaryOp\\LogicalXor($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            449 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\BinaryOp\\BitwiseOr($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            450 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\BinaryOp\\BitwiseAnd($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            451 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\BinaryOp\\BitwiseAnd($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            452 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\BinaryOp\\BitwiseXor($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            453 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\BinaryOp\\Concat($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            454 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\BinaryOp\\Plus($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            455 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\BinaryOp\\Minus($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            456 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\BinaryOp\\Mul($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            457 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\BinaryOp\\Div($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            458 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\BinaryOp\\Mod($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            459 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\BinaryOp\\ShiftLeft($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            460 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\BinaryOp\\ShiftRight($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            461 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\BinaryOp\\Pow($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            462 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\UnaryPlus($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            463 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\UnaryMinus($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            464 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\BooleanNot($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            465 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\BitwiseNot($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            466 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\BinaryOp\\Identical($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            467 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\BinaryOp\\NotIdentical($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            468 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\BinaryOp\\Equal($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            469 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\BinaryOp\\NotEqual($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            470 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\BinaryOp\\Spaceship($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            471 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\BinaryOp\\Smaller($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            472 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\BinaryOp\\SmallerOrEqual($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            473 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\BinaryOp\\Greater($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            474 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\BinaryOp\\GreaterOrEqual($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            475 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Instanceof_($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            476 => static function ($self, $stackPos) {\n\n          $self->semValue = $self->semStack[$stackPos-(3-2)];\n          if ($self->semValue instanceof Expr\\ArrowFunction) {\n              $self->parenthesizedArrowFunctions->offsetSet($self->semValue);\n          }\n\n            },\n            477 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Ternary($self->semStack[$stackPos-(5-1)], $self->semStack[$stackPos-(5-3)], $self->semStack[$stackPos-(5-5)], $self->getAttributes($self->tokenStartStack[$stackPos-(5-1)], $self->tokenEndStack[$stackPos]));\n            },\n            478 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Ternary($self->semStack[$stackPos-(4-1)], null, $self->semStack[$stackPos-(4-4)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]));\n            },\n            479 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\BinaryOp\\Coalesce($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            480 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Isset_($self->semStack[$stackPos-(4-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]));\n            },\n            481 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Empty_($self->semStack[$stackPos-(4-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]));\n            },\n            482 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Include_($self->semStack[$stackPos-(2-2)], Expr\\Include_::TYPE_INCLUDE, $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            483 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Include_($self->semStack[$stackPos-(2-2)], Expr\\Include_::TYPE_INCLUDE_ONCE, $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            484 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Eval_($self->semStack[$stackPos-(4-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]));\n            },\n            485 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Include_($self->semStack[$stackPos-(2-2)], Expr\\Include_::TYPE_REQUIRE, $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            486 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Include_($self->semStack[$stackPos-(2-2)], Expr\\Include_::TYPE_REQUIRE_ONCE, $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            487 => static function ($self, $stackPos) {\n                 $attrs = $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]);\n            $attrs['kind'] = $self->getIntCastKind($self->semStack[$stackPos-(2-1)]);\n            $self->semValue = new Expr\\Cast\\Int_($self->semStack[$stackPos-(2-2)], $attrs);\n            },\n            488 => static function ($self, $stackPos) {\n                 $attrs = $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]);\n            $attrs['kind'] = $self->getFloatCastKind($self->semStack[$stackPos-(2-1)]);\n            $self->semValue = new Expr\\Cast\\Double($self->semStack[$stackPos-(2-2)], $attrs);\n            },\n            489 => static function ($self, $stackPos) {\n                 $attrs = $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]);\n            $attrs['kind'] = $self->getStringCastKind($self->semStack[$stackPos-(2-1)]);\n            $self->semValue = new Expr\\Cast\\String_($self->semStack[$stackPos-(2-2)], $attrs);\n            },\n            490 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Cast\\Array_($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            491 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Cast\\Object_($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            492 => static function ($self, $stackPos) {\n                 $attrs = $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]);\n            $attrs['kind'] = $self->getBoolCastKind($self->semStack[$stackPos-(2-1)]);\n            $self->semValue = new Expr\\Cast\\Bool_($self->semStack[$stackPos-(2-2)], $attrs);\n            },\n            493 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Cast\\Unset_($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            494 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Cast\\Void_($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            495 => static function ($self, $stackPos) {\n                 $self->semValue = $self->createExitExpr($self->semStack[$stackPos-(2-1)], $stackPos-(2-1), $self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            496 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\ErrorSuppress($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            497 => null,\n            498 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\ShellExec($self->semStack[$stackPos-(3-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            499 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Print_($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            500 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Yield_(null, null, $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            501 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Yield_($self->semStack[$stackPos-(2-2)], null, $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            502 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Yield_($self->semStack[$stackPos-(4-4)], $self->semStack[$stackPos-(4-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]));\n            },\n            503 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\YieldFrom($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            504 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Throw_($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            505 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\ArrowFunction(['static' => false, 'byRef' => $self->semStack[$stackPos-(8-2)], 'params' => $self->semStack[$stackPos-(8-4)], 'returnType' => $self->semStack[$stackPos-(8-6)], 'expr' => $self->semStack[$stackPos-(8-8)], 'attrGroups' => []], $self->getAttributes($self->tokenStartStack[$stackPos-(8-1)], $self->tokenEndStack[$stackPos]));\n            },\n            506 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\ArrowFunction(['static' => true, 'byRef' => $self->semStack[$stackPos-(9-3)], 'params' => $self->semStack[$stackPos-(9-5)], 'returnType' => $self->semStack[$stackPos-(9-7)], 'expr' => $self->semStack[$stackPos-(9-9)], 'attrGroups' => []], $self->getAttributes($self->tokenStartStack[$stackPos-(9-1)], $self->tokenEndStack[$stackPos]));\n            },\n            507 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Closure(['static' => false, 'byRef' => $self->semStack[$stackPos-(8-2)], 'params' => $self->semStack[$stackPos-(8-4)], 'uses' => $self->semStack[$stackPos-(8-6)], 'returnType' => $self->semStack[$stackPos-(8-7)], 'stmts' => $self->semStack[$stackPos-(8-8)], 'attrGroups' => []], $self->getAttributes($self->tokenStartStack[$stackPos-(8-1)], $self->tokenEndStack[$stackPos]));\n            },\n            508 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Closure(['static' => true, 'byRef' => $self->semStack[$stackPos-(9-3)], 'params' => $self->semStack[$stackPos-(9-5)], 'uses' => $self->semStack[$stackPos-(9-7)], 'returnType' => $self->semStack[$stackPos-(9-8)], 'stmts' => $self->semStack[$stackPos-(9-9)], 'attrGroups' => []], $self->getAttributes($self->tokenStartStack[$stackPos-(9-1)], $self->tokenEndStack[$stackPos]));\n            },\n            509 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\ArrowFunction(['static' => false, 'byRef' => $self->semStack[$stackPos-(9-3)], 'params' => $self->semStack[$stackPos-(9-5)], 'returnType' => $self->semStack[$stackPos-(9-7)], 'expr' => $self->semStack[$stackPos-(9-9)], 'attrGroups' => $self->semStack[$stackPos-(9-1)]], $self->getAttributes($self->tokenStartStack[$stackPos-(9-1)], $self->tokenEndStack[$stackPos]));\n            },\n            510 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\ArrowFunction(['static' => true, 'byRef' => $self->semStack[$stackPos-(10-4)], 'params' => $self->semStack[$stackPos-(10-6)], 'returnType' => $self->semStack[$stackPos-(10-8)], 'expr' => $self->semStack[$stackPos-(10-10)], 'attrGroups' => $self->semStack[$stackPos-(10-1)]], $self->getAttributes($self->tokenStartStack[$stackPos-(10-1)], $self->tokenEndStack[$stackPos]));\n            },\n            511 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Closure(['static' => false, 'byRef' => $self->semStack[$stackPos-(9-3)], 'params' => $self->semStack[$stackPos-(9-5)], 'uses' => $self->semStack[$stackPos-(9-7)], 'returnType' => $self->semStack[$stackPos-(9-8)], 'stmts' => $self->semStack[$stackPos-(9-9)], 'attrGroups' => $self->semStack[$stackPos-(9-1)]], $self->getAttributes($self->tokenStartStack[$stackPos-(9-1)], $self->tokenEndStack[$stackPos]));\n            },\n            512 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Closure(['static' => true, 'byRef' => $self->semStack[$stackPos-(10-4)], 'params' => $self->semStack[$stackPos-(10-6)], 'uses' => $self->semStack[$stackPos-(10-8)], 'returnType' => $self->semStack[$stackPos-(10-9)], 'stmts' => $self->semStack[$stackPos-(10-10)], 'attrGroups' => $self->semStack[$stackPos-(10-1)]], $self->getAttributes($self->tokenStartStack[$stackPos-(10-1)], $self->tokenEndStack[$stackPos]));\n            },\n            513 => static function ($self, $stackPos) {\n                 $self->semValue = array(new Stmt\\Class_(null, ['type' => $self->semStack[$stackPos-(8-2)], 'extends' => $self->semStack[$stackPos-(8-4)], 'implements' => $self->semStack[$stackPos-(8-5)], 'stmts' => $self->semStack[$stackPos-(8-7)], 'attrGroups' => $self->semStack[$stackPos-(8-1)]], $self->getAttributes($self->tokenStartStack[$stackPos-(8-1)], $self->tokenEndStack[$stackPos])), $self->semStack[$stackPos-(8-3)]);\n            $self->checkClass($self->semValue[0], -1);\n            },\n            514 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\New_($self->semStack[$stackPos-(3-2)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            515 => static function ($self, $stackPos) {\n                 list($class, $ctorArgs) = $self->semStack[$stackPos-(2-2)]; $self->semValue = new Expr\\New_($class, $ctorArgs, $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            516 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\New_($self->semStack[$stackPos-(2-2)], [], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            517 => null,\n            518 => null,\n            519 => static function ($self, $stackPos) {\n                 $self->semValue = array();\n            },\n            520 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(4-3)];\n            },\n            521 => null,\n            522 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(1-1)]);\n            },\n            523 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)];\n            },\n            524 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\ClosureUse($self->semStack[$stackPos-(2-2)], $self->semStack[$stackPos-(2-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            525 => static function ($self, $stackPos) {\n                 $self->semValue = new Name($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            526 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\FuncCall($self->semStack[$stackPos-(2-1)], $self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            527 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\FuncCall($self->semStack[$stackPos-(2-1)], $self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            528 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\FuncCall($self->semStack[$stackPos-(2-1)], $self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            529 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\StaticCall($self->semStack[$stackPos-(4-1)], $self->semStack[$stackPos-(4-3)], $self->semStack[$stackPos-(4-4)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]));\n            },\n            530 => static function ($self, $stackPos) {\n                 $self->semValue = new Name($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            531 => null,\n            532 => static function ($self, $stackPos) {\n                 $self->semValue = new Name($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            533 => static function ($self, $stackPos) {\n                 $self->semValue = new Name($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            534 => static function ($self, $stackPos) {\n                 $self->semValue = new Name\\FullyQualified(substr($self->semStack[$stackPos-(1-1)], 1), $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            535 => static function ($self, $stackPos) {\n                 $self->semValue = new Name\\Relative(substr($self->semStack[$stackPos-(1-1)], 10), $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            536 => null,\n            537 => null,\n            538 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(3-2)];\n            },\n            539 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Error($self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); $self->errorState = 2;\n            },\n            540 => null,\n            541 => null,\n            542 => static function ($self, $stackPos) {\n                 $self->semValue = array();\n            },\n            543 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(1-1)]); foreach ($self->semValue as $s) { if ($s instanceof Node\\InterpolatedStringPart) { $s->value = Node\\Scalar\\String_::parseEscapeSequences($s->value, '`', $self->phpVersion->supportsUnicodeEscapes()); } };\n            },\n            544 => static function ($self, $stackPos) {\n                 foreach ($self->semStack[$stackPos-(1-1)] as $s) { if ($s instanceof Node\\InterpolatedStringPart) { $s->value = Node\\Scalar\\String_::parseEscapeSequences($s->value, '`', $self->phpVersion->supportsUnicodeEscapes()); } }; $self->semValue = $self->semStack[$stackPos-(1-1)];\n            },\n            545 => static function ($self, $stackPos) {\n                 $self->semValue = array();\n            },\n            546 => null,\n            547 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\ConstFetch($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            548 => static function ($self, $stackPos) {\n                 $self->semValue = new Scalar\\MagicConst\\Line($self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            549 => static function ($self, $stackPos) {\n                 $self->semValue = new Scalar\\MagicConst\\File($self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            550 => static function ($self, $stackPos) {\n                 $self->semValue = new Scalar\\MagicConst\\Dir($self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            551 => static function ($self, $stackPos) {\n                 $self->semValue = new Scalar\\MagicConst\\Class_($self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            552 => static function ($self, $stackPos) {\n                 $self->semValue = new Scalar\\MagicConst\\Trait_($self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            553 => static function ($self, $stackPos) {\n                 $self->semValue = new Scalar\\MagicConst\\Method($self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            554 => static function ($self, $stackPos) {\n                 $self->semValue = new Scalar\\MagicConst\\Function_($self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            555 => static function ($self, $stackPos) {\n                 $self->semValue = new Scalar\\MagicConst\\Namespace_($self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            556 => static function ($self, $stackPos) {\n                 $self->semValue = new Scalar\\MagicConst\\Property($self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            557 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\ClassConstFetch($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            558 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\ClassConstFetch($self->semStack[$stackPos-(5-1)], $self->semStack[$stackPos-(5-4)], $self->getAttributes($self->tokenStartStack[$stackPos-(5-1)], $self->tokenEndStack[$stackPos]));\n            },\n            559 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\ClassConstFetch($self->semStack[$stackPos-(3-1)], new Expr\\Error($self->getAttributes($self->tokenStartStack[$stackPos-(3-3)],  $self->tokenEndStack[$stackPos-(3-3)])), $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); $self->errorState = 2;\n            },\n            560 => static function ($self, $stackPos) {\n                 $attrs = $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]); $attrs['kind'] = Expr\\Array_::KIND_SHORT;\n            $self->semValue = new Expr\\Array_($self->semStack[$stackPos-(3-2)], $attrs);\n            },\n            561 => static function ($self, $stackPos) {\n                 $attrs = $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]); $attrs['kind'] = Expr\\Array_::KIND_LONG;\n            $self->semValue = new Expr\\Array_($self->semStack[$stackPos-(4-3)], $attrs);\n            $self->createdArrays->offsetSet($self->semValue);\n            },\n            562 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(1-1)]; $self->createdArrays->offsetSet($self->semValue);\n            },\n            563 => static function ($self, $stackPos) {\n                 $self->semValue = Scalar\\String_::fromString($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]), $self->phpVersion->supportsUnicodeEscapes());\n            },\n            564 => static function ($self, $stackPos) {\n                 $attrs = $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]); $attrs['kind'] = Scalar\\String_::KIND_DOUBLE_QUOTED;\n            foreach ($self->semStack[$stackPos-(3-2)] as $s) { if ($s instanceof Node\\InterpolatedStringPart) { $s->value = Node\\Scalar\\String_::parseEscapeSequences($s->value, '\"', $self->phpVersion->supportsUnicodeEscapes()); } }; $self->semValue = new Scalar\\InterpolatedString($self->semStack[$stackPos-(3-2)], $attrs);\n            },\n            565 => static function ($self, $stackPos) {\n                 $self->semValue = $self->parseLNumber($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]), $self->phpVersion->allowsInvalidOctals());\n            },\n            566 => static function ($self, $stackPos) {\n                 $self->semValue = Scalar\\Float_::fromString($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            567 => null,\n            568 => null,\n            569 => null,\n            570 => static function ($self, $stackPos) {\n                 $self->semValue = $self->parseDocString($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-2)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]), $self->getAttributes($self->tokenStartStack[$stackPos-(3-3)],  $self->tokenEndStack[$stackPos-(3-3)]), true);\n            },\n            571 => static function ($self, $stackPos) {\n                 $self->semValue = $self->parseDocString($self->semStack[$stackPos-(2-1)], '', $self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]), $self->getAttributes($self->tokenStartStack[$stackPos-(2-2)],  $self->tokenEndStack[$stackPos-(2-2)]), true);\n            },\n            572 => static function ($self, $stackPos) {\n                 $self->semValue = $self->parseDocString($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-2)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]), $self->getAttributes($self->tokenStartStack[$stackPos-(3-3)],  $self->tokenEndStack[$stackPos-(3-3)]), true);\n            },\n            573 => static function ($self, $stackPos) {\n                 $self->semValue = null;\n            },\n            574 => null,\n            575 => null,\n            576 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(3-2)];\n            },\n            577 => null,\n            578 => null,\n            579 => null,\n            580 => null,\n            581 => null,\n            582 => null,\n            583 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(3-2)];\n            },\n            584 => null,\n            585 => null,\n            586 => null,\n            587 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\ArrayDimFetch($self->semStack[$stackPos-(4-1)], $self->semStack[$stackPos-(4-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]));\n            },\n            588 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\ArrayDimFetch($self->semStack[$stackPos-(4-1)], $self->semStack[$stackPos-(4-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]));\n            },\n            589 => null,\n            590 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\MethodCall($self->semStack[$stackPos-(4-1)], $self->semStack[$stackPos-(4-3)], $self->semStack[$stackPos-(4-4)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]));\n            },\n            591 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\NullsafeMethodCall($self->semStack[$stackPos-(4-1)], $self->semStack[$stackPos-(4-3)], $self->semStack[$stackPos-(4-4)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]));\n            },\n            592 => static function ($self, $stackPos) {\n                 $self->semValue = null;\n            },\n            593 => null,\n            594 => null,\n            595 => null,\n            596 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\PropertyFetch($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            597 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\NullsafePropertyFetch($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            598 => null,\n            599 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Variable($self->semStack[$stackPos-(4-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]));\n            },\n            600 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Variable($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            601 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Variable(new Expr\\Error($self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])), $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); $self->errorState = 2;\n            },\n            602 => static function ($self, $stackPos) {\n                 $var = $self->semStack[$stackPos-(1-1)]->name; $self->semValue = \\is_string($var) ? new Node\\VarLikeIdentifier($var, $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])) : $var;\n            },\n            603 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\StaticPropertyFetch($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            604 => null,\n            605 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\ArrayDimFetch($self->semStack[$stackPos-(4-1)], $self->semStack[$stackPos-(4-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]));\n            },\n            606 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\ArrayDimFetch($self->semStack[$stackPos-(4-1)], $self->semStack[$stackPos-(4-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]));\n            },\n            607 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\PropertyFetch($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            608 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\NullsafePropertyFetch($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            609 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\StaticPropertyFetch($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            610 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\StaticPropertyFetch($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            611 => null,\n            612 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(3-2)];\n            },\n            613 => null,\n            614 => null,\n            615 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(3-2)];\n            },\n            616 => null,\n            617 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Error($self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); $self->errorState = 2;\n            },\n            618 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\List_($self->semStack[$stackPos-(4-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos])); $self->semValue->setAttribute('kind', Expr\\List_::KIND_LIST);\n            $self->postprocessList($self->semValue);\n            },\n            619 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(1-1)]; $end = count($self->semValue)-1; if ($self->semValue[$end]->value instanceof Expr\\Error) array_pop($self->semValue);\n            },\n            620 => null,\n            621 => static function ($self, $stackPos) {\n                 /* do nothing -- prevent default action of $$=$self->semStack[$1]. See $551. */\n            },\n            622 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)];\n            },\n            623 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(1-1)]);\n            },\n            624 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\ArrayItem($self->semStack[$stackPos-(1-1)], null, false, $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            625 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\ArrayItem($self->semStack[$stackPos-(2-2)], null, true, $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            626 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\ArrayItem($self->semStack[$stackPos-(1-1)], null, false, $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            627 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\ArrayItem($self->semStack[$stackPos-(3-3)], $self->semStack[$stackPos-(3-1)], false, $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            628 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\ArrayItem($self->semStack[$stackPos-(4-4)], $self->semStack[$stackPos-(4-1)], true, $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]));\n            },\n            629 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\ArrayItem($self->semStack[$stackPos-(3-3)], $self->semStack[$stackPos-(3-1)], false, $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            630 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\ArrayItem($self->semStack[$stackPos-(2-2)], null, false, $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]), true);\n            },\n            631 => static function ($self, $stackPos) {\n                 /* Create an Error node now to remember the position. We'll later either report an error,\n             or convert this into a null element, depending on whether this is a creation or destructuring context. */\n          $attrs = $self->createEmptyElemAttributes($self->tokenPos);\n          $self->semValue = new Node\\ArrayItem(new Expr\\Error($attrs), null, false, $attrs);\n            },\n            632 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(2-1)][] = $self->semStack[$stackPos-(2-2)]; $self->semValue = $self->semStack[$stackPos-(2-1)];\n            },\n            633 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(2-1)][] = $self->semStack[$stackPos-(2-2)]; $self->semValue = $self->semStack[$stackPos-(2-1)];\n            },\n            634 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(1-1)]);\n            },\n            635 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(2-1)], $self->semStack[$stackPos-(2-2)]);\n            },\n            636 => static function ($self, $stackPos) {\n                 $attrs = $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]); $attrs['rawValue'] = $self->semStack[$stackPos-(1-1)]; $self->semValue = new Node\\InterpolatedStringPart($self->semStack[$stackPos-(1-1)], $attrs);\n            },\n            637 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Variable($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            638 => null,\n            639 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\ArrayDimFetch($self->semStack[$stackPos-(4-1)], $self->semStack[$stackPos-(4-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]));\n            },\n            640 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\PropertyFetch($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            641 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\NullsafePropertyFetch($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            642 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Variable($self->semStack[$stackPos-(3-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            643 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Variable($self->semStack[$stackPos-(3-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            644 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\ArrayDimFetch($self->semStack[$stackPos-(6-2)], $self->semStack[$stackPos-(6-4)], $self->getAttributes($self->tokenStartStack[$stackPos-(6-1)], $self->tokenEndStack[$stackPos]));\n            },\n            645 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(3-2)];\n            },\n            646 => static function ($self, $stackPos) {\n                 $self->semValue = new Scalar\\String_($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            647 => static function ($self, $stackPos) {\n                 $self->semValue = $self->parseNumString($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            648 => static function ($self, $stackPos) {\n                 $self->semValue = $self->parseNumString('-' . $self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            649 => null,\n        ];\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Parser/Php8.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\Parser;\n\nuse PhpParser\\Error;\nuse PhpParser\\Modifiers;\nuse PhpParser\\Node;\nuse PhpParser\\Node\\Expr;\nuse PhpParser\\Node\\Name;\nuse PhpParser\\Node\\Scalar;\nuse PhpParser\\Node\\Stmt;\n\n/* This is an automatically GENERATED file, which should not be manually edited.\n * Instead edit one of the following:\n *  * the grammar file grammar/php.y\n *  * the skeleton file grammar/parser.template\n *  * the preprocessing script grammar/rebuildParsers.php\n */\nclass Php8 extends \\PhpParser\\ParserAbstract\n{\n    public const YYERRTOK = 256;\n    public const T_VOID_CAST = 257;\n    public const T_THROW = 258;\n    public const T_INCLUDE = 259;\n    public const T_INCLUDE_ONCE = 260;\n    public const T_EVAL = 261;\n    public const T_REQUIRE = 262;\n    public const T_REQUIRE_ONCE = 263;\n    public const T_LOGICAL_OR = 264;\n    public const T_LOGICAL_XOR = 265;\n    public const T_LOGICAL_AND = 266;\n    public const T_PRINT = 267;\n    public const T_YIELD = 268;\n    public const T_DOUBLE_ARROW = 269;\n    public const T_YIELD_FROM = 270;\n    public const T_PLUS_EQUAL = 271;\n    public const T_MINUS_EQUAL = 272;\n    public const T_MUL_EQUAL = 273;\n    public const T_DIV_EQUAL = 274;\n    public const T_CONCAT_EQUAL = 275;\n    public const T_MOD_EQUAL = 276;\n    public const T_AND_EQUAL = 277;\n    public const T_OR_EQUAL = 278;\n    public const T_XOR_EQUAL = 279;\n    public const T_SL_EQUAL = 280;\n    public const T_SR_EQUAL = 281;\n    public const T_POW_EQUAL = 282;\n    public const T_COALESCE_EQUAL = 283;\n    public const T_COALESCE = 284;\n    public const T_BOOLEAN_OR = 285;\n    public const T_BOOLEAN_AND = 286;\n    public const T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG = 287;\n    public const T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG = 288;\n    public const T_IS_EQUAL = 289;\n    public const T_IS_NOT_EQUAL = 290;\n    public const T_IS_IDENTICAL = 291;\n    public const T_IS_NOT_IDENTICAL = 292;\n    public const T_SPACESHIP = 293;\n    public const T_IS_SMALLER_OR_EQUAL = 294;\n    public const T_IS_GREATER_OR_EQUAL = 295;\n    public const T_PIPE = 296;\n    public const T_SL = 297;\n    public const T_SR = 298;\n    public const T_INSTANCEOF = 299;\n    public const T_INC = 300;\n    public const T_DEC = 301;\n    public const T_INT_CAST = 302;\n    public const T_DOUBLE_CAST = 303;\n    public const T_STRING_CAST = 304;\n    public const T_ARRAY_CAST = 305;\n    public const T_OBJECT_CAST = 306;\n    public const T_BOOL_CAST = 307;\n    public const T_UNSET_CAST = 308;\n    public const T_POW = 309;\n    public const T_NEW = 310;\n    public const T_CLONE = 311;\n    public const T_EXIT = 312;\n    public const T_IF = 313;\n    public const T_ELSEIF = 314;\n    public const T_ELSE = 315;\n    public const T_ENDIF = 316;\n    public const T_LNUMBER = 317;\n    public const T_DNUMBER = 318;\n    public const T_STRING = 319;\n    public const T_STRING_VARNAME = 320;\n    public const T_VARIABLE = 321;\n    public const T_NUM_STRING = 322;\n    public const T_INLINE_HTML = 323;\n    public const T_ENCAPSED_AND_WHITESPACE = 324;\n    public const T_CONSTANT_ENCAPSED_STRING = 325;\n    public const T_ECHO = 326;\n    public const T_DO = 327;\n    public const T_WHILE = 328;\n    public const T_ENDWHILE = 329;\n    public const T_FOR = 330;\n    public const T_ENDFOR = 331;\n    public const T_FOREACH = 332;\n    public const T_ENDFOREACH = 333;\n    public const T_DECLARE = 334;\n    public const T_ENDDECLARE = 335;\n    public const T_AS = 336;\n    public const T_SWITCH = 337;\n    public const T_MATCH = 338;\n    public const T_ENDSWITCH = 339;\n    public const T_CASE = 340;\n    public const T_DEFAULT = 341;\n    public const T_BREAK = 342;\n    public const T_CONTINUE = 343;\n    public const T_GOTO = 344;\n    public const T_FUNCTION = 345;\n    public const T_FN = 346;\n    public const T_CONST = 347;\n    public const T_RETURN = 348;\n    public const T_TRY = 349;\n    public const T_CATCH = 350;\n    public const T_FINALLY = 351;\n    public const T_USE = 352;\n    public const T_INSTEADOF = 353;\n    public const T_GLOBAL = 354;\n    public const T_STATIC = 355;\n    public const T_ABSTRACT = 356;\n    public const T_FINAL = 357;\n    public const T_PRIVATE = 358;\n    public const T_PROTECTED = 359;\n    public const T_PUBLIC = 360;\n    public const T_READONLY = 361;\n    public const T_PUBLIC_SET = 362;\n    public const T_PROTECTED_SET = 363;\n    public const T_PRIVATE_SET = 364;\n    public const T_VAR = 365;\n    public const T_UNSET = 366;\n    public const T_ISSET = 367;\n    public const T_EMPTY = 368;\n    public const T_HALT_COMPILER = 369;\n    public const T_CLASS = 370;\n    public const T_TRAIT = 371;\n    public const T_INTERFACE = 372;\n    public const T_ENUM = 373;\n    public const T_EXTENDS = 374;\n    public const T_IMPLEMENTS = 375;\n    public const T_OBJECT_OPERATOR = 376;\n    public const T_NULLSAFE_OBJECT_OPERATOR = 377;\n    public const T_LIST = 378;\n    public const T_ARRAY = 379;\n    public const T_CALLABLE = 380;\n    public const T_CLASS_C = 381;\n    public const T_TRAIT_C = 382;\n    public const T_METHOD_C = 383;\n    public const T_FUNC_C = 384;\n    public const T_PROPERTY_C = 385;\n    public const T_LINE = 386;\n    public const T_FILE = 387;\n    public const T_START_HEREDOC = 388;\n    public const T_END_HEREDOC = 389;\n    public const T_DOLLAR_OPEN_CURLY_BRACES = 390;\n    public const T_CURLY_OPEN = 391;\n    public const T_PAAMAYIM_NEKUDOTAYIM = 392;\n    public const T_NAMESPACE = 393;\n    public const T_NS_C = 394;\n    public const T_DIR = 395;\n    public const T_NS_SEPARATOR = 396;\n    public const T_ELLIPSIS = 397;\n    public const T_NAME_FULLY_QUALIFIED = 398;\n    public const T_NAME_QUALIFIED = 399;\n    public const T_NAME_RELATIVE = 400;\n    public const T_ATTRIBUTE = 401;\n\n    protected int $tokenToSymbolMapSize = 402;\n    protected int $actionTableSize = 1537;\n    protected int $gotoTableSize = 642;\n\n    protected int $invalidSymbol = 174;\n    protected int $errorSymbol = 1;\n    protected int $defaultAction = -32766;\n    protected int $unexpectedTokenRule = 32767;\n\n    protected int $YY2TBLSTATE = 452;\n    protected int $numNonLeafStates = 767;\n\n    protected array $symbolToName = array(\n        \"EOF\",\n        \"error\",\n        \"T_VOID_CAST\",\n        \"T_THROW\",\n        \"T_INCLUDE\",\n        \"T_INCLUDE_ONCE\",\n        \"T_EVAL\",\n        \"T_REQUIRE\",\n        \"T_REQUIRE_ONCE\",\n        \"','\",\n        \"T_LOGICAL_OR\",\n        \"T_LOGICAL_XOR\",\n        \"T_LOGICAL_AND\",\n        \"T_PRINT\",\n        \"T_YIELD\",\n        \"T_DOUBLE_ARROW\",\n        \"T_YIELD_FROM\",\n        \"'='\",\n        \"T_PLUS_EQUAL\",\n        \"T_MINUS_EQUAL\",\n        \"T_MUL_EQUAL\",\n        \"T_DIV_EQUAL\",\n        \"T_CONCAT_EQUAL\",\n        \"T_MOD_EQUAL\",\n        \"T_AND_EQUAL\",\n        \"T_OR_EQUAL\",\n        \"T_XOR_EQUAL\",\n        \"T_SL_EQUAL\",\n        \"T_SR_EQUAL\",\n        \"T_POW_EQUAL\",\n        \"T_COALESCE_EQUAL\",\n        \"'?'\",\n        \"':'\",\n        \"T_COALESCE\",\n        \"T_BOOLEAN_OR\",\n        \"T_BOOLEAN_AND\",\n        \"'|'\",\n        \"'^'\",\n        \"T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG\",\n        \"T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG\",\n        \"T_IS_EQUAL\",\n        \"T_IS_NOT_EQUAL\",\n        \"T_IS_IDENTICAL\",\n        \"T_IS_NOT_IDENTICAL\",\n        \"T_SPACESHIP\",\n        \"'<'\",\n        \"T_IS_SMALLER_OR_EQUAL\",\n        \"'>'\",\n        \"T_IS_GREATER_OR_EQUAL\",\n        \"T_PIPE\",\n        \"'.'\",\n        \"T_SL\",\n        \"T_SR\",\n        \"'+'\",\n        \"'-'\",\n        \"'*'\",\n        \"'/'\",\n        \"'%'\",\n        \"'!'\",\n        \"T_INSTANCEOF\",\n        \"'~'\",\n        \"T_INC\",\n        \"T_DEC\",\n        \"T_INT_CAST\",\n        \"T_DOUBLE_CAST\",\n        \"T_STRING_CAST\",\n        \"T_ARRAY_CAST\",\n        \"T_OBJECT_CAST\",\n        \"T_BOOL_CAST\",\n        \"T_UNSET_CAST\",\n        \"'@'\",\n        \"T_POW\",\n        \"'['\",\n        \"T_NEW\",\n        \"T_CLONE\",\n        \"T_EXIT\",\n        \"T_IF\",\n        \"T_ELSEIF\",\n        \"T_ELSE\",\n        \"T_ENDIF\",\n        \"T_LNUMBER\",\n        \"T_DNUMBER\",\n        \"T_STRING\",\n        \"T_STRING_VARNAME\",\n        \"T_VARIABLE\",\n        \"T_NUM_STRING\",\n        \"T_INLINE_HTML\",\n        \"T_ENCAPSED_AND_WHITESPACE\",\n        \"T_CONSTANT_ENCAPSED_STRING\",\n        \"T_ECHO\",\n        \"T_DO\",\n        \"T_WHILE\",\n        \"T_ENDWHILE\",\n        \"T_FOR\",\n        \"T_ENDFOR\",\n        \"T_FOREACH\",\n        \"T_ENDFOREACH\",\n        \"T_DECLARE\",\n        \"T_ENDDECLARE\",\n        \"T_AS\",\n        \"T_SWITCH\",\n        \"T_MATCH\",\n        \"T_ENDSWITCH\",\n        \"T_CASE\",\n        \"T_DEFAULT\",\n        \"T_BREAK\",\n        \"T_CONTINUE\",\n        \"T_GOTO\",\n        \"T_FUNCTION\",\n        \"T_FN\",\n        \"T_CONST\",\n        \"T_RETURN\",\n        \"T_TRY\",\n        \"T_CATCH\",\n        \"T_FINALLY\",\n        \"T_USE\",\n        \"T_INSTEADOF\",\n        \"T_GLOBAL\",\n        \"T_STATIC\",\n        \"T_ABSTRACT\",\n        \"T_FINAL\",\n        \"T_PRIVATE\",\n        \"T_PROTECTED\",\n        \"T_PUBLIC\",\n        \"T_READONLY\",\n        \"T_PUBLIC_SET\",\n        \"T_PROTECTED_SET\",\n        \"T_PRIVATE_SET\",\n        \"T_VAR\",\n        \"T_UNSET\",\n        \"T_ISSET\",\n        \"T_EMPTY\",\n        \"T_HALT_COMPILER\",\n        \"T_CLASS\",\n        \"T_TRAIT\",\n        \"T_INTERFACE\",\n        \"T_ENUM\",\n        \"T_EXTENDS\",\n        \"T_IMPLEMENTS\",\n        \"T_OBJECT_OPERATOR\",\n        \"T_NULLSAFE_OBJECT_OPERATOR\",\n        \"T_LIST\",\n        \"T_ARRAY\",\n        \"T_CALLABLE\",\n        \"T_CLASS_C\",\n        \"T_TRAIT_C\",\n        \"T_METHOD_C\",\n        \"T_FUNC_C\",\n        \"T_PROPERTY_C\",\n        \"T_LINE\",\n        \"T_FILE\",\n        \"T_START_HEREDOC\",\n        \"T_END_HEREDOC\",\n        \"T_DOLLAR_OPEN_CURLY_BRACES\",\n        \"T_CURLY_OPEN\",\n        \"T_PAAMAYIM_NEKUDOTAYIM\",\n        \"T_NAMESPACE\",\n        \"T_NS_C\",\n        \"T_DIR\",\n        \"T_NS_SEPARATOR\",\n        \"T_ELLIPSIS\",\n        \"T_NAME_FULLY_QUALIFIED\",\n        \"T_NAME_QUALIFIED\",\n        \"T_NAME_RELATIVE\",\n        \"T_ATTRIBUTE\",\n        \"';'\",\n        \"']'\",\n        \"'('\",\n        \"')'\",\n        \"'{'\",\n        \"'}'\",\n        \"'`'\",\n        \"'\\\"'\",\n        \"'$'\"\n    );\n\n    protected array $tokenToSymbol = array(\n            0,  174,  174,  174,  174,  174,  174,  174,  174,  174,\n          174,  174,  174,  174,  174,  174,  174,  174,  174,  174,\n          174,  174,  174,  174,  174,  174,  174,  174,  174,  174,\n          174,  174,  174,   58,  172,  174,  173,   57,  174,  174,\n          167,  168,   55,   53,    9,   54,   50,   56,  174,  174,\n          174,  174,  174,  174,  174,  174,  174,  174,   32,  165,\n           45,   17,   47,   31,   70,  174,  174,  174,  174,  174,\n          174,  174,  174,  174,  174,  174,  174,  174,  174,  174,\n          174,  174,  174,  174,  174,  174,  174,  174,  174,  174,\n          174,   72,  174,  166,   37,  174,  171,  174,  174,  174,\n          174,  174,  174,  174,  174,  174,  174,  174,  174,  174,\n          174,  174,  174,  174,  174,  174,  174,  174,  174,  174,\n          174,  174,  174,  169,   36,  170,   60,  174,  174,  174,\n          174,  174,  174,  174,  174,  174,  174,  174,  174,  174,\n          174,  174,  174,  174,  174,  174,  174,  174,  174,  174,\n          174,  174,  174,  174,  174,  174,  174,  174,  174,  174,\n          174,  174,  174,  174,  174,  174,  174,  174,  174,  174,\n          174,  174,  174,  174,  174,  174,  174,  174,  174,  174,\n          174,  174,  174,  174,  174,  174,  174,  174,  174,  174,\n          174,  174,  174,  174,  174,  174,  174,  174,  174,  174,\n          174,  174,  174,  174,  174,  174,  174,  174,  174,  174,\n          174,  174,  174,  174,  174,  174,  174,  174,  174,  174,\n          174,  174,  174,  174,  174,  174,  174,  174,  174,  174,\n          174,  174,  174,  174,  174,  174,  174,  174,  174,  174,\n          174,  174,  174,  174,  174,  174,  174,  174,  174,  174,\n          174,  174,  174,  174,  174,  174,    1,    2,    3,    4,\n            5,    6,    7,    8,   10,   11,   12,   13,   14,   15,\n           16,   18,   19,   20,   21,   22,   23,   24,   25,   26,\n           27,   28,   29,   30,   33,   34,   35,   38,   39,   40,\n           41,   42,   43,   44,   46,   48,   49,   51,   52,   59,\n           61,   62,   63,   64,   65,   66,   67,   68,   69,   71,\n           73,   74,   75,   76,   77,   78,   79,   80,   81,   82,\n           83,   84,   85,   86,   87,   88,   89,   90,   91,   92,\n           93,   94,   95,   96,   97,   98,   99,  100,  101,  102,\n          103,  104,  105,  106,  107,  108,  109,  110,  111,  112,\n          113,  114,  115,  116,  117,  118,  119,  120,  121,  122,\n          123,  124,  125,  126,  127,  128,  129,  130,  131,  132,\n          133,  134,  135,  136,  137,  138,  139,  140,  141,  142,\n          143,  144,  145,  146,  147,  148,  149,  150,  151,  152,\n          153,  154,  155,  156,  157,  158,  159,  160,  161,  162,\n          163,  164\n    );\n\n    protected array $action = array(\n          132,  133,  134,  582,  135,  136,  162,  779,  780,  781,\n          137,   41,  863,-32766,  970, 1404, -584,  974,  973, 1302,\n            0,  395,  396,  455,  246,  854,-32766,-32766,-32766,-32766,\n        -32766,  440,-32766,   27,-32766,  773,  772,-32766,-32766,-32766,\n        -32766,  508,-32766,-32766,-32766,-32766,-32766,-32766,-32766,-32766,\n          131,-32766,-32766,-32766,-32766,  437,  782,  859, 1148,-32766,\n          949,-32766,-32766,-32766,-32766,-32766,-32766,  972, 1385,  300,\n          271,   53,  398,  786,  787,  788,  789,  305,  865,  441,\n         -341,   39,  254, -584, -584, -195,  843,  790,  791,  792,\n          793,  794,  795,  796,  797,  798,  799,  819,  583,  820,\n          821,  822,  823,  811,  812,  353,  354,  814,  815,  800,\n          801,  802,  804,  805,  806,  368,  846,  847,  848,  849,\n          850,  584, 1062, -194,  856,  807,  808,  585,  586,    3,\n          831,  829,  830,  842,  826,  827,    4,  860,  587,  588,\n          825,  589,  590,  591,  592,  939,  593,  594,    5,  854,\n        -32766,-32766,-32766,  828,  595,  596,-32766,  138,  764,  132,\n          133,  134,  582,  135,  136, 1098,  779,  780,  781,  137,\n           41,-32766,-32766,-32766,-32766,-32766,-32766, -275, 1302,  613,\n          153, 1071,  749,  990,  991,-32766,-32766,-32766,  992,-32766,\n          891,-32766,  892,-32766,  773,  772,-32766,  986, 1309,  397,\n          396,-32766,-32766,-32766,  858,  299,  630,-32766,-32766,  440,\n          502,  736,-32766,-32766,  437,  782,-32767,-32767,-32767,-32767,\n          106,  107,  108,  109,  951,-32766, 1021,   29,  734,  271,\n           53,  398,  786,  787,  788,  789,  144, 1071,  441, -341,\n          332,   38,  864,  862, -195,  843,  790,  791,  792,  793,\n          794,  795,  796,  797,  798,  799,  819,  583,  820,  821,\n          822,  823,  811,  812,  353,  354,  814,  815,  800,  801,\n          802,  804,  805,  806,  368,  846,  847,  848,  849,  850,\n          584,  863, -194,  139,  807,  808,  585,  586,  323,  831,\n          829,  830,  842,  826,  827, 1370,  148,  587,  588,  825,\n          589,  590,  591,  592,  245,  593,  594,  395,  396,-32766,\n        -32766,-32766,  828,  595,  596,  -85,  138,  440,  132,  133,\n          134,  582,  135,  136, 1095,  779,  780,  781,  137,   41,\n        -32766,-32766,-32766,-32766,-32766,   51,  578, 1302,  257,-32766,\n          636,  107,  108,  109,-32766,-32766,-32766,  503,-32766,  316,\n        -32766,-32766,-32766,  773,  772,-32766, -383,  166, -383, 1022,\n        -32766,-32766,-32766,  305,   79, 1133,-32766,-32766, 1414,  762,\n          332, 1415,-32766,  437,  782,-32766, 1071,  110,  111,  112,\n          113,  114,  -85,  283,-32766,  477,  478,  479,  271,   53,\n          398,  786,  787,  788,  789,  115,  407,  441,   10,-32766,\n          299, 1341,  306,  307,  843,  790,  791,  792,  793,  794,\n          795,  796,  797,  798,  799,  819,  583,  820,  821,  822,\n          823,  811,  812,  353,  354,  814,  815,  800,  801,  802,\n          804,  805,  806,  368,  846,  847,  848,  849,  850,  584,\n          320, 1068, -582,  807,  808,  585,  586, 1389,  831,  829,\n          830,  842,  826,  827,  329, 1388,  587,  588,  825,  589,\n          590,  591,  592,   86,  593,  594, 1071,  332,-32766,-32766,\n        -32766,  828,  595,  596,  349,  151, -581,  132,  133,  134,\n          582,  135,  136, 1100,  779,  780,  781,  137,   41,-32766,\n          290,-32766,-32766,-32766,-32766,-32766,-32766,-32766,-32767,-32767,\n        -32767,-32767,-32767,-32766,-32766,-32766,  891, 1175,  892, -582,\n         -582,  754,  773,  772, 1159, 1160, 1161, 1155, 1154, 1153,\n         1162, 1156, 1157, 1158,-32766, -582,-32766,-32766,-32766,-32766,\n        -32766,-32766,-32766,  782,-32766,-32766,-32766, -588,  -78,-32766,\n        -32766,-32766,  350, -581, -581,-32766,-32766,  271,   53,  398,\n          786,  787,  788,  789,  383,-32766,  441,-32766,-32766, -581,\n        -32766,  773,  772,  843,  790,  791,  792,  793,  794,  795,\n          796,  797,  798,  799,  819,  583,  820,  821,  822,  823,\n          811,  812,  353,  354,  814,  815,  800,  801,  802,  804,\n          805,  806,  368,  846,  847,  848,  849,  850,  584, -620,\n         1068, -620,  807,  808,  585,  586,  389,  831,  829,  830,\n          842,  826,  827,  441,  405,  587,  588,  825,  589,  590,\n          591,  592,  333,  593,  594, 1071,   87,   88,   89,  459,\n          828,  595,  596,  460,  151,  803,  774,  775,  776,  777,\n          778,  854,  779,  780,  781,  816,  817,   40,  461,   90,\n           91,   92,   93,   94,   95,   96,   97,   98,   99,  100,\n          101,  102,  103,  104,  105,  106,  107,  108,  109,  110,\n          111,  112,  113,  114,  462,  283, 1329, 1159, 1160, 1161,\n         1155, 1154, 1153, 1162, 1156, 1157, 1158,  115,  869,  488,\n          489,  782, 1304, 1303, 1305,  108,  109, 1132,  154,-32766,\n        -32766, 1134,  679,   23,  156,  783,  784,  785,  786,  787,\n          788,  789,  698,  699,  852,  152,  423, -580,  393,  394,\n          157,  843,  790,  791,  792,  793,  794,  795,  796,  797,\n          798,  799,  819,  841,  820,  821,  822,  823,  811,  812,\n          813,  840,  814,  815,  800,  801,  802,  804,  805,  806,\n          845,  846,  847,  848,  849,  850,  851, 1094, -578,  863,\n          807,  808,  809,  810,  -58,  831,  829,  830,  842,  826,\n          827,  399,  400,  818,  824,  825,  832,  833,  835,  834,\n          294,  836,  837,  158, -580, -580,  160,  294,  828,  839,\n          838,   54,   55,   56,   57,  534,   58,   59,   36, -110,\n         -580,  -57,   60,   61, -110,   62, -110,  670,  671,  129,\n          130,  312, -587,  140, -110, -110, -110, -110, -110, -110,\n         -110, -110, -110, -110, -110, -578, -578,  141,  147,  949,\n          161,  712,  -87,  163,  164,  165,  -84,  949,  -78,  -73,\n          -72, -578,   63,   64,  143, -309,  -71,   65,  332,   66,\n          251,  252,   67,   68,   69,   70,   71,   72,   73,   74,\n          739,   31,  276,   47,  457,  535, -357,  713,  740, 1335,\n         1336,  536,  -70,  863, 1068,  -69,  -68, 1333,   45,   22,\n          537,  949,  538,  -67,  539,  -66,  540,   52,  -65,  541,\n          542,  714,  715,  -46,   48,   49,  463,  392,  391, 1071,\n           50,  543,  -18,  145,  281, 1302,  381,  348,  291,  750,\n         1304, 1303, 1305, 1295,  939,  753,  290,  948,  545,  546,\n          547,  150,  939,  290, -305,  295,  288,  289,  292,  293,\n          549,  550,  338, 1321, 1322, 1323, 1324, 1326, 1318, 1319,\n          304, 1300,  296,  301,  302,  283, 1325, 1320,  773,  772,\n         1304, 1303, 1305,  305,  308,  309,   75, -154, -154, -154,\n          327,  328,  332,  966,  854, 1070,  939,  149,  115, 1416,\n          388,  680, -154,  708, -154,  725, -154,   13, -154,  668,\n          723,  313,   31,  277, 1304, 1303, 1305,  863,  390,-32766,\n          600, 1166,  987,  951,  863,  310,  701,  734, 1333,  990,\n          991,  951,-32766,  686,  544,  734,  949,  685,  606, 1340,\n          485,  513,  925,  986, -110, -110, -110,   35,  116,  117,\n          118,  119,  120,  121,  122,  123,  124,  125,  126,  127,\n          128,  702,  949,  634, 1295,  773,  772,  741, -579,  305,\n         -614, 1334,    0,    0,    0,  951,  311,  949,    0,  734,\n         -154,  549,  550,  319, 1321, 1322, 1323, 1324, 1326, 1318,\n         1319, 1209, 1211,  744,    0, 1342,    0, 1325, 1320, -544,\n         -534,    0, -578,-32766,   -4,  949,   11,   77,  751, 1302,\n           30,  387,  328,  332,  862,   43,-32766,-32766,-32766, -613,\n        -32766,  939,-32766,  968,-32766,   44,  759,-32766, 1330,  773,\n          772,  760,-32766,-32766,-32766, -579, -579,  882,-32766,-32766,\n          930, 1031, 1008, 1015,-32766,  437, 1005,  939, 1016,  928,\n         1003, -579, 1137, 1140, 1141, 1138,-32766, 1177, 1139, 1145,\n           37,  874,  939, -586, 1357, 1374, 1407,-32766,  673, -578,\n         -578, -612, -588, 1302, -587, -586, -585,   31,  276, -528,\n        -32766,-32766,-32766,    1,-32766, -578,-32766,   78,-32766,  863,\n          939,-32766,   32, 1333, -278,   33,-32766,-32766,-32766,   42,\n         1007,   46,-32766,-32766,  734,   76,   80,   81,-32766,  437,\n           82,   83,  390,   84,  453,   31,  277,   85,  146,  303,\n        -32766,  155,  159,  990,  991,  249,  951,  863,  544, 1295,\n          734, 1333,  334,  369,  370,  371,  548,  986, -110, -110,\n         -110,  951,  372,  326,  373,  734,  374,  550,  375, 1321,\n         1322, 1323, 1324, 1326, 1318, 1319,  376,  377,  422,  378,\n           21,  -50, 1325, 1320,  379,  382,  454, 1295,  577,  951,\n          380,  384,   77,  734,   -4, -276, -275,  328,  332,   15,\n           16,   17,   18,   20,  363,  550,  421, 1321, 1322, 1323,\n         1324, 1326, 1318, 1319,  142,  504,  505,  512,  515,  516,\n         1325, 1320,  949,  517,  518,-32766,  522,  523,  524,  531,\n           77, 1302,  611,  718, 1101,  328,  332, 1097,-32766,-32766,\n        -32766, 1250,-32766, 1331,-32766,  949,-32766, 1099, 1096,-32766,\n         1077, 1290, 1309, 1073,-32766,-32766,-32766, -280,-32766, -102,\n        -32766,-32766,   14,   19, 1302,   24,-32766,  437,  323,  420,\n          625,-32766,-32766,-32766,  631,-32766,  659,-32766,-32766,-32766,\n          724, 1254,-32766,  -16, 1308, 1251, 1386,-32766,-32766,-32766,\n          735,-32766,  738,-32766,-32766,  742,  743, 1302,  745,-32766,\n          437,  746,  747,  748,-32766,-32766,-32766,  939,-32766,  300,\n        -32766,-32766,-32766,  752, 1309,-32766,  764,  737,  332,  765,\n        -32766,-32766,-32766, -253, -253, -253,-32766,-32766,  426,  390,\n          939,  756,-32766,  437,  926,  863, 1411, 1413,  885,  884,\n          990,  991,  980, 1023,-32766,  544, -252, -252, -252, 1412,\n          979,  977,  390,  925,  986, -110, -110, -110,  978,  981,\n         1283,  959,  969,  990,  991,  957, 1176, 1172,  544, 1126,\n         -110, -110, 1013, 1014,  657, -110,  925,  986, -110, -110,\n         -110, 1410,    2, 1368, -110, 1268,  951, 1383,    0,    0,\n          734, -253,    0,-32766,    0,    0,-32766,  863, 1059, 1054,\n         1053, 1052, 1058, 1055, 1056, 1057,    0,    0,    0,  951,\n            0,    0,    0,  734, -252,  305,    0,    0,   79,    0,\n            0, 1071,    0,    0,  332,    0,    0,    0,    0,    0,\n            0,    0, -110, -110,    0,    0,    0, -110,    0,    0,\n            0,    0,    0,    0,    0,  299, -110,    0,    0,    0,\n            0,    0,    0,    0,    0,-32766,    0,    0,    0,    0,\n            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n            0,    0,    0,    0,    0,    0,    0,  305,    0,    0,\n           79,    0,    0,    0,    0,    0,  332\n    );\n\n    protected array $actionCheck = array(\n            3,    4,    5,    6,    7,    8,   17,   10,   11,   12,\n           13,   14,   84,   76,    1,   87,   72,   74,   75,   82,\n            0,  108,  109,  110,   15,   82,   89,   90,   91,   10,\n           93,  118,   95,  103,   97,   38,   39,  100,   10,   11,\n           12,  104,  105,  106,  107,   10,   11,   12,  111,  112,\n           15,   10,   11,   12,  117,  118,   59,   82,  128,   31,\n            1,   33,   34,   35,   36,   37,  129,  124,    1,   31,\n           73,   74,   75,   76,   77,   78,   79,  164,    1,   82,\n            9,  153,  154,  139,  140,    9,   89,   90,   91,   92,\n           93,   94,   95,   96,   97,   98,   99,  100,  101,  102,\n          103,  104,  105,  106,  107,  108,  109,  110,  111,  112,\n          113,  114,  115,  116,  117,  118,  119,  120,  121,  122,\n          123,  124,    1,    9,   82,  128,  129,  130,  131,    9,\n          133,  134,  135,  136,  137,  138,    9,  162,  141,  142,\n          143,  144,  145,  146,  147,   86,  149,  150,    9,   82,\n           10,   11,   12,  156,  157,  158,  118,  160,  169,    3,\n            4,    5,    6,    7,    8,  168,   10,   11,   12,   13,\n           14,   31,   76,   33,   34,   35,   36,  168,   82,   83,\n           15,  143,  169,  119,  120,   89,   90,   91,  124,   93,\n          108,   95,  110,   97,   38,   39,  100,  133,    1,  108,\n          109,  105,  106,  107,  162,  167,    1,  111,  112,  118,\n           32,  169,  118,  117,  118,   59,   45,   46,   47,   48,\n           49,   50,   51,   52,  165,  129,   32,    9,  169,   73,\n           74,   75,   76,   77,   78,   79,  169,  143,   82,  168,\n          173,    9,  165,  161,  168,   89,   90,   91,   92,   93,\n           94,   95,   96,   97,   98,   99,  100,  101,  102,  103,\n          104,  105,  106,  107,  108,  109,  110,  111,  112,  113,\n          114,  115,  116,  117,  118,  119,  120,  121,  122,  123,\n          124,   84,  168,    9,  128,  129,  130,  131,  168,  133,\n          134,  135,  136,  137,  138,    1,    9,  141,  142,  143,\n          144,  145,  146,  147,   99,  149,  150,  108,  109,   10,\n           11,   12,  156,  157,  158,   32,  160,  118,    3,    4,\n            5,    6,    7,    8,  168,   10,   11,   12,   13,   14,\n           31,   76,   33,   34,   35,   72,   87,   82,    9,  142,\n           54,   50,   51,   52,   89,   90,   91,  169,   93,    9,\n           95,  118,   97,   38,   39,  100,  108,   15,  110,  165,\n          105,  106,  107,  164,  167,  165,  111,  112,   82,  169,\n          173,   85,  117,  118,   59,  118,  143,   53,   54,   55,\n           56,   57,   99,   59,  129,  134,  135,  136,   73,   74,\n           75,   76,   77,   78,   79,   71,  108,   82,  110,  142,\n          167,  152,  139,  140,   89,   90,   91,   92,   93,   94,\n           95,   96,   97,   98,   99,  100,  101,  102,  103,  104,\n          105,  106,  107,  108,  109,  110,  111,  112,  113,  114,\n          115,  116,  117,  118,  119,  120,  121,  122,  123,  124,\n            9,  118,   72,  128,  129,  130,  131,    1,  133,  134,\n          135,  136,  137,  138,    9,    9,  141,  142,  143,  144,\n          145,  146,  147,  169,  149,  150,  143,  173,   10,   11,\n           12,  156,  157,  158,    9,  160,   72,    3,    4,    5,\n            6,    7,    8,  168,   10,   11,   12,   13,   14,   31,\n          167,   33,   34,   35,   36,   37,   38,   39,   40,   41,\n           42,   43,   44,   10,   11,   12,  108,  165,  110,  139,\n          140,  169,   38,   39,  118,  119,  120,  121,  122,  123,\n          124,  125,  126,  127,   31,  155,   33,   34,   35,   36,\n           37,   38,   39,   59,   10,   11,   12,  167,   17,   10,\n           11,   12,    9,  139,  140,   10,   11,   73,   74,   75,\n           76,   77,   78,   79,    9,   31,   82,   33,   34,  155,\n           31,   38,   39,   89,   90,   91,   92,   93,   94,   95,\n           96,   97,   98,   99,  100,  101,  102,  103,  104,  105,\n          106,  107,  108,  109,  110,  111,  112,  113,  114,  115,\n          116,  117,  118,  119,  120,  121,  122,  123,  124,  166,\n          118,  168,  128,  129,  130,  131,    9,  133,  134,  135,\n          136,  137,  138,   82,    9,  141,  142,  143,  144,  145,\n          146,  147,   72,  149,  150,  143,   10,   11,   12,    9,\n          156,  157,  158,    9,  160,    3,    4,    5,    6,    7,\n            8,   82,   10,   11,   12,   13,   14,   31,    9,   33,\n           34,   35,   36,   37,   38,   39,   40,   41,   42,   43,\n           44,   45,   46,   47,   48,   49,   50,   51,   52,   53,\n           54,   55,   56,   57,    9,   59,    1,  118,  119,  120,\n          121,  122,  123,  124,  125,  126,  127,   71,    9,  139,\n          140,   59,  161,  162,  163,   51,   52,    1,   15,   53,\n           54,  170,   77,   78,   15,   73,   74,   75,   76,   77,\n           78,   79,   77,   78,   82,  103,  104,   72,  108,  109,\n           15,   89,   90,   91,   92,   93,   94,   95,   96,   97,\n           98,   99,  100,  101,  102,  103,  104,  105,  106,  107,\n          108,  109,  110,  111,  112,  113,  114,  115,  116,  117,\n          118,  119,  120,  121,  122,  123,  124,    1,   72,   84,\n          128,  129,  130,  131,   17,  133,  134,  135,  136,  137,\n          138,  108,  109,  141,  142,  143,  144,  145,  146,  147,\n           31,  149,  150,   15,  139,  140,   15,   31,  156,  157,\n          158,    2,    3,    4,    5,    6,    7,    8,   15,  103,\n          155,   17,   13,   14,  108,   16,  110,  113,  114,   17,\n           17,  115,  167,   17,  118,  119,  120,  121,  122,  123,\n          124,  125,  126,  127,  128,  139,  140,   17,   17,    1,\n           17,   82,   32,   17,   17,   17,   32,    1,   32,   32,\n           32,  155,   53,   54,  169,   36,   32,   58,  173,   60,\n           61,   62,   63,   64,   65,   66,   67,   68,   69,   70,\n           32,   72,   73,   74,   75,   76,  170,  118,   32,   80,\n           81,   82,   32,   84,  118,   32,   32,   88,   89,   90,\n           91,    1,   93,   32,   95,   32,   97,   72,   32,  100,\n          101,  142,  143,   32,  105,  106,  107,  108,  109,  143,\n          111,  112,   32,   32,   32,   82,  117,  118,   32,   32,\n          161,  162,  163,  124,   86,   32,  167,   32,  129,  130,\n          131,   32,   86,  167,   36,   38,   36,   36,   36,   36,\n          141,  142,   36,  144,  145,  146,  147,  148,  149,  150,\n          151,  118,   38,   38,   38,   59,  157,  158,   38,   39,\n          161,  162,  163,  164,  139,  140,  167,   77,   78,   79,\n          171,  172,  173,   39,   82,  142,   86,   72,   71,   85,\n          155,   92,   92,   79,   94,   94,   96,   99,   98,  115,\n           82,  116,   72,   73,  161,  162,  163,   84,  108,   87,\n           91,   84,  133,  165,   84,  137,   96,  169,   88,  119,\n          120,  165,  142,  102,  124,  169,    1,   98,  159,  152,\n           99,   99,  132,  133,  134,  135,  136,   17,   18,   19,\n           20,   21,   22,   23,   24,   25,   26,   27,   28,   29,\n           30,  102,    1,  159,  124,   38,   39,   32,   72,  164,\n          167,  172,   -1,   -1,   -1,  165,  138,    1,   -1,  169,\n          170,  141,  142,  137,  144,  145,  146,  147,  148,  149,\n          150,   61,   62,   32,   -1,  152,   -1,  157,  158,  155,\n          155,   -1,   72,   76,    0,    1,  155,  167,   32,   82,\n          155,  155,  172,  173,  161,  165,   89,   90,   91,  167,\n           93,   86,   95,  160,   97,  165,  165,  100,  166,   38,\n           39,  165,  105,  106,  107,  139,  140,  165,  111,  112,\n          165,  165,  165,  165,  117,  118,  165,   86,  165,  165,\n          165,  155,  165,  165,  165,  165,  129,  165,  165,  165,\n          169,  166,   86,  167,  166,  166,  166,   76,  166,  139,\n          140,  167,  167,   82,  167,  167,  167,   72,   73,  167,\n           89,   90,   91,  167,   93,  155,   95,  160,   97,   84,\n           86,  100,  167,   88,  168,  167,  105,  106,  107,  167,\n          165,  167,  111,  112,  169,  167,  167,  167,  117,  118,\n          167,  167,  108,  167,  110,   72,   73,  167,  167,  115,\n          129,  167,  167,  119,  120,  167,  165,   84,  124,  124,\n          169,   88,  167,  167,  167,  167,  132,  133,  134,  135,\n          136,  165,  167,  169,  167,  169,  167,  142,  167,  144,\n          145,  146,  147,  148,  149,  150,  167,  167,  170,  167,\n          156,   32,  157,  158,  167,  167,  167,  124,  167,  165,\n          167,  169,  167,  169,  170,  168,  168,  172,  173,  168,\n          168,  168,  168,  168,  168,  142,  168,  144,  145,  146,\n          147,  148,  149,  150,   32,  168,  168,  168,  168,  168,\n          157,  158,    1,  168,  168,   76,  168,  168,  168,  168,\n          167,   82,  168,  168,  168,  172,  173,  168,   89,   90,\n           91,  168,   93,  168,   95,    1,   97,  168,  168,  100,\n          168,  168,    1,  168,  105,  106,  107,  168,   76,  168,\n          111,  112,  168,  168,   82,  168,  117,  118,  168,  168,\n          168,   89,   90,   91,  168,   93,  168,   95,  129,   97,\n          168,  168,  100,   32,  168,  168,  168,  105,  106,  107,\n          169,   76,  169,  111,  112,  169,  169,   82,  169,  117,\n          118,  169,  169,  169,   89,   90,   91,   86,   93,   31,\n           95,  129,   97,  169,    1,  100,  169,  169,  173,  169,\n          105,  106,  107,  102,  103,  104,  111,  112,  170,  108,\n           86,  170,  117,  118,  170,   84,  170,  170,  170,  170,\n          119,  120,  170,  170,  129,  124,  102,  103,  104,  170,\n          170,  170,  108,  132,  133,  134,  135,  136,  170,  170,\n          170,  170,  170,  119,  120,  170,  170,  170,  124,  170,\n          119,  120,  170,  170,  170,  124,  132,  133,  134,  135,\n          136,  170,  167,  170,  133,  171,  165,  170,   -1,   -1,\n          169,  170,   -1,  142,   -1,   -1,  118,   84,  120,  121,\n          122,  123,  124,  125,  126,  127,   -1,   -1,   -1,  165,\n           -1,   -1,   -1,  169,  170,  164,   -1,   -1,  167,   -1,\n           -1,  143,   -1,   -1,  173,   -1,   -1,   -1,   -1,   -1,\n           -1,   -1,  119,  120,   -1,   -1,   -1,  124,   -1,   -1,\n           -1,   -1,   -1,   -1,   -1,  167,  133,   -1,   -1,   -1,\n           -1,   -1,   -1,   -1,   -1,  142,   -1,   -1,   -1,   -1,\n           -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,\n           -1,   -1,   -1,   -1,   -1,   -1,   -1,  164,   -1,   -1,\n          167,   -1,   -1,   -1,   -1,   -1,  173\n    );\n\n    protected array $actionBase = array(\n            0,  156,   -3,  315,  474,  474,  880, 1074, 1271, 1294,\n          749,  675,  531,  559,  836, 1031, 1031, 1046, 1031,  828,\n         1005,   42,   59,   59,   59,  963,  898,  632,  632,  898,\n          632,  997,  997,  997,  997, 1061, 1061,  -63,  -63,   96,\n         1232, 1199,  255,  255,  255,  255,  255, 1265,  255,  255,\n          255,  255,  255, 1265,  255,  255,  255,  255,  255,  255,\n          255,  255,  255,  255,  255,  255,  255,  255,  255,  255,\n          255,  255,  255,  255,  255,  255,  255,  255,  255,  255,\n          255,  255,  255,  255,  255,  255,  255,  255,  255,  255,\n          255,  255,  255,  255,  255,  255,  255,  255,  255,  255,\n          255,  255,  255,  255,  255,  255,  255,  255,  255,  255,\n          255,  255,  255,  255,  255,  255,  255,  255,  255,  255,\n          255,  255,  255,  255,  255,  255,  255,  255,  255,  255,\n          255,  255,  255,  255,  255,  255,  255,  255,  255,  255,\n          255,  255,  255,  255,  255,  255,  255,  255,  255,  255,\n          255,  255,  255,  255,  255,  255,  255,  255,  255,  255,\n          255,  255,  255,  255,  255,  255,  255,   77,  194,  120,\n          205, 1197,  783, 1150, 1163, 1152, 1166, 1145, 1144, 1151,\n         1156, 1167, 1261, 1263,  889, 1254, 1267, 1158,  972, 1147,\n         1162,  962,  616,  616,  616,  616,  616,  616,  616,  616,\n          616,  616,  616,  616,  616,  616,  616,  616,  616,  616,\n          616,  616,  616,  616,  616,  616,  616,  616,  616,   19,\n           35,  535,   41,   41,   41,   41,   41,   41,   41,   41,\n           41,   41,   41,   41,   41,   41,   41,   41,   41,   41,\n           41,   41,  529,  529,  529,  910,  910,  524,  299, 1113,\n         1075, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113,  140,\n           28, 1000,  493,  493,  458,  458,  458,  458,  458,  696,\n         1328, 1301,  171,  171,  171,  171, 1363, 1363,  -70,  523,\n          248,  756,  291,  197,  -87,  644,   38,  199,  323,  323,\n          482,  482,  233,  233,  482,  482,  482,  324,  324,   94,\n           94,   94,   94,   82,  249,  860,   67,   67,   67,   67,\n          860,  860,  860,  860,  913,  869,  860, 1036, 1049,  860,\n          860,  370,  645,  966,  646,  646,  398,  -72,  -72,  398,\n           64,  -72,  294,  286,  257,  859,   91,  433,  257, 1073,\n          404,  686,  686,  815,  686,  686,  686,  923,  610,  923,\n         1141,  902,  902,  861,  807,  964, 1198, 1168,  901, 1252,\n          929, 1253, 1200,  342,  251,  -56,  263,  550,  806, 1139,\n         1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139,\n         1139, 1195,  523, 1141,  -25, 1247, 1249, 1195, 1195, 1195,\n          523,  523,  523,  523,  523,  523,  523,  523,  870,  523,\n          523,  694,  -25,  625,  635,  -25,  896,  523,  915,   77,\n           77,   77,   77,   77,   77,   77,   77,   77,   77,   77,\n          178,   77,   77,  194,   13,   13,   77,  200,  121,   13,\n           13,   13,  -11,   13,   77,   77,   77,  610,  886,  849,\n          663,  283,  874,  114,  886,  886,  886,   71,    9,   76,\n          809,  888,  288,  882,  882,  882,  907,  986,  986,  882,\n          903,  882,  907,  882,  882,  986,  986,  875,  986,  274,\n          620,  465,  597,  624,  986,  340,  882,  882,  882,  882,\n          916,  986,  127,  139,  639,  882,  329,  287,  882,  882,\n          916,  858,  876,  908,  986,  986,  986,  916,  545,  908,\n          908,  908,  931,  936,  864,  872,  445,  431,  679,  232,\n          924,  872,  872,  882,  605,  864,  872,  864,  872,  933,\n          872,  872,  872,  864,  872,  903,  533,  872,  813,  665,\n          218,  872,  882,   20, 1008, 1009,  800, 1010, 1002, 1013,\n         1069, 1014, 1016, 1171,  982, 1028, 1004, 1020, 1071,  998,\n          995,  885,  792,  793,  921,  914,  979,  897,  897,  897,\n          975,  977,  897,  897,  897,  897,  897,  897,  897,  897,\n          792,  932,  926,  899, 1037,  796,  810, 1114,  857, 1214,\n         1264, 1036, 1008, 1016,  804, 1004, 1020,  998,  995,  856,\n          853,  844,  851,  843,  840,  808,  814,  871, 1116, 1119,\n         1021,  920,  811, 1085, 1038, 1211, 1044, 1045, 1047, 1088,\n         1123,  942, 1125, 1216,  895, 1217, 1218,  965, 1051, 1173,\n          897,  974,  873,  968, 1049,  978,  792,  969, 1129, 1130,\n         1081,  961, 1097, 1098, 1072,  911,  884,  970, 1219, 1059,\n         1060, 1062, 1176, 1177,  930, 1082,  996, 1099,  912, 1058,\n         1100, 1101, 1105, 1106, 1179, 1222, 1182,  922, 1183,  945,\n          879, 1077,  909, 1223,  165,  892,  893,  906, 1068,  683,\n         1035, 1184, 1208, 1229, 1108, 1109, 1110, 1230, 1231, 1024,\n          946, 1083,  900, 1084, 1078,  947,  948,  689,  905, 1132,\n          890,  891,  904,  705,  768, 1238, 1239, 1240, 1025,  877,\n          894,  951,  953, 1133,  887, 1135, 1241,  771,  954, 1242,\n         1115,  816,  817,  521,  784,  747,  818,  881, 1194,  925,\n          865,  878, 1067,  817,  883,  955, 1245,  957,  958,  959,\n         1111,  960, 1086, 1246,    0,    0,    0,    0,    0,    0,\n            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n            0,    0,    0,    0,    0,    0,    0,    0,  789,  789,\n          789,  789,  789,  789,  789,  789,  789,  632,  632,  632,\n          632,  789,  789,  789,  789,  789,  789,  789,  632,  789,\n          789,  789,  632,  632,    0,    0,  632,    0,  789,  789,\n          789,  789,  789,  789,  789,  789,  789,  789,  789,  789,\n          789,  789,  789,  789,  789,  789,  789,  789,  789,  789,\n          789,  789,  789,  789,  789,  789,  789,  789,  789,  789,\n          789,  789,  789,  789,  789,  789,  789,  789,  789,  789,\n          789,  789,  789,  789,  789,  789,  789,  789,  789,  789,\n          789,  789,  789,  789,  789,  789,  789,  789,  789,  789,\n          789,  789,  789,  789,  789,  789,  789,  789,  789,  789,\n          789,  789,  789,  789,  789,  789,  789,  789,  789,  789,\n          789,  789,  789,  789,  789,  789,  789,  789,  789,  789,\n          789,  789,  789,  789,  789,  789,  789,  789,  789,  789,\n          789,  789,  789,  789,  789,  789,  789,  789,  789,  789,\n          789,  789,  789,  789,  789,  789,  789,  789,  789,  789,\n          789,  789,  789,  789,  789,  789,  789,  789,  789,  789,\n          789,  789,  789,  789,  616,  616,  616,  616,  616,  616,\n          616,  616,  616,  616,  616,  616,  616,  616,  616,  616,\n          616,  616,  616,  616,  616,  616,  616,  616,  616,    0,\n            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n            0,    0,    0,    0,    0,    0,  616,  616,  616,  616,\n          616,  616,  616,  616,  616,  616,  616,  616,  616,  616,\n          616,  616,  616,  616,  616,  616,  616,  616,  616,  616,\n          616,  616,  823,  823,  616,  616,  823,  823,  823,  823,\n          823,  823,  823,  823,  823,  823,  616,  616,    0,  616,\n          616,  616,  616,  616,  616,  616,  875,  823,  823,  324,\n          324,  324,  324,  823,  823,  396,  396,  396,  823,  324,\n          823,   64,  324,  823,   64,  823,  823,  823,  823,  823,\n          823,  823,  823,  823,    0,    0,  823,  823,  823,  823,\n          -25,  -72,  823,  903,  903,  903,  903,  823,  823,  823,\n          823,  -72,  -72,  823,  -57,  -57,  823,  823,    0,    0,\n            0,  324,  324,  -25,    0,    0,  -25,    0,    0,  903,\n          903,  823,   64,  875,  446,  823,  342,    0,    0,    0,\n            0,    0,    0,    0,  -25,  903,  -25,  523,  -72,  -72,\n          523,  523,   13,   77,  446,  612,  612,  612,  612,   77,\n            0,    0,    0,    0,    0,  610,  875,  875,  875,  875,\n          875,  875,  875,  875,  875,  875,  875,  875,  903,    0,\n          875,    0,  875,  875,  903,  903,  903,    0,    0,    0,\n            0,    0,    0,    0,    0,  986,    0,    0,    0,    0,\n            0,    0,    0,  903,    0,  986,    0,    0,    0,    0,\n            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n            0,    0,    0,    0,    0,  903,    0,    0,    0,    0,\n            0,    0,    0,    0,    0,  897,  911,    0,    0,  911,\n            0,  897,  897,  897,    0,    0,    0,  905,  887\n    );\n\n    protected array $actionDefault = array(\n            3,32767,32767,32767,  102,  102,32767,32767,32767,32767,\n        32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,\n        32767,32767,32767,32767,32767,32767,32767,32767,32767,  100,\n        32767,  632,  632,  632,  632,32767,32767,  257,  102,32767,\n        32767,  503,  417,  417,  417,32767,32767,32767,  576,  576,\n          576,  576,  576,   17,32767,32767,32767,32767,32767,32767,\n        32767,  503,32767,32767,32767,32767,32767,32767,32767,32767,\n        32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,\n        32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,\n        32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,\n        32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,\n        32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,\n        32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,\n        32767,32767,   36,    7,    8,   10,   11,   49,  338,  100,\n        32767,32767,32767,32767,32767,32767,32767,32767,  102,32767,\n        32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,\n        32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,\n        32767,  404,  625,32767,32767,32767,32767,32767,32767,32767,\n        32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,\n        32767,32767,  497,  507,  485,  486,  488,  489,  416,  577,\n          631,  344,  628,  342,  415,  146,  354,  343,  245,  261,\n          508,  262,  509,  512,  513,  218,  401,  150,  151,  448,\n          504,  450,  502,  506,  449,  422,  429,  430,  431,  432,\n          433,  434,  435,  436,  437,  438,  439,  440,  441,  420,\n          421,  505,  482,  481,  480,32767,32767,  446,  447,32767,\n        32767,32767,32767,32767,32767,32767,32767,  102,32767,  451,\n          454,  419,  452,  453,  470,  471,  468,  469,  472,32767,\n          323,32767,  473,  474,  475,  476,32767,32767,  382,  196,\n          380,32767,  477,32767,  111,  455,  323,  111,32767,32767,\n        32767,32767,32767,32767,32767,32767,32767,  461,  462,32767,\n        32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,\n        32767,32767,32767,32767,32767,32767,  102,32767,32767,32767,\n          100,  520,  570,  479,  456,  457,32767,  545,32767,  102,\n        32767,  547,32767,32767,32767,32767,32767,32767,32767,32767,\n          572,  443,  445,  540,  626,  423,  629,32767,  533,  100,\n          196,32767,  546,  196,  196,32767,32767,32767,32767,32767,\n        32767,32767,32767,32767,32767,  571,32767,  639,  533,  110,\n          110,  110,  110,  110,  110,  110,  110,  110,  110,  110,\n          110,32767,  196,  110,32767,  110,  110,32767,32767,  100,\n          196,  196,  196,  196,  196,  196,  196,  196,  548,  196,\n          196,  191,32767,  271,  273,  102,  594,  196,  550,32767,\n        32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,\n        32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,\n        32767,32767,  404,32767,32767,32767,32767,  533,  466,  139,\n        32767,  535,  139,  578,  458,  459,  460,  578,  578,  578,\n          319,  296,32767,32767,32767,32767,32767,  548,  548,  100,\n          100,  100,  100,32767,32767,32767,32767,  111,  519,   99,\n           99,   99,   99,   99,  103,  101,32767,32767,32767,32767,\n          226,32767,  101,  101,   99,32767,  101,  101,32767,32767,\n          226,  228,  215,  230,32767,  598,  599,  226,  101,  230,\n          230,  230,  250,  250,  522,  325,  101,   99,  101,  101,\n          198,  325,  325,32767,  101,  522,  325,  522,  325,  200,\n          325,  325,  325,  522,  325,32767,  101,  325,  217,   99,\n           99,  325,32767,32767,32767,32767,  535,32767,32767,32767,\n        32767,32767,32767,32767,  225,32767,32767,32767,32767,32767,\n        32767,32767,32767,  565,32767,  583,  596,  464,  465,  467,\n          582,  580,  490,  491,  492,  493,  494,  495,  496,  499,\n          627,32767,  539,32767,32767,32767,  353,32767,  637,32767,\n        32767,32767,    9,   74,  528,   42,   43,   51,   57,  554,\n          555,  556,  557,  551,  552,  558,  553,32767,32767,32767,\n        32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,\n        32767,32767,32767,  638,32767,  578,32767,32767,32767,32767,\n          463,  560,  604,32767,32767,  579,  630,32767,32767,32767,\n        32767,32767,32767,32767,32767,  139,32767,32767,32767,32767,\n        32767,32767,32767,32767,32767,32767,  565,32767,  137,32767,\n        32767,32767,32767,32767,32767,32767,32767,  561,32767,32767,\n        32767,  578,32767,32767,32767,32767,  321,  318,32767,32767,\n        32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,\n        32767,32767,32767,32767,  578,32767,32767,32767,32767,32767,\n          298,32767,  315,32767,32767,32767,32767,32767,32767,32767,\n        32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,\n        32767,  400,  535,  301,  303,  304,32767,32767,32767,32767,\n          376,32767,32767,32767,32767,32767,32767,32767,32767,32767,\n        32767,32767,32767,32767,  153,  153,    3,    3,  356,  153,\n          153,  153,  356,  356,  153,  356,  356,  356,  153,  153,\n          153,  153,  153,  153,  153,  283,  186,  265,  268,  250,\n          250,  153,  368,  153,  402,  402,  411\n    );\n\n    protected array $goto = array(\n          201,  169,  201,  201,  201, 1069,  598,  719,  448,  684,\n          644,  681,  443,  345,  341,  342,  344,  615,  447,  346,\n          449,  661,  481,  728,  570,  570,  570,  570, 1245,  626,\n          172,  172,  172,  172,  225,  202,  198,  198,  182,  184,\n          220,  198,  198,  198,  198,  198, 1195,  199,  199,  199,\n          199,  199, 1195,  192,  193,  194,  195,  196,  197,  222,\n          220,  223,  557,  558,  438,  559,  562,  563,  564,  565,\n          566,  567,  568,  569,  173,  174,  175,  200,  176,  177,\n          178,  170,  179,  180,  181,  183,  219,  221,  224,  242,\n          247,  248,  259,  260,  262,  263,  264,  265,  266,  267,\n          268,  272,  273,  274,  275,  282,  285,  297,  298,  324,\n          325,  444,  445,  446,  620,  226,  227,  228,  229,  230,\n          231,  232,  233,  234,  235,  236,  237,  238,  239,  240,\n          241,  193,  194,  195,  196,  197,  222,  203,  204,  205,\n          206,  243,  185,  186,  207,  187,  208,  204,  188,  244,\n          203,  168,  209,  210,  189,  211,  212,  213,  190,  214,\n          215,  171,  216,  217,  218,  191,  287,  284,  287,  287,\n          883,  255,  255,  255,  255,  255, 1125,  605,  487,  487,\n          622,  758,  660,  662, 1103,  359,  682,  487, 1075, 1074,\n          706,  709, 1041,  717,  726, 1037,  733,  922,  879,  922,\n          922,  253,  253,  253,  253,  250,  256,  646,  646, 1078,\n         1079, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332,\n         1332,  880,  351,  938,  933,  934,  947,  889,  935,  886,\n          936,  937,  887,  890,  476,  941,  894,  476, 1044, 1044,\n          893,  364,  364,  364,  364,  352,  351,  532, 1131, 1127,\n         1128, 1351, 1351,  331,  315, 1351, 1351, 1351, 1351, 1351,\n         1351, 1351, 1351, 1351, 1351, 1069, 1301, 1072, 1072,  704,\n          983, 1301, 1301, 1064, 1080, 1081, 1069,  942, 1301,  943,\n          458, 1069,  881, 1069, 1069, 1069, 1069, 1069, 1069, 1069,\n         1069, 1069,  897,  855, 1069, 1069, 1069, 1069,  677,  678,\n         1301,  695,  696,  697, 1006, 1301, 1301, 1301, 1301,  450,\n          909, 1301,  436,  896, 1301, 1301, 1382, 1382, 1382, 1382,\n          915,  581,  574,  499,  612,  450,  367,  971,  971,  955,\n          501, 1076, 1076,  956, 1400, 1400,  367,  367,  688, 1087,\n         1083, 1084,  572,  411,  414,  623,  627,  572,  572,  367,\n          367, 1400,  357,  367,  572, 1417, 1377, 1378,  317,  574,\n          581,  607,  608,  318,  618,  624, 1390,  640,  641, 1027,\n          576, 1403, 1403,  367,  367,   28,  474,  520,  442,  521,\n          635, 1000, 1000, 1000, 1000,  527,  409,  474, 1348, 1348,\n          994, 1001, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348,\n         1348, 1348,  633,  647,  650,  651,  652,  653,  674,  675,\n          676,  730,  732,  561,  561,  258,  258,  561,  561,  561,\n          561,  561,  561,  561,  561,  561,  561,  610, 1362,  467,\n          683,  467,  876,  616,  638,  876,  467,  467, 1191,  861,\n         1373,  360,  361, 1093,  456, 1373, 1373,  560,  560,  705,\n          432,  560, 1373,  560,  560,  560,  560,  560,  560,  560,\n          560, 1277,  975,  575,  602,  575, 1278, 1281,  976,  575,\n         1282,  602,  689,  412,  480, 1384, 1384, 1384, 1384,  347,\n          873,  716,  576,  861,  876,  861,  490,  619,  491,  492,\n          639,    8,  857,    9,  902,  907,  989,  716, 1408, 1409,\n          716, 1369,  418, 1296,  278,  899,  330, 1174,  424,  425,\n         1292,  330,  330,  693, 1049,  694, 1114,  429,  430,  431,\n          761,  707, 1060,  905,  433, 1102, 1104, 1107,  355,  467,\n          467,  467,  467,  467,  467,  467,  467,  467,  467,  467,\n          467,  419,  339,  467,  911,  467,  467, 1294,  628,  629,\n         1116,  497,  960, 1181,  621, 1144, 1371, 1371, 1116, 1118,\n         1297, 1298, 1011, 1284, 1046, 1151, 1179, 1152,  731,  871,\n          528,  722,  901, 1142,  687, 1025, 1284,  496, 1375, 1376,\n          895,  910,  898, 1113, 1117,  998,  427,  727, 1165, 1299,\n         1359, 1360, 1291, 1030,  386, 1009, 1002,    0,  757,    0,\n            0,  573, 1039, 1034,  654,  656,  658,    0,    0,    0,\n            0,    0,    0,    0,    0,  876,    0,    0,  999,    0,\n          766,  766,    0,    0,    0,    0,    0,    0,    0,    0,\n            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n         1163,  914\n    );\n\n    protected array $gotoCheck = array(\n           42,   42,   42,   42,   42,   73,  127,   73,   66,   66,\n           56,   56,   66,   66,   66,   66,   66,   66,   66,   66,\n           66,   66,  159,    9,  107,  107,  107,  107,  159,  107,\n           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,\n           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,\n           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,\n           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,\n           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,\n           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,\n           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,\n           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,\n           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,\n           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,\n           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,\n           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,\n           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,\n           42,   42,   42,   42,   42,   42,   23,   23,   23,   23,\n           15,    5,    5,    5,    5,    5,   15,   48,  157,  157,\n          134,   48,   48,   48,  131,   97,   48,  157,  119,  119,\n           48,   48,   48,   48,   48,   48,   48,   25,   25,   25,\n           25,    5,    5,    5,    5,    5,    5,  108,  108,  120,\n          120,  108,  108,  108,  108,  108,  108,  108,  108,  108,\n          108,   26,  177,   15,   15,   15,   15,   15,   15,   15,\n           15,   15,   15,   15,   83,   15,   15,   83,  107,  107,\n           15,   24,   24,   24,   24,  177,  177,   76,   15,   15,\n           15,  179,  179,  178,  178,  179,  179,  179,  179,  179,\n          179,  179,  179,  179,  179,   73,   73,   89,   89,   89,\n           89,   73,   73,   89,   89,   89,   73,   65,   73,   65,\n           83,   73,   27,   73,   73,   73,   73,   73,   73,   73,\n           73,   73,   35,    6,   73,   73,   73,   73,   86,   86,\n           73,   86,   86,   86,   49,   73,   73,   73,   73,  118,\n           35,   73,   43,   35,   73,   73,    9,    9,    9,    9,\n           45,   76,   76,   84,  181,  118,   14,    9,    9,   73,\n           84,  118,  118,   73,  191,  191,   14,   14,  118,  118,\n          118,  118,   19,   59,   59,   59,   59,   19,   19,   14,\n           14,  191,  188,   14,   19,   14,  187,  187,   76,   76,\n           76,   76,   76,   76,   76,   76,  190,   76,   76,  103,\n           14,  191,  191,   14,   14,   76,   19,  163,   13,  163,\n           13,   19,   19,   19,   19,  163,   62,   19,  180,  180,\n           19,   19,  180,  180,  180,  180,  180,  180,  180,  180,\n          180,  180,   81,   81,   81,   81,   81,   81,   81,   81,\n           81,   81,   81,  182,  182,    5,    5,  182,  182,  182,\n          182,  182,  182,  182,  182,  182,  182,  104,   14,   23,\n           64,   23,   22,    2,    2,   22,   23,   23,  158,   12,\n          134,   97,   97,  115,  113,  134,  134,  165,  165,  117,\n           14,  165,  134,  165,  165,  165,  165,  165,  165,  165,\n          165,   79,   79,    9,    9,    9,   79,   79,   79,    9,\n           79,    9,  121,    9,    9,  134,  134,  134,  134,   29,\n           18,    7,   14,   12,   22,   12,    9,    9,    9,    9,\n           80,   46,    7,   46,   39,    9,   92,    7,    9,    9,\n            7,  134,   28,   20,   24,   37,   24,  156,   82,   82,\n          169,   24,   24,   82,  110,   82,  133,   82,   82,   82,\n           99,   82,  114,    9,   82,  130,  130,  130,   82,   23,\n           23,   23,   23,   23,   23,   23,   23,   23,   23,   23,\n           23,   31,    9,   23,   41,   23,   23,   14,   17,   17,\n          134,  160,   17,   17,    8,    8,  134,  134,  134,  136,\n           20,   20,   96,   20,   17,  149,  149,  149,    8,   20,\n            8,    8,   17,    8,   17,   17,   20,  185,  185,  185,\n           17,   16,   16,   16,   16,   93,   93,   93,  152,   20,\n           20,   20,   17,   50,  141,   16,   50,   -1,   50,   -1,\n           -1,   50,   50,   50,   85,   85,   85,   -1,   -1,   -1,\n           -1,   -1,   -1,   -1,   -1,   22,   -1,   -1,   16,   -1,\n           24,   24,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,\n           -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,\n           16,   16\n    );\n\n    protected array $gotoBase = array(\n            0,    0, -303,    0,    0,  170,  280,  471,  543,   10,\n            0,    0,  136,   31,   22, -186,  111,   66,  164,   71,\n           95,    0,  148,  160,  235,  191,  214,  275,  155,  176,\n            0,   86,    0,    0,    0,  -92,    0,  156,    0,  165,\n            0,   85,   -1,  286,    0,  291, -270,    0, -558,  284,\n          579,    0,    0,    0,    0,    0,  -33,    0,    0,  294,\n            0,    0,  341,    0,  184,  261, -237,    0,    0,    0,\n            0,    0,    0,   -5,    0,    0,  -32,    0,    0,   37,\n          172,   32,   -3,  -50, -167,  105, -444,    0,    0,  -21,\n            0,    0,  161,  274,    0,    0,  101, -318,    0,   97,\n            0,    0,    0,  331,  381,    0,    0,   -7,  -38,    0,\n          131,    0,    0,  158,   90,  162,    0,  159,   39, -100,\n          -83,  173,    0,    0,    0,    0,    0,    4,    0,    0,\n          522,  182,    0,  127,  169,    0,   99,    0,    0,    0,\n            0, -171,    0,    0,    0,    0,    0,    0,    0,  287,\n            0,    0,  126,    0,    0,    0,  144,  141,  188, -255,\n           93,    0,    0, -138,    0,  202,    0,    0,    0,  128,\n            0,    0,    0,    0,    0,    0,    0,  -82,  -74,    6,\n          143,  292,  168,    0,    0,  270,    0,  -31,  319,    0,\n          332,   20,    0,    0\n    );\n\n    protected array $gotoDefault = array(\n        -32768,  533,  768,    7,  769,  964,  844,  853,  597,  551,\n          729,  356,  648,  439, 1367,  940, 1180,  617,  872, 1310,\n         1316,  475,  875,  336,  755,  952,  923,  924,  415,  402,\n          888,  413,  672,  649,  514,  908,  471,  900,  506,  903,\n          470,  912,  167,  435,  530,  916,    6,  919,  579,  950,\n         1004,  403,  927,  404,  700,  929,  601,  931,  932,  410,\n          416,  417, 1185,  609,  645,  944,  261,  603,  945,  401,\n          946,  954,  406,  408,  710,  486,  525,  519,  428, 1146,\n          604,  632,  669,  464,  493,  643,  655,  642,  500,  451,\n          434,  335,  988,  996,  507,  484, 1010,  358, 1018,  763,\n         1193,  663,  509, 1026,  664, 1033, 1036,  552,  553,  498,\n         1048,  270, 1051,  510, 1061,   26,  690, 1066, 1067,  691,\n          665, 1089,  666,  692,  667, 1091,  483,  599, 1194,  482,\n         1106, 1112,  472, 1115, 1356,  473, 1119,  269, 1122,  286,\n          362,  385,  452, 1129, 1130,   12, 1136,  720,  721,   25,\n          280,  529, 1164,  711, 1170,  279, 1173,  469, 1192,  468,\n         1265, 1267,  580,  511, 1285,  321, 1288,  703,  526, 1293,\n          465, 1358,  466,  554,  494,  343,  555, 1401,  314,  365,\n          340,  571,  322,  366,  556,  495, 1364, 1372,  337,   34,\n         1391, 1402,  614,  637\n    );\n\n    protected array $ruleToNonTerminal = array(\n            0,    1,    3,    3,    2,    5,    5,    6,    6,    6,\n            6,    6,    6,    6,    6,    6,    6,    6,    6,    6,\n            6,    6,    6,    6,    6,    6,    6,    6,    6,    6,\n            6,    6,    6,    6,    6,    6,    6,    6,    6,    6,\n            6,    6,    6,    6,    6,    6,    6,    6,    6,    6,\n            6,    6,    6,    6,    6,    6,    6,    6,    6,    6,\n            6,    6,    6,    6,    6,    6,    6,    6,    6,    6,\n            6,    6,    6,    6,    6,    6,    6,    7,    7,    7,\n            7,    7,    7,    7,    7,    8,    8,    9,   10,   11,\n           11,   11,   12,   12,   13,   13,   14,   15,   15,   16,\n           16,   17,   17,   18,   18,   21,   21,   22,   23,   23,\n           24,   24,    4,    4,    4,    4,    4,    4,    4,    4,\n            4,    4,    4,    4,   29,   29,   30,   30,   32,   34,\n           34,   28,   36,   36,   33,   38,   38,   35,   35,   37,\n           37,   39,   39,   31,   40,   40,   41,   43,   44,   44,\n           45,   45,   46,   46,   48,   47,   47,   47,   47,   49,\n           49,   49,   49,   49,   49,   49,   49,   49,   49,   49,\n           49,   49,   49,   49,   49,   49,   49,   49,   49,   49,\n           49,   49,   49,   25,   25,   50,   69,   69,   72,   72,\n           71,   70,   70,   63,   75,   75,   76,   76,   77,   77,\n           78,   78,   79,   79,   80,   80,   80,   80,   26,   26,\n           27,   27,   27,   27,   27,   88,   88,   90,   90,   83,\n           83,   91,   91,   92,   92,   92,   84,   84,   87,   87,\n           85,   85,   93,   94,   94,   57,   57,   65,   65,   68,\n           68,   68,   67,   95,   95,   96,   58,   58,   58,   58,\n           97,   97,   98,   98,   99,   99,  100,  101,  101,  102,\n          102,  103,  103,   55,   55,   51,   51,  105,   53,   53,\n          106,   52,   52,   54,   54,   64,   64,   64,   64,   81,\n           81,  109,  109,  111,  111,  112,  112,  112,  112,  112,\n          112,  112,  112,  110,  110,  110,  115,  115,  115,  115,\n           89,   89,  118,  118,  118,  119,  119,  116,  116,  120,\n          120,  122,  122,  123,  123,  117,  124,  124,  121,  125,\n          125,  125,  125,  113,  113,   82,   82,   82,   20,   20,\n           20,  128,  128,  128,  128,  129,  129,  129,  127,  126,\n          126,  131,  131,  131,  130,  130,   60,  132,  132,  133,\n           61,  135,  135,  136,  136,  137,  137,   86,  138,  138,\n          138,  138,  138,  138,  138,  138,  144,  144,  145,  145,\n          146,  146,  146,  146,  146,  147,  148,  148,  143,  143,\n          139,  139,  142,  142,  150,  150,  149,  149,  149,  149,\n          149,  149,  149,  149,  149,  149,  140,  151,  151,  153,\n          152,  152,  141,  141,  114,  114,  154,  154,  156,  156,\n          156,  155,  155,   62,  104,  157,  157,   56,   56,   42,\n           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,\n           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,\n           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,\n           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,\n           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,\n           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,\n           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,\n           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,\n           42,   42,   42,   42,   42,   42,   42,   42,   42,   42,\n           42,   42,   42,   42,   42,   42,  164,  165,  165,  166,\n          158,  158,  163,  163,  167,  168,  168,  169,  170,  171,\n          171,  171,  171,   19,   19,   73,   73,   73,   73,  159,\n          159,  159,  159,  173,  173,  162,  162,  162,  160,  160,\n          179,  179,  179,  179,  179,  179,  179,  179,  179,  179,\n          180,  180,  180,  108,  182,  182,  182,  182,  161,  161,\n          161,  161,  161,  161,  161,  161,   59,   59,  176,  176,\n          176,  176,  176,  183,  183,  172,  172,  172,  172,  184,\n          184,  184,  184,  184,   74,   74,   66,   66,   66,   66,\n          134,  134,  134,  134,  187,  186,  175,  175,  175,  175,\n          175,  175,  174,  174,  174,  185,  185,  185,  185,  107,\n          181,  189,  189,  188,  188,  190,  190,  190,  190,  190,\n          190,  190,  190,  178,  178,  178,  178,  177,  192,  191,\n          191,  191,  191,  191,  191,  191,  191,  193,  193,  193,\n          193\n    );\n\n    protected array $ruleToLength = array(\n            1,    1,    2,    0,    1,    1,    1,    1,    1,    1,\n            1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n            1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n            1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n            1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n            1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n            1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n            1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n            1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n            1,    1,    1,    1,    1,    1,    1,    1,    1,    0,\n            1,    0,    1,    1,    2,    1,    3,    4,    1,    2,\n            0,    1,    1,    1,    1,    4,    3,    5,    4,    3,\n            4,    1,    3,    4,    1,    1,    8,    7,    2,    3,\n            1,    2,    3,    1,    2,    3,    1,    1,    3,    1,\n            3,    1,    2,    2,    3,    1,    3,    2,    3,    1,\n            3,    3,    2,    0,    1,    1,    1,    1,    1,    3,\n            7,   10,    5,    7,    9,    5,    3,    3,    3,    3,\n            3,    3,    1,    2,    5,    7,    9,    6,    5,    6,\n            3,    2,    1,    1,    1,    1,    0,    2,    1,    3,\n            8,    0,    4,    2,    1,    3,    0,    1,    0,    1,\n            0,    1,    3,    1,    1,    1,    1,    1,    8,    9,\n            7,    8,    7,    6,    8,    0,    2,    0,    2,    1,\n            2,    1,    2,    1,    1,    1,    0,    2,    0,    2,\n            0,    2,    2,    1,    3,    1,    4,    1,    4,    1,\n            1,    4,    2,    1,    3,    3,    3,    4,    4,    5,\n            0,    2,    4,    3,    1,    1,    7,    0,    2,    1,\n            3,    3,    4,    1,    4,    0,    2,    5,    0,    2,\n            6,    0,    2,    0,    3,    1,    2,    1,    1,    2,\n            0,    1,    3,    0,    2,    1,    1,    1,    1,    1,\n            1,    1,    1,    7,    9,    6,    1,    2,    1,    1,\n            1,    1,    1,    1,    1,    1,    3,    3,    3,    1,\n            3,    3,    3,    3,    3,    1,    3,    3,    1,    1,\n            2,    1,    1,    0,    1,    0,    2,    2,    2,    4,\n            3,    2,    4,    4,    3,    3,    1,    3,    1,    1,\n            3,    2,    2,    3,    1,    1,    2,    3,    1,    1,\n            2,    3,    1,    1,    3,    2,    0,    1,    5,    7,\n            5,    6,   10,    3,    5,    1,    1,    3,    0,    2,\n            4,    5,    4,    4,    4,    3,    1,    1,    1,    1,\n            1,    1,    0,    1,    1,    2,    1,    1,    1,    1,\n            1,    1,    1,    1,    1,    1,    2,    1,    3,    1,\n            1,    3,    0,    2,    0,    3,    5,    8,    1,    3,\n            3,    0,    2,    2,    2,    3,    1,    0,    1,    1,\n            3,    3,    3,    4,    4,    1,    1,    2,    2,    3,\n            3,    3,    3,    3,    3,    3,    3,    3,    3,    3,\n            3,    3,    2,    2,    2,    2,    3,    3,    3,    3,\n            3,    3,    3,    3,    3,    3,    3,    3,    3,    3,\n            3,    3,    3,    3,    2,    2,    2,    2,    3,    3,\n            3,    3,    3,    3,    3,    3,    3,    3,    3,    3,\n            5,    4,    3,    4,    4,    2,    2,    4,    2,    2,\n            2,    2,    2,    2,    2,    2,    2,    2,    2,    2,\n            1,    3,    2,    1,    2,    4,    2,    2,    8,    9,\n            8,    9,    9,   10,    9,   10,    8,    3,    2,    2,\n            1,    1,    0,    4,    2,    1,    3,    2,    1,    2,\n            2,    2,    4,    1,    1,    1,    1,    1,    1,    1,\n            1,    3,    1,    1,    1,    0,    1,    1,    0,    1,\n            1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n            3,    5,    3,    3,    4,    1,    1,    3,    1,    1,\n            1,    1,    1,    3,    2,    3,    0,    1,    1,    3,\n            1,    1,    1,    1,    1,    1,    3,    1,    1,    1,\n            4,    1,    4,    4,    0,    1,    1,    1,    3,    3,\n            1,    4,    2,    2,    1,    3,    1,    4,    3,    3,\n            3,    3,    1,    3,    1,    1,    3,    1,    1,    4,\n            1,    1,    1,    3,    1,    1,    2,    1,    3,    4,\n            3,    2,    0,    2,    2,    1,    2,    1,    1,    1,\n            4,    3,    3,    3,    3,    6,    3,    1,    1,    2,\n            1\n    );\n\n    protected function initReduceCallbacks(): void {\n        $this->reduceCallbacks = [\n            0 => null,\n            1 => static function ($self, $stackPos) {\n                 $self->semValue = $self->handleNamespaces($self->semStack[$stackPos-(1-1)]);\n            },\n            2 => static function ($self, $stackPos) {\n                 if ($self->semStack[$stackPos-(2-2)] !== null) { $self->semStack[$stackPos-(2-1)][] = $self->semStack[$stackPos-(2-2)]; } $self->semValue = $self->semStack[$stackPos-(2-1)];;\n            },\n            3 => static function ($self, $stackPos) {\n                 $self->semValue = array();\n            },\n            4 => static function ($self, $stackPos) {\n                 $nop = $self->maybeCreateZeroLengthNop($self->tokenPos);;\n            if ($nop !== null) { $self->semStack[$stackPos-(1-1)][] = $nop; } $self->semValue = $self->semStack[$stackPos-(1-1)];\n            },\n            5 => null,\n            6 => null,\n            7 => null,\n            8 => null,\n            9 => null,\n            10 => null,\n            11 => null,\n            12 => null,\n            13 => null,\n            14 => null,\n            15 => null,\n            16 => null,\n            17 => null,\n            18 => null,\n            19 => null,\n            20 => null,\n            21 => null,\n            22 => null,\n            23 => null,\n            24 => null,\n            25 => null,\n            26 => null,\n            27 => null,\n            28 => null,\n            29 => null,\n            30 => null,\n            31 => null,\n            32 => null,\n            33 => null,\n            34 => null,\n            35 => null,\n            36 => null,\n            37 => null,\n            38 => null,\n            39 => null,\n            40 => null,\n            41 => null,\n            42 => null,\n            43 => null,\n            44 => null,\n            45 => null,\n            46 => null,\n            47 => null,\n            48 => null,\n            49 => null,\n            50 => null,\n            51 => null,\n            52 => null,\n            53 => null,\n            54 => null,\n            55 => null,\n            56 => null,\n            57 => null,\n            58 => null,\n            59 => null,\n            60 => null,\n            61 => null,\n            62 => null,\n            63 => null,\n            64 => null,\n            65 => null,\n            66 => null,\n            67 => null,\n            68 => null,\n            69 => null,\n            70 => null,\n            71 => null,\n            72 => null,\n            73 => null,\n            74 => null,\n            75 => null,\n            76 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(1-1)]; if ($self->semValue === \"<?=\") $self->emitError(new Error('Cannot use \"<?=\" as an identifier', $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])));\n            },\n            77 => null,\n            78 => null,\n            79 => null,\n            80 => null,\n            81 => null,\n            82 => null,\n            83 => null,\n            84 => null,\n            85 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\Identifier($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            86 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\Identifier($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            87 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\Identifier($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            88 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\Identifier($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            89 => static function ($self, $stackPos) {\n                 $self->semValue = new Name($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            90 => static function ($self, $stackPos) {\n                 $self->semValue = new Name($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            91 => static function ($self, $stackPos) {\n                 $self->semValue = new Name($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            92 => static function ($self, $stackPos) {\n                 $self->semValue = new Name($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            93 => static function ($self, $stackPos) {\n                 $self->semValue = new Name($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            94 => null,\n            95 => static function ($self, $stackPos) {\n                 $self->semValue = new Name(substr($self->semStack[$stackPos-(1-1)], 1), $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            96 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Variable(substr($self->semStack[$stackPos-(1-1)], 1), $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            97 => static function ($self, $stackPos) {\n                 /* nothing */\n            },\n            98 => static function ($self, $stackPos) {\n                 /* nothing */\n            },\n            99 => static function ($self, $stackPos) {\n                 /* nothing */\n            },\n            100 => static function ($self, $stackPos) {\n                 $self->emitError(new Error('A trailing comma is not allowed here', $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])));\n            },\n            101 => null,\n            102 => null,\n            103 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\Attribute($self->semStack[$stackPos-(1-1)], [], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            104 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\Attribute($self->semStack[$stackPos-(2-1)], $self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            105 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(1-1)]);\n            },\n            106 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)];\n            },\n            107 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\AttributeGroup($self->semStack[$stackPos-(4-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]));\n            },\n            108 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(1-1)]);\n            },\n            109 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(2-1)][] = $self->semStack[$stackPos-(2-2)]; $self->semValue = $self->semStack[$stackPos-(2-1)];\n            },\n            110 => static function ($self, $stackPos) {\n                 $self->semValue = [];\n            },\n            111 => null,\n            112 => null,\n            113 => null,\n            114 => null,\n            115 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\HaltCompiler($self->handleHaltCompiler(), $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]));\n            },\n            116 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Namespace_($self->semStack[$stackPos-(3-2)], null, $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            $self->semValue->setAttribute('kind', Stmt\\Namespace_::KIND_SEMICOLON);\n            $self->checkNamespace($self->semValue);\n            },\n            117 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Namespace_($self->semStack[$stackPos-(5-2)], $self->semStack[$stackPos-(5-4)], $self->getAttributes($self->tokenStartStack[$stackPos-(5-1)], $self->tokenEndStack[$stackPos]));\n            $self->semValue->setAttribute('kind', Stmt\\Namespace_::KIND_BRACED);\n            $self->checkNamespace($self->semValue);\n            },\n            118 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Namespace_(null, $self->semStack[$stackPos-(4-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]));\n            $self->semValue->setAttribute('kind', Stmt\\Namespace_::KIND_BRACED);\n            $self->checkNamespace($self->semValue);\n            },\n            119 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Use_($self->semStack[$stackPos-(3-2)], Stmt\\Use_::TYPE_NORMAL, $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            120 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Use_($self->semStack[$stackPos-(4-3)], $self->semStack[$stackPos-(4-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]));\n            },\n            121 => null,\n            122 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Const_($self->semStack[$stackPos-(3-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]), []);\n            },\n            123 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Const_($self->semStack[$stackPos-(4-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]), $self->semStack[$stackPos-(4-1)]);\n            $self->checkConstantAttributes($self->semValue);\n            },\n            124 => static function ($self, $stackPos) {\n                 $self->semValue = Stmt\\Use_::TYPE_FUNCTION;\n            },\n            125 => static function ($self, $stackPos) {\n                 $self->semValue = Stmt\\Use_::TYPE_CONSTANT;\n            },\n            126 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\GroupUse($self->semStack[$stackPos-(8-3)], $self->semStack[$stackPos-(8-6)], $self->semStack[$stackPos-(8-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(8-1)], $self->tokenEndStack[$stackPos]));\n            },\n            127 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\GroupUse($self->semStack[$stackPos-(7-2)], $self->semStack[$stackPos-(7-5)], Stmt\\Use_::TYPE_UNKNOWN, $self->getAttributes($self->tokenStartStack[$stackPos-(7-1)], $self->tokenEndStack[$stackPos]));\n            },\n            128 => null,\n            129 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)];\n            },\n            130 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(1-1)]);\n            },\n            131 => null,\n            132 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)];\n            },\n            133 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(1-1)]);\n            },\n            134 => null,\n            135 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)];\n            },\n            136 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(1-1)]);\n            },\n            137 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\UseItem($self->semStack[$stackPos-(1-1)], null, Stmt\\Use_::TYPE_UNKNOWN, $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); $self->checkUseUse($self->semValue, $stackPos-(1-1));\n            },\n            138 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\UseItem($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], Stmt\\Use_::TYPE_UNKNOWN, $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); $self->checkUseUse($self->semValue, $stackPos-(3-3));\n            },\n            139 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\UseItem($self->semStack[$stackPos-(1-1)], null, Stmt\\Use_::TYPE_UNKNOWN, $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); $self->checkUseUse($self->semValue, $stackPos-(1-1));\n            },\n            140 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\UseItem($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], Stmt\\Use_::TYPE_UNKNOWN, $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); $self->checkUseUse($self->semValue, $stackPos-(3-3));\n            },\n            141 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(1-1)]; $self->semValue->type = Stmt\\Use_::TYPE_NORMAL;\n            },\n            142 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(2-2)]; $self->semValue->type = $self->semStack[$stackPos-(2-1)];\n            },\n            143 => null,\n            144 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)];\n            },\n            145 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(1-1)]);\n            },\n            146 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\Const_($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            147 => null,\n            148 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)];\n            },\n            149 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(1-1)]);\n            },\n            150 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\Const_(new Node\\Identifier($self->semStack[$stackPos-(3-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)],  $self->tokenEndStack[$stackPos-(3-1)])), $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            151 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\Const_(new Node\\Identifier($self->semStack[$stackPos-(3-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)],  $self->tokenEndStack[$stackPos-(3-1)])), $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            152 => static function ($self, $stackPos) {\n                 if ($self->semStack[$stackPos-(2-2)] !== null) { $self->semStack[$stackPos-(2-1)][] = $self->semStack[$stackPos-(2-2)]; } $self->semValue = $self->semStack[$stackPos-(2-1)];;\n            },\n            153 => static function ($self, $stackPos) {\n                 $self->semValue = array();\n            },\n            154 => static function ($self, $stackPos) {\n                 $nop = $self->maybeCreateZeroLengthNop($self->tokenPos);;\n            if ($nop !== null) { $self->semStack[$stackPos-(1-1)][] = $nop; } $self->semValue = $self->semStack[$stackPos-(1-1)];\n            },\n            155 => null,\n            156 => null,\n            157 => null,\n            158 => static function ($self, $stackPos) {\n                 throw new Error('__HALT_COMPILER() can only be used from the outermost scope', $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            159 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Block($self->semStack[$stackPos-(3-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            160 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\If_($self->semStack[$stackPos-(7-3)], ['stmts' => $self->semStack[$stackPos-(7-5)], 'elseifs' => $self->semStack[$stackPos-(7-6)], 'else' => $self->semStack[$stackPos-(7-7)]], $self->getAttributes($self->tokenStartStack[$stackPos-(7-1)], $self->tokenEndStack[$stackPos]));\n            },\n            161 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\If_($self->semStack[$stackPos-(10-3)], ['stmts' => $self->semStack[$stackPos-(10-6)], 'elseifs' => $self->semStack[$stackPos-(10-7)], 'else' => $self->semStack[$stackPos-(10-8)]], $self->getAttributes($self->tokenStartStack[$stackPos-(10-1)], $self->tokenEndStack[$stackPos]));\n            },\n            162 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\While_($self->semStack[$stackPos-(5-3)], $self->semStack[$stackPos-(5-5)], $self->getAttributes($self->tokenStartStack[$stackPos-(5-1)], $self->tokenEndStack[$stackPos]));\n            },\n            163 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Do_($self->semStack[$stackPos-(7-5)], $self->semStack[$stackPos-(7-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(7-1)], $self->tokenEndStack[$stackPos]));\n            },\n            164 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\For_(['init' => $self->semStack[$stackPos-(9-3)], 'cond' => $self->semStack[$stackPos-(9-5)], 'loop' => $self->semStack[$stackPos-(9-7)], 'stmts' => $self->semStack[$stackPos-(9-9)]], $self->getAttributes($self->tokenStartStack[$stackPos-(9-1)], $self->tokenEndStack[$stackPos]));\n            },\n            165 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Switch_($self->semStack[$stackPos-(5-3)], $self->semStack[$stackPos-(5-5)], $self->getAttributes($self->tokenStartStack[$stackPos-(5-1)], $self->tokenEndStack[$stackPos]));\n            },\n            166 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Break_($self->semStack[$stackPos-(3-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            167 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Continue_($self->semStack[$stackPos-(3-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            168 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Return_($self->semStack[$stackPos-(3-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            169 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Global_($self->semStack[$stackPos-(3-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            170 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Static_($self->semStack[$stackPos-(3-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            171 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Echo_($self->semStack[$stackPos-(3-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            172 => static function ($self, $stackPos) {\n\n        $self->semValue = new Stmt\\InlineHTML($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n        $self->semValue->setAttribute('hasLeadingNewline', $self->inlineHtmlHasLeadingNewline($stackPos-(1-1)));\n\n            },\n            173 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Expression($self->semStack[$stackPos-(2-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            174 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Unset_($self->semStack[$stackPos-(5-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(5-1)], $self->tokenEndStack[$stackPos]));\n            },\n            175 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Foreach_($self->semStack[$stackPos-(7-3)], $self->semStack[$stackPos-(7-5)][0], ['keyVar' => null, 'byRef' => $self->semStack[$stackPos-(7-5)][1], 'stmts' => $self->semStack[$stackPos-(7-7)]], $self->getAttributes($self->tokenStartStack[$stackPos-(7-1)], $self->tokenEndStack[$stackPos]));\n            },\n            176 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Foreach_($self->semStack[$stackPos-(9-3)], $self->semStack[$stackPos-(9-7)][0], ['keyVar' => $self->semStack[$stackPos-(9-5)], 'byRef' => $self->semStack[$stackPos-(9-7)][1], 'stmts' => $self->semStack[$stackPos-(9-9)]], $self->getAttributes($self->tokenStartStack[$stackPos-(9-1)], $self->tokenEndStack[$stackPos]));\n            },\n            177 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Foreach_($self->semStack[$stackPos-(6-3)], new Expr\\Error($self->getAttributes($self->tokenStartStack[$stackPos-(6-4)],  $self->tokenEndStack[$stackPos-(6-4)])), ['stmts' => $self->semStack[$stackPos-(6-6)]], $self->getAttributes($self->tokenStartStack[$stackPos-(6-1)], $self->tokenEndStack[$stackPos]));\n            },\n            178 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Declare_($self->semStack[$stackPos-(5-3)], $self->semStack[$stackPos-(5-5)], $self->getAttributes($self->tokenStartStack[$stackPos-(5-1)], $self->tokenEndStack[$stackPos]));\n            },\n            179 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\TryCatch($self->semStack[$stackPos-(6-3)], $self->semStack[$stackPos-(6-5)], $self->semStack[$stackPos-(6-6)], $self->getAttributes($self->tokenStartStack[$stackPos-(6-1)], $self->tokenEndStack[$stackPos])); $self->checkTryCatch($self->semValue);\n            },\n            180 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Goto_($self->semStack[$stackPos-(3-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            181 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Label($self->semStack[$stackPos-(2-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            182 => static function ($self, $stackPos) {\n                 $self->semValue = null; /* means: no statement */\n            },\n            183 => null,\n            184 => static function ($self, $stackPos) {\n                 $self->semValue = $self->maybeCreateNop($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]);\n            },\n            185 => static function ($self, $stackPos) {\n                 if ($self->semStack[$stackPos-(1-1)] instanceof Stmt\\Block) { $self->semValue = $self->semStack[$stackPos-(1-1)]->stmts; } else if ($self->semStack[$stackPos-(1-1)] === null) { $self->semValue = []; } else { $self->semValue = [$self->semStack[$stackPos-(1-1)]]; };\n            },\n            186 => static function ($self, $stackPos) {\n                 $self->semValue = array();\n            },\n            187 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(2-1)][] = $self->semStack[$stackPos-(2-2)]; $self->semValue = $self->semStack[$stackPos-(2-1)];\n            },\n            188 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(1-1)]);\n            },\n            189 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)];\n            },\n            190 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Catch_($self->semStack[$stackPos-(8-3)], $self->semStack[$stackPos-(8-4)], $self->semStack[$stackPos-(8-7)], $self->getAttributes($self->tokenStartStack[$stackPos-(8-1)], $self->tokenEndStack[$stackPos]));\n            },\n            191 => static function ($self, $stackPos) {\n                 $self->semValue = null;\n            },\n            192 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Finally_($self->semStack[$stackPos-(4-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]));\n            },\n            193 => null,\n            194 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(1-1)]);\n            },\n            195 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)];\n            },\n            196 => static function ($self, $stackPos) {\n                 $self->semValue = false;\n            },\n            197 => static function ($self, $stackPos) {\n                 $self->semValue = true;\n            },\n            198 => static function ($self, $stackPos) {\n                 $self->semValue = false;\n            },\n            199 => static function ($self, $stackPos) {\n                 $self->semValue = true;\n            },\n            200 => static function ($self, $stackPos) {\n                 $self->semValue = false;\n            },\n            201 => static function ($self, $stackPos) {\n                 $self->semValue = true;\n            },\n            202 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(3-2)];\n            },\n            203 => static function ($self, $stackPos) {\n                 $self->semValue = [];\n            },\n            204 => null,\n            205 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\Identifier($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            206 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\Identifier($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            207 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\Identifier($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            208 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Function_($self->semStack[$stackPos-(8-3)], ['byRef' => $self->semStack[$stackPos-(8-2)], 'params' => $self->semStack[$stackPos-(8-5)], 'returnType' => $self->semStack[$stackPos-(8-7)], 'stmts' => $self->semStack[$stackPos-(8-8)], 'attrGroups' => []], $self->getAttributes($self->tokenStartStack[$stackPos-(8-1)], $self->tokenEndStack[$stackPos]));\n            },\n            209 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Function_($self->semStack[$stackPos-(9-4)], ['byRef' => $self->semStack[$stackPos-(9-3)], 'params' => $self->semStack[$stackPos-(9-6)], 'returnType' => $self->semStack[$stackPos-(9-8)], 'stmts' => $self->semStack[$stackPos-(9-9)], 'attrGroups' => $self->semStack[$stackPos-(9-1)]], $self->getAttributes($self->tokenStartStack[$stackPos-(9-1)], $self->tokenEndStack[$stackPos]));\n            },\n            210 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Class_($self->semStack[$stackPos-(7-2)], ['type' => $self->semStack[$stackPos-(7-1)], 'extends' => $self->semStack[$stackPos-(7-3)], 'implements' => $self->semStack[$stackPos-(7-4)], 'stmts' => $self->semStack[$stackPos-(7-6)], 'attrGroups' => []], $self->getAttributes($self->tokenStartStack[$stackPos-(7-1)], $self->tokenEndStack[$stackPos]));\n            $self->checkClass($self->semValue, $stackPos-(7-2));\n            },\n            211 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Class_($self->semStack[$stackPos-(8-3)], ['type' => $self->semStack[$stackPos-(8-2)], 'extends' => $self->semStack[$stackPos-(8-4)], 'implements' => $self->semStack[$stackPos-(8-5)], 'stmts' => $self->semStack[$stackPos-(8-7)], 'attrGroups' => $self->semStack[$stackPos-(8-1)]], $self->getAttributes($self->tokenStartStack[$stackPos-(8-1)], $self->tokenEndStack[$stackPos]));\n            $self->checkClass($self->semValue, $stackPos-(8-3));\n            },\n            212 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Interface_($self->semStack[$stackPos-(7-3)], ['extends' => $self->semStack[$stackPos-(7-4)], 'stmts' => $self->semStack[$stackPos-(7-6)], 'attrGroups' => $self->semStack[$stackPos-(7-1)]], $self->getAttributes($self->tokenStartStack[$stackPos-(7-1)], $self->tokenEndStack[$stackPos]));\n            $self->checkInterface($self->semValue, $stackPos-(7-3));\n            },\n            213 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Trait_($self->semStack[$stackPos-(6-3)], ['stmts' => $self->semStack[$stackPos-(6-5)], 'attrGroups' => $self->semStack[$stackPos-(6-1)]], $self->getAttributes($self->tokenStartStack[$stackPos-(6-1)], $self->tokenEndStack[$stackPos]));\n            },\n            214 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Enum_($self->semStack[$stackPos-(8-3)], ['scalarType' => $self->semStack[$stackPos-(8-4)], 'implements' => $self->semStack[$stackPos-(8-5)], 'stmts' => $self->semStack[$stackPos-(8-7)], 'attrGroups' => $self->semStack[$stackPos-(8-1)]], $self->getAttributes($self->tokenStartStack[$stackPos-(8-1)], $self->tokenEndStack[$stackPos]));\n            $self->checkEnum($self->semValue, $stackPos-(8-3));\n            },\n            215 => static function ($self, $stackPos) {\n                 $self->semValue = null;\n            },\n            216 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(2-2)];\n            },\n            217 => static function ($self, $stackPos) {\n                 $self->semValue = null;\n            },\n            218 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(2-2)];\n            },\n            219 => static function ($self, $stackPos) {\n                 $self->semValue = 0;\n            },\n            220 => null,\n            221 => null,\n            222 => static function ($self, $stackPos) {\n                 $self->checkClassModifier($self->semStack[$stackPos-(2-1)], $self->semStack[$stackPos-(2-2)], $stackPos-(2-2)); $self->semValue = $self->semStack[$stackPos-(2-1)] | $self->semStack[$stackPos-(2-2)];\n            },\n            223 => static function ($self, $stackPos) {\n                 $self->semValue = Modifiers::ABSTRACT;\n            },\n            224 => static function ($self, $stackPos) {\n                 $self->semValue = Modifiers::FINAL;\n            },\n            225 => static function ($self, $stackPos) {\n                 $self->semValue = Modifiers::READONLY;\n            },\n            226 => static function ($self, $stackPos) {\n                 $self->semValue = null;\n            },\n            227 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(2-2)];\n            },\n            228 => static function ($self, $stackPos) {\n                 $self->semValue = array();\n            },\n            229 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(2-2)];\n            },\n            230 => static function ($self, $stackPos) {\n                 $self->semValue = array();\n            },\n            231 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(2-2)];\n            },\n            232 => null,\n            233 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(1-1)]);\n            },\n            234 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)];\n            },\n            235 => null,\n            236 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(4-2)];\n            },\n            237 => null,\n            238 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(4-2)];\n            },\n            239 => static function ($self, $stackPos) {\n                 if ($self->semStack[$stackPos-(1-1)] instanceof Stmt\\Block) { $self->semValue = $self->semStack[$stackPos-(1-1)]->stmts; } else if ($self->semStack[$stackPos-(1-1)] === null) { $self->semValue = []; } else { $self->semValue = [$self->semStack[$stackPos-(1-1)]]; };\n            },\n            240 => static function ($self, $stackPos) {\n                 $self->semValue = null;\n            },\n            241 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(4-2)];\n            },\n            242 => null,\n            243 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(1-1)]);\n            },\n            244 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)];\n            },\n            245 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\DeclareItem($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            246 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(3-2)];\n            },\n            247 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(4-3)];\n            },\n            248 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(4-2)];\n            },\n            249 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(5-3)];\n            },\n            250 => static function ($self, $stackPos) {\n                 $self->semValue = array();\n            },\n            251 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(2-1)][] = $self->semStack[$stackPos-(2-2)]; $self->semValue = $self->semStack[$stackPos-(2-1)];\n            },\n            252 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Case_($self->semStack[$stackPos-(4-2)], $self->semStack[$stackPos-(4-4)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]));\n            },\n            253 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Case_(null, $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            254 => null,\n            255 => null,\n            256 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Match_($self->semStack[$stackPos-(7-3)], $self->semStack[$stackPos-(7-6)], $self->getAttributes($self->tokenStartStack[$stackPos-(7-1)], $self->tokenEndStack[$stackPos]));\n            },\n            257 => static function ($self, $stackPos) {\n                 $self->semValue = [];\n            },\n            258 => null,\n            259 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(1-1)]);\n            },\n            260 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)];\n            },\n            261 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\MatchArm($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            262 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\MatchArm(null, $self->semStack[$stackPos-(4-4)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]));\n            },\n            263 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(1-1)];\n            },\n            264 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(4-2)];\n            },\n            265 => static function ($self, $stackPos) {\n                 $self->semValue = array();\n            },\n            266 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(2-1)][] = $self->semStack[$stackPos-(2-2)]; $self->semValue = $self->semStack[$stackPos-(2-1)];\n            },\n            267 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\ElseIf_($self->semStack[$stackPos-(5-3)], $self->semStack[$stackPos-(5-5)], $self->getAttributes($self->tokenStartStack[$stackPos-(5-1)], $self->tokenEndStack[$stackPos]));\n            },\n            268 => static function ($self, $stackPos) {\n                 $self->semValue = array();\n            },\n            269 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(2-1)][] = $self->semStack[$stackPos-(2-2)]; $self->semValue = $self->semStack[$stackPos-(2-1)];\n            },\n            270 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\ElseIf_($self->semStack[$stackPos-(6-3)], $self->semStack[$stackPos-(6-6)], $self->getAttributes($self->tokenStartStack[$stackPos-(6-1)], $self->tokenEndStack[$stackPos])); $self->fixupAlternativeElse($self->semValue);\n            },\n            271 => static function ($self, $stackPos) {\n                 $self->semValue = null;\n            },\n            272 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Else_($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            273 => static function ($self, $stackPos) {\n                 $self->semValue = null;\n            },\n            274 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Else_($self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); $self->fixupAlternativeElse($self->semValue);\n            },\n            275 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(1-1)], false);\n            },\n            276 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(2-2)], true);\n            },\n            277 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(1-1)], false);\n            },\n            278 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->fixupArrayDestructuring($self->semStack[$stackPos-(1-1)]), false);\n            },\n            279 => null,\n            280 => static function ($self, $stackPos) {\n                 $self->semValue = array();\n            },\n            281 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(1-1)]);\n            },\n            282 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)];\n            },\n            283 => static function ($self, $stackPos) {\n                 $self->semValue = 0;\n            },\n            284 => static function ($self, $stackPos) {\n                 $self->checkModifier($self->semStack[$stackPos-(2-1)], $self->semStack[$stackPos-(2-2)], $stackPos-(2-2)); $self->semValue = $self->semStack[$stackPos-(2-1)] | $self->semStack[$stackPos-(2-2)];\n            },\n            285 => static function ($self, $stackPos) {\n                 $self->semValue = Modifiers::PUBLIC;\n            },\n            286 => static function ($self, $stackPos) {\n                 $self->semValue = Modifiers::PROTECTED;\n            },\n            287 => static function ($self, $stackPos) {\n                 $self->semValue = Modifiers::PRIVATE;\n            },\n            288 => static function ($self, $stackPos) {\n                 $self->semValue = Modifiers::PUBLIC_SET;\n            },\n            289 => static function ($self, $stackPos) {\n                 $self->semValue = Modifiers::PROTECTED_SET;\n            },\n            290 => static function ($self, $stackPos) {\n                 $self->semValue = Modifiers::PRIVATE_SET;\n            },\n            291 => static function ($self, $stackPos) {\n                 $self->semValue = Modifiers::READONLY;\n            },\n            292 => static function ($self, $stackPos) {\n                 $self->semValue = Modifiers::FINAL;\n            },\n            293 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\Param($self->semStack[$stackPos-(7-6)], null, $self->semStack[$stackPos-(7-3)], $self->semStack[$stackPos-(7-4)], $self->semStack[$stackPos-(7-5)], $self->getAttributes($self->tokenStartStack[$stackPos-(7-1)], $self->tokenEndStack[$stackPos]), $self->semStack[$stackPos-(7-2)], $self->semStack[$stackPos-(7-1)], $self->semStack[$stackPos-(7-7)]);\n            $self->checkParam($self->semValue);\n            $self->addPropertyNameToHooks($self->semValue);\n            },\n            294 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\Param($self->semStack[$stackPos-(9-6)], $self->semStack[$stackPos-(9-8)], $self->semStack[$stackPos-(9-3)], $self->semStack[$stackPos-(9-4)], $self->semStack[$stackPos-(9-5)], $self->getAttributes($self->tokenStartStack[$stackPos-(9-1)], $self->tokenEndStack[$stackPos]), $self->semStack[$stackPos-(9-2)], $self->semStack[$stackPos-(9-1)], $self->semStack[$stackPos-(9-9)]);\n            $self->checkParam($self->semValue);\n            $self->addPropertyNameToHooks($self->semValue);\n            },\n            295 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\Param(new Expr\\Error($self->getAttributes($self->tokenStartStack[$stackPos-(6-1)], $self->tokenEndStack[$stackPos])), null, $self->semStack[$stackPos-(6-3)], $self->semStack[$stackPos-(6-4)], $self->semStack[$stackPos-(6-5)], $self->getAttributes($self->tokenStartStack[$stackPos-(6-1)], $self->tokenEndStack[$stackPos]), $self->semStack[$stackPos-(6-2)], $self->semStack[$stackPos-(6-1)]);\n            },\n            296 => null,\n            297 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\NullableType($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            298 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\UnionType($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            299 => null,\n            300 => null,\n            301 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\Name('static', $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            302 => static function ($self, $stackPos) {\n                 $self->semValue = $self->handleBuiltinTypes($self->semStack[$stackPos-(1-1)]);\n            },\n            303 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\Identifier('array', $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            304 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\Identifier('callable', $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            305 => null,\n            306 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(3-2)];\n            },\n            307 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)]);\n            },\n            308 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)];\n            },\n            309 => null,\n            310 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(3-2)];\n            },\n            311 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)]);\n            },\n            312 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)];\n            },\n            313 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)]);\n            },\n            314 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)];\n            },\n            315 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\IntersectionType($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            316 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)]);\n            },\n            317 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)];\n            },\n            318 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\IntersectionType($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            319 => null,\n            320 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\NullableType($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            321 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\UnionType($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            322 => null,\n            323 => static function ($self, $stackPos) {\n                 $self->semValue = null;\n            },\n            324 => null,\n            325 => static function ($self, $stackPos) {\n                 $self->semValue = null;\n            },\n            326 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(2-2)];\n            },\n            327 => static function ($self, $stackPos) {\n                 $self->semValue = null;\n            },\n            328 => static function ($self, $stackPos) {\n                 $self->semValue = array();\n            },\n            329 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(4-2)];\n            },\n            330 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(3-2)]);\n            },\n            331 => static function ($self, $stackPos) {\n                 $self->semValue = array();\n            },\n            332 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(4-2)];\n            },\n            333 => static function ($self, $stackPos) {\n                 $self->semValue = array(new Node\\Arg($self->semStack[$stackPos-(4-2)], false, false, $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos])));\n            },\n            334 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(3-2)]);\n            },\n            335 => static function ($self, $stackPos) {\n                 $self->semValue = array(new Node\\Arg($self->semStack[$stackPos-(3-1)], false, false, $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)],  $self->tokenEndStack[$stackPos-(3-1)])), $self->semStack[$stackPos-(3-3)]);\n            },\n            336 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(1-1)]);\n            },\n            337 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)];\n            },\n            338 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\VariadicPlaceholder($self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            339 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(1-1)]);\n            },\n            340 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)];\n            },\n            341 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\Arg($self->semStack[$stackPos-(2-2)], true, false, $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            342 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\Arg($self->semStack[$stackPos-(2-2)], false, true, $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            343 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\Arg($self->semStack[$stackPos-(3-3)], false, false, $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]), $self->semStack[$stackPos-(3-1)]);\n            },\n            344 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\Arg($self->semStack[$stackPos-(1-1)], false, false, $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            345 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(1-1)];\n            },\n            346 => null,\n            347 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)];\n            },\n            348 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(1-1)]);\n            },\n            349 => null,\n            350 => null,\n            351 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)];\n            },\n            352 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(1-1)]);\n            },\n            353 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\StaticVar($self->semStack[$stackPos-(1-1)], null, $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            354 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\StaticVar($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            355 => static function ($self, $stackPos) {\n                 if ($self->semStack[$stackPos-(2-2)] !== null) { $self->semStack[$stackPos-(2-1)][] = $self->semStack[$stackPos-(2-2)]; $self->semValue = $self->semStack[$stackPos-(2-1)]; } else { $self->semValue = $self->semStack[$stackPos-(2-1)]; }\n            },\n            356 => static function ($self, $stackPos) {\n                 $self->semValue = array();\n            },\n            357 => static function ($self, $stackPos) {\n                 $nop = $self->maybeCreateZeroLengthNop($self->tokenPos);;\n            if ($nop !== null) { $self->semStack[$stackPos-(1-1)][] = $nop; } $self->semValue = $self->semStack[$stackPos-(1-1)];\n            },\n            358 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Property($self->semStack[$stackPos-(5-2)], $self->semStack[$stackPos-(5-4)], $self->getAttributes($self->tokenStartStack[$stackPos-(5-1)], $self->tokenEndStack[$stackPos]), $self->semStack[$stackPos-(5-3)], $self->semStack[$stackPos-(5-1)]);\n            },\n            359 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\Property($self->semStack[$stackPos-(7-2)], $self->semStack[$stackPos-(7-4)], $self->getAttributes($self->tokenStartStack[$stackPos-(7-1)], $self->tokenEndStack[$stackPos]), $self->semStack[$stackPos-(7-3)], $self->semStack[$stackPos-(7-1)], $self->semStack[$stackPos-(7-6)]);\n            $self->checkPropertyHooksForMultiProperty($self->semValue, $stackPos-(7-5));\n            $self->checkEmptyPropertyHookList($self->semStack[$stackPos-(7-6)], $stackPos-(7-5));\n            $self->addPropertyNameToHooks($self->semValue);\n            },\n            360 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\ClassConst($self->semStack[$stackPos-(5-4)], $self->semStack[$stackPos-(5-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(5-1)], $self->tokenEndStack[$stackPos]), $self->semStack[$stackPos-(5-1)]);\n            $self->checkClassConst($self->semValue, $stackPos-(5-2));\n            },\n            361 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\ClassConst($self->semStack[$stackPos-(6-5)], $self->semStack[$stackPos-(6-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(6-1)], $self->tokenEndStack[$stackPos]), $self->semStack[$stackPos-(6-1)], $self->semStack[$stackPos-(6-4)]);\n            $self->checkClassConst($self->semValue, $stackPos-(6-2));\n            },\n            362 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\ClassMethod($self->semStack[$stackPos-(10-5)], ['type' => $self->semStack[$stackPos-(10-2)], 'byRef' => $self->semStack[$stackPos-(10-4)], 'params' => $self->semStack[$stackPos-(10-7)], 'returnType' => $self->semStack[$stackPos-(10-9)], 'stmts' => $self->semStack[$stackPos-(10-10)], 'attrGroups' => $self->semStack[$stackPos-(10-1)]], $self->getAttributes($self->tokenStartStack[$stackPos-(10-1)], $self->tokenEndStack[$stackPos]));\n            $self->checkClassMethod($self->semValue, $stackPos-(10-2));\n            },\n            363 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\TraitUse($self->semStack[$stackPos-(3-2)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            364 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\EnumCase($self->semStack[$stackPos-(5-3)], $self->semStack[$stackPos-(5-4)], $self->semStack[$stackPos-(5-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(5-1)], $self->tokenEndStack[$stackPos]));\n            },\n            365 => static function ($self, $stackPos) {\n                 $self->semValue = null; /* will be skipped */\n            },\n            366 => static function ($self, $stackPos) {\n                 $self->semValue = array();\n            },\n            367 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(3-2)];\n            },\n            368 => static function ($self, $stackPos) {\n                 $self->semValue = array();\n            },\n            369 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(2-1)][] = $self->semStack[$stackPos-(2-2)]; $self->semValue = $self->semStack[$stackPos-(2-1)];\n            },\n            370 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\TraitUseAdaptation\\Precedence($self->semStack[$stackPos-(4-1)][0], $self->semStack[$stackPos-(4-1)][1], $self->semStack[$stackPos-(4-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]));\n            },\n            371 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\TraitUseAdaptation\\Alias($self->semStack[$stackPos-(5-1)][0], $self->semStack[$stackPos-(5-1)][1], $self->semStack[$stackPos-(5-3)], $self->semStack[$stackPos-(5-4)], $self->getAttributes($self->tokenStartStack[$stackPos-(5-1)], $self->tokenEndStack[$stackPos]));\n            },\n            372 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\TraitUseAdaptation\\Alias($self->semStack[$stackPos-(4-1)][0], $self->semStack[$stackPos-(4-1)][1], $self->semStack[$stackPos-(4-3)], null, $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]));\n            },\n            373 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\TraitUseAdaptation\\Alias($self->semStack[$stackPos-(4-1)][0], $self->semStack[$stackPos-(4-1)][1], null, $self->semStack[$stackPos-(4-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]));\n            },\n            374 => static function ($self, $stackPos) {\n                 $self->semValue = new Stmt\\TraitUseAdaptation\\Alias($self->semStack[$stackPos-(4-1)][0], $self->semStack[$stackPos-(4-1)][1], null, $self->semStack[$stackPos-(4-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]));\n            },\n            375 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)]);\n            },\n            376 => null,\n            377 => static function ($self, $stackPos) {\n                 $self->semValue = array(null, $self->semStack[$stackPos-(1-1)]);\n            },\n            378 => static function ($self, $stackPos) {\n                 $self->semValue = null;\n            },\n            379 => null,\n            380 => null,\n            381 => static function ($self, $stackPos) {\n                 $self->semValue = 0;\n            },\n            382 => static function ($self, $stackPos) {\n                 $self->semValue = 0;\n            },\n            383 => null,\n            384 => null,\n            385 => static function ($self, $stackPos) {\n                 $self->checkModifier($self->semStack[$stackPos-(2-1)], $self->semStack[$stackPos-(2-2)], $stackPos-(2-2)); $self->semValue = $self->semStack[$stackPos-(2-1)] | $self->semStack[$stackPos-(2-2)];\n            },\n            386 => static function ($self, $stackPos) {\n                 $self->semValue = Modifiers::PUBLIC;\n            },\n            387 => static function ($self, $stackPos) {\n                 $self->semValue = Modifiers::PROTECTED;\n            },\n            388 => static function ($self, $stackPos) {\n                 $self->semValue = Modifiers::PRIVATE;\n            },\n            389 => static function ($self, $stackPos) {\n                 $self->semValue = Modifiers::PUBLIC_SET;\n            },\n            390 => static function ($self, $stackPos) {\n                 $self->semValue = Modifiers::PROTECTED_SET;\n            },\n            391 => static function ($self, $stackPos) {\n                 $self->semValue = Modifiers::PRIVATE_SET;\n            },\n            392 => static function ($self, $stackPos) {\n                 $self->semValue = Modifiers::STATIC;\n            },\n            393 => static function ($self, $stackPos) {\n                 $self->semValue = Modifiers::ABSTRACT;\n            },\n            394 => static function ($self, $stackPos) {\n                 $self->semValue = Modifiers::FINAL;\n            },\n            395 => static function ($self, $stackPos) {\n                 $self->semValue = Modifiers::READONLY;\n            },\n            396 => null,\n            397 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(1-1)]);\n            },\n            398 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)];\n            },\n            399 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\VarLikeIdentifier(substr($self->semStack[$stackPos-(1-1)], 1), $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            400 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\PropertyItem($self->semStack[$stackPos-(1-1)], null, $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            401 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\PropertyItem($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            402 => static function ($self, $stackPos) {\n                 $self->semValue = [];\n            },\n            403 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(2-1)][] = $self->semStack[$stackPos-(2-2)]; $self->semValue = $self->semStack[$stackPos-(2-1)];\n            },\n            404 => static function ($self, $stackPos) {\n                 $self->semValue = [];\n            },\n            405 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(3-2)]; $self->checkEmptyPropertyHookList($self->semStack[$stackPos-(3-2)], $stackPos-(3-1));\n            },\n            406 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\PropertyHook($self->semStack[$stackPos-(5-4)], $self->semStack[$stackPos-(5-5)], ['flags' => $self->semStack[$stackPos-(5-2)], 'byRef' => $self->semStack[$stackPos-(5-3)], 'params' => [], 'attrGroups' => $self->semStack[$stackPos-(5-1)]], $self->getAttributes($self->tokenStartStack[$stackPos-(5-1)], $self->tokenEndStack[$stackPos]));\n            $self->checkPropertyHook($self->semValue, null);\n            },\n            407 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\PropertyHook($self->semStack[$stackPos-(8-4)], $self->semStack[$stackPos-(8-8)], ['flags' => $self->semStack[$stackPos-(8-2)], 'byRef' => $self->semStack[$stackPos-(8-3)], 'params' => $self->semStack[$stackPos-(8-6)], 'attrGroups' => $self->semStack[$stackPos-(8-1)]], $self->getAttributes($self->tokenStartStack[$stackPos-(8-1)], $self->tokenEndStack[$stackPos]));\n            $self->checkPropertyHook($self->semValue, $stackPos-(8-5));\n            },\n            408 => static function ($self, $stackPos) {\n                 $self->semValue = null;\n            },\n            409 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(3-2)];\n            },\n            410 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(3-2)];\n            },\n            411 => static function ($self, $stackPos) {\n                 $self->semValue = 0;\n            },\n            412 => static function ($self, $stackPos) {\n                 $self->checkPropertyHookModifiers($self->semStack[$stackPos-(2-1)], $self->semStack[$stackPos-(2-2)], $stackPos-(2-2)); $self->semValue = $self->semStack[$stackPos-(2-1)] | $self->semStack[$stackPos-(2-2)];\n            },\n            413 => null,\n            414 => null,\n            415 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)];\n            },\n            416 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(1-1)]);\n            },\n            417 => static function ($self, $stackPos) {\n                 $self->semValue = array();\n            },\n            418 => null,\n            419 => null,\n            420 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Assign($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            421 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Assign($self->fixupArrayDestructuring($self->semStack[$stackPos-(3-1)]), $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            422 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Assign($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            423 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\AssignRef($self->semStack[$stackPos-(4-1)], $self->semStack[$stackPos-(4-4)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]));\n            },\n            424 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\AssignRef($self->semStack[$stackPos-(4-1)], $self->semStack[$stackPos-(4-4)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]));\n            if (!$self->phpVersion->allowsAssignNewByReference()) {\n                $self->emitError(new Error('Cannot assign new by reference', $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos])));\n            }\n\n            },\n            425 => null,\n            426 => null,\n            427 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\FuncCall(new Node\\Name($self->semStack[$stackPos-(2-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)],  $self->tokenEndStack[$stackPos-(2-1)])), $self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            428 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Clone_($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            429 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\AssignOp\\Plus($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            430 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\AssignOp\\Minus($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            431 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\AssignOp\\Mul($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            432 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\AssignOp\\Div($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            433 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\AssignOp\\Concat($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            434 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\AssignOp\\Mod($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            435 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\AssignOp\\BitwiseAnd($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            436 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\AssignOp\\BitwiseOr($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            437 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\AssignOp\\BitwiseXor($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            438 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\AssignOp\\ShiftLeft($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            439 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\AssignOp\\ShiftRight($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            440 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\AssignOp\\Pow($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            441 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\AssignOp\\Coalesce($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            442 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\PostInc($self->semStack[$stackPos-(2-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            443 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\PreInc($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            444 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\PostDec($self->semStack[$stackPos-(2-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            445 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\PreDec($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            446 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\BinaryOp\\BooleanOr($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            447 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\BinaryOp\\BooleanAnd($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            448 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\BinaryOp\\LogicalOr($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            449 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\BinaryOp\\LogicalAnd($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            450 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\BinaryOp\\LogicalXor($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            451 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\BinaryOp\\BitwiseOr($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            452 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\BinaryOp\\BitwiseAnd($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            453 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\BinaryOp\\BitwiseAnd($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            454 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\BinaryOp\\BitwiseXor($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            455 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\BinaryOp\\Concat($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            456 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\BinaryOp\\Plus($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            457 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\BinaryOp\\Minus($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            458 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\BinaryOp\\Mul($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            459 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\BinaryOp\\Div($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            460 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\BinaryOp\\Mod($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            461 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\BinaryOp\\ShiftLeft($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            462 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\BinaryOp\\ShiftRight($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            463 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\BinaryOp\\Pow($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            464 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\UnaryPlus($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            465 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\UnaryMinus($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            466 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\BooleanNot($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            467 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\BitwiseNot($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            468 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\BinaryOp\\Identical($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            469 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\BinaryOp\\NotIdentical($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            470 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\BinaryOp\\Equal($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            471 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\BinaryOp\\NotEqual($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            472 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\BinaryOp\\Spaceship($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            473 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\BinaryOp\\Smaller($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            474 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\BinaryOp\\SmallerOrEqual($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            475 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\BinaryOp\\Greater($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            476 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\BinaryOp\\GreaterOrEqual($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            477 => static function ($self, $stackPos) {\n\n          $self->semValue = new Expr\\BinaryOp\\Pipe($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n          $self->checkPipeOperatorParentheses($self->semStack[$stackPos-(3-3)]);\n\n            },\n            478 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Instanceof_($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            479 => static function ($self, $stackPos) {\n\n          $self->semValue = $self->semStack[$stackPos-(3-2)];\n          if ($self->semValue instanceof Expr\\ArrowFunction) {\n              $self->parenthesizedArrowFunctions->offsetSet($self->semValue);\n          }\n\n            },\n            480 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Ternary($self->semStack[$stackPos-(5-1)], $self->semStack[$stackPos-(5-3)], $self->semStack[$stackPos-(5-5)], $self->getAttributes($self->tokenStartStack[$stackPos-(5-1)], $self->tokenEndStack[$stackPos]));\n            },\n            481 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Ternary($self->semStack[$stackPos-(4-1)], null, $self->semStack[$stackPos-(4-4)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]));\n            },\n            482 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\BinaryOp\\Coalesce($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            483 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Isset_($self->semStack[$stackPos-(4-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]));\n            },\n            484 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Empty_($self->semStack[$stackPos-(4-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]));\n            },\n            485 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Include_($self->semStack[$stackPos-(2-2)], Expr\\Include_::TYPE_INCLUDE, $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            486 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Include_($self->semStack[$stackPos-(2-2)], Expr\\Include_::TYPE_INCLUDE_ONCE, $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            487 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Eval_($self->semStack[$stackPos-(4-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]));\n            },\n            488 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Include_($self->semStack[$stackPos-(2-2)], Expr\\Include_::TYPE_REQUIRE, $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            489 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Include_($self->semStack[$stackPos-(2-2)], Expr\\Include_::TYPE_REQUIRE_ONCE, $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            490 => static function ($self, $stackPos) {\n                 $attrs = $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]);\n            $attrs['kind'] = $self->getIntCastKind($self->semStack[$stackPos-(2-1)]);\n            $self->semValue = new Expr\\Cast\\Int_($self->semStack[$stackPos-(2-2)], $attrs);\n            },\n            491 => static function ($self, $stackPos) {\n                 $attrs = $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]);\n            $attrs['kind'] = $self->getFloatCastKind($self->semStack[$stackPos-(2-1)]);\n            $self->semValue = new Expr\\Cast\\Double($self->semStack[$stackPos-(2-2)], $attrs);\n            },\n            492 => static function ($self, $stackPos) {\n                 $attrs = $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]);\n            $attrs['kind'] = $self->getStringCastKind($self->semStack[$stackPos-(2-1)]);\n            $self->semValue = new Expr\\Cast\\String_($self->semStack[$stackPos-(2-2)], $attrs);\n            },\n            493 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Cast\\Array_($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            494 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Cast\\Object_($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            495 => static function ($self, $stackPos) {\n                 $attrs = $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]);\n            $attrs['kind'] = $self->getBoolCastKind($self->semStack[$stackPos-(2-1)]);\n            $self->semValue = new Expr\\Cast\\Bool_($self->semStack[$stackPos-(2-2)], $attrs);\n            },\n            496 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Cast\\Unset_($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            497 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Cast\\Void_($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            498 => static function ($self, $stackPos) {\n                 $self->semValue = $self->createExitExpr($self->semStack[$stackPos-(2-1)], $stackPos-(2-1), $self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            499 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\ErrorSuppress($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            500 => null,\n            501 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\ShellExec($self->semStack[$stackPos-(3-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            502 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Print_($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            503 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Yield_(null, null, $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            504 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Yield_($self->semStack[$stackPos-(2-2)], null, $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            505 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Yield_($self->semStack[$stackPos-(4-4)], $self->semStack[$stackPos-(4-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]));\n            },\n            506 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\YieldFrom($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            507 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Throw_($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            508 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\ArrowFunction(['static' => false, 'byRef' => $self->semStack[$stackPos-(8-2)], 'params' => $self->semStack[$stackPos-(8-4)], 'returnType' => $self->semStack[$stackPos-(8-6)], 'expr' => $self->semStack[$stackPos-(8-8)], 'attrGroups' => []], $self->getAttributes($self->tokenStartStack[$stackPos-(8-1)], $self->tokenEndStack[$stackPos]));\n            },\n            509 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\ArrowFunction(['static' => true, 'byRef' => $self->semStack[$stackPos-(9-3)], 'params' => $self->semStack[$stackPos-(9-5)], 'returnType' => $self->semStack[$stackPos-(9-7)], 'expr' => $self->semStack[$stackPos-(9-9)], 'attrGroups' => []], $self->getAttributes($self->tokenStartStack[$stackPos-(9-1)], $self->tokenEndStack[$stackPos]));\n            },\n            510 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Closure(['static' => false, 'byRef' => $self->semStack[$stackPos-(8-2)], 'params' => $self->semStack[$stackPos-(8-4)], 'uses' => $self->semStack[$stackPos-(8-6)], 'returnType' => $self->semStack[$stackPos-(8-7)], 'stmts' => $self->semStack[$stackPos-(8-8)], 'attrGroups' => []], $self->getAttributes($self->tokenStartStack[$stackPos-(8-1)], $self->tokenEndStack[$stackPos]));\n            },\n            511 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Closure(['static' => true, 'byRef' => $self->semStack[$stackPos-(9-3)], 'params' => $self->semStack[$stackPos-(9-5)], 'uses' => $self->semStack[$stackPos-(9-7)], 'returnType' => $self->semStack[$stackPos-(9-8)], 'stmts' => $self->semStack[$stackPos-(9-9)], 'attrGroups' => []], $self->getAttributes($self->tokenStartStack[$stackPos-(9-1)], $self->tokenEndStack[$stackPos]));\n            },\n            512 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\ArrowFunction(['static' => false, 'byRef' => $self->semStack[$stackPos-(9-3)], 'params' => $self->semStack[$stackPos-(9-5)], 'returnType' => $self->semStack[$stackPos-(9-7)], 'expr' => $self->semStack[$stackPos-(9-9)], 'attrGroups' => $self->semStack[$stackPos-(9-1)]], $self->getAttributes($self->tokenStartStack[$stackPos-(9-1)], $self->tokenEndStack[$stackPos]));\n            },\n            513 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\ArrowFunction(['static' => true, 'byRef' => $self->semStack[$stackPos-(10-4)], 'params' => $self->semStack[$stackPos-(10-6)], 'returnType' => $self->semStack[$stackPos-(10-8)], 'expr' => $self->semStack[$stackPos-(10-10)], 'attrGroups' => $self->semStack[$stackPos-(10-1)]], $self->getAttributes($self->tokenStartStack[$stackPos-(10-1)], $self->tokenEndStack[$stackPos]));\n            },\n            514 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Closure(['static' => false, 'byRef' => $self->semStack[$stackPos-(9-3)], 'params' => $self->semStack[$stackPos-(9-5)], 'uses' => $self->semStack[$stackPos-(9-7)], 'returnType' => $self->semStack[$stackPos-(9-8)], 'stmts' => $self->semStack[$stackPos-(9-9)], 'attrGroups' => $self->semStack[$stackPos-(9-1)]], $self->getAttributes($self->tokenStartStack[$stackPos-(9-1)], $self->tokenEndStack[$stackPos]));\n            },\n            515 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Closure(['static' => true, 'byRef' => $self->semStack[$stackPos-(10-4)], 'params' => $self->semStack[$stackPos-(10-6)], 'uses' => $self->semStack[$stackPos-(10-8)], 'returnType' => $self->semStack[$stackPos-(10-9)], 'stmts' => $self->semStack[$stackPos-(10-10)], 'attrGroups' => $self->semStack[$stackPos-(10-1)]], $self->getAttributes($self->tokenStartStack[$stackPos-(10-1)], $self->tokenEndStack[$stackPos]));\n            },\n            516 => static function ($self, $stackPos) {\n                 $self->semValue = array(new Stmt\\Class_(null, ['type' => $self->semStack[$stackPos-(8-2)], 'extends' => $self->semStack[$stackPos-(8-4)], 'implements' => $self->semStack[$stackPos-(8-5)], 'stmts' => $self->semStack[$stackPos-(8-7)], 'attrGroups' => $self->semStack[$stackPos-(8-1)]], $self->getAttributes($self->tokenStartStack[$stackPos-(8-1)], $self->tokenEndStack[$stackPos])), $self->semStack[$stackPos-(8-3)]);\n            $self->checkClass($self->semValue[0], -1);\n            },\n            517 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\New_($self->semStack[$stackPos-(3-2)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            518 => static function ($self, $stackPos) {\n                 list($class, $ctorArgs) = $self->semStack[$stackPos-(2-2)]; $self->semValue = new Expr\\New_($class, $ctorArgs, $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            519 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\New_($self->semStack[$stackPos-(2-2)], [], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            520 => null,\n            521 => null,\n            522 => static function ($self, $stackPos) {\n                 $self->semValue = array();\n            },\n            523 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(4-3)];\n            },\n            524 => null,\n            525 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(1-1)]);\n            },\n            526 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)];\n            },\n            527 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\ClosureUse($self->semStack[$stackPos-(2-2)], $self->semStack[$stackPos-(2-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            528 => static function ($self, $stackPos) {\n                 $self->semValue = new Name($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            529 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\FuncCall($self->semStack[$stackPos-(2-1)], $self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            530 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\FuncCall($self->semStack[$stackPos-(2-1)], $self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            531 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\FuncCall($self->semStack[$stackPos-(2-1)], $self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            532 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\StaticCall($self->semStack[$stackPos-(4-1)], $self->semStack[$stackPos-(4-3)], $self->semStack[$stackPos-(4-4)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]));\n            },\n            533 => static function ($self, $stackPos) {\n                 $self->semValue = new Name($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            534 => null,\n            535 => static function ($self, $stackPos) {\n                 $self->semValue = new Name($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            536 => static function ($self, $stackPos) {\n                 $self->semValue = new Name($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            537 => static function ($self, $stackPos) {\n                 $self->semValue = new Name\\FullyQualified(substr($self->semStack[$stackPos-(1-1)], 1), $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            538 => static function ($self, $stackPos) {\n                 $self->semValue = new Name\\Relative(substr($self->semStack[$stackPos-(1-1)], 10), $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            539 => null,\n            540 => null,\n            541 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(3-2)];\n            },\n            542 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Error($self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); $self->errorState = 2;\n            },\n            543 => null,\n            544 => null,\n            545 => static function ($self, $stackPos) {\n                 $self->semValue = array();\n            },\n            546 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(1-1)]); foreach ($self->semValue as $s) { if ($s instanceof Node\\InterpolatedStringPart) { $s->value = Node\\Scalar\\String_::parseEscapeSequences($s->value, '`', $self->phpVersion->supportsUnicodeEscapes()); } };\n            },\n            547 => static function ($self, $stackPos) {\n                 foreach ($self->semStack[$stackPos-(1-1)] as $s) { if ($s instanceof Node\\InterpolatedStringPart) { $s->value = Node\\Scalar\\String_::parseEscapeSequences($s->value, '`', $self->phpVersion->supportsUnicodeEscapes()); } }; $self->semValue = $self->semStack[$stackPos-(1-1)];\n            },\n            548 => static function ($self, $stackPos) {\n                 $self->semValue = array();\n            },\n            549 => null,\n            550 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\ConstFetch($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            551 => static function ($self, $stackPos) {\n                 $self->semValue = new Scalar\\MagicConst\\Line($self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            552 => static function ($self, $stackPos) {\n                 $self->semValue = new Scalar\\MagicConst\\File($self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            553 => static function ($self, $stackPos) {\n                 $self->semValue = new Scalar\\MagicConst\\Dir($self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            554 => static function ($self, $stackPos) {\n                 $self->semValue = new Scalar\\MagicConst\\Class_($self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            555 => static function ($self, $stackPos) {\n                 $self->semValue = new Scalar\\MagicConst\\Trait_($self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            556 => static function ($self, $stackPos) {\n                 $self->semValue = new Scalar\\MagicConst\\Method($self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            557 => static function ($self, $stackPos) {\n                 $self->semValue = new Scalar\\MagicConst\\Function_($self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            558 => static function ($self, $stackPos) {\n                 $self->semValue = new Scalar\\MagicConst\\Namespace_($self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            559 => static function ($self, $stackPos) {\n                 $self->semValue = new Scalar\\MagicConst\\Property($self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            560 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\ClassConstFetch($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            561 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\ClassConstFetch($self->semStack[$stackPos-(5-1)], $self->semStack[$stackPos-(5-4)], $self->getAttributes($self->tokenStartStack[$stackPos-(5-1)], $self->tokenEndStack[$stackPos]));\n            },\n            562 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\ClassConstFetch($self->semStack[$stackPos-(3-1)], new Expr\\Error($self->getAttributes($self->tokenStartStack[$stackPos-(3-3)],  $self->tokenEndStack[$stackPos-(3-3)])), $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos])); $self->errorState = 2;\n            },\n            563 => static function ($self, $stackPos) {\n                 $attrs = $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]); $attrs['kind'] = Expr\\Array_::KIND_SHORT;\n            $self->semValue = new Expr\\Array_($self->semStack[$stackPos-(3-2)], $attrs);\n            },\n            564 => static function ($self, $stackPos) {\n                 $attrs = $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]); $attrs['kind'] = Expr\\Array_::KIND_LONG;\n            $self->semValue = new Expr\\Array_($self->semStack[$stackPos-(4-3)], $attrs);\n            $self->createdArrays->offsetSet($self->semValue);\n            },\n            565 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(1-1)]; $self->createdArrays->offsetSet($self->semValue);\n            },\n            566 => static function ($self, $stackPos) {\n                 $self->semValue = Scalar\\String_::fromString($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]), $self->phpVersion->supportsUnicodeEscapes());\n            },\n            567 => static function ($self, $stackPos) {\n                 $attrs = $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]); $attrs['kind'] = Scalar\\String_::KIND_DOUBLE_QUOTED;\n            foreach ($self->semStack[$stackPos-(3-2)] as $s) { if ($s instanceof Node\\InterpolatedStringPart) { $s->value = Node\\Scalar\\String_::parseEscapeSequences($s->value, '\"', $self->phpVersion->supportsUnicodeEscapes()); } }; $self->semValue = new Scalar\\InterpolatedString($self->semStack[$stackPos-(3-2)], $attrs);\n            },\n            568 => static function ($self, $stackPos) {\n                 $self->semValue = $self->parseLNumber($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]), $self->phpVersion->allowsInvalidOctals());\n            },\n            569 => static function ($self, $stackPos) {\n                 $self->semValue = Scalar\\Float_::fromString($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            570 => null,\n            571 => null,\n            572 => null,\n            573 => static function ($self, $stackPos) {\n                 $self->semValue = $self->parseDocString($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-2)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]), $self->getAttributes($self->tokenStartStack[$stackPos-(3-3)],  $self->tokenEndStack[$stackPos-(3-3)]), true);\n            },\n            574 => static function ($self, $stackPos) {\n                 $self->semValue = $self->parseDocString($self->semStack[$stackPos-(2-1)], '', $self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]), $self->getAttributes($self->tokenStartStack[$stackPos-(2-2)],  $self->tokenEndStack[$stackPos-(2-2)]), true);\n            },\n            575 => static function ($self, $stackPos) {\n                 $self->semValue = $self->parseDocString($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-2)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]), $self->getAttributes($self->tokenStartStack[$stackPos-(3-3)],  $self->tokenEndStack[$stackPos-(3-3)]), true);\n            },\n            576 => static function ($self, $stackPos) {\n                 $self->semValue = null;\n            },\n            577 => null,\n            578 => null,\n            579 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(3-2)];\n            },\n            580 => null,\n            581 => null,\n            582 => null,\n            583 => null,\n            584 => null,\n            585 => null,\n            586 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(3-2)];\n            },\n            587 => null,\n            588 => null,\n            589 => null,\n            590 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\ArrayDimFetch($self->semStack[$stackPos-(4-1)], $self->semStack[$stackPos-(4-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]));\n            },\n            591 => null,\n            592 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\MethodCall($self->semStack[$stackPos-(4-1)], $self->semStack[$stackPos-(4-3)], $self->semStack[$stackPos-(4-4)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]));\n            },\n            593 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\NullsafeMethodCall($self->semStack[$stackPos-(4-1)], $self->semStack[$stackPos-(4-3)], $self->semStack[$stackPos-(4-4)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]));\n            },\n            594 => static function ($self, $stackPos) {\n                 $self->semValue = null;\n            },\n            595 => null,\n            596 => null,\n            597 => null,\n            598 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\PropertyFetch($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            599 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\NullsafePropertyFetch($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            600 => null,\n            601 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Variable($self->semStack[$stackPos-(4-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]));\n            },\n            602 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Variable($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            603 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Variable(new Expr\\Error($self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])), $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos])); $self->errorState = 2;\n            },\n            604 => static function ($self, $stackPos) {\n                 $var = $self->semStack[$stackPos-(1-1)]->name; $self->semValue = \\is_string($var) ? new Node\\VarLikeIdentifier($var, $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])) : $var;\n            },\n            605 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\StaticPropertyFetch($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            606 => null,\n            607 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\ArrayDimFetch($self->semStack[$stackPos-(4-1)], $self->semStack[$stackPos-(4-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]));\n            },\n            608 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\PropertyFetch($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            609 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\NullsafePropertyFetch($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            610 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\StaticPropertyFetch($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            611 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\StaticPropertyFetch($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            612 => null,\n            613 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(3-2)];\n            },\n            614 => null,\n            615 => null,\n            616 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(3-2)];\n            },\n            617 => null,\n            618 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Error($self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos])); $self->errorState = 2;\n            },\n            619 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\List_($self->semStack[$stackPos-(4-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos])); $self->semValue->setAttribute('kind', Expr\\List_::KIND_LIST);\n            $self->postprocessList($self->semValue);\n            },\n            620 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(1-1)]; $end = count($self->semValue)-1; if ($self->semValue[$end]->value instanceof Expr\\Error) array_pop($self->semValue);\n            },\n            621 => null,\n            622 => static function ($self, $stackPos) {\n                 /* do nothing -- prevent default action of $$=$self->semStack[$1]. See $551. */\n            },\n            623 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(3-1)][] = $self->semStack[$stackPos-(3-3)]; $self->semValue = $self->semStack[$stackPos-(3-1)];\n            },\n            624 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(1-1)]);\n            },\n            625 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\ArrayItem($self->semStack[$stackPos-(1-1)], null, false, $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            626 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\ArrayItem($self->semStack[$stackPos-(2-2)], null, true, $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            627 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\ArrayItem($self->semStack[$stackPos-(1-1)], null, false, $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            628 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\ArrayItem($self->semStack[$stackPos-(3-3)], $self->semStack[$stackPos-(3-1)], false, $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            629 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\ArrayItem($self->semStack[$stackPos-(4-4)], $self->semStack[$stackPos-(4-1)], true, $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]));\n            },\n            630 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\ArrayItem($self->semStack[$stackPos-(3-3)], $self->semStack[$stackPos-(3-1)], false, $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            631 => static function ($self, $stackPos) {\n                 $self->semValue = new Node\\ArrayItem($self->semStack[$stackPos-(2-2)], null, false, $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]), true);\n            },\n            632 => static function ($self, $stackPos) {\n                 /* Create an Error node now to remember the position. We'll later either report an error,\n             or convert this into a null element, depending on whether this is a creation or destructuring context. */\n          $attrs = $self->createEmptyElemAttributes($self->tokenPos);\n          $self->semValue = new Node\\ArrayItem(new Expr\\Error($attrs), null, false, $attrs);\n            },\n            633 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(2-1)][] = $self->semStack[$stackPos-(2-2)]; $self->semValue = $self->semStack[$stackPos-(2-1)];\n            },\n            634 => static function ($self, $stackPos) {\n                 $self->semStack[$stackPos-(2-1)][] = $self->semStack[$stackPos-(2-2)]; $self->semValue = $self->semStack[$stackPos-(2-1)];\n            },\n            635 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(1-1)]);\n            },\n            636 => static function ($self, $stackPos) {\n                 $self->semValue = array($self->semStack[$stackPos-(2-1)], $self->semStack[$stackPos-(2-2)]);\n            },\n            637 => static function ($self, $stackPos) {\n                 $attrs = $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]); $attrs['rawValue'] = $self->semStack[$stackPos-(1-1)]; $self->semValue = new Node\\InterpolatedStringPart($self->semStack[$stackPos-(1-1)], $attrs);\n            },\n            638 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Variable($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            639 => null,\n            640 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\ArrayDimFetch($self->semStack[$stackPos-(4-1)], $self->semStack[$stackPos-(4-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(4-1)], $self->tokenEndStack[$stackPos]));\n            },\n            641 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\PropertyFetch($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            642 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\NullsafePropertyFetch($self->semStack[$stackPos-(3-1)], $self->semStack[$stackPos-(3-3)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            643 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Variable($self->semStack[$stackPos-(3-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            644 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\Variable($self->semStack[$stackPos-(3-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(3-1)], $self->tokenEndStack[$stackPos]));\n            },\n            645 => static function ($self, $stackPos) {\n                 $self->semValue = new Expr\\ArrayDimFetch($self->semStack[$stackPos-(6-2)], $self->semStack[$stackPos-(6-4)], $self->getAttributes($self->tokenStartStack[$stackPos-(6-1)], $self->tokenEndStack[$stackPos]));\n            },\n            646 => static function ($self, $stackPos) {\n                 $self->semValue = $self->semStack[$stackPos-(3-2)];\n            },\n            647 => static function ($self, $stackPos) {\n                 $self->semValue = new Scalar\\String_($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            648 => static function ($self, $stackPos) {\n                 $self->semValue = $self->parseNumString($self->semStack[$stackPos-(1-1)], $self->getAttributes($self->tokenStartStack[$stackPos-(1-1)], $self->tokenEndStack[$stackPos]));\n            },\n            649 => static function ($self, $stackPos) {\n                 $self->semValue = $self->parseNumString('-' . $self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));\n            },\n            650 => null,\n        ];\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Parser.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser;\n\ninterface Parser {\n    /**\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     */\n    public function parse(string $code, ?ErrorHandler $errorHandler = null): ?array;\n\n    /**\n     * Return tokens for the last parse.\n     *\n     * @return Token[]\n     */\n    public function getTokens(): array;\n}\n","vendor/nikic/php-parser/lib/PhpParser/ParserAbstract.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser;\n\n/*\n * This parser is based on a skeleton written by Moriyoshi Koizumi, which in\n * turn is based on work by Masato Bito.\n */\n\nuse PhpParser\\Node\\Arg;\nuse PhpParser\\Node\\Expr;\nuse PhpParser\\Node\\Expr\\Array_;\nuse PhpParser\\Node\\Expr\\Cast\\Double;\nuse PhpParser\\Node\\Identifier;\nuse PhpParser\\Node\\InterpolatedStringPart;\nuse PhpParser\\Node\\Name;\nuse PhpParser\\Node\\Param;\nuse PhpParser\\Node\\PropertyHook;\nuse PhpParser\\Node\\Scalar\\InterpolatedString;\nuse PhpParser\\Node\\Scalar\\Int_;\nuse PhpParser\\Node\\Scalar\\String_;\nuse PhpParser\\Node\\Stmt;\nuse PhpParser\\Node\\Stmt\\Class_;\nuse PhpParser\\Node\\Stmt\\ClassConst;\nuse PhpParser\\Node\\Stmt\\ClassMethod;\nuse PhpParser\\Node\\Stmt\\Const_;\nuse PhpParser\\Node\\Stmt\\Else_;\nuse PhpParser\\Node\\Stmt\\ElseIf_;\nuse PhpParser\\Node\\Stmt\\Enum_;\nuse PhpParser\\Node\\Stmt\\Interface_;\nuse PhpParser\\Node\\Stmt\\Namespace_;\nuse PhpParser\\Node\\Stmt\\Nop;\nuse PhpParser\\Node\\Stmt\\Property;\nuse PhpParser\\Node\\Stmt\\TryCatch;\nuse PhpParser\\Node\\UseItem;\nuse PhpParser\\Node\\VarLikeIdentifier;\nuse PhpParser\\NodeVisitor\\CommentAnnotatingVisitor;\n\nabstract class ParserAbstract implements Parser {\n    private const SYMBOL_NONE = -1;\n\n    /** @var Lexer Lexer that is used when parsing */\n    protected Lexer $lexer;\n    /** @var PhpVersion PHP version to target on a best-effort basis */\n    protected PhpVersion $phpVersion;\n\n    /*\n     * The following members will be filled with generated parsing data:\n     */\n\n    /** @var int Size of $tokenToSymbol map */\n    protected int $tokenToSymbolMapSize;\n    /** @var int Size of $action table */\n    protected int $actionTableSize;\n    /** @var int Size of $goto table */\n    protected int $gotoTableSize;\n\n    /** @var int Symbol number signifying an invalid token */\n    protected int $invalidSymbol;\n    /** @var int Symbol number of error recovery token */\n    protected int $errorSymbol;\n    /** @var int Action number signifying default action */\n    protected int $defaultAction;\n    /** @var int Rule number signifying that an unexpected token was encountered */\n    protected int $unexpectedTokenRule;\n\n    protected int $YY2TBLSTATE;\n    /** @var int Number of non-leaf states */\n    protected int $numNonLeafStates;\n\n    /** @var int[] Map of PHP token IDs to internal symbols */\n    protected array $phpTokenToSymbol;\n    /** @var array<int, bool> Map of PHP token IDs to drop */\n    protected array $dropTokens;\n    /** @var int[] Map of external symbols (static::T_*) to internal symbols */\n    protected array $tokenToSymbol;\n    /** @var string[] Map of symbols to their names */\n    protected array $symbolToName;\n    /** @var array<int, string> Names of the production rules (only necessary for debugging) */\n    protected array $productions;\n\n    /** @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. */\n    protected array $actionBase;\n    /** @var int[] Table of actions. Indexed according to $actionBase comment. */\n    protected array $action;\n    /** @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. */\n    protected array $actionCheck;\n    /** @var int[] Map of states to their default action */\n    protected array $actionDefault;\n    /** @var callable[] Semantic action callbacks */\n    protected array $reduceCallbacks;\n\n    /** @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) */\n    protected array $gotoBase;\n    /** @var int[] Table of states to goto after reduction. Indexed according to $gotoBase comment. */\n    protected array $goto;\n    /** @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. */\n    protected array $gotoCheck;\n    /** @var int[] Map of non-terminals to the default state to goto after their reduction */\n    protected array $gotoDefault;\n\n    /** @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. */\n    protected array $ruleToNonTerminal;\n    /** @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. */\n    protected array $ruleToLength;\n\n    /*\n     * The following members are part of the parser state:\n     */\n\n    /** @var mixed Temporary value containing the result of last semantic action (reduction) */\n    protected $semValue;\n    /** @var mixed[] Semantic value stack (contains values of tokens and semantic action results) */\n    protected array $semStack;\n    /** @var int[] Token start position stack */\n    protected array $tokenStartStack;\n    /** @var int[] Token end position stack */\n    protected array $tokenEndStack;\n\n    /** @var ErrorHandler Error handler */\n    protected ErrorHandler $errorHandler;\n    /** @var int Error state, used to avoid error floods */\n    protected int $errorState;\n\n    /** @var \\SplObjectStorage<Array_, null>|null Array nodes created during parsing, for postprocessing of empty elements. */\n    protected ?\\SplObjectStorage $createdArrays;\n\n    /** @var \\SplObjectStorage<Expr\\ArrowFunction, null>|null\n     *       Arrow functions that are wrapped in parentheses, to enforce the pipe operator parentheses requirements.\n     */\n    protected ?\\SplObjectStorage $parenthesizedArrowFunctions;\n\n    /** @var Token[] Tokens for the current parse */\n    protected array $tokens;\n    /** @var int Current position in token array */\n    protected int $tokenPos;\n\n    /**\n     * Initialize $reduceCallbacks map.\n     */\n    abstract protected function initReduceCallbacks(): void;\n\n    /**\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     */\n    public function __construct(Lexer $lexer, ?PhpVersion $phpVersion = null) {\n        $this->lexer = $lexer;\n        $this->phpVersion = $phpVersion ?? PhpVersion::getNewestSupported();\n\n        $this->initReduceCallbacks();\n        $this->phpTokenToSymbol = $this->createTokenMap();\n        $this->dropTokens = array_fill_keys(\n            [\\T_WHITESPACE, \\T_OPEN_TAG, \\T_COMMENT, \\T_DOC_COMMENT, \\T_BAD_CHARACTER], true\n        );\n    }\n\n    /**\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     */\n    public function parse(string $code, ?ErrorHandler $errorHandler = null): ?array {\n        $this->errorHandler = $errorHandler ?: new ErrorHandler\\Throwing();\n        $this->createdArrays = new \\SplObjectStorage();\n        $this->parenthesizedArrowFunctions = new \\SplObjectStorage();\n\n        $this->tokens = $this->lexer->tokenize($code, $this->errorHandler);\n        $result = $this->doParse();\n\n        // Report errors for any empty elements used inside arrays. This is delayed until after the main parse,\n        // because we don't know a priori whether a given array expression will be used in a destructuring context\n        // or not.\n        foreach ($this->createdArrays as $node) {\n            foreach ($node->items as $item) {\n                if ($item->value instanceof Expr\\Error) {\n                    $this->errorHandler->handleError(\n                        new Error('Cannot use empty array elements in arrays', $item->getAttributes()));\n                }\n            }\n        }\n\n        // Clear out some of the interior state, so we don't hold onto unnecessary\n        // memory between uses of the parser\n        $this->tokenStartStack = [];\n        $this->tokenEndStack = [];\n        $this->semStack = [];\n        $this->semValue = null;\n        $this->createdArrays = null;\n        $this->parenthesizedArrowFunctions = null;\n\n        if ($result !== null) {\n            $traverser = new NodeTraverser(new CommentAnnotatingVisitor($this->tokens));\n            $traverser->traverse($result);\n        }\n\n        return $result;\n    }\n\n    public function getTokens(): array {\n        return $this->tokens;\n    }\n\n    /** @return Stmt[]|null */\n    protected function doParse(): ?array {\n        // We start off with no lookahead-token\n        $symbol = self::SYMBOL_NONE;\n        $tokenValue = null;\n        $this->tokenPos = -1;\n\n        // Keep stack of start and end attributes\n        $this->tokenStartStack = [];\n        $this->tokenEndStack = [0];\n\n        // Start off in the initial state and keep a stack of previous states\n        $state = 0;\n        $stateStack = [$state];\n\n        // Semantic value stack (contains values of tokens and semantic action results)\n        $this->semStack = [];\n\n        // Current position in the stack(s)\n        $stackPos = 0;\n\n        $this->errorState = 0;\n\n        for (;;) {\n            //$this->traceNewState($state, $symbol);\n\n            if ($this->actionBase[$state] === 0) {\n                $rule = $this->actionDefault[$state];\n            } else {\n                if ($symbol === self::SYMBOL_NONE) {\n                    do {\n                        $token = $this->tokens[++$this->tokenPos];\n                        $tokenId = $token->id;\n                    } while (isset($this->dropTokens[$tokenId]));\n\n                    // Map the lexer token id to the internally used symbols.\n                    $tokenValue = $token->text;\n                    if (!isset($this->phpTokenToSymbol[$tokenId])) {\n                        throw new \\RangeException(sprintf(\n                            'The lexer returned an invalid token (id=%d, value=%s)',\n                            $tokenId, $tokenValue\n                        ));\n                    }\n                    $symbol = $this->phpTokenToSymbol[$tokenId];\n\n                    //$this->traceRead($symbol);\n                }\n\n                $idx = $this->actionBase[$state] + $symbol;\n                if ((($idx >= 0 && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $symbol)\n                     || ($state < $this->YY2TBLSTATE\n                         && ($idx = $this->actionBase[$state + $this->numNonLeafStates] + $symbol) >= 0\n                         && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $symbol))\n                    && ($action = $this->action[$idx]) !== $this->defaultAction) {\n                    /*\n                     * >= numNonLeafStates: shift and reduce\n                     * > 0: shift\n                     * = 0: accept\n                     * < 0: reduce\n                     * = -YYUNEXPECTED: error\n                     */\n                    if ($action > 0) {\n                        /* shift */\n                        //$this->traceShift($symbol);\n\n                        ++$stackPos;\n                        $stateStack[$stackPos] = $state = $action;\n                        $this->semStack[$stackPos] = $tokenValue;\n                        $this->tokenStartStack[$stackPos] = $this->tokenPos;\n                        $this->tokenEndStack[$stackPos] = $this->tokenPos;\n                        $symbol = self::SYMBOL_NONE;\n\n                        if ($this->errorState) {\n                            --$this->errorState;\n                        }\n\n                        if ($action < $this->numNonLeafStates) {\n                            continue;\n                        }\n\n                        /* $yyn >= numNonLeafStates means shift-and-reduce */\n                        $rule = $action - $this->numNonLeafStates;\n                    } else {\n                        $rule = -$action;\n                    }\n                } else {\n                    $rule = $this->actionDefault[$state];\n                }\n            }\n\n            for (;;) {\n                if ($rule === 0) {\n                    /* accept */\n                    //$this->traceAccept();\n                    return $this->semValue;\n                }\n                if ($rule !== $this->unexpectedTokenRule) {\n                    /* reduce */\n                    //$this->traceReduce($rule);\n\n                    $ruleLength = $this->ruleToLength[$rule];\n                    try {\n                        $callback = $this->reduceCallbacks[$rule];\n                        if ($callback !== null) {\n                            $callback($this, $stackPos);\n                        } elseif ($ruleLength > 0) {\n                            $this->semValue = $this->semStack[$stackPos - $ruleLength + 1];\n                        }\n                    } catch (Error $e) {\n                        if (-1 === $e->getStartLine()) {\n                            $e->setStartLine($this->tokens[$this->tokenPos]->line);\n                        }\n\n                        $this->emitError($e);\n                        // Can't recover from this type of error\n                        return null;\n                    }\n\n                    /* Goto - shift nonterminal */\n                    $lastTokenEnd = $this->tokenEndStack[$stackPos];\n                    $stackPos -= $ruleLength;\n                    $nonTerminal = $this->ruleToNonTerminal[$rule];\n                    $idx = $this->gotoBase[$nonTerminal] + $stateStack[$stackPos];\n                    if ($idx >= 0 && $idx < $this->gotoTableSize && $this->gotoCheck[$idx] === $nonTerminal) {\n                        $state = $this->goto[$idx];\n                    } else {\n                        $state = $this->gotoDefault[$nonTerminal];\n                    }\n\n                    ++$stackPos;\n                    $stateStack[$stackPos]     = $state;\n                    $this->semStack[$stackPos] = $this->semValue;\n                    $this->tokenEndStack[$stackPos] = $lastTokenEnd;\n                    if ($ruleLength === 0) {\n                        // Empty productions use the start attributes of the lookahead token.\n                        $this->tokenStartStack[$stackPos] = $this->tokenPos;\n                    }\n                } else {\n                    /* error */\n                    switch ($this->errorState) {\n                        case 0:\n                            $msg = $this->getErrorMessage($symbol, $state);\n                            $this->emitError(new Error($msg, $this->getAttributesForToken($this->tokenPos)));\n                            // Break missing intentionally\n                            // no break\n                        case 1:\n                        case 2:\n                            $this->errorState = 3;\n\n                            // Pop until error-expecting state uncovered\n                            while (!(\n                                (($idx = $this->actionBase[$state] + $this->errorSymbol) >= 0\n                                    && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $this->errorSymbol)\n                                || ($state < $this->YY2TBLSTATE\n                                    && ($idx = $this->actionBase[$state + $this->numNonLeafStates] + $this->errorSymbol) >= 0\n                                    && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $this->errorSymbol)\n                            ) || ($action = $this->action[$idx]) === $this->defaultAction) { // Not totally sure about this\n                                if ($stackPos <= 0) {\n                                    // Could not recover from error\n                                    return null;\n                                }\n                                $state = $stateStack[--$stackPos];\n                                //$this->tracePop($state);\n                            }\n\n                            //$this->traceShift($this->errorSymbol);\n                            ++$stackPos;\n                            $stateStack[$stackPos] = $state = $action;\n\n                            // We treat the error symbol as being empty, so we reset the end attributes\n                            // to the end attributes of the last non-error symbol\n                            $this->tokenStartStack[$stackPos] = $this->tokenPos;\n                            $this->tokenEndStack[$stackPos] = $this->tokenEndStack[$stackPos - 1];\n                            break;\n\n                        case 3:\n                            if ($symbol === 0) {\n                                // Reached EOF without recovering from error\n                                return null;\n                            }\n\n                            //$this->traceDiscard($symbol);\n                            $symbol = self::SYMBOL_NONE;\n                            break 2;\n                    }\n                }\n\n                if ($state < $this->numNonLeafStates) {\n                    break;\n                }\n\n                /* >= numNonLeafStates means shift-and-reduce */\n                $rule = $state - $this->numNonLeafStates;\n            }\n        }\n    }\n\n    protected function emitError(Error $error): void {\n        $this->errorHandler->handleError($error);\n    }\n\n    /**\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     */\n    protected function getErrorMessage(int $symbol, int $state): string {\n        $expectedString = '';\n        if ($expected = $this->getExpectedTokens($state)) {\n            $expectedString = ', expecting ' . implode(' or ', $expected);\n        }\n\n        return 'Syntax error, unexpected ' . $this->symbolToName[$symbol] . $expectedString;\n    }\n\n    /**\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     */\n    protected function getExpectedTokens(int $state): array {\n        $expected = [];\n\n        $base = $this->actionBase[$state];\n        foreach ($this->symbolToName as $symbol => $name) {\n            $idx = $base + $symbol;\n            if ($idx >= 0 && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $symbol\n                || $state < $this->YY2TBLSTATE\n                && ($idx = $this->actionBase[$state + $this->numNonLeafStates] + $symbol) >= 0\n                && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $symbol\n            ) {\n                if ($this->action[$idx] !== $this->unexpectedTokenRule\n                    && $this->action[$idx] !== $this->defaultAction\n                    && $symbol !== $this->errorSymbol\n                ) {\n                    if (count($expected) === 4) {\n                        /* Too many expected tokens */\n                        return [];\n                    }\n\n                    $expected[] = $name;\n                }\n            }\n        }\n\n        return $expected;\n    }\n\n    /**\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     */\n    protected function getAttributes(int $tokenStartPos, int $tokenEndPos): array {\n        $startToken = $this->tokens[$tokenStartPos];\n        $afterEndToken = $this->tokens[$tokenEndPos + 1];\n        return [\n            'startLine' => $startToken->line,\n            'startTokenPos' => $tokenStartPos,\n            'startFilePos' => $startToken->pos,\n            'endLine' => $afterEndToken->line,\n            'endTokenPos' => $tokenEndPos,\n            'endFilePos' => $afterEndToken->pos - 1,\n        ];\n    }\n\n    /**\n     * Get attributes for a single token at the given token position.\n     *\n     * @return array<string, mixed> Attributes\n     */\n    protected function getAttributesForToken(int $tokenPos): array {\n        if ($tokenPos < \\count($this->tokens) - 1) {\n            return $this->getAttributes($tokenPos, $tokenPos);\n        }\n\n        // Get attributes for the sentinel token.\n        $token = $this->tokens[$tokenPos];\n        return [\n            'startLine' => $token->line,\n            'startTokenPos' => $tokenPos,\n            'startFilePos' => $token->pos,\n            'endLine' => $token->line,\n            'endTokenPos' => $tokenPos,\n            'endFilePos' => $token->pos,\n        ];\n    }\n\n    /*\n     * Tracing functions used for debugging the parser.\n     */\n\n    /*\n    protected function traceNewState($state, $symbol): void {\n        echo '% State ' . $state\n            . ', Lookahead ' . ($symbol == self::SYMBOL_NONE ? '--none--' : $this->symbolToName[$symbol]) . \"\\n\";\n    }\n\n    protected function traceRead($symbol): void {\n        echo '% Reading ' . $this->symbolToName[$symbol] . \"\\n\";\n    }\n\n    protected function traceShift($symbol): void {\n        echo '% Shift ' . $this->symbolToName[$symbol] . \"\\n\";\n    }\n\n    protected function traceAccept(): void {\n        echo \"% Accepted.\\n\";\n    }\n\n    protected function traceReduce($n): void {\n        echo '% Reduce by (' . $n . ') ' . $this->productions[$n] . \"\\n\";\n    }\n\n    protected function tracePop($state): void {\n        echo '% Recovering, uncovered state ' . $state . \"\\n\";\n    }\n\n    protected function traceDiscard($symbol): void {\n        echo '% Discard ' . $this->symbolToName[$symbol] . \"\\n\";\n    }\n    */\n\n    /*\n     * Helper functions invoked by semantic actions\n     */\n\n    /**\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     */\n    protected function handleNamespaces(array $stmts): array {\n        $hasErrored = false;\n        $style = $this->getNamespacingStyle($stmts);\n        if (null === $style) {\n            // not namespaced, nothing to do\n            return $stmts;\n        }\n        if ('brace' === $style) {\n            // For braced namespaces we only have to check that there are no invalid statements between the namespaces\n            $afterFirstNamespace = false;\n            foreach ($stmts as $stmt) {\n                if ($stmt instanceof Node\\Stmt\\Namespace_) {\n                    $afterFirstNamespace = true;\n                } elseif (!$stmt instanceof Node\\Stmt\\HaltCompiler\n                        && !$stmt instanceof Node\\Stmt\\Nop\n                        && $afterFirstNamespace && !$hasErrored) {\n                    $this->emitError(new Error(\n                        'No code may exist outside of namespace {}', $stmt->getAttributes()));\n                    $hasErrored = true; // Avoid one error for every statement\n                }\n            }\n            return $stmts;\n        } else {\n            // For semicolon namespaces we have to move the statements after a namespace declaration into ->stmts\n            $resultStmts = [];\n            $targetStmts = &$resultStmts;\n            $lastNs = null;\n            foreach ($stmts as $stmt) {\n                if ($stmt instanceof Node\\Stmt\\Namespace_) {\n                    if ($lastNs !== null) {\n                        $this->fixupNamespaceAttributes($lastNs);\n                    }\n                    if ($stmt->stmts === null) {\n                        $stmt->stmts = [];\n                        $targetStmts = &$stmt->stmts;\n                        $resultStmts[] = $stmt;\n                    } else {\n                        // This handles the invalid case of mixed style namespaces\n                        $resultStmts[] = $stmt;\n                        $targetStmts = &$resultStmts;\n                    }\n                    $lastNs = $stmt;\n                } elseif ($stmt instanceof Node\\Stmt\\HaltCompiler) {\n                    // __halt_compiler() is not moved into the namespace\n                    $resultStmts[] = $stmt;\n                } else {\n                    $targetStmts[] = $stmt;\n                }\n            }\n            if ($lastNs !== null) {\n                $this->fixupNamespaceAttributes($lastNs);\n            }\n            return $resultStmts;\n        }\n    }\n\n    private function fixupNamespaceAttributes(Node\\Stmt\\Namespace_ $stmt): void {\n        // We moved the statements into the namespace node, as such the end of the namespace node\n        // needs to be extended to the end of the statements.\n        if (empty($stmt->stmts)) {\n            return;\n        }\n\n        // We only move the builtin end attributes here. This is the best we can do with the\n        // knowledge we have.\n        $endAttributes = ['endLine', 'endFilePos', 'endTokenPos'];\n        $lastStmt = $stmt->stmts[count($stmt->stmts) - 1];\n        foreach ($endAttributes as $endAttribute) {\n            if ($lastStmt->hasAttribute($endAttribute)) {\n                $stmt->setAttribute($endAttribute, $lastStmt->getAttribute($endAttribute));\n            }\n        }\n    }\n\n    /** @return array<string, mixed> */\n    private function getNamespaceErrorAttributes(Namespace_ $node): array {\n        $attrs = $node->getAttributes();\n        // Adjust end attributes to only cover the \"namespace\" keyword, not the whole namespace.\n        if (isset($attrs['startLine'])) {\n            $attrs['endLine'] = $attrs['startLine'];\n        }\n        if (isset($attrs['startTokenPos'])) {\n            $attrs['endTokenPos'] = $attrs['startTokenPos'];\n        }\n        if (isset($attrs['startFilePos'])) {\n            $attrs['endFilePos'] = $attrs['startFilePos'] + \\strlen('namespace') - 1;\n        }\n        return $attrs;\n    }\n\n    /**\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     */\n    private function getNamespacingStyle(array $stmts): ?string {\n        $style = null;\n        $hasNotAllowedStmts = false;\n        foreach ($stmts as $i => $stmt) {\n            if ($stmt instanceof Node\\Stmt\\Namespace_) {\n                $currentStyle = null === $stmt->stmts ? 'semicolon' : 'brace';\n                if (null === $style) {\n                    $style = $currentStyle;\n                    if ($hasNotAllowedStmts) {\n                        $this->emitError(new Error(\n                            'Namespace declaration statement has to be the very first statement in the script',\n                            $this->getNamespaceErrorAttributes($stmt)\n                        ));\n                    }\n                } elseif ($style !== $currentStyle) {\n                    $this->emitError(new Error(\n                        'Cannot mix bracketed namespace declarations with unbracketed namespace declarations',\n                        $this->getNamespaceErrorAttributes($stmt)\n                    ));\n                    // Treat like semicolon style for namespace normalization\n                    return 'semicolon';\n                }\n                continue;\n            }\n\n            /* declare(), __halt_compiler() and nops can be used before a namespace declaration */\n            if ($stmt instanceof Node\\Stmt\\Declare_\n                || $stmt instanceof Node\\Stmt\\HaltCompiler\n                || $stmt instanceof Node\\Stmt\\Nop) {\n                continue;\n            }\n\n            /* There may be a hashbang line at the very start of the file */\n            if ($i === 0 && $stmt instanceof Node\\Stmt\\InlineHTML && preg_match('/\\A#!.*\\r?\\n\\z/', $stmt->value)) {\n                continue;\n            }\n\n            /* Everything else if forbidden before namespace declarations */\n            $hasNotAllowedStmts = true;\n        }\n        return $style;\n    }\n\n    /** @return Name|Identifier */\n    protected function handleBuiltinTypes(Name $name) {\n        if (!$name->isUnqualified()) {\n            return $name;\n        }\n\n        $lowerName = $name->toLowerString();\n        if (!$this->phpVersion->supportsBuiltinType($lowerName)) {\n            return $name;\n        }\n\n        return new Node\\Identifier($lowerName, $name->getAttributes());\n    }\n\n    /**\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     */\n    protected function getAttributesAt(int $stackPos): array {\n        return $this->getAttributes($this->tokenStartStack[$stackPos], $this->tokenEndStack[$stackPos]);\n    }\n\n    protected function getFloatCastKind(string $cast): int {\n        $cast = strtolower($cast);\n        if (strpos($cast, 'float') !== false) {\n            return Double::KIND_FLOAT;\n        }\n\n        if (strpos($cast, 'real') !== false) {\n            return Double::KIND_REAL;\n        }\n\n        return Double::KIND_DOUBLE;\n    }\n\n    protected function getIntCastKind(string $cast): int {\n        $cast = strtolower($cast);\n        if (strpos($cast, 'integer') !== false) {\n            return Expr\\Cast\\Int_::KIND_INTEGER;\n        }\n\n        return Expr\\Cast\\Int_::KIND_INT;\n    }\n\n    protected function getBoolCastKind(string $cast): int {\n        $cast = strtolower($cast);\n        if (strpos($cast, 'boolean') !== false) {\n            return Expr\\Cast\\Bool_::KIND_BOOLEAN;\n        }\n\n        return Expr\\Cast\\Bool_::KIND_BOOL;\n    }\n\n    protected function getStringCastKind(string $cast): int {\n        $cast = strtolower($cast);\n        if (strpos($cast, 'binary') !== false) {\n            return Expr\\Cast\\String_::KIND_BINARY;\n        }\n\n        return Expr\\Cast\\String_::KIND_STRING;\n    }\n\n    /** @param array<string, mixed> $attributes */\n    protected function parseLNumber(string $str, array $attributes, bool $allowInvalidOctal = false): Int_ {\n        try {\n            return Int_::fromString($str, $attributes, $allowInvalidOctal);\n        } catch (Error $error) {\n            $this->emitError($error);\n            // Use dummy value\n            return new Int_(0, $attributes);\n        }\n    }\n\n    /**\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     */\n    protected function parseNumString(string $str, array $attributes) {\n        if (!preg_match('/^(?:0|-?[1-9][0-9]*)$/', $str)) {\n            return new String_($str, $attributes);\n        }\n\n        $num = +$str;\n        if (!is_int($num)) {\n            return new String_($str, $attributes);\n        }\n\n        return new Int_($num, $attributes);\n    }\n\n    /** @param array<string, mixed> $attributes */\n    protected function stripIndentation(\n        string $string, int $indentLen, string $indentChar,\n        bool $newlineAtStart, bool $newlineAtEnd, array $attributes\n    ): string {\n        if ($indentLen === 0) {\n            return $string;\n        }\n\n        $start = $newlineAtStart ? '(?:(?<=\\n)|\\A)' : '(?<=\\n)';\n        $end = $newlineAtEnd ? '(?:(?=[\\r\\n])|\\z)' : '(?=[\\r\\n])';\n        $regex = '/' . $start . '([ \\t]*)(' . $end . ')?/';\n        return preg_replace_callback(\n            $regex,\n            function ($matches) use ($indentLen, $indentChar, $attributes) {\n                $prefix = substr($matches[1], 0, $indentLen);\n                if (false !== strpos($prefix, $indentChar === \" \" ? \"\\t\" : \" \")) {\n                    $this->emitError(new Error(\n                        'Invalid indentation - tabs and spaces cannot be mixed', $attributes\n                    ));\n                } elseif (strlen($prefix) < $indentLen && !isset($matches[2])) {\n                    $this->emitError(new Error(\n                        'Invalid body indentation level ' .\n                        '(expecting an indentation level of at least ' . $indentLen . ')',\n                        $attributes\n                    ));\n                }\n                return substr($matches[0], strlen($prefix));\n            },\n            $string\n        );\n    }\n\n    /**\n     * @param string|(Expr|InterpolatedStringPart)[] $contents\n     * @param array<string, mixed> $attributes\n     * @param array<string, mixed> $endTokenAttributes\n     */\n    protected function parseDocString(\n        string $startToken, $contents, string $endToken,\n        array $attributes, array $endTokenAttributes, bool $parseUnicodeEscape\n    ): Expr {\n        $kind = strpos($startToken, \"'\") === false\n            ? String_::KIND_HEREDOC : String_::KIND_NOWDOC;\n\n        $regex = '/\\A[bB]?<<<[ \\t]*[\\'\"]?([a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\\x7f-\\xff]*)[\\'\"]?(?:\\r\\n|\\n|\\r)\\z/';\n        $result = preg_match($regex, $startToken, $matches);\n        assert($result === 1);\n        $label = $matches[1];\n\n        $result = preg_match('/\\A[ \\t]*/', $endToken, $matches);\n        assert($result === 1);\n        $indentation = $matches[0];\n\n        $attributes['kind'] = $kind;\n        $attributes['docLabel'] = $label;\n        $attributes['docIndentation'] = $indentation;\n\n        $indentHasSpaces = false !== strpos($indentation, \" \");\n        $indentHasTabs = false !== strpos($indentation, \"\\t\");\n        if ($indentHasSpaces && $indentHasTabs) {\n            $this->emitError(new Error(\n                'Invalid indentation - tabs and spaces cannot be mixed',\n                $endTokenAttributes\n            ));\n\n            // Proceed processing as if this doc string is not indented\n            $indentation = '';\n        }\n\n        $indentLen = \\strlen($indentation);\n        $indentChar = $indentHasSpaces ? \" \" : \"\\t\";\n\n        if (\\is_string($contents)) {\n            if ($contents === '') {\n                $attributes['rawValue'] = $contents;\n                return new String_('', $attributes);\n            }\n\n            $contents = $this->stripIndentation(\n                $contents, $indentLen, $indentChar, true, true, $attributes\n            );\n            $contents = preg_replace('~(\\r\\n|\\n|\\r)\\z~', '', $contents);\n            $attributes['rawValue'] = $contents;\n\n            if ($kind === String_::KIND_HEREDOC) {\n                $contents = String_::parseEscapeSequences($contents, null, $parseUnicodeEscape);\n            }\n\n            return new String_($contents, $attributes);\n        } else {\n            assert(count($contents) > 0);\n            if (!$contents[0] instanceof Node\\InterpolatedStringPart) {\n                // If there is no leading encapsed string part, pretend there is an empty one\n                $this->stripIndentation(\n                    '', $indentLen, $indentChar, true, false, $contents[0]->getAttributes()\n                );\n            }\n\n            $newContents = [];\n            foreach ($contents as $i => $part) {\n                if ($part instanceof Node\\InterpolatedStringPart) {\n                    $isLast = $i === \\count($contents) - 1;\n                    $part->value = $this->stripIndentation(\n                        $part->value, $indentLen, $indentChar,\n                        $i === 0, $isLast, $part->getAttributes()\n                    );\n                    if ($isLast) {\n                        $part->value = preg_replace('~(\\r\\n|\\n|\\r)\\z~', '', $part->value);\n                    }\n                    $part->setAttribute('rawValue', $part->value);\n                    $part->value = String_::parseEscapeSequences($part->value, null, $parseUnicodeEscape);\n                    if ('' === $part->value) {\n                        continue;\n                    }\n                }\n                $newContents[] = $part;\n            }\n            return new InterpolatedString($newContents, $attributes);\n        }\n    }\n\n    protected function createCommentFromToken(Token $token, int $tokenPos): Comment {\n        assert($token->id === \\T_COMMENT || $token->id == \\T_DOC_COMMENT);\n        return \\T_DOC_COMMENT === $token->id\n            ? new Comment\\Doc($token->text, $token->line, $token->pos, $tokenPos,\n                $token->getEndLine(), $token->getEndPos() - 1, $tokenPos)\n            : new Comment($token->text, $token->line, $token->pos, $tokenPos,\n                $token->getEndLine(), $token->getEndPos() - 1, $tokenPos);\n    }\n\n    /**\n     * Get last comment before the given token position, if any\n     */\n    protected function getCommentBeforeToken(int $tokenPos): ?Comment {\n        while (--$tokenPos >= 0) {\n            $token = $this->tokens[$tokenPos];\n            if (!isset($this->dropTokens[$token->id])) {\n                break;\n            }\n\n            if ($token->id === \\T_COMMENT || $token->id === \\T_DOC_COMMENT) {\n                return $this->createCommentFromToken($token, $tokenPos);\n            }\n        }\n        return null;\n    }\n\n    /**\n     * Create a zero-length nop to capture preceding comments, if any.\n     */\n    protected function maybeCreateZeroLengthNop(int $tokenPos): ?Nop {\n        $comment = $this->getCommentBeforeToken($tokenPos);\n        if ($comment === null) {\n            return null;\n        }\n\n        $commentEndLine = $comment->getEndLine();\n        $commentEndFilePos = $comment->getEndFilePos();\n        $commentEndTokenPos = $comment->getEndTokenPos();\n        $attributes = [\n            'startLine' => $commentEndLine,\n            'endLine' => $commentEndLine,\n            'startFilePos' => $commentEndFilePos + 1,\n            'endFilePos' => $commentEndFilePos,\n            'startTokenPos' => $commentEndTokenPos + 1,\n            'endTokenPos' => $commentEndTokenPos,\n        ];\n        return new Nop($attributes);\n    }\n\n    protected function maybeCreateNop(int $tokenStartPos, int $tokenEndPos): ?Nop {\n        if ($this->getCommentBeforeToken($tokenStartPos) === null) {\n            return null;\n        }\n        return new Nop($this->getAttributes($tokenStartPos, $tokenEndPos));\n    }\n\n    protected function handleHaltCompiler(): string {\n        // Prevent the lexer from returning any further tokens.\n        $nextToken = $this->tokens[$this->tokenPos + 1];\n        $this->tokenPos = \\count($this->tokens) - 2;\n\n        // Return text after __halt_compiler.\n        return $nextToken->id === \\T_INLINE_HTML ? $nextToken->text : '';\n    }\n\n    protected function inlineHtmlHasLeadingNewline(int $stackPos): bool {\n        $tokenPos = $this->tokenStartStack[$stackPos];\n        $token = $this->tokens[$tokenPos];\n        assert($token->id == \\T_INLINE_HTML);\n        if ($tokenPos > 0) {\n            $prevToken = $this->tokens[$tokenPos - 1];\n            assert($prevToken->id == \\T_CLOSE_TAG);\n            return false !== strpos($prevToken->text, \"\\n\")\n                || false !== strpos($prevToken->text, \"\\r\");\n        }\n        return true;\n    }\n\n    /**\n     * @return array<string, mixed>\n     */\n    protected function createEmptyElemAttributes(int $tokenPos): array {\n        return $this->getAttributesForToken($tokenPos);\n    }\n\n    protected function fixupArrayDestructuring(Array_ $node): Expr\\List_ {\n        $this->createdArrays->offsetUnset($node);\n        return new Expr\\List_(array_map(function (Node\\ArrayItem $item) {\n            if ($item->value instanceof Expr\\Error) {\n                // We used Error as a placeholder for empty elements, which are legal for destructuring.\n                return null;\n            }\n            if ($item->value instanceof Array_) {\n                return new Node\\ArrayItem(\n                    $this->fixupArrayDestructuring($item->value),\n                    $item->key, $item->byRef, $item->getAttributes());\n            }\n            return $item;\n        }, $node->items), ['kind' => Expr\\List_::KIND_ARRAY] + $node->getAttributes());\n    }\n\n    protected function postprocessList(Expr\\List_ $node): void {\n        foreach ($node->items as $i => $item) {\n            if ($item->value instanceof Expr\\Error) {\n                // We used Error as a placeholder for empty elements, which are legal for destructuring.\n                $node->items[$i] = null;\n            }\n        }\n    }\n\n    /** @param ElseIf_|Else_ $node */\n    protected function fixupAlternativeElse($node): void {\n        // Make sure a trailing nop statement carrying comments is part of the node.\n        $numStmts = \\count($node->stmts);\n        if ($numStmts !== 0 && $node->stmts[$numStmts - 1] instanceof Nop) {\n            $nopAttrs = $node->stmts[$numStmts - 1]->getAttributes();\n            if (isset($nopAttrs['endLine'])) {\n                $node->setAttribute('endLine', $nopAttrs['endLine']);\n            }\n            if (isset($nopAttrs['endFilePos'])) {\n                $node->setAttribute('endFilePos', $nopAttrs['endFilePos']);\n            }\n            if (isset($nopAttrs['endTokenPos'])) {\n                $node->setAttribute('endTokenPos', $nopAttrs['endTokenPos']);\n            }\n        }\n    }\n\n    protected function checkClassModifier(int $a, int $b, int $modifierPos): void {\n        try {\n            Modifiers::verifyClassModifier($a, $b);\n        } catch (Error $error) {\n            $error->setAttributes($this->getAttributesAt($modifierPos));\n            $this->emitError($error);\n        }\n    }\n\n    protected function checkModifier(int $a, int $b, int $modifierPos): void {\n        // Jumping through some hoops here because verifyModifier() is also used elsewhere\n        try {\n            Modifiers::verifyModifier($a, $b);\n        } catch (Error $error) {\n            $error->setAttributes($this->getAttributesAt($modifierPos));\n            $this->emitError($error);\n        }\n    }\n\n    protected function checkParam(Param $node): void {\n        if ($node->variadic && null !== $node->default) {\n            $this->emitError(new Error(\n                'Variadic parameter cannot have a default value',\n                $node->default->getAttributes()\n            ));\n        }\n\n        if ($node->type instanceof Identifier && $node->type->name === 'void') {\n            $this->emitError(new Error(\n                'void cannot be used as a parameter type',\n                $node->type->getAttributes()\n            ));\n        }\n    }\n\n    protected function checkTryCatch(TryCatch $node): void {\n        if (empty($node->catches) && null === $node->finally) {\n            $this->emitError(new Error(\n                'Cannot use try without catch or finally', $node->getAttributes()\n            ));\n        }\n    }\n\n    protected function checkNamespace(Namespace_ $node): void {\n        if (null !== $node->stmts) {\n            foreach ($node->stmts as $stmt) {\n                if ($stmt instanceof Namespace_) {\n                    $this->emitError(new Error(\n                        'Namespace declarations cannot be nested', $stmt->getAttributes()\n                    ));\n                }\n            }\n        }\n    }\n\n    private function checkClassName(?Identifier $name, int $namePos): void {\n        if (null !== $name && $name->isSpecialClassName()) {\n            $this->emitError(new Error(\n                sprintf('Cannot use \\'%s\\' as class name as it is reserved', $name),\n                $this->getAttributesAt($namePos)\n            ));\n        }\n    }\n\n    /** @param Name[] $interfaces */\n    private function checkImplementedInterfaces(array $interfaces): void {\n        foreach ($interfaces as $interface) {\n            if ($interface->isSpecialClassName()) {\n                $this->emitError(new Error(\n                    sprintf('Cannot use \\'%s\\' as interface name as it is reserved', $interface),\n                    $interface->getAttributes()\n                ));\n            }\n        }\n    }\n\n    protected function checkClass(Class_ $node, int $namePos): void {\n        $this->checkClassName($node->name, $namePos);\n\n        if ($node->extends && $node->extends->isSpecialClassName()) {\n            $this->emitError(new Error(\n                sprintf('Cannot use \\'%s\\' as class name as it is reserved', $node->extends),\n                $node->extends->getAttributes()\n            ));\n        }\n\n        $this->checkImplementedInterfaces($node->implements);\n    }\n\n    protected function checkInterface(Interface_ $node, int $namePos): void {\n        $this->checkClassName($node->name, $namePos);\n        $this->checkImplementedInterfaces($node->extends);\n    }\n\n    protected function checkEnum(Enum_ $node, int $namePos): void {\n        $this->checkClassName($node->name, $namePos);\n        $this->checkImplementedInterfaces($node->implements);\n    }\n\n    protected function checkClassMethod(ClassMethod $node, int $modifierPos): void {\n        if ($node->flags & Modifiers::STATIC) {\n            switch ($node->name->toLowerString()) {\n                case '__construct':\n                    $this->emitError(new Error(\n                        sprintf('Constructor %s() cannot be static', $node->name),\n                        $this->getAttributesAt($modifierPos)));\n                    break;\n                case '__destruct':\n                    $this->emitError(new Error(\n                        sprintf('Destructor %s() cannot be static', $node->name),\n                        $this->getAttributesAt($modifierPos)));\n                    break;\n                case '__clone':\n                    $this->emitError(new Error(\n                        sprintf('Clone method %s() cannot be static', $node->name),\n                        $this->getAttributesAt($modifierPos)));\n                    break;\n            }\n        }\n\n        if ($node->flags & Modifiers::READONLY) {\n            $this->emitError(new Error(\n                sprintf('Method %s() cannot be readonly', $node->name),\n                $this->getAttributesAt($modifierPos)));\n        }\n    }\n\n    protected function checkClassConst(ClassConst $node, int $modifierPos): void {\n        foreach ([Modifiers::STATIC, Modifiers::ABSTRACT, Modifiers::READONLY] as $modifier) {\n            if ($node->flags & $modifier) {\n                $this->emitError(new Error(\n                    \"Cannot use '\" . Modifiers::toString($modifier) . \"' as constant modifier\",\n                    $this->getAttributesAt($modifierPos)));\n            }\n        }\n    }\n\n    protected function checkUseUse(UseItem $node, int $namePos): void {\n        if ($node->alias && $node->alias->isSpecialClassName()) {\n            $this->emitError(new Error(\n                sprintf(\n                    'Cannot use %s as %s because \\'%2$s\\' is a special class name',\n                    $node->name, $node->alias\n                ),\n                $this->getAttributesAt($namePos)\n            ));\n        }\n    }\n\n    protected function checkPropertyHooksForMultiProperty(Property $property, int $hookPos): void {\n        if (count($property->props) > 1) {\n            $this->emitError(new Error(\n                'Cannot use hooks when declaring multiple properties', $this->getAttributesAt($hookPos)));\n        }\n    }\n\n    /** @param PropertyHook[] $hooks */\n    protected function checkEmptyPropertyHookList(array $hooks, int $hookPos): void {\n        if (empty($hooks)) {\n            $this->emitError(new Error(\n                'Property hook list cannot be empty', $this->getAttributesAt($hookPos)));\n        }\n    }\n\n    protected function checkPropertyHook(PropertyHook $hook, ?int $paramListPos): void {\n        $name = $hook->name->toLowerString();\n        if ($name !== 'get' && $name !== 'set') {\n            $this->emitError(new Error(\n                'Unknown hook \"' . $hook->name . '\", expected \"get\" or \"set\"',\n                $hook->name->getAttributes()));\n        }\n        if ($name === 'get' && $paramListPos !== null) {\n            $this->emitError(new Error(\n                'get hook must not have a parameter list', $this->getAttributesAt($paramListPos)));\n        }\n    }\n\n    protected function checkPropertyHookModifiers(int $a, int $b, int $modifierPos): void {\n        try {\n            Modifiers::verifyModifier($a, $b);\n        } catch (Error $error) {\n            $error->setAttributes($this->getAttributesAt($modifierPos));\n            $this->emitError($error);\n        }\n\n        if ($b != Modifiers::FINAL) {\n            $this->emitError(new Error(\n                'Cannot use the ' . Modifiers::toString($b) . ' modifier on a property hook',\n                $this->getAttributesAt($modifierPos)));\n        }\n    }\n\n    protected function checkConstantAttributes(Const_ $node): void {\n        if ($node->attrGroups !== [] && count($node->consts) > 1) {\n            $this->emitError(new Error(\n                'Cannot use attributes on multiple constants at once', $node->getAttributes()));\n        }\n    }\n\n    protected function checkPipeOperatorParentheses(Expr $node): void {\n        if ($node instanceof Expr\\ArrowFunction && !$this->parenthesizedArrowFunctions->offsetExists($node)) {\n            $this->emitError(new Error(\n                'Arrow functions on the right hand side of |> must be parenthesized', $node->getAttributes()));\n        }\n    }\n\n    /**\n     * @param Property|Param $node\n     */\n    protected function addPropertyNameToHooks(Node $node): void {\n        if ($node instanceof Property) {\n            $name = $node->props[0]->name->toString();\n        } else {\n            $name = $node->var->name;\n        }\n        foreach ($node->hooks as $hook) {\n            $hook->setAttribute('propertyName', $name);\n        }\n    }\n\n    /** @param array<Node\\Arg|Node\\VariadicPlaceholder> $args */\n    private function isSimpleExit(array $args): bool {\n        if (\\count($args) === 0) {\n            return true;\n        }\n        if (\\count($args) === 1) {\n            $arg = $args[0];\n            return $arg instanceof Arg && $arg->name === null &&\n                   $arg->byRef === false && $arg->unpack === false;\n        }\n        return false;\n    }\n\n    /**\n     * @param array<Node\\Arg|Node\\VariadicPlaceholder> $args\n     * @param array<string, mixed> $attrs\n     */\n    protected function createExitExpr(string $name, int $namePos, array $args, array $attrs): Expr {\n        if ($this->isSimpleExit($args)) {\n            // Create Exit node for backwards compatibility.\n            $attrs['kind'] = strtolower($name) === 'exit' ? Expr\\Exit_::KIND_EXIT : Expr\\Exit_::KIND_DIE;\n            return new Expr\\Exit_(\\count($args) === 1 ? $args[0]->value : null, $attrs);\n        }\n        return new Expr\\FuncCall(new Name($name, $this->getAttributesAt($namePos)), $args, $attrs);\n    }\n\n    /**\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     */\n    protected function createTokenMap(): array {\n        $tokenMap = [];\n\n        // Single-char tokens use an identity mapping.\n        for ($i = 0; $i < 256; ++$i) {\n            $tokenMap[$i] = $i;\n        }\n\n        foreach ($this->symbolToName as $name) {\n            if ($name[0] === 'T') {\n                $tokenMap[\\constant($name)] = constant(static::class . '::' . $name);\n            }\n        }\n\n        // T_OPEN_TAG_WITH_ECHO with dropped T_OPEN_TAG results in T_ECHO\n        $tokenMap[\\T_OPEN_TAG_WITH_ECHO] = static::T_ECHO;\n        // T_CLOSE_TAG is equivalent to ';'\n        $tokenMap[\\T_CLOSE_TAG] = ord(';');\n\n        // We have created a map from PHP token IDs to external symbol IDs.\n        // Now map them to the internal symbol ID.\n        $fullTokenMap = [];\n        foreach ($tokenMap as $phpToken => $extSymbol) {\n            $intSymbol = $this->tokenToSymbol[$extSymbol];\n            if ($intSymbol === $this->invalidSymbol) {\n                continue;\n            }\n            $fullTokenMap[$phpToken] = $intSymbol;\n        }\n\n        return $fullTokenMap;\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/ParserFactory.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser;\n\nuse PhpParser\\Parser\\Php7;\nuse PhpParser\\Parser\\Php8;\n\nclass ParserFactory {\n    /**\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     */\n    public function createForVersion(PhpVersion $version): Parser {\n        if ($version->isHostVersion()) {\n            $lexer = new Lexer();\n        } else {\n            $lexer = new Lexer\\Emulative($version);\n        }\n        if ($version->id >= 80000) {\n            return new Php8($lexer, $version);\n        }\n        return new Php7($lexer, $version);\n    }\n\n    /**\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     */\n    public function createForNewestSupportedVersion(): Parser {\n        return $this->createForVersion(PhpVersion::getNewestSupported());\n    }\n\n    /**\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     */\n    public function createForHostVersion(): Parser {\n        return $this->createForVersion(PhpVersion::getHostVersion());\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/PhpVersion.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser;\n\n/**\n * A PHP version, representing only the major and minor version components.\n */\nclass PhpVersion {\n    /** @var int Version ID in PHP_VERSION_ID format */\n    public int $id;\n\n    /** @var int[] Minimum versions for builtin types */\n    private const BUILTIN_TYPE_VERSIONS = [\n        'array'    => 50100,\n        'callable' => 50400,\n        'bool'     => 70000,\n        'int'      => 70000,\n        'float'    => 70000,\n        'string'   => 70000,\n        'iterable' => 70100,\n        'void'     => 70100,\n        'object'   => 70200,\n        'null'     => 80000,\n        'false'    => 80000,\n        'mixed'    => 80000,\n        'never'    => 80100,\n        'true'     => 80200,\n    ];\n\n    private function __construct(int $id) {\n        $this->id = $id;\n    }\n\n    /**\n     * Create a PhpVersion object from major and minor version components.\n     */\n    public static function fromComponents(int $major, int $minor): self {\n        return new self($major * 10000 + $minor * 100);\n    }\n\n    /**\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     */\n    public static function getNewestSupported(): self {\n        return self::fromComponents(8, 5);\n    }\n\n    /**\n     * Get the host PHP version, that is the PHP version we're currently running on.\n     */\n    public static function getHostVersion(): self {\n        return self::fromComponents(\\PHP_MAJOR_VERSION, \\PHP_MINOR_VERSION);\n    }\n\n    /**\n     * Parse the version from a string like \"8.1\".\n     */\n    public static function fromString(string $version): self {\n        if (!preg_match('/^(\\d+)\\.(\\d+)/', $version, $matches)) {\n            throw new \\LogicException(\"Invalid PHP version \\\"$version\\\"\");\n        }\n        return self::fromComponents((int) $matches[1], (int) $matches[2]);\n    }\n\n    /**\n     * Check whether two versions are the same.\n     */\n    public function equals(PhpVersion $other): bool {\n        return $this->id === $other->id;\n    }\n\n    /**\n     * Check whether this version is greater than or equal to the argument.\n     */\n    public function newerOrEqual(PhpVersion $other): bool {\n        return $this->id >= $other->id;\n    }\n\n    /**\n     * Check whether this version is older than the argument.\n     */\n    public function older(PhpVersion $other): bool {\n        return $this->id < $other->id;\n    }\n\n    /**\n     * Check whether this is the host PHP version.\n     */\n    public function isHostVersion(): bool {\n        return $this->equals(self::getHostVersion());\n    }\n\n    /**\n     * Check whether this PHP version supports the given builtin type. Type name must be lowercase.\n     */\n    public function supportsBuiltinType(string $type): bool {\n        $minVersion = self::BUILTIN_TYPE_VERSIONS[$type] ?? null;\n        return $minVersion !== null && $this->id >= $minVersion;\n    }\n\n    /**\n     * Whether this version supports [] array literals.\n     */\n    public function supportsShortArraySyntax(): bool {\n        return $this->id >= 50400;\n    }\n\n    /**\n     * Whether this version supports [] for destructuring.\n     */\n    public function supportsShortArrayDestructuring(): bool {\n        return $this->id >= 70100;\n    }\n\n    /**\n     * Whether this version supports flexible heredoc/nowdoc.\n     */\n    public function supportsFlexibleHeredoc(): bool {\n        return $this->id >= 70300;\n    }\n\n    /**\n     * Whether this version supports trailing commas in parameter lists.\n     */\n    public function supportsTrailingCommaInParamList(): bool {\n        return $this->id >= 80000;\n    }\n\n    /**\n     * Whether this version allows \"$var =& new Obj\".\n     */\n    public function allowsAssignNewByReference(): bool {\n        return $this->id < 70000;\n    }\n\n    /**\n     * Whether this version allows invalid octals like \"08\".\n     */\n    public function allowsInvalidOctals(): bool {\n        return $this->id < 70000;\n    }\n\n    /**\n     * Whether this version allows DEL (\\x7f) to occur in identifiers.\n     */\n    public function allowsDelInIdentifiers(): bool {\n        return $this->id < 70100;\n    }\n\n    /**\n     * Whether this version supports yield in expression context without parentheses.\n     */\n    public function supportsYieldWithoutParentheses(): bool {\n        return $this->id >= 70000;\n    }\n\n    /**\n     * Whether this version supports unicode escape sequences in strings.\n     */\n    public function supportsUnicodeEscapes(): bool {\n        return $this->id >= 70000;\n    }\n\n    /*\n     * Whether this version supports attributes.\n     */\n    public function supportsAttributes(): bool {\n        return $this->id >= 80000;\n    }\n\n    public function supportsNewDereferenceWithoutParentheses(): bool {\n        return $this->id >= 80400;\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/PrettyPrinter/Standard.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser\\PrettyPrinter;\n\nuse PhpParser\\Node;\nuse PhpParser\\Node\\Expr;\nuse PhpParser\\Node\\Expr\\AssignOp;\nuse PhpParser\\Node\\Expr\\BinaryOp;\nuse PhpParser\\Node\\Expr\\Cast;\nuse PhpParser\\Node\\Name;\nuse PhpParser\\Node\\Scalar;\nuse PhpParser\\Node\\Scalar\\MagicConst;\nuse PhpParser\\Node\\Stmt;\nuse PhpParser\\PrettyPrinterAbstract;\n\nclass Standard extends PrettyPrinterAbstract {\n    // Special nodes\n\n    protected function pParam(Node\\Param $node): string {\n        return $this->pAttrGroups($node->attrGroups, $this->phpVersion->supportsAttributes())\n             . $this->pModifiers($node->flags)\n             . ($node->type ? $this->p($node->type) . ' ' : '')\n             . ($node->byRef ? '&' : '')\n             . ($node->variadic ? '...' : '')\n             . $this->p($node->var)\n             . ($node->default ? ' = ' . $this->p($node->default) : '')\n             . ($node->hooks ? ' {' . $this->pStmts($node->hooks) . $this->nl . '}' : '');\n    }\n\n    protected function pArg(Node\\Arg $node): string {\n        return ($node->name ? $node->name->toString() . ': ' : '')\n             . ($node->byRef ? '&' : '') . ($node->unpack ? '...' : '')\n             . $this->p($node->value);\n    }\n\n    protected function pVariadicPlaceholder(Node\\VariadicPlaceholder $node): string {\n        return '...';\n    }\n\n    protected function pConst(Node\\Const_ $node): string {\n        return $node->name . ' = ' . $this->p($node->value);\n    }\n\n    protected function pNullableType(Node\\NullableType $node): string {\n        return '?' . $this->p($node->type);\n    }\n\n    protected function pUnionType(Node\\UnionType $node): string {\n        $types = [];\n        foreach ($node->types as $typeNode) {\n            if ($typeNode instanceof Node\\IntersectionType) {\n                $types[] = '('. $this->p($typeNode) . ')';\n                continue;\n            }\n            $types[] = $this->p($typeNode);\n        }\n        return implode('|', $types);\n    }\n\n    protected function pIntersectionType(Node\\IntersectionType $node): string {\n        return $this->pImplode($node->types, '&');\n    }\n\n    protected function pIdentifier(Node\\Identifier $node): string {\n        return $node->name;\n    }\n\n    protected function pVarLikeIdentifier(Node\\VarLikeIdentifier $node): string {\n        return '$' . $node->name;\n    }\n\n    protected function pAttribute(Node\\Attribute $node): string {\n        return $this->p($node->name)\n             . ($node->args ? '(' . $this->pCommaSeparated($node->args) . ')' : '');\n    }\n\n    protected function pAttributeGroup(Node\\AttributeGroup $node): string {\n        return '#[' . $this->pCommaSeparated($node->attrs) . ']';\n    }\n\n    // Names\n\n    protected function pName(Name $node): string {\n        return $node->name;\n    }\n\n    protected function pName_FullyQualified(Name\\FullyQualified $node): string {\n        return '\\\\' . $node->name;\n    }\n\n    protected function pName_Relative(Name\\Relative $node): string {\n        return 'namespace\\\\' . $node->name;\n    }\n\n    // Magic Constants\n\n    protected function pScalar_MagicConst_Class(MagicConst\\Class_ $node): string {\n        return '__CLASS__';\n    }\n\n    protected function pScalar_MagicConst_Dir(MagicConst\\Dir $node): string {\n        return '__DIR__';\n    }\n\n    protected function pScalar_MagicConst_File(MagicConst\\File $node): string {\n        return '__FILE__';\n    }\n\n    protected function pScalar_MagicConst_Function(MagicConst\\Function_ $node): string {\n        return '__FUNCTION__';\n    }\n\n    protected function pScalar_MagicConst_Line(MagicConst\\Line $node): string {\n        return '__LINE__';\n    }\n\n    protected function pScalar_MagicConst_Method(MagicConst\\Method $node): string {\n        return '__METHOD__';\n    }\n\n    protected function pScalar_MagicConst_Namespace(MagicConst\\Namespace_ $node): string {\n        return '__NAMESPACE__';\n    }\n\n    protected function pScalar_MagicConst_Trait(MagicConst\\Trait_ $node): string {\n        return '__TRAIT__';\n    }\n\n    protected function pScalar_MagicConst_Property(MagicConst\\Property $node): string {\n        return '__PROPERTY__';\n    }\n\n    // Scalars\n\n    private function indentString(string $str): string {\n        return str_replace(\"\\n\", $this->nl, $str);\n    }\n\n    protected function pScalar_String(Scalar\\String_ $node): string {\n        $kind = $node->getAttribute('kind', Scalar\\String_::KIND_SINGLE_QUOTED);\n        switch ($kind) {\n            case Scalar\\String_::KIND_NOWDOC:\n                $label = $node->getAttribute('docLabel');\n                if ($label && !$this->containsEndLabel($node->value, $label)) {\n                    $shouldIdent = $this->phpVersion->supportsFlexibleHeredoc();\n                    $nl = $shouldIdent ? $this->nl : $this->newline;\n                    if ($node->value === '') {\n                        return \"<<<'$label'$nl$label{$this->docStringEndToken}\";\n                    }\n\n                    // Make sure trailing \\r is not combined with following \\n into CRLF.\n                    if ($node->value[strlen($node->value) - 1] !== \"\\r\") {\n                        $value = $shouldIdent ? $this->indentString($node->value) : $node->value;\n                        return \"<<<'$label'$nl$value$nl$label{$this->docStringEndToken}\";\n                    }\n                }\n                /* break missing intentionally */\n                // no break\n            case Scalar\\String_::KIND_SINGLE_QUOTED:\n                return $this->pSingleQuotedString($node->value);\n            case Scalar\\String_::KIND_HEREDOC:\n                $label = $node->getAttribute('docLabel');\n                $escaped = $this->escapeString($node->value, null);\n                if ($label && !$this->containsEndLabel($escaped, $label)) {\n                    $nl = $this->phpVersion->supportsFlexibleHeredoc() ? $this->nl : $this->newline;\n                    if ($escaped === '') {\n                        return \"<<<$label$nl$label{$this->docStringEndToken}\";\n                    }\n\n                    return \"<<<$label$nl$escaped$nl$label{$this->docStringEndToken}\";\n                }\n                /* break missing intentionally */\n                // no break\n            case Scalar\\String_::KIND_DOUBLE_QUOTED:\n                return '\"' . $this->escapeString($node->value, '\"') . '\"';\n        }\n        throw new \\Exception('Invalid string kind');\n    }\n\n    protected function pScalar_InterpolatedString(Scalar\\InterpolatedString $node): string {\n        if ($node->getAttribute('kind') === Scalar\\String_::KIND_HEREDOC) {\n            $label = $node->getAttribute('docLabel');\n            if ($label && !$this->encapsedContainsEndLabel($node->parts, $label)) {\n                $nl = $this->phpVersion->supportsFlexibleHeredoc() ? $this->nl : $this->newline;\n                if (count($node->parts) === 1\n                    && $node->parts[0] instanceof Node\\InterpolatedStringPart\n                    && $node->parts[0]->value === ''\n                ) {\n                    return \"<<<$label$nl$label{$this->docStringEndToken}\";\n                }\n\n                return \"<<<$label$nl\" . $this->pEncapsList($node->parts, null)\n                     . \"$nl$label{$this->docStringEndToken}\";\n            }\n        }\n        return '\"' . $this->pEncapsList($node->parts, '\"') . '\"';\n    }\n\n    protected function pScalar_Int(Scalar\\Int_ $node): string {\n        if ($node->getAttribute('shouldPrintRawValue') === true) {\n            return $node->getAttribute('rawValue');\n        }\n\n        if ($node->value === -\\PHP_INT_MAX - 1) {\n            // PHP_INT_MIN cannot be represented as a literal,\n            // because the sign is not part of the literal\n            return '(-' . \\PHP_INT_MAX . '-1)';\n        }\n\n        $kind = $node->getAttribute('kind', Scalar\\Int_::KIND_DEC);\n\n        if (Scalar\\Int_::KIND_DEC === $kind) {\n            return (string) $node->value;\n        }\n\n        if ($node->value < 0) {\n            $sign = '-';\n            $str = (string) -$node->value;\n        } else {\n            $sign = '';\n            $str = (string) $node->value;\n        }\n        switch ($kind) {\n            case Scalar\\Int_::KIND_BIN:\n                return $sign . '0b' . base_convert($str, 10, 2);\n            case Scalar\\Int_::KIND_OCT:\n                return $sign . '0' . base_convert($str, 10, 8);\n            case Scalar\\Int_::KIND_HEX:\n                return $sign . '0x' . base_convert($str, 10, 16);\n        }\n        throw new \\Exception('Invalid number kind');\n    }\n\n    protected function pScalar_Float(Scalar\\Float_ $node): string {\n        if (!is_finite($node->value)) {\n            if ($node->value === \\INF) {\n                return '1.0E+1000';\n            }\n            if ($node->value === -\\INF) {\n                return '-1.0E+1000';\n            } else {\n                return '\\NAN';\n            }\n        }\n\n        // Try to find a short full-precision representation\n        $stringValue = sprintf('%.16G', $node->value);\n        if ($node->value !== (float) $stringValue) {\n            $stringValue = sprintf('%.17G', $node->value);\n        }\n\n        // %G is locale dependent and there exists no locale-independent alternative. We don't want\n        // mess with switching locales here, so let's assume that a comma is the only non-standard\n        // decimal separator we may encounter...\n        $stringValue = str_replace(',', '.', $stringValue);\n\n        // ensure that number is really printed as float\n        return preg_match('/^-?[0-9]+$/', $stringValue) ? $stringValue . '.0' : $stringValue;\n    }\n\n    // Assignments\n\n    protected function pExpr_Assign(Expr\\Assign $node, int $precedence, int $lhsPrecedence): string {\n        return $this->pPrefixOp(Expr\\Assign::class, $this->p($node->var) . ' = ', $node->expr, $precedence, $lhsPrecedence);\n    }\n\n    protected function pExpr_AssignRef(Expr\\AssignRef $node, int $precedence, int $lhsPrecedence): string {\n        return $this->pPrefixOp(Expr\\AssignRef::class, $this->p($node->var) . ' =& ', $node->expr, $precedence, $lhsPrecedence);\n    }\n\n    protected function pExpr_AssignOp_Plus(AssignOp\\Plus $node, int $precedence, int $lhsPrecedence): string {\n        return $this->pPrefixOp(AssignOp\\Plus::class, $this->p($node->var) . ' += ', $node->expr, $precedence, $lhsPrecedence);\n    }\n\n    protected function pExpr_AssignOp_Minus(AssignOp\\Minus $node, int $precedence, int $lhsPrecedence): string {\n        return $this->pPrefixOp(AssignOp\\Minus::class, $this->p($node->var) . ' -= ', $node->expr, $precedence, $lhsPrecedence);\n    }\n\n    protected function pExpr_AssignOp_Mul(AssignOp\\Mul $node, int $precedence, int $lhsPrecedence): string {\n        return $this->pPrefixOp(AssignOp\\Mul::class, $this->p($node->var) . ' *= ', $node->expr, $precedence, $lhsPrecedence);\n    }\n\n    protected function pExpr_AssignOp_Div(AssignOp\\Div $node, int $precedence, int $lhsPrecedence): string {\n        return $this->pPrefixOp(AssignOp\\Div::class, $this->p($node->var) . ' /= ', $node->expr, $precedence, $lhsPrecedence);\n    }\n\n    protected function pExpr_AssignOp_Concat(AssignOp\\Concat $node, int $precedence, int $lhsPrecedence): string {\n        return $this->pPrefixOp(AssignOp\\Concat::class, $this->p($node->var) . ' .= ', $node->expr, $precedence, $lhsPrecedence);\n    }\n\n    protected function pExpr_AssignOp_Mod(AssignOp\\Mod $node, int $precedence, int $lhsPrecedence): string {\n        return $this->pPrefixOp(AssignOp\\Mod::class, $this->p($node->var) . ' %= ', $node->expr, $precedence, $lhsPrecedence);\n    }\n\n    protected function pExpr_AssignOp_BitwiseAnd(AssignOp\\BitwiseAnd $node, int $precedence, int $lhsPrecedence): string {\n        return $this->pPrefixOp(AssignOp\\BitwiseAnd::class, $this->p($node->var) . ' &= ', $node->expr, $precedence, $lhsPrecedence);\n    }\n\n    protected function pExpr_AssignOp_BitwiseOr(AssignOp\\BitwiseOr $node, int $precedence, int $lhsPrecedence): string {\n        return $this->pPrefixOp(AssignOp\\BitwiseOr::class, $this->p($node->var) . ' |= ', $node->expr, $precedence, $lhsPrecedence);\n    }\n\n    protected function pExpr_AssignOp_BitwiseXor(AssignOp\\BitwiseXor $node, int $precedence, int $lhsPrecedence): string {\n        return $this->pPrefixOp(AssignOp\\BitwiseXor::class, $this->p($node->var) . ' ^= ', $node->expr, $precedence, $lhsPrecedence);\n    }\n\n    protected function pExpr_AssignOp_ShiftLeft(AssignOp\\ShiftLeft $node, int $precedence, int $lhsPrecedence): string {\n        return $this->pPrefixOp(AssignOp\\ShiftLeft::class, $this->p($node->var) . ' <<= ', $node->expr, $precedence, $lhsPrecedence);\n    }\n\n    protected function pExpr_AssignOp_ShiftRight(AssignOp\\ShiftRight $node, int $precedence, int $lhsPrecedence): string {\n        return $this->pPrefixOp(AssignOp\\ShiftRight::class, $this->p($node->var) . ' >>= ', $node->expr, $precedence, $lhsPrecedence);\n    }\n\n    protected function pExpr_AssignOp_Pow(AssignOp\\Pow $node, int $precedence, int $lhsPrecedence): string {\n        return $this->pPrefixOp(AssignOp\\Pow::class, $this->p($node->var) . ' **= ', $node->expr, $precedence, $lhsPrecedence);\n    }\n\n    protected function pExpr_AssignOp_Coalesce(AssignOp\\Coalesce $node, int $precedence, int $lhsPrecedence): string {\n        return $this->pPrefixOp(AssignOp\\Coalesce::class, $this->p($node->var) . ' ??= ', $node->expr, $precedence, $lhsPrecedence);\n    }\n\n    // Binary expressions\n\n    protected function pExpr_BinaryOp_Plus(BinaryOp\\Plus $node, int $precedence, int $lhsPrecedence): string {\n        return $this->pInfixOp(BinaryOp\\Plus::class, $node->left, ' + ', $node->right, $precedence, $lhsPrecedence);\n    }\n\n    protected function pExpr_BinaryOp_Minus(BinaryOp\\Minus $node, int $precedence, int $lhsPrecedence): string {\n        return $this->pInfixOp(BinaryOp\\Minus::class, $node->left, ' - ', $node->right, $precedence, $lhsPrecedence);\n    }\n\n    protected function pExpr_BinaryOp_Mul(BinaryOp\\Mul $node, int $precedence, int $lhsPrecedence): string {\n        return $this->pInfixOp(BinaryOp\\Mul::class, $node->left, ' * ', $node->right, $precedence, $lhsPrecedence);\n    }\n\n    protected function pExpr_BinaryOp_Div(BinaryOp\\Div $node, int $precedence, int $lhsPrecedence): string {\n        return $this->pInfixOp(BinaryOp\\Div::class, $node->left, ' / ', $node->right, $precedence, $lhsPrecedence);\n    }\n\n    protected function pExpr_BinaryOp_Concat(BinaryOp\\Concat $node, int $precedence, int $lhsPrecedence): string {\n        return $this->pInfixOp(BinaryOp\\Concat::class, $node->left, ' . ', $node->right, $precedence, $lhsPrecedence);\n    }\n\n    protected function pExpr_BinaryOp_Mod(BinaryOp\\Mod $node, int $precedence, int $lhsPrecedence): string {\n        return $this->pInfixOp(BinaryOp\\Mod::class, $node->left, ' % ', $node->right, $precedence, $lhsPrecedence);\n    }\n\n    protected function pExpr_BinaryOp_BooleanAnd(BinaryOp\\BooleanAnd $node, int $precedence, int $lhsPrecedence): string {\n        return $this->pInfixOp(BinaryOp\\BooleanAnd::class, $node->left, ' && ', $node->right, $precedence, $lhsPrecedence);\n    }\n\n    protected function pExpr_BinaryOp_BooleanOr(BinaryOp\\BooleanOr $node, int $precedence, int $lhsPrecedence): string {\n        return $this->pInfixOp(BinaryOp\\BooleanOr::class, $node->left, ' || ', $node->right, $precedence, $lhsPrecedence);\n    }\n\n    protected function pExpr_BinaryOp_BitwiseAnd(BinaryOp\\BitwiseAnd $node, int $precedence, int $lhsPrecedence): string {\n        return $this->pInfixOp(BinaryOp\\BitwiseAnd::class, $node->left, ' & ', $node->right, $precedence, $lhsPrecedence);\n    }\n\n    protected function pExpr_BinaryOp_BitwiseOr(BinaryOp\\BitwiseOr $node, int $precedence, int $lhsPrecedence): string {\n        return $this->pInfixOp(BinaryOp\\BitwiseOr::class, $node->left, ' | ', $node->right, $precedence, $lhsPrecedence);\n    }\n\n    protected function pExpr_BinaryOp_BitwiseXor(BinaryOp\\BitwiseXor $node, int $precedence, int $lhsPrecedence): string {\n        return $this->pInfixOp(BinaryOp\\BitwiseXor::class, $node->left, ' ^ ', $node->right, $precedence, $lhsPrecedence);\n    }\n\n    protected function pExpr_BinaryOp_ShiftLeft(BinaryOp\\ShiftLeft $node, int $precedence, int $lhsPrecedence): string {\n        return $this->pInfixOp(BinaryOp\\ShiftLeft::class, $node->left, ' << ', $node->right, $precedence, $lhsPrecedence);\n    }\n\n    protected function pExpr_BinaryOp_ShiftRight(BinaryOp\\ShiftRight $node, int $precedence, int $lhsPrecedence): string {\n        return $this->pInfixOp(BinaryOp\\ShiftRight::class, $node->left, ' >> ', $node->right, $precedence, $lhsPrecedence);\n    }\n\n    protected function pExpr_BinaryOp_Pow(BinaryOp\\Pow $node, int $precedence, int $lhsPrecedence): string {\n        return $this->pInfixOp(BinaryOp\\Pow::class, $node->left, ' ** ', $node->right, $precedence, $lhsPrecedence);\n    }\n\n    protected function pExpr_BinaryOp_LogicalAnd(BinaryOp\\LogicalAnd $node, int $precedence, int $lhsPrecedence): string {\n        return $this->pInfixOp(BinaryOp\\LogicalAnd::class, $node->left, ' and ', $node->right, $precedence, $lhsPrecedence);\n    }\n\n    protected function pExpr_BinaryOp_LogicalOr(BinaryOp\\LogicalOr $node, int $precedence, int $lhsPrecedence): string {\n        return $this->pInfixOp(BinaryOp\\LogicalOr::class, $node->left, ' or ', $node->right, $precedence, $lhsPrecedence);\n    }\n\n    protected function pExpr_BinaryOp_LogicalXor(BinaryOp\\LogicalXor $node, int $precedence, int $lhsPrecedence): string {\n        return $this->pInfixOp(BinaryOp\\LogicalXor::class, $node->left, ' xor ', $node->right, $precedence, $lhsPrecedence);\n    }\n\n    protected function pExpr_BinaryOp_Equal(BinaryOp\\Equal $node, int $precedence, int $lhsPrecedence): string {\n        return $this->pInfixOp(BinaryOp\\Equal::class, $node->left, ' == ', $node->right, $precedence, $lhsPrecedence);\n    }\n\n    protected function pExpr_BinaryOp_NotEqual(BinaryOp\\NotEqual $node, int $precedence, int $lhsPrecedence): string {\n        return $this->pInfixOp(BinaryOp\\NotEqual::class, $node->left, ' != ', $node->right, $precedence, $lhsPrecedence);\n    }\n\n    protected function pExpr_BinaryOp_Identical(BinaryOp\\Identical $node, int $precedence, int $lhsPrecedence): string {\n        return $this->pInfixOp(BinaryOp\\Identical::class, $node->left, ' === ', $node->right, $precedence, $lhsPrecedence);\n    }\n\n    protected function pExpr_BinaryOp_NotIdentical(BinaryOp\\NotIdentical $node, int $precedence, int $lhsPrecedence): string {\n        return $this->pInfixOp(BinaryOp\\NotIdentical::class, $node->left, ' !== ', $node->right, $precedence, $lhsPrecedence);\n    }\n\n    protected function pExpr_BinaryOp_Spaceship(BinaryOp\\Spaceship $node, int $precedence, int $lhsPrecedence): string {\n        return $this->pInfixOp(BinaryOp\\Spaceship::class, $node->left, ' <=> ', $node->right, $precedence, $lhsPrecedence);\n    }\n\n    protected function pExpr_BinaryOp_Greater(BinaryOp\\Greater $node, int $precedence, int $lhsPrecedence): string {\n        return $this->pInfixOp(BinaryOp\\Greater::class, $node->left, ' > ', $node->right, $precedence, $lhsPrecedence);\n    }\n\n    protected function pExpr_BinaryOp_GreaterOrEqual(BinaryOp\\GreaterOrEqual $node, int $precedence, int $lhsPrecedence): string {\n        return $this->pInfixOp(BinaryOp\\GreaterOrEqual::class, $node->left, ' >= ', $node->right, $precedence, $lhsPrecedence);\n    }\n\n    protected function pExpr_BinaryOp_Smaller(BinaryOp\\Smaller $node, int $precedence, int $lhsPrecedence): string {\n        return $this->pInfixOp(BinaryOp\\Smaller::class, $node->left, ' < ', $node->right, $precedence, $lhsPrecedence);\n    }\n\n    protected function pExpr_BinaryOp_SmallerOrEqual(BinaryOp\\SmallerOrEqual $node, int $precedence, int $lhsPrecedence): string {\n        return $this->pInfixOp(BinaryOp\\SmallerOrEqual::class, $node->left, ' <= ', $node->right, $precedence, $lhsPrecedence);\n    }\n\n    protected function pExpr_BinaryOp_Coalesce(BinaryOp\\Coalesce $node, int $precedence, int $lhsPrecedence): string {\n        return $this->pInfixOp(BinaryOp\\Coalesce::class, $node->left, ' ?? ', $node->right, $precedence, $lhsPrecedence);\n    }\n\n    protected function pExpr_BinaryOp_Pipe(BinaryOp\\Pipe $node, int $precedence, int $lhsPrecedence): string {\n        if ($node->right instanceof Expr\\ArrowFunction) {\n            // Force parentheses around arrow functions.\n            $lhsPrecedence = $this->precedenceMap[Expr\\ArrowFunction::class][0];\n        }\n        return $this->pInfixOp(BinaryOp\\Pipe::class, $node->left, ' |> ', $node->right, $precedence, $lhsPrecedence);\n    }\n\n    protected function pExpr_Instanceof(Expr\\Instanceof_ $node, int $precedence, int $lhsPrecedence): string {\n        return $this->pPostfixOp(\n            Expr\\Instanceof_::class, $node->expr,\n            ' instanceof ' . $this->pNewOperand($node->class),\n            $precedence, $lhsPrecedence);\n    }\n\n    // Unary expressions\n\n    protected function pExpr_BooleanNot(Expr\\BooleanNot $node, int $precedence, int $lhsPrecedence): string {\n        return $this->pPrefixOp(Expr\\BooleanNot::class, '!', $node->expr, $precedence, $lhsPrecedence);\n    }\n\n    protected function pExpr_BitwiseNot(Expr\\BitwiseNot $node, int $precedence, int $lhsPrecedence): string {\n        return $this->pPrefixOp(Expr\\BitwiseNot::class, '~', $node->expr, $precedence, $lhsPrecedence);\n    }\n\n    protected function pExpr_UnaryMinus(Expr\\UnaryMinus $node, int $precedence, int $lhsPrecedence): string {\n        return $this->pPrefixOp(Expr\\UnaryMinus::class, '-', $node->expr, $precedence, $lhsPrecedence);\n    }\n\n    protected function pExpr_UnaryPlus(Expr\\UnaryPlus $node, int $precedence, int $lhsPrecedence): string {\n        return $this->pPrefixOp(Expr\\UnaryPlus::class, '+', $node->expr, $precedence, $lhsPrecedence);\n    }\n\n    protected function pExpr_PreInc(Expr\\PreInc $node): string {\n        return '++' . $this->p($node->var);\n    }\n\n    protected function pExpr_PreDec(Expr\\PreDec $node): string {\n        return '--' . $this->p($node->var);\n    }\n\n    protected function pExpr_PostInc(Expr\\PostInc $node): string {\n        return $this->p($node->var) . '++';\n    }\n\n    protected function pExpr_PostDec(Expr\\PostDec $node): string {\n        return $this->p($node->var) . '--';\n    }\n\n    protected function pExpr_ErrorSuppress(Expr\\ErrorSuppress $node, int $precedence, int $lhsPrecedence): string {\n        return $this->pPrefixOp(Expr\\ErrorSuppress::class, '@', $node->expr, $precedence, $lhsPrecedence);\n    }\n\n    protected function pExpr_YieldFrom(Expr\\YieldFrom $node, int $precedence, int $lhsPrecedence): string {\n        return $this->pPrefixOp(Expr\\YieldFrom::class, 'yield from ', $node->expr, $precedence, $lhsPrecedence);\n    }\n\n    protected function pExpr_Print(Expr\\Print_ $node, int $precedence, int $lhsPrecedence): string {\n        return $this->pPrefixOp(Expr\\Print_::class, 'print ', $node->expr, $precedence, $lhsPrecedence);\n    }\n\n    // Casts\n\n    protected function pExpr_Cast_Int(Cast\\Int_ $node, int $precedence, int $lhsPrecedence): string {\n        return $this->pPrefixOp(Cast\\Int_::class, '(int) ', $node->expr, $precedence, $lhsPrecedence);\n    }\n\n    protected function pExpr_Cast_Double(Cast\\Double $node, int $precedence, int $lhsPrecedence): string {\n        $kind = $node->getAttribute('kind', Cast\\Double::KIND_DOUBLE);\n        if ($kind === Cast\\Double::KIND_DOUBLE) {\n            $cast = '(double)';\n        } elseif ($kind === Cast\\Double::KIND_FLOAT) {\n            $cast = '(float)';\n        } else {\n            assert($kind === Cast\\Double::KIND_REAL);\n            $cast = '(real)';\n        }\n        return $this->pPrefixOp(Cast\\Double::class, $cast . ' ', $node->expr, $precedence, $lhsPrecedence);\n    }\n\n    protected function pExpr_Cast_String(Cast\\String_ $node, int $precedence, int $lhsPrecedence): string {\n        return $this->pPrefixOp(Cast\\String_::class, '(string) ', $node->expr, $precedence, $lhsPrecedence);\n    }\n\n    protected function pExpr_Cast_Array(Cast\\Array_ $node, int $precedence, int $lhsPrecedence): string {\n        return $this->pPrefixOp(Cast\\Array_::class, '(array) ', $node->expr, $precedence, $lhsPrecedence);\n    }\n\n    protected function pExpr_Cast_Object(Cast\\Object_ $node, int $precedence, int $lhsPrecedence): string {\n        return $this->pPrefixOp(Cast\\Object_::class, '(object) ', $node->expr, $precedence, $lhsPrecedence);\n    }\n\n    protected function pExpr_Cast_Bool(Cast\\Bool_ $node, int $precedence, int $lhsPrecedence): string {\n        return $this->pPrefixOp(Cast\\Bool_::class, '(bool) ', $node->expr, $precedence, $lhsPrecedence);\n    }\n\n    protected function pExpr_Cast_Unset(Cast\\Unset_ $node, int $precedence, int $lhsPrecedence): string {\n        return $this->pPrefixOp(Cast\\Unset_::class, '(unset) ', $node->expr, $precedence, $lhsPrecedence);\n    }\n\n    protected function pExpr_Cast_Void(Cast\\Void_ $node, int $precedence, int $lhsPrecedence): string {\n        return $this->pPrefixOp(Cast\\Void_::class, '(void) ', $node->expr, $precedence, $lhsPrecedence);\n    }\n\n    // Function calls and similar constructs\n\n    protected function pExpr_FuncCall(Expr\\FuncCall $node): string {\n        return $this->pCallLhs($node->name)\n             . '(' . $this->pMaybeMultiline($node->args) . ')';\n    }\n\n    protected function pExpr_MethodCall(Expr\\MethodCall $node): string {\n        return $this->pDereferenceLhs($node->var) . '->' . $this->pObjectProperty($node->name)\n             . '(' . $this->pMaybeMultiline($node->args) . ')';\n    }\n\n    protected function pExpr_NullsafeMethodCall(Expr\\NullsafeMethodCall $node): string {\n        return $this->pDereferenceLhs($node->var) . '?->' . $this->pObjectProperty($node->name)\n            . '(' . $this->pMaybeMultiline($node->args) . ')';\n    }\n\n    protected function pExpr_StaticCall(Expr\\StaticCall $node): string {\n        return $this->pStaticDereferenceLhs($node->class) . '::'\n             . ($node->name instanceof Expr\n                ? ($node->name instanceof Expr\\Variable\n                   ? $this->p($node->name)\n                   : '{' . $this->p($node->name) . '}')\n                : $node->name)\n             . '(' . $this->pMaybeMultiline($node->args) . ')';\n    }\n\n    protected function pExpr_Empty(Expr\\Empty_ $node): string {\n        return 'empty(' . $this->p($node->expr) . ')';\n    }\n\n    protected function pExpr_Isset(Expr\\Isset_ $node): string {\n        return 'isset(' . $this->pCommaSeparated($node->vars) . ')';\n    }\n\n    protected function pExpr_Eval(Expr\\Eval_ $node): string {\n        return 'eval(' . $this->p($node->expr) . ')';\n    }\n\n    protected function pExpr_Include(Expr\\Include_ $node, int $precedence, int $lhsPrecedence): string {\n        static $map = [\n            Expr\\Include_::TYPE_INCLUDE      => 'include',\n            Expr\\Include_::TYPE_INCLUDE_ONCE => 'include_once',\n            Expr\\Include_::TYPE_REQUIRE      => 'require',\n            Expr\\Include_::TYPE_REQUIRE_ONCE => 'require_once',\n        ];\n\n        return $this->pPrefixOp(Expr\\Include_::class, $map[$node->type] . ' ', $node->expr, $precedence, $lhsPrecedence);\n    }\n\n    protected function pExpr_List(Expr\\List_ $node): string {\n        $syntax = $node->getAttribute('kind',\n            $this->phpVersion->supportsShortArrayDestructuring() ? Expr\\List_::KIND_ARRAY : Expr\\List_::KIND_LIST);\n        if ($syntax === Expr\\List_::KIND_ARRAY) {\n            return '[' . $this->pMaybeMultiline($node->items, true) . ']';\n        } else {\n            return 'list(' . $this->pMaybeMultiline($node->items, true) . ')';\n        }\n    }\n\n    // Other\n\n    protected function pExpr_Error(Expr\\Error $node): string {\n        throw new \\LogicException('Cannot pretty-print AST with Error nodes');\n    }\n\n    protected function pExpr_Variable(Expr\\Variable $node): string {\n        if ($node->name instanceof Expr) {\n            return '${' . $this->p($node->name) . '}';\n        } else {\n            return '$' . $node->name;\n        }\n    }\n\n    protected function pExpr_Array(Expr\\Array_ $node): string {\n        $syntax = $node->getAttribute('kind',\n            $this->shortArraySyntax ? Expr\\Array_::KIND_SHORT : Expr\\Array_::KIND_LONG);\n        if ($syntax === Expr\\Array_::KIND_SHORT) {\n            return '[' . $this->pMaybeMultiline($node->items, true) . ']';\n        } else {\n            return 'array(' . $this->pMaybeMultiline($node->items, true) . ')';\n        }\n    }\n\n    protected function pKey(?Node $node): string {\n        if ($node === null) {\n            return '';\n        }\n\n        // => is not really an operator and does not typically participate in precedence resolution.\n        // However, there is an exception if yield expressions with keys are involved:\n        // [yield $a => $b] is interpreted as [(yield $a => $b)], so we need to ensure that\n        // [(yield $a) => $b] is printed with parentheses. We approximate this by lowering the LHS\n        // precedence to that of yield (which will also print unnecessary parentheses for rare low\n        // precedence unary operators like include).\n        $yieldPrecedence = $this->precedenceMap[Expr\\Yield_::class][0];\n        return $this->p($node, self::MAX_PRECEDENCE, $yieldPrecedence) . ' => ';\n    }\n\n    protected function pArrayItem(Node\\ArrayItem $node): string {\n        return $this->pKey($node->key)\n             . ($node->byRef ? '&' : '')\n             . ($node->unpack ? '...' : '')\n             . $this->p($node->value);\n    }\n\n    protected function pExpr_ArrayDimFetch(Expr\\ArrayDimFetch $node): string {\n        return $this->pDereferenceLhs($node->var)\n             . '[' . (null !== $node->dim ? $this->p($node->dim) : '') . ']';\n    }\n\n    protected function pExpr_ConstFetch(Expr\\ConstFetch $node): string {\n        return $this->p($node->name);\n    }\n\n    protected function pExpr_ClassConstFetch(Expr\\ClassConstFetch $node): string {\n        return $this->pStaticDereferenceLhs($node->class) . '::' . $this->pObjectProperty($node->name);\n    }\n\n    protected function pExpr_PropertyFetch(Expr\\PropertyFetch $node): string {\n        return $this->pDereferenceLhs($node->var) . '->' . $this->pObjectProperty($node->name);\n    }\n\n    protected function pExpr_NullsafePropertyFetch(Expr\\NullsafePropertyFetch $node): string {\n        return $this->pDereferenceLhs($node->var) . '?->' . $this->pObjectProperty($node->name);\n    }\n\n    protected function pExpr_StaticPropertyFetch(Expr\\StaticPropertyFetch $node): string {\n        return $this->pStaticDereferenceLhs($node->class) . '::$' . $this->pObjectProperty($node->name);\n    }\n\n    protected function pExpr_ShellExec(Expr\\ShellExec $node): string {\n        return '`' . $this->pEncapsList($node->parts, '`') . '`';\n    }\n\n    protected function pExpr_Closure(Expr\\Closure $node): string {\n        return $this->pAttrGroups($node->attrGroups, true)\n             . $this->pStatic($node->static)\n             . 'function ' . ($node->byRef ? '&' : '')\n             . '(' . $this->pParams($node->params) . ')'\n             . (!empty($node->uses) ? ' use (' . $this->pCommaSeparated($node->uses) . ')' : '')\n             . (null !== $node->returnType ? ': ' . $this->p($node->returnType) : '')\n             . ' {' . $this->pStmts($node->stmts) . $this->nl . '}';\n    }\n\n    protected function pExpr_Match(Expr\\Match_ $node): string {\n        return 'match (' . $this->p($node->cond) . ') {'\n            . $this->pCommaSeparatedMultiline($node->arms, true)\n            . $this->nl\n            . '}';\n    }\n\n    protected function pMatchArm(Node\\MatchArm $node): string {\n        $result = '';\n        if ($node->conds) {\n            for ($i = 0, $c = \\count($node->conds); $i + 1 < $c; $i++) {\n                $result .= $this->p($node->conds[$i]) . ', ';\n            }\n            $result .= $this->pKey($node->conds[$i]);\n        } else {\n            $result = 'default => ';\n        }\n        return $result . $this->p($node->body);\n    }\n\n    protected function pExpr_ArrowFunction(Expr\\ArrowFunction $node, int $precedence, int $lhsPrecedence): string {\n        return $this->pPrefixOp(\n            Expr\\ArrowFunction::class,\n            $this->pAttrGroups($node->attrGroups, true)\n            . $this->pStatic($node->static)\n            . 'fn' . ($node->byRef ? '&' : '')\n            . '(' . $this->pParams($node->params) . ')'\n            . (null !== $node->returnType ? ': ' . $this->p($node->returnType) : '')\n            . ' => ',\n            $node->expr, $precedence, $lhsPrecedence);\n    }\n\n    protected function pClosureUse(Node\\ClosureUse $node): string {\n        return ($node->byRef ? '&' : '') . $this->p($node->var);\n    }\n\n    protected function pExpr_New(Expr\\New_ $node): string {\n        if ($node->class instanceof Stmt\\Class_) {\n            $args = $node->args ? '(' . $this->pMaybeMultiline($node->args) . ')' : '';\n            return 'new ' . $this->pClassCommon($node->class, $args);\n        }\n        return 'new ' . $this->pNewOperand($node->class)\n            . '(' . $this->pMaybeMultiline($node->args) . ')';\n    }\n\n    protected function pExpr_Clone(Expr\\Clone_ $node, int $precedence, int $lhsPrecedence): string {\n        return $this->pPrefixOp(Expr\\Clone_::class, 'clone ', $node->expr, $precedence, $lhsPrecedence);\n    }\n\n    protected function pExpr_Ternary(Expr\\Ternary $node, int $precedence, int $lhsPrecedence): string {\n        // a bit of cheating: we treat the ternary as a binary op where the ?...: part is the operator.\n        // this is okay because the part between ? and : never needs parentheses.\n        return $this->pInfixOp(Expr\\Ternary::class,\n            $node->cond, ' ?' . (null !== $node->if ? ' ' . $this->p($node->if) . ' ' : '') . ': ', $node->else,\n            $precedence, $lhsPrecedence\n        );\n    }\n\n    protected function pExpr_Exit(Expr\\Exit_ $node): string {\n        $kind = $node->getAttribute('kind', Expr\\Exit_::KIND_DIE);\n        return ($kind === Expr\\Exit_::KIND_EXIT ? 'exit' : 'die')\n             . (null !== $node->expr ? '(' . $this->p($node->expr) . ')' : '');\n    }\n\n    protected function pExpr_Throw(Expr\\Throw_ $node, int $precedence, int $lhsPrecedence): string {\n        return $this->pPrefixOp(Expr\\Throw_::class, 'throw ', $node->expr, $precedence, $lhsPrecedence);\n    }\n\n    protected function pExpr_Yield(Expr\\Yield_ $node, int $precedence, int $lhsPrecedence): string {\n        if ($node->value === null) {\n            $opPrecedence = $this->precedenceMap[Expr\\Yield_::class][0];\n            return $opPrecedence >= $lhsPrecedence ? '(yield)' : 'yield';\n        } else {\n            if (!$this->phpVersion->supportsYieldWithoutParentheses()) {\n                return '(yield ' . $this->pKey($node->key) . $this->p($node->value) . ')';\n            }\n            return $this->pPrefixOp(\n                Expr\\Yield_::class, 'yield ' . $this->pKey($node->key),\n                $node->value, $precedence, $lhsPrecedence);\n        }\n    }\n\n    // Declarations\n\n    protected function pStmt_Namespace(Stmt\\Namespace_ $node): string {\n        if ($this->canUseSemicolonNamespaces) {\n            return 'namespace ' . $this->p($node->name) . ';'\n                 . $this->nl . $this->pStmts($node->stmts, false);\n        } else {\n            return 'namespace' . (null !== $node->name ? ' ' . $this->p($node->name) : '')\n                 . ' {' . $this->pStmts($node->stmts) . $this->nl . '}';\n        }\n    }\n\n    protected function pStmt_Use(Stmt\\Use_ $node): string {\n        return 'use ' . $this->pUseType($node->type)\n             . $this->pCommaSeparated($node->uses) . ';';\n    }\n\n    protected function pStmt_GroupUse(Stmt\\GroupUse $node): string {\n        return 'use ' . $this->pUseType($node->type) . $this->pName($node->prefix)\n             . '\\{' . $this->pCommaSeparated($node->uses) . '};';\n    }\n\n    protected function pUseItem(Node\\UseItem $node): string {\n        return $this->pUseType($node->type) . $this->p($node->name)\n             . (null !== $node->alias ? ' as ' . $node->alias : '');\n    }\n\n    protected function pUseType(int $type): string {\n        return $type === Stmt\\Use_::TYPE_FUNCTION ? 'function '\n            : ($type === Stmt\\Use_::TYPE_CONSTANT ? 'const ' : '');\n    }\n\n    protected function pStmt_Interface(Stmt\\Interface_ $node): string {\n        return $this->pAttrGroups($node->attrGroups)\n             . 'interface ' . $node->name\n             . (!empty($node->extends) ? ' extends ' . $this->pCommaSeparated($node->extends) : '')\n             . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}';\n    }\n\n    protected function pStmt_Enum(Stmt\\Enum_ $node): string {\n        return $this->pAttrGroups($node->attrGroups)\n             . 'enum ' . $node->name\n             . ($node->scalarType ? ' : ' . $this->p($node->scalarType) : '')\n             . (!empty($node->implements) ? ' implements ' . $this->pCommaSeparated($node->implements) : '')\n             . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}';\n    }\n\n    protected function pStmt_Class(Stmt\\Class_ $node): string {\n        return $this->pClassCommon($node, ' ' . $node->name);\n    }\n\n    protected function pStmt_Trait(Stmt\\Trait_ $node): string {\n        return $this->pAttrGroups($node->attrGroups)\n             . 'trait ' . $node->name\n             . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}';\n    }\n\n    protected function pStmt_EnumCase(Stmt\\EnumCase $node): string {\n        return $this->pAttrGroups($node->attrGroups)\n             . 'case ' . $node->name\n             . ($node->expr ? ' = ' . $this->p($node->expr) : '')\n             . ';';\n    }\n\n    protected function pStmt_TraitUse(Stmt\\TraitUse $node): string {\n        return 'use ' . $this->pCommaSeparated($node->traits)\n             . (empty($node->adaptations)\n                ? ';'\n                : ' {' . $this->pStmts($node->adaptations) . $this->nl . '}');\n    }\n\n    protected function pStmt_TraitUseAdaptation_Precedence(Stmt\\TraitUseAdaptation\\Precedence $node): string {\n        return $this->p($node->trait) . '::' . $node->method\n             . ' insteadof ' . $this->pCommaSeparated($node->insteadof) . ';';\n    }\n\n    protected function pStmt_TraitUseAdaptation_Alias(Stmt\\TraitUseAdaptation\\Alias $node): string {\n        return (null !== $node->trait ? $this->p($node->trait) . '::' : '')\n             . $node->method . ' as'\n             . (null !== $node->newModifier ? ' ' . rtrim($this->pModifiers($node->newModifier), ' ') : '')\n             . (null !== $node->newName ? ' ' . $node->newName : '')\n             . ';';\n    }\n\n    protected function pStmt_Property(Stmt\\Property $node): string {\n        return $this->pAttrGroups($node->attrGroups)\n            . (0 === $node->flags ? 'var ' : $this->pModifiers($node->flags))\n            . ($node->type ? $this->p($node->type) . ' ' : '')\n            . $this->pCommaSeparated($node->props)\n            . ($node->hooks ? ' {' . $this->pStmts($node->hooks) . $this->nl . '}' : ';');\n    }\n\n    protected function pPropertyItem(Node\\PropertyItem $node): string {\n        return '$' . $node->name\n             . (null !== $node->default ? ' = ' . $this->p($node->default) : '');\n    }\n\n    protected function pPropertyHook(Node\\PropertyHook $node): string {\n        return $this->pAttrGroups($node->attrGroups)\n             . $this->pModifiers($node->flags)\n             . ($node->byRef ? '&' : '') . $node->name\n             . ($node->params ? '(' . $this->pParams($node->params) . ')' : '')\n             . (\\is_array($node->body) ? ' {' . $this->pStmts($node->body) . $this->nl . '}'\n                : ($node->body !== null ? ' => ' . $this->p($node->body) : '') . ';');\n    }\n\n    protected function pStmt_ClassMethod(Stmt\\ClassMethod $node): string {\n        return $this->pAttrGroups($node->attrGroups)\n             . $this->pModifiers($node->flags)\n             . 'function ' . ($node->byRef ? '&' : '') . $node->name\n             . '(' . $this->pParams($node->params) . ')'\n             . (null !== $node->returnType ? ': ' . $this->p($node->returnType) : '')\n             . (null !== $node->stmts\n                ? $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}'\n                : ';');\n    }\n\n    protected function pStmt_ClassConst(Stmt\\ClassConst $node): string {\n        return $this->pAttrGroups($node->attrGroups)\n             . $this->pModifiers($node->flags)\n             . 'const '\n             . (null !== $node->type ? $this->p($node->type) . ' ' : '')\n             . $this->pCommaSeparated($node->consts) . ';';\n    }\n\n    protected function pStmt_Function(Stmt\\Function_ $node): string {\n        return $this->pAttrGroups($node->attrGroups)\n             . 'function ' . ($node->byRef ? '&' : '') . $node->name\n             . '(' . $this->pParams($node->params) . ')'\n             . (null !== $node->returnType ? ': ' . $this->p($node->returnType) : '')\n             . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}';\n    }\n\n    protected function pStmt_Const(Stmt\\Const_ $node): string {\n        return $this->pAttrGroups($node->attrGroups)\n            . 'const '\n            . $this->pCommaSeparated($node->consts) . ';';\n    }\n\n    protected function pStmt_Declare(Stmt\\Declare_ $node): string {\n        return 'declare (' . $this->pCommaSeparated($node->declares) . ')'\n             . (null !== $node->stmts ? ' {' . $this->pStmts($node->stmts) . $this->nl . '}' : ';');\n    }\n\n    protected function pDeclareItem(Node\\DeclareItem $node): string {\n        return $node->key . '=' . $this->p($node->value);\n    }\n\n    // Control flow\n\n    protected function pStmt_If(Stmt\\If_ $node): string {\n        return 'if (' . $this->p($node->cond) . ') {'\n             . $this->pStmts($node->stmts) . $this->nl . '}'\n             . ($node->elseifs ? ' ' . $this->pImplode($node->elseifs, ' ') : '')\n             . (null !== $node->else ? ' ' . $this->p($node->else) : '');\n    }\n\n    protected function pStmt_ElseIf(Stmt\\ElseIf_ $node): string {\n        return 'elseif (' . $this->p($node->cond) . ') {'\n             . $this->pStmts($node->stmts) . $this->nl . '}';\n    }\n\n    protected function pStmt_Else(Stmt\\Else_ $node): string {\n        if (\\count($node->stmts) === 1 && $node->stmts[0] instanceof Stmt\\If_) {\n            // Print as \"else if\" rather than \"else { if }\"\n            return 'else ' . $this->p($node->stmts[0]);\n        }\n        return 'else {' . $this->pStmts($node->stmts) . $this->nl . '}';\n    }\n\n    protected function pStmt_For(Stmt\\For_ $node): string {\n        return 'for ('\n             . $this->pCommaSeparated($node->init) . ';' . (!empty($node->cond) ? ' ' : '')\n             . $this->pCommaSeparated($node->cond) . ';' . (!empty($node->loop) ? ' ' : '')\n             . $this->pCommaSeparated($node->loop)\n             . ') {' . $this->pStmts($node->stmts) . $this->nl . '}';\n    }\n\n    protected function pStmt_Foreach(Stmt\\Foreach_ $node): string {\n        return 'foreach (' . $this->p($node->expr) . ' as '\n             . (null !== $node->keyVar ? $this->p($node->keyVar) . ' => ' : '')\n             . ($node->byRef ? '&' : '') . $this->p($node->valueVar) . ') {'\n             . $this->pStmts($node->stmts) . $this->nl . '}';\n    }\n\n    protected function pStmt_While(Stmt\\While_ $node): string {\n        return 'while (' . $this->p($node->cond) . ') {'\n             . $this->pStmts($node->stmts) . $this->nl . '}';\n    }\n\n    protected function pStmt_Do(Stmt\\Do_ $node): string {\n        return 'do {' . $this->pStmts($node->stmts) . $this->nl\n             . '} while (' . $this->p($node->cond) . ');';\n    }\n\n    protected function pStmt_Switch(Stmt\\Switch_ $node): string {\n        return 'switch (' . $this->p($node->cond) . ') {'\n             . $this->pStmts($node->cases) . $this->nl . '}';\n    }\n\n    protected function pStmt_Case(Stmt\\Case_ $node): string {\n        return (null !== $node->cond ? 'case ' . $this->p($node->cond) : 'default') . ':'\n             . $this->pStmts($node->stmts);\n    }\n\n    protected function pStmt_TryCatch(Stmt\\TryCatch $node): string {\n        return 'try {' . $this->pStmts($node->stmts) . $this->nl . '}'\n             . ($node->catches ? ' ' . $this->pImplode($node->catches, ' ') : '')\n             . ($node->finally !== null ? ' ' . $this->p($node->finally) : '');\n    }\n\n    protected function pStmt_Catch(Stmt\\Catch_ $node): string {\n        return 'catch (' . $this->pImplode($node->types, '|')\n             . ($node->var !== null ? ' ' . $this->p($node->var) : '')\n             . ') {' . $this->pStmts($node->stmts) . $this->nl . '}';\n    }\n\n    protected function pStmt_Finally(Stmt\\Finally_ $node): string {\n        return 'finally {' . $this->pStmts($node->stmts) . $this->nl . '}';\n    }\n\n    protected function pStmt_Break(Stmt\\Break_ $node): string {\n        return 'break' . ($node->num !== null ? ' ' . $this->p($node->num) : '') . ';';\n    }\n\n    protected function pStmt_Continue(Stmt\\Continue_ $node): string {\n        return 'continue' . ($node->num !== null ? ' ' . $this->p($node->num) : '') . ';';\n    }\n\n    protected function pStmt_Return(Stmt\\Return_ $node): string {\n        return 'return' . (null !== $node->expr ? ' ' . $this->p($node->expr) : '') . ';';\n    }\n\n    protected function pStmt_Label(Stmt\\Label $node): string {\n        return $node->name . ':';\n    }\n\n    protected function pStmt_Goto(Stmt\\Goto_ $node): string {\n        return 'goto ' . $node->name . ';';\n    }\n\n    // Other\n\n    protected function pStmt_Expression(Stmt\\Expression $node): string {\n        return $this->p($node->expr) . ';';\n    }\n\n    protected function pStmt_Echo(Stmt\\Echo_ $node): string {\n        return 'echo ' . $this->pCommaSeparated($node->exprs) . ';';\n    }\n\n    protected function pStmt_Static(Stmt\\Static_ $node): string {\n        return 'static ' . $this->pCommaSeparated($node->vars) . ';';\n    }\n\n    protected function pStmt_Global(Stmt\\Global_ $node): string {\n        return 'global ' . $this->pCommaSeparated($node->vars) . ';';\n    }\n\n    protected function pStaticVar(Node\\StaticVar $node): string {\n        return $this->p($node->var)\n             . (null !== $node->default ? ' = ' . $this->p($node->default) : '');\n    }\n\n    protected function pStmt_Unset(Stmt\\Unset_ $node): string {\n        return 'unset(' . $this->pCommaSeparated($node->vars) . ');';\n    }\n\n    protected function pStmt_InlineHTML(Stmt\\InlineHTML $node): string {\n        $newline = $node->getAttribute('hasLeadingNewline', true) ? $this->newline : '';\n        return '?>' . $newline . $node->value . '<?php ';\n    }\n\n    protected function pStmt_HaltCompiler(Stmt\\HaltCompiler $node): string {\n        return '__halt_compiler();' . $node->remaining;\n    }\n\n    protected function pStmt_Nop(Stmt\\Nop $node): string {\n        return '';\n    }\n\n    protected function pStmt_Block(Stmt\\Block $node): string {\n        return '{' . $this->pStmts($node->stmts) . $this->nl . '}';\n    }\n\n    // Helpers\n\n    protected function pClassCommon(Stmt\\Class_ $node, string $afterClassToken): string {\n        return $this->pAttrGroups($node->attrGroups, $node->name === null)\n            . $this->pModifiers($node->flags)\n            . 'class' . $afterClassToken\n            . (null !== $node->extends ? ' extends ' . $this->p($node->extends) : '')\n            . (!empty($node->implements) ? ' implements ' . $this->pCommaSeparated($node->implements) : '')\n            . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}';\n    }\n\n    protected function pObjectProperty(Node $node): string {\n        if ($node instanceof Expr) {\n            return '{' . $this->p($node) . '}';\n        } else {\n            assert($node instanceof Node\\Identifier);\n            return $node->name;\n        }\n    }\n\n    /** @param (Expr|Node\\InterpolatedStringPart)[] $encapsList */\n    protected function pEncapsList(array $encapsList, ?string $quote): string {\n        $return = '';\n        foreach ($encapsList as $element) {\n            if ($element instanceof Node\\InterpolatedStringPart) {\n                $return .= $this->escapeString($element->value, $quote);\n            } else {\n                $return .= '{' . $this->p($element) . '}';\n            }\n        }\n\n        return $return;\n    }\n\n    protected function pSingleQuotedString(string $string): string {\n        // It is idiomatic to only escape backslashes when necessary, i.e. when followed by ', \\ or\n        // the end of the string ('Foo\\Bar' instead of 'Foo\\\\Bar'). However, we also don't want to\n        // produce an odd number of backslashes, so '\\\\\\\\a' should not get rendered as '\\\\\\a', even\n        // though that would be legal.\n        $regex = '/\\'|\\\\\\\\(?=[\\'\\\\\\\\]|$)|(?<=\\\\\\\\)\\\\\\\\/';\n        return '\\'' . preg_replace($regex, '\\\\\\\\$0', $string) . '\\'';\n    }\n\n    protected function escapeString(string $string, ?string $quote): string {\n        if (null === $quote) {\n            // For doc strings, don't escape newlines\n            $escaped = addcslashes($string, \"\\t\\f\\v$\\\\\");\n            // But do escape isolated \\r. Combined with the terminating newline, it might get\n            // interpreted as \\r\\n and dropped from the string contents.\n            $escaped = preg_replace('/\\r(?!\\n)/', '\\\\r', $escaped);\n            if ($this->phpVersion->supportsFlexibleHeredoc()) {\n                $escaped = $this->indentString($escaped);\n            }\n        } else {\n            $escaped = addcslashes($string, \"\\n\\r\\t\\f\\v$\" . $quote . \"\\\\\");\n        }\n\n        // Escape control characters and non-UTF-8 characters.\n        // Regex based on https://stackoverflow.com/a/11709412/385378.\n        $regex = '/(\n              [\\x00-\\x08\\x0E-\\x1F] # Control characters\n            | [\\xC0-\\xC1] # Invalid UTF-8 Bytes\n            | [\\xF5-\\xFF] # Invalid UTF-8 Bytes\n            | \\xE0(?=[\\x80-\\x9F]) # Overlong encoding of prior code point\n            | \\xF0(?=[\\x80-\\x8F]) # Overlong encoding of prior code point\n            | [\\xC2-\\xDF](?![\\x80-\\xBF]) # Invalid UTF-8 Sequence Start\n            | [\\xE0-\\xEF](?![\\x80-\\xBF]{2}) # Invalid UTF-8 Sequence Start\n            | [\\xF0-\\xF4](?![\\x80-\\xBF]{3}) # Invalid UTF-8 Sequence Start\n            | (?<=[\\x00-\\x7F\\xF5-\\xFF])[\\x80-\\xBF] # Invalid UTF-8 Sequence Middle\n            | (?<![\\xC2-\\xDF]|[\\xE0-\\xEF]|[\\xE0-\\xEF][\\x80-\\xBF]|[\\xF0-\\xF4]|[\\xF0-\\xF4][\\x80-\\xBF]|[\\xF0-\\xF4][\\x80-\\xBF]{2})[\\x80-\\xBF] # Overlong Sequence\n            | (?<=[\\xE0-\\xEF])[\\x80-\\xBF](?![\\x80-\\xBF]) # Short 3 byte sequence\n            | (?<=[\\xF0-\\xF4])[\\x80-\\xBF](?![\\x80-\\xBF]{2}) # Short 4 byte sequence\n            | (?<=[\\xF0-\\xF4][\\x80-\\xBF])[\\x80-\\xBF](?![\\x80-\\xBF]) # Short 4 byte sequence (2)\n        )/x';\n        return preg_replace_callback($regex, function ($matches): string {\n            assert(strlen($matches[0]) === 1);\n            $hex = dechex(ord($matches[0]));\n            return '\\\\x' . str_pad($hex, 2, '0', \\STR_PAD_LEFT);\n        }, $escaped);\n    }\n\n    protected function containsEndLabel(string $string, string $label, bool $atStart = true): bool {\n        $start = $atStart ? '(?:^|[\\r\\n])[ \\t]*' : '[\\r\\n][ \\t]*';\n        return false !== strpos($string, $label)\n            && preg_match('/' . $start . $label . '(?:$|[^_A-Za-z0-9\\x80-\\xff])/', $string);\n    }\n\n    /** @param (Expr|Node\\InterpolatedStringPart)[] $parts */\n    protected function encapsedContainsEndLabel(array $parts, string $label): bool {\n        foreach ($parts as $i => $part) {\n            if ($part instanceof Node\\InterpolatedStringPart\n                && $this->containsEndLabel($this->escapeString($part->value, null), $label, $i === 0)\n            ) {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    protected function pDereferenceLhs(Node $node): string {\n        if (!$this->dereferenceLhsRequiresParens($node)) {\n            return $this->p($node);\n        } else {\n            return '(' . $this->p($node) . ')';\n        }\n    }\n\n    protected function pStaticDereferenceLhs(Node $node): string {\n        if (!$this->staticDereferenceLhsRequiresParens($node)) {\n            return $this->p($node);\n        } else {\n            return '(' . $this->p($node) . ')';\n        }\n    }\n\n    protected function pCallLhs(Node $node): string {\n        if (!$this->callLhsRequiresParens($node)) {\n            return $this->p($node);\n        } else {\n            return '(' . $this->p($node) . ')';\n        }\n    }\n\n    protected function pNewOperand(Node $node): string {\n        if (!$this->newOperandRequiresParens($node)) {\n            return $this->p($node);\n        } else {\n            return '(' . $this->p($node) . ')';\n        }\n    }\n\n    /**\n     * @param Node[] $nodes\n     */\n    protected function hasNodeWithComments(array $nodes): bool {\n        foreach ($nodes as $node) {\n            if ($node && $node->getComments()) {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    /** @param Node[] $nodes */\n    protected function pMaybeMultiline(array $nodes, bool $trailingComma = false): string {\n        if (!$this->hasNodeWithComments($nodes)) {\n            return $this->pCommaSeparated($nodes);\n        } else {\n            return $this->pCommaSeparatedMultiline($nodes, $trailingComma) . $this->nl;\n        }\n    }\n\n    /** @param Node\\Param[] $params\n     */\n    private function hasParamWithAttributes(array $params): bool {\n        foreach ($params as $param) {\n            if ($param->attrGroups) {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    /** @param Node\\Param[] $params */\n    protected function pParams(array $params): string {\n        if ($this->hasNodeWithComments($params) ||\n            ($this->hasParamWithAttributes($params) && !$this->phpVersion->supportsAttributes())\n        ) {\n            return $this->pCommaSeparatedMultiline($params, $this->phpVersion->supportsTrailingCommaInParamList()) . $this->nl;\n        }\n        return $this->pCommaSeparated($params);\n    }\n\n    /** @param Node\\AttributeGroup[] $nodes */\n    protected function pAttrGroups(array $nodes, bool $inline = false): string {\n        $result = '';\n        $sep = $inline ? ' ' : $this->nl;\n        foreach ($nodes as $node) {\n            $result .= $this->p($node) . $sep;\n        }\n\n        return $result;\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/PrettyPrinter.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser;\n\nuse PhpParser\\Node\\Expr;\n\ninterface PrettyPrinter {\n    /**\n     * Pretty prints an array of statements.\n     *\n     * @param Node[] $stmts Array of statements\n     *\n     * @return string Pretty printed statements\n     */\n    public function prettyPrint(array $stmts): string;\n\n    /**\n     * Pretty prints an expression.\n     *\n     * @param Expr $node Expression node\n     *\n     * @return string Pretty printed node\n     */\n    public function prettyPrintExpr(Expr $node): string;\n\n    /**\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     */\n    public function prettyPrintFile(array $stmts): string;\n\n    /**\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     */\n    public function printFormatPreserving(array $stmts, array $origStmts, array $origTokens): string;\n}\n","vendor/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser;\n\nuse PhpParser\\Internal\\DiffElem;\nuse PhpParser\\Internal\\Differ;\nuse PhpParser\\Internal\\PrintableNewAnonClassNode;\nuse PhpParser\\Internal\\TokenStream;\nuse PhpParser\\Node\\AttributeGroup;\nuse PhpParser\\Node\\Expr;\nuse PhpParser\\Node\\Expr\\AssignOp;\nuse PhpParser\\Node\\Expr\\BinaryOp;\nuse PhpParser\\Node\\Expr\\Cast;\nuse PhpParser\\Node\\IntersectionType;\nuse PhpParser\\Node\\MatchArm;\nuse PhpParser\\Node\\Param;\nuse PhpParser\\Node\\PropertyHook;\nuse PhpParser\\Node\\Scalar;\nuse PhpParser\\Node\\Stmt;\nuse PhpParser\\Node\\UnionType;\n\nabstract class PrettyPrinterAbstract implements PrettyPrinter {\n    protected const FIXUP_PREC_LEFT = 0; // LHS operand affected by precedence\n    protected const FIXUP_PREC_RIGHT = 1; // RHS operand affected by precedence\n    protected const FIXUP_PREC_UNARY = 2; // Only operand affected by precedence\n    protected const FIXUP_CALL_LHS = 3; // LHS of call\n    protected const FIXUP_DEREF_LHS = 4; // LHS of dereferencing operation\n    protected const FIXUP_STATIC_DEREF_LHS = 5; // LHS of static dereferencing operation\n    protected const FIXUP_BRACED_NAME  = 6; // Name operand that may require bracing\n    protected const FIXUP_VAR_BRACED_NAME = 7; // Name operand that may require ${} bracing\n    protected const FIXUP_ENCAPSED = 8; // Encapsed string part\n    protected const FIXUP_NEW = 9; // New/instanceof operand\n\n    protected const MAX_PRECEDENCE = 1000;\n\n    /** @var array<class-string, array{int, int, int}> */\n    protected array $precedenceMap = [\n        // [precedence, precedenceLHS, precedenceRHS]\n        // Where the latter two are the precedences to use for the LHS and RHS of a binary operator,\n        // where 1 is added to one of the sides depending on associativity. This information is not\n        // used for unary operators and set to -1.\n        Expr\\Clone_::class             => [-10,   0,   1],\n        BinaryOp\\Pow::class            => [  0,   0,   1],\n        Expr\\BitwiseNot::class         => [ 10,  -1,  -1],\n        Expr\\UnaryPlus::class          => [ 10,  -1,  -1],\n        Expr\\UnaryMinus::class         => [ 10,  -1,  -1],\n        Cast\\Int_::class               => [ 10,  -1,  -1],\n        Cast\\Double::class             => [ 10,  -1,  -1],\n        Cast\\String_::class            => [ 10,  -1,  -1],\n        Cast\\Array_::class             => [ 10,  -1,  -1],\n        Cast\\Object_::class            => [ 10,  -1,  -1],\n        Cast\\Bool_::class              => [ 10,  -1,  -1],\n        Cast\\Unset_::class             => [ 10,  -1,  -1],\n        Expr\\ErrorSuppress::class      => [ 10,  -1,  -1],\n        Expr\\Instanceof_::class        => [ 20,  -1,  -1],\n        Expr\\BooleanNot::class         => [ 30,  -1,  -1],\n        BinaryOp\\Mul::class            => [ 40,  41,  40],\n        BinaryOp\\Div::class            => [ 40,  41,  40],\n        BinaryOp\\Mod::class            => [ 40,  41,  40],\n        BinaryOp\\Plus::class           => [ 50,  51,  50],\n        BinaryOp\\Minus::class          => [ 50,  51,  50],\n        // FIXME: This precedence is incorrect for PHP 8.\n        BinaryOp\\Concat::class         => [ 50,  51,  50],\n        BinaryOp\\ShiftLeft::class      => [ 60,  61,  60],\n        BinaryOp\\ShiftRight::class     => [ 60,  61,  60],\n        BinaryOp\\Pipe::class           => [ 65,  66,  65],\n        BinaryOp\\Smaller::class        => [ 70,  70,  70],\n        BinaryOp\\SmallerOrEqual::class => [ 70,  70,  70],\n        BinaryOp\\Greater::class        => [ 70,  70,  70],\n        BinaryOp\\GreaterOrEqual::class => [ 70,  70,  70],\n        BinaryOp\\Equal::class          => [ 80,  80,  80],\n        BinaryOp\\NotEqual::class       => [ 80,  80,  80],\n        BinaryOp\\Identical::class      => [ 80,  80,  80],\n        BinaryOp\\NotIdentical::class   => [ 80,  80,  80],\n        BinaryOp\\Spaceship::class      => [ 80,  80,  80],\n        BinaryOp\\BitwiseAnd::class     => [ 90,  91,  90],\n        BinaryOp\\BitwiseXor::class     => [100, 101, 100],\n        BinaryOp\\BitwiseOr::class      => [110, 111, 110],\n        BinaryOp\\BooleanAnd::class     => [120, 121, 120],\n        BinaryOp\\BooleanOr::class      => [130, 131, 130],\n        BinaryOp\\Coalesce::class       => [140, 140, 141],\n        Expr\\Ternary::class            => [150, 150, 150],\n        Expr\\Assign::class             => [160,  -1,  -1],\n        Expr\\AssignRef::class          => [160,  -1,  -1],\n        AssignOp\\Plus::class           => [160,  -1,  -1],\n        AssignOp\\Minus::class          => [160,  -1,  -1],\n        AssignOp\\Mul::class            => [160,  -1,  -1],\n        AssignOp\\Div::class            => [160,  -1,  -1],\n        AssignOp\\Concat::class         => [160,  -1,  -1],\n        AssignOp\\Mod::class            => [160,  -1,  -1],\n        AssignOp\\BitwiseAnd::class     => [160,  -1,  -1],\n        AssignOp\\BitwiseOr::class      => [160,  -1,  -1],\n        AssignOp\\BitwiseXor::class     => [160,  -1,  -1],\n        AssignOp\\ShiftLeft::class      => [160,  -1,  -1],\n        AssignOp\\ShiftRight::class     => [160,  -1,  -1],\n        AssignOp\\Pow::class            => [160,  -1,  -1],\n        AssignOp\\Coalesce::class       => [160,  -1,  -1],\n        Expr\\YieldFrom::class          => [170,  -1,  -1],\n        Expr\\Yield_::class             => [175,  -1,  -1],\n        Expr\\Print_::class             => [180,  -1,  -1],\n        BinaryOp\\LogicalAnd::class     => [190, 191, 190],\n        BinaryOp\\LogicalXor::class     => [200, 201, 200],\n        BinaryOp\\LogicalOr::class      => [210, 211, 210],\n        Expr\\Include_::class           => [220,  -1,  -1],\n        Expr\\ArrowFunction::class      => [230,  -1,  -1],\n        Expr\\Throw_::class             => [240,  -1,  -1],\n        Expr\\Cast\\Void_::class         => [250,  -1,  -1],\n    ];\n\n    /** @var int Current indentation level. */\n    protected int $indentLevel;\n    /** @var string String for single level of indentation */\n    private string $indent;\n    /** @var int Width in spaces to indent by. */\n    private int $indentWidth;\n    /** @var bool Whether to use tab indentation. */\n    private bool $useTabs;\n    /** @var int Width in spaces of one tab. */\n    private int $tabWidth = 4;\n\n    /** @var string Newline style. Does not include current indentation. */\n    protected string $newline;\n    /** @var string Newline including current indentation. */\n    protected string $nl;\n    /** @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. */\n    protected ?string $docStringEndToken;\n    /** @var bool Whether semicolon namespaces can be used (i.e. no global namespace is used) */\n    protected bool $canUseSemicolonNamespaces;\n    /** @var bool Whether to use short array syntax if the node specifies no preference */\n    protected bool $shortArraySyntax;\n    /** @var PhpVersion PHP version to target */\n    protected PhpVersion $phpVersion;\n\n    /** @var TokenStream|null Original tokens for use in format-preserving pretty print */\n    protected ?TokenStream $origTokens;\n    /** @var Internal\\Differ<Node> Differ for node lists */\n    protected Differ $nodeListDiffer;\n    /** @var array<string, bool> Map determining whether a certain character is a label character */\n    protected array $labelCharMap;\n    /**\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     */\n    protected array $fixupMap;\n    /**\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     */\n    protected array $removalMap;\n    /**\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     */\n    protected array $insertionMap;\n    /**\n     * @var array<string, string> Map From \"{$class}->{$subNode}\" to string that should be inserted\n     *                            between elements of this list subnode.\n     */\n    protected array $listInsertionMap;\n\n    /**\n     * @var array<string, array{int|string|null, string, string}>\n     */\n    protected array $emptyListInsertionMap;\n    /** @var array<string, array{string, int, int}>\n     *       Map from \"{$class}->{$subNode}\" to [$printFn, $skipToken, $findToken] where $printFn is the function to\n     *       print the modifiers, $skipToken is the token to skip at the start and $findToken is the token before which\n     *       the modifiers should be reprinted. */\n    protected array $modifierChangeMap;\n\n    /**\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     */\n    public function __construct(array $options = []) {\n        $this->phpVersion = $options['phpVersion'] ?? PhpVersion::fromComponents(7, 4);\n\n        $this->newline = $options['newline'] ?? \"\\n\";\n        if ($this->newline !== \"\\n\" && $this->newline != \"\\r\\n\") {\n            throw new \\LogicException('Option \"newline\" must be one of \"\\n\" or \"\\r\\n\"');\n        }\n\n        $this->shortArraySyntax =\n            $options['shortArraySyntax'] ?? $this->phpVersion->supportsShortArraySyntax();\n        $this->docStringEndToken =\n            $this->phpVersion->supportsFlexibleHeredoc() ? null : '_DOC_STRING_END_' . mt_rand();\n\n        $this->indent = $indent = $options['indent'] ?? '    ';\n        if ($indent === \"\\t\") {\n            $this->useTabs = true;\n            $this->indentWidth = $this->tabWidth;\n        } elseif ($indent === \\str_repeat(' ', \\strlen($indent))) {\n            $this->useTabs = false;\n            $this->indentWidth = \\strlen($indent);\n        } else {\n            throw new \\LogicException('Option \"indent\" must either be all spaces or a single tab');\n        }\n    }\n\n    /**\n     * Reset pretty printing state.\n     */\n    protected function resetState(): void {\n        $this->indentLevel = 0;\n        $this->nl = $this->newline;\n        $this->origTokens = null;\n    }\n\n    /**\n     * Set indentation level\n     *\n     * @param int $level Level in number of spaces\n     */\n    protected function setIndentLevel(int $level): void {\n        $this->indentLevel = $level;\n        if ($this->useTabs) {\n            $tabs = \\intdiv($level, $this->tabWidth);\n            $spaces = $level % $this->tabWidth;\n            $this->nl = $this->newline . \\str_repeat(\"\\t\", $tabs) . \\str_repeat(' ', $spaces);\n        } else {\n            $this->nl = $this->newline . \\str_repeat(' ', $level);\n        }\n    }\n\n    /**\n     * Increase indentation level.\n     */\n    protected function indent(): void {\n        $this->indentLevel += $this->indentWidth;\n        $this->nl .= $this->indent;\n    }\n\n    /**\n     * Decrease indentation level.\n     */\n    protected function outdent(): void {\n        assert($this->indentLevel >= $this->indentWidth);\n        $this->setIndentLevel($this->indentLevel - $this->indentWidth);\n    }\n\n    /**\n     * Pretty prints an array of statements.\n     *\n     * @param Node[] $stmts Array of statements\n     *\n     * @return string Pretty printed statements\n     */\n    public function prettyPrint(array $stmts): string {\n        $this->resetState();\n        $this->preprocessNodes($stmts);\n\n        return ltrim($this->handleMagicTokens($this->pStmts($stmts, false)));\n    }\n\n    /**\n     * Pretty prints an expression.\n     *\n     * @param Expr $node Expression node\n     *\n     * @return string Pretty printed node\n     */\n    public function prettyPrintExpr(Expr $node): string {\n        $this->resetState();\n        return $this->handleMagicTokens($this->p($node));\n    }\n\n    /**\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     */\n    public function prettyPrintFile(array $stmts): string {\n        if (!$stmts) {\n            return \"<?php\" . $this->newline . $this->newline;\n        }\n\n        $p = \"<?php\" . $this->newline . $this->newline . $this->prettyPrint($stmts);\n\n        if ($stmts[0] instanceof Stmt\\InlineHTML) {\n            $p = preg_replace('/^<\\?php\\s+\\?>\\r?\\n?/', '', $p);\n        }\n        if ($stmts[count($stmts) - 1] instanceof Stmt\\InlineHTML) {\n            $p = preg_replace('/<\\?php$/', '', rtrim($p));\n        }\n\n        return $p;\n    }\n\n    /**\n     * Preprocesses the top-level nodes to initialize pretty printer state.\n     *\n     * @param Node[] $nodes Array of nodes\n     */\n    protected function preprocessNodes(array $nodes): void {\n        /* We can use semicolon-namespaces unless there is a global namespace declaration */\n        $this->canUseSemicolonNamespaces = true;\n        foreach ($nodes as $node) {\n            if ($node instanceof Stmt\\Namespace_ && null === $node->name) {\n                $this->canUseSemicolonNamespaces = false;\n                break;\n            }\n        }\n    }\n\n    /**\n     * Handles (and removes) doc-string-end tokens.\n     */\n    protected function handleMagicTokens(string $str): string {\n        if ($this->docStringEndToken !== null) {\n            // Replace doc-string-end tokens with nothing or a newline\n            $str = str_replace(\n                $this->docStringEndToken . ';' . $this->newline,\n                ';' . $this->newline,\n                $str);\n            $str = str_replace($this->docStringEndToken, $this->newline, $str);\n        }\n\n        return $str;\n    }\n\n    /**\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     */\n    protected function pStmts(array $nodes, bool $indent = true): string {\n        if ($indent) {\n            $this->indent();\n        }\n\n        $result = '';\n        foreach ($nodes as $node) {\n            $comments = $node->getComments();\n            if ($comments) {\n                $result .= $this->nl . $this->pComments($comments);\n                if ($node instanceof Stmt\\Nop) {\n                    continue;\n                }\n            }\n\n            $result .= $this->nl . $this->p($node);\n        }\n\n        if ($indent) {\n            $this->outdent();\n        }\n\n        return $result;\n    }\n\n    /**\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     */\n    protected function pInfixOp(\n        string $class, Node $leftNode, string $operatorString, Node $rightNode,\n        int $precedence, int $lhsPrecedence\n    ): string {\n        list($opPrecedence, $newPrecedenceLHS, $newPrecedenceRHS) = $this->precedenceMap[$class];\n        $prefix = '';\n        $suffix = '';\n        if ($opPrecedence >= $precedence) {\n            $prefix = '(';\n            $suffix = ')';\n            $lhsPrecedence = self::MAX_PRECEDENCE;\n        }\n        return $prefix . $this->p($leftNode, $newPrecedenceLHS, $newPrecedenceLHS)\n            . $operatorString . $this->p($rightNode, $newPrecedenceRHS, $lhsPrecedence) . $suffix;\n    }\n\n    /**\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     */\n    protected function pPrefixOp(string $class, string $operatorString, Node $node, int $precedence, int $lhsPrecedence): string {\n        $opPrecedence = $this->precedenceMap[$class][0];\n        $prefix = '';\n        $suffix = '';\n        if ($opPrecedence >= $lhsPrecedence) {\n            $prefix = '(';\n            $suffix = ')';\n            $lhsPrecedence = self::MAX_PRECEDENCE;\n        }\n        $printedArg = $this->p($node, $opPrecedence, $lhsPrecedence);\n        if (($operatorString === '+' && $printedArg[0] === '+') ||\n            ($operatorString === '-' && $printedArg[0] === '-')\n        ) {\n            // Avoid printing +(+$a) as ++$a and similar.\n            $printedArg = '(' . $printedArg . ')';\n        }\n        return $prefix . $operatorString . $printedArg . $suffix;\n    }\n\n    /**\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     */\n    protected function pPostfixOp(string $class, Node $node, string $operatorString, int $precedence, int $lhsPrecedence): string {\n        $opPrecedence = $this->precedenceMap[$class][0];\n        $prefix = '';\n        $suffix = '';\n        if ($opPrecedence >= $precedence) {\n            $prefix = '(';\n            $suffix = ')';\n            $lhsPrecedence = self::MAX_PRECEDENCE;\n        }\n        if ($opPrecedence < $lhsPrecedence) {\n            $lhsPrecedence = $opPrecedence;\n        }\n        return $prefix . $this->p($node, $opPrecedence, $lhsPrecedence) . $operatorString . $suffix;\n    }\n\n    /**\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     */\n    protected function pImplode(array $nodes, string $glue = ''): string {\n        $pNodes = [];\n        foreach ($nodes as $node) {\n            if (null === $node) {\n                $pNodes[] = '';\n            } else {\n                $pNodes[] = $this->p($node);\n            }\n        }\n\n        return implode($glue, $pNodes);\n    }\n\n    /**\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     */\n    protected function pCommaSeparated(array $nodes): string {\n        return $this->pImplode($nodes, ', ');\n    }\n\n    /**\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     */\n    protected function pCommaSeparatedMultiline(array $nodes, bool $trailingComma): string {\n        $this->indent();\n\n        $result = '';\n        $lastIdx = count($nodes) - 1;\n        foreach ($nodes as $idx => $node) {\n            if ($node !== null) {\n                $comments = $node->getComments();\n                if ($comments) {\n                    $result .= $this->nl . $this->pComments($comments);\n                }\n\n                $result .= $this->nl . $this->p($node);\n            } else {\n                $result .= $this->nl;\n            }\n            if ($trailingComma || $idx !== $lastIdx) {\n                $result .= ',';\n            }\n        }\n\n        $this->outdent();\n        return $result;\n    }\n\n    /**\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     */\n    protected function pComments(array $comments): string {\n        $formattedComments = [];\n\n        foreach ($comments as $comment) {\n            $formattedComments[] = str_replace(\"\\n\", $this->nl, $comment->getReformattedText());\n        }\n\n        return implode($this->nl, $formattedComments);\n    }\n\n    /**\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     */\n    public function printFormatPreserving(array $stmts, array $origStmts, array $origTokens): string {\n        $this->initializeNodeListDiffer();\n        $this->initializeLabelCharMap();\n        $this->initializeFixupMap();\n        $this->initializeRemovalMap();\n        $this->initializeInsertionMap();\n        $this->initializeListInsertionMap();\n        $this->initializeEmptyListInsertionMap();\n        $this->initializeModifierChangeMap();\n\n        $this->resetState();\n        $this->origTokens = new TokenStream($origTokens, $this->tabWidth);\n\n        $this->preprocessNodes($stmts);\n\n        $pos = 0;\n        $result = $this->pArray($stmts, $origStmts, $pos, 0, 'File', 'stmts', null);\n        if (null !== $result) {\n            $result .= $this->origTokens->getTokenCode($pos, count($origTokens) - 1, 0);\n        } else {\n            // Fallback\n            // TODO Add <?php properly\n            $result = \"<?php\" . $this->newline . $this->pStmts($stmts, false);\n        }\n\n        return $this->handleMagicTokens($result);\n    }\n\n    protected function pFallback(Node $node, int $precedence, int $lhsPrecedence): string {\n        return $this->{'p' . $node->getType()}($node, $precedence, $lhsPrecedence);\n    }\n\n    /**\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     */\n    protected function p(\n        Node $node, int $precedence = self::MAX_PRECEDENCE, int $lhsPrecedence = self::MAX_PRECEDENCE,\n        bool $parentFormatPreserved = false\n    ): string {\n        // No orig tokens means this is a normal pretty print without preservation of formatting\n        if (!$this->origTokens) {\n            return $this->{'p' . $node->getType()}($node, $precedence, $lhsPrecedence);\n        }\n\n        /** @var Node|null $origNode */\n        $origNode = $node->getAttribute('origNode');\n        if (null === $origNode) {\n            return $this->pFallback($node, $precedence, $lhsPrecedence);\n        }\n\n        $class = \\get_class($node);\n        \\assert($class === \\get_class($origNode));\n\n        $startPos = $origNode->getStartTokenPos();\n        $endPos = $origNode->getEndTokenPos();\n        \\assert($startPos >= 0 && $endPos >= 0);\n\n        $fallbackNode = $node;\n        if ($node instanceof Expr\\New_ && $node->class instanceof Stmt\\Class_) {\n            // Normalize node structure of anonymous classes\n            assert($origNode instanceof Expr\\New_);\n            $node = PrintableNewAnonClassNode::fromNewNode($node);\n            $origNode = PrintableNewAnonClassNode::fromNewNode($origNode);\n            $class = PrintableNewAnonClassNode::class;\n        }\n\n        // InlineHTML node does not contain closing and opening PHP tags. If the parent formatting\n        // is not preserved, then we need to use the fallback code to make sure the tags are\n        // printed.\n        if ($node instanceof Stmt\\InlineHTML && !$parentFormatPreserved) {\n            return $this->pFallback($fallbackNode, $precedence, $lhsPrecedence);\n        }\n\n        $indentAdjustment = $this->indentLevel - $this->origTokens->getIndentationBefore($startPos);\n\n        $type = $node->getType();\n        $fixupInfo = $this->fixupMap[$class] ?? null;\n\n        $result = '';\n        $pos = $startPos;\n        foreach ($node->getSubNodeNames() as $subNodeName) {\n            $subNode = $node->$subNodeName;\n            $origSubNode = $origNode->$subNodeName;\n\n            if ((!$subNode instanceof Node && $subNode !== null)\n                || (!$origSubNode instanceof Node && $origSubNode !== null)\n            ) {\n                if ($subNode === $origSubNode) {\n                    // Unchanged, can reuse old code\n                    continue;\n                }\n\n                if (is_array($subNode) && is_array($origSubNode)) {\n                    // Array subnode changed, we might be able to reconstruct it\n                    $listResult = $this->pArray(\n                        $subNode, $origSubNode, $pos, $indentAdjustment, $class, $subNodeName,\n                        $fixupInfo[$subNodeName] ?? null\n                    );\n                    if (null === $listResult) {\n                        return $this->pFallback($fallbackNode, $precedence, $lhsPrecedence);\n                    }\n\n                    $result .= $listResult;\n                    continue;\n                }\n\n                // Check if this is a modifier change\n                $key = $class . '->' . $subNodeName;\n                if (!isset($this->modifierChangeMap[$key])) {\n                    return $this->pFallback($fallbackNode, $precedence, $lhsPrecedence);\n                }\n\n                [$printFn, $skipToken, $findToken] = $this->modifierChangeMap[$key];\n                $skipWSPos = $this->origTokens->skipRight($pos, $skipToken);\n                $result .= $this->origTokens->getTokenCode($pos, $skipWSPos, $indentAdjustment);\n                $result .= $this->$printFn($subNode);\n                $pos = $this->origTokens->findRight($skipWSPos, $findToken);\n                continue;\n            }\n\n            $extraLeft = '';\n            $extraRight = '';\n            if ($origSubNode !== null) {\n                $subStartPos = $origSubNode->getStartTokenPos();\n                $subEndPos = $origSubNode->getEndTokenPos();\n                \\assert($subStartPos >= 0 && $subEndPos >= 0);\n            } else {\n                if ($subNode === null) {\n                    // Both null, nothing to do\n                    continue;\n                }\n\n                // A node has been inserted, check if we have insertion information for it\n                $key = $type . '->' . $subNodeName;\n                if (!isset($this->insertionMap[$key])) {\n                    return $this->pFallback($fallbackNode, $precedence, $lhsPrecedence);\n                }\n\n                list($findToken, $beforeToken, $extraLeft, $extraRight) = $this->insertionMap[$key];\n                if (null !== $findToken) {\n                    $subStartPos = $this->origTokens->findRight($pos, $findToken)\n                        + (int) !$beforeToken;\n                } else {\n                    $subStartPos = $pos;\n                }\n\n                if (null === $extraLeft && null !== $extraRight) {\n                    // If inserting on the right only, skipping whitespace looks better\n                    $subStartPos = $this->origTokens->skipRightWhitespace($subStartPos);\n                }\n                $subEndPos = $subStartPos - 1;\n            }\n\n            if (null === $subNode) {\n                // A node has been removed, check if we have removal information for it\n                $key = $type . '->' . $subNodeName;\n                if (!isset($this->removalMap[$key])) {\n                    return $this->pFallback($fallbackNode, $precedence, $lhsPrecedence);\n                }\n\n                // Adjust positions to account for additional tokens that must be skipped\n                $removalInfo = $this->removalMap[$key];\n                if (isset($removalInfo['left'])) {\n                    $subStartPos = $this->origTokens->skipLeft($subStartPos - 1, $removalInfo['left']) + 1;\n                }\n                if (isset($removalInfo['right'])) {\n                    $subEndPos = $this->origTokens->skipRight($subEndPos + 1, $removalInfo['right']) - 1;\n                }\n            }\n\n            $result .= $this->origTokens->getTokenCode($pos, $subStartPos, $indentAdjustment);\n\n            if (null !== $subNode) {\n                $result .= $extraLeft;\n\n                $origIndentLevel = $this->indentLevel;\n                $this->setIndentLevel(max($this->origTokens->getIndentationBefore($subStartPos) + $indentAdjustment, 0));\n\n                // If it's the same node that was previously in this position, it certainly doesn't\n                // need fixup. It's important to check this here, because our fixup checks are more\n                // conservative than strictly necessary.\n                if (isset($fixupInfo[$subNodeName])\n                    && $subNode->getAttribute('origNode') !== $origSubNode\n                ) {\n                    $fixup = $fixupInfo[$subNodeName];\n                    $res = $this->pFixup($fixup, $subNode, $class, $subStartPos, $subEndPos);\n                } else {\n                    $res = $this->p($subNode, self::MAX_PRECEDENCE, self::MAX_PRECEDENCE, true);\n                }\n\n                $this->safeAppend($result, $res);\n                $this->setIndentLevel($origIndentLevel);\n\n                $result .= $extraRight;\n            }\n\n            $pos = $subEndPos + 1;\n        }\n\n        $result .= $this->origTokens->getTokenCode($pos, $endPos + 1, $indentAdjustment);\n        return $result;\n    }\n\n    /**\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     */\n    protected function pArray(\n        array  $nodes, array $origNodes, int &$pos, int $indentAdjustment,\n        string $parentNodeClass, string $subNodeName, ?int $fixup\n    ): ?string {\n        $diff = $this->nodeListDiffer->diffWithReplacements($origNodes, $nodes);\n\n        $mapKey = $parentNodeClass . '->' . $subNodeName;\n        $insertStr = $this->listInsertionMap[$mapKey] ?? null;\n        $isStmtList = $subNodeName === 'stmts';\n\n        $beforeFirstKeepOrReplace = true;\n        $skipRemovedNode = false;\n        $delayedAdd = [];\n        $lastElemIndentLevel = $this->indentLevel;\n\n        $insertNewline = false;\n        if ($insertStr === \"\\n\") {\n            $insertStr = '';\n            $insertNewline = true;\n        }\n\n        if ($isStmtList && \\count($origNodes) === 1 && \\count($nodes) !== 1) {\n            $startPos = $origNodes[0]->getStartTokenPos();\n            $endPos = $origNodes[0]->getEndTokenPos();\n            \\assert($startPos >= 0 && $endPos >= 0);\n            if (!$this->origTokens->haveBraces($startPos, $endPos)) {\n                // This was a single statement without braces, but either additional statements\n                // have been added, or the single statement has been removed. This requires the\n                // addition of braces. For now fall back.\n                // TODO: Try to preserve formatting\n                return null;\n            }\n        }\n\n        $result = '';\n        foreach ($diff as $i => $diffElem) {\n            $diffType = $diffElem->type;\n            /** @var Node|string|null $arrItem */\n            $arrItem = $diffElem->new;\n            /** @var Node|string|null $origArrItem */\n            $origArrItem = $diffElem->old;\n\n            if ($diffType === DiffElem::TYPE_KEEP || $diffType === DiffElem::TYPE_REPLACE) {\n                $beforeFirstKeepOrReplace = false;\n\n                if ($origArrItem === null || $arrItem === null) {\n                    // We can only handle the case where both are null\n                    if ($origArrItem === $arrItem) {\n                        continue;\n                    }\n                    return null;\n                }\n\n                if (!$arrItem instanceof Node || !$origArrItem instanceof Node) {\n                    // We can only deal with nodes. This can occur for Names, which use string arrays.\n                    return null;\n                }\n\n                $itemStartPos = $origArrItem->getStartTokenPos();\n                $itemEndPos = $origArrItem->getEndTokenPos();\n                \\assert($itemStartPos >= 0 && $itemEndPos >= 0 && $itemStartPos >= $pos);\n\n                $origIndentLevel = $this->indentLevel;\n                $lastElemIndentLevel = max($this->origTokens->getIndentationBefore($itemStartPos) + $indentAdjustment, 0);\n                $this->setIndentLevel($lastElemIndentLevel);\n\n                $comments = $arrItem->getComments();\n                $origComments = $origArrItem->getComments();\n                $commentStartPos = $origComments ? $origComments[0]->getStartTokenPos() : $itemStartPos;\n                \\assert($commentStartPos >= 0);\n\n                if ($commentStartPos < $pos) {\n                    // Comments may be assigned to multiple nodes if they start at the same position.\n                    // Make sure we don't try to print them multiple times.\n                    $commentStartPos = $itemStartPos;\n                }\n\n                if ($skipRemovedNode) {\n                    if ($isStmtList && $this->origTokens->haveTagInRange($pos, $itemStartPos)) {\n                        // We'd remove an opening/closing PHP tag.\n                        // TODO: Preserve formatting.\n                        $this->setIndentLevel($origIndentLevel);\n                        return null;\n                    }\n                } else {\n                    $result .= $this->origTokens->getTokenCode(\n                        $pos, $commentStartPos, $indentAdjustment);\n                }\n\n                if (!empty($delayedAdd)) {\n                    /** @var Node $delayedAddNode */\n                    foreach ($delayedAdd as $delayedAddNode) {\n                        if ($insertNewline) {\n                            $delayedAddComments = $delayedAddNode->getComments();\n                            if ($delayedAddComments) {\n                                $result .= $this->pComments($delayedAddComments) . $this->nl;\n                            }\n                        }\n\n                        $this->safeAppend($result, $this->p($delayedAddNode, self::MAX_PRECEDENCE, self::MAX_PRECEDENCE, true));\n\n                        if ($insertNewline) {\n                            $result .= $insertStr . $this->nl;\n                        } else {\n                            $result .= $insertStr;\n                        }\n                    }\n\n                    $delayedAdd = [];\n                }\n\n                if ($comments !== $origComments) {\n                    if ($comments) {\n                        $result .= $this->pComments($comments) . $this->nl;\n                    }\n                } else {\n                    $result .= $this->origTokens->getTokenCode(\n                        $commentStartPos, $itemStartPos, $indentAdjustment);\n                }\n\n                // If we had to remove anything, we have done so now.\n                $skipRemovedNode = false;\n            } elseif ($diffType === DiffElem::TYPE_ADD) {\n                if (null === $insertStr) {\n                    // We don't have insertion information for this list type\n                    return null;\n                }\n\n                if (!$arrItem instanceof Node) {\n                    // We only support list insertion of nodes.\n                    return null;\n                }\n\n                // We go multiline if the original code was multiline,\n                // or if it's an array item with a comment above it.\n                // Match always uses multiline formatting.\n                if ($insertStr === ', ' &&\n                    ($this->isMultiline($origNodes) || $arrItem->getComments() ||\n                     $parentNodeClass === Expr\\Match_::class)\n                ) {\n                    $insertStr = ',';\n                    $insertNewline = true;\n                }\n\n                if ($beforeFirstKeepOrReplace) {\n                    // Will be inserted at the next \"replace\" or \"keep\" element\n                    $delayedAdd[] = $arrItem;\n                    continue;\n                }\n\n                $itemStartPos = $pos;\n                $itemEndPos = $pos - 1;\n\n                $origIndentLevel = $this->indentLevel;\n                $this->setIndentLevel($lastElemIndentLevel);\n\n                if ($insertNewline) {\n                    $result .= $insertStr . $this->nl;\n                    $comments = $arrItem->getComments();\n                    if ($comments) {\n                        $result .= $this->pComments($comments) . $this->nl;\n                    }\n                } else {\n                    $result .= $insertStr;\n                }\n            } elseif ($diffType === DiffElem::TYPE_REMOVE) {\n                if (!$origArrItem instanceof Node) {\n                    // We only support removal for nodes\n                    return null;\n                }\n\n                $itemStartPos = $origArrItem->getStartTokenPos();\n                $itemEndPos = $origArrItem->getEndTokenPos();\n                \\assert($itemStartPos >= 0 && $itemEndPos >= 0);\n\n                // Consider comments part of the node.\n                $origComments = $origArrItem->getComments();\n                if ($origComments) {\n                    $itemStartPos = $origComments[0]->getStartTokenPos();\n                }\n\n                if ($i === 0) {\n                    // If we're removing from the start, keep the tokens before the node and drop those after it,\n                    // instead of the other way around.\n                    $result .= $this->origTokens->getTokenCode(\n                        $pos, $itemStartPos, $indentAdjustment);\n                    $skipRemovedNode = true;\n                } else {\n                    if ($isStmtList && $this->origTokens->haveTagInRange($pos, $itemStartPos)) {\n                        // We'd remove an opening/closing PHP tag.\n                        // TODO: Preserve formatting.\n                        return null;\n                    }\n                }\n\n                $pos = $itemEndPos + 1;\n                continue;\n            } else {\n                throw new \\Exception(\"Shouldn't happen\");\n            }\n\n            if (null !== $fixup && $arrItem->getAttribute('origNode') !== $origArrItem) {\n                $res = $this->pFixup($fixup, $arrItem, null, $itemStartPos, $itemEndPos);\n            } else {\n                $res = $this->p($arrItem, self::MAX_PRECEDENCE, self::MAX_PRECEDENCE, true);\n            }\n            $this->safeAppend($result, $res);\n\n            $this->setIndentLevel($origIndentLevel);\n            $pos = $itemEndPos + 1;\n        }\n\n        if ($skipRemovedNode) {\n            // TODO: Support removing single node.\n            return null;\n        }\n\n        if (!empty($delayedAdd)) {\n            if (!isset($this->emptyListInsertionMap[$mapKey])) {\n                return null;\n            }\n\n            list($findToken, $extraLeft, $extraRight) = $this->emptyListInsertionMap[$mapKey];\n            if (null !== $findToken) {\n                // For anon classes skip to the class keyword.\n                $isAnonClassArgs = $mapKey === PrintableNewAnonClassNode::class . '->args';\n                if ($isAnonClassArgs) {\n                    $insertPos = $this->origTokens->findRight($pos, \\T_CLASS) + 1;\n                    $result .= $this->origTokens->getTokenCode($pos, $insertPos, $indentAdjustment);\n                    $pos = $insertPos;\n                }\n\n                // If \"new Foo\" was used without arguments, we need to convert to \"new Foo()\".\n                if (($mapKey === Expr\\New_::class . '->args' || $isAnonClassArgs) &&\n                    !$this->origTokens->haveTokenImmediatelyAfter($pos - 1, '(')\n                ) {\n                    $extraLeft = '(';\n                    $extraRight = ')';\n                } else {\n                    $insertPos = $this->origTokens->findRight($pos, $findToken) + 1;\n                    $result .= $this->origTokens->getTokenCode($pos, $insertPos, $indentAdjustment);\n                    $pos = $insertPos;\n                }\n            }\n\n            $first = true;\n            $result .= $extraLeft;\n            foreach ($delayedAdd as $delayedAddNode) {\n                if (!$first) {\n                    $result .= $insertStr;\n                    if ($insertNewline) {\n                        $result .= $this->nl;\n                    }\n                }\n                $result .= $this->p($delayedAddNode, self::MAX_PRECEDENCE, self::MAX_PRECEDENCE, true);\n                $first = false;\n            }\n            $result .= $extraRight === \"\\n\" ? $this->nl : $extraRight;\n        }\n\n        return $result;\n    }\n\n    /**\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     */\n    protected function pFixup(int $fixup, Node $subNode, ?string $parentClass, int $subStartPos, int $subEndPos): string {\n        switch ($fixup) {\n            case self::FIXUP_PREC_LEFT:\n                // We use a conservative approximation where lhsPrecedence == precedence.\n                if (!$this->origTokens->haveParens($subStartPos, $subEndPos)) {\n                    $precedence = $this->precedenceMap[$parentClass][1];\n                    return $this->p($subNode, $precedence, $precedence);\n                }\n                break;\n            case self::FIXUP_PREC_RIGHT:\n                if (!$this->origTokens->haveParens($subStartPos, $subEndPos)) {\n                    $precedence = $this->precedenceMap[$parentClass][2];\n                    return $this->p($subNode, $precedence, $precedence);\n                }\n                break;\n            case self::FIXUP_PREC_UNARY:\n                if (!$this->origTokens->haveParens($subStartPos, $subEndPos)) {\n                    $precedence = $this->precedenceMap[$parentClass][0];\n                    return $this->p($subNode, $precedence, $precedence);\n                }\n                break;\n            case self::FIXUP_CALL_LHS:\n                if ($this->callLhsRequiresParens($subNode)\n                    && !$this->origTokens->haveParens($subStartPos, $subEndPos)\n                ) {\n                    return '(' . $this->p($subNode) . ')';\n                }\n                break;\n            case self::FIXUP_DEREF_LHS:\n                if ($this->dereferenceLhsRequiresParens($subNode)\n                    && !$this->origTokens->haveParens($subStartPos, $subEndPos)\n                ) {\n                    return '(' . $this->p($subNode) . ')';\n                }\n                break;\n            case self::FIXUP_STATIC_DEREF_LHS:\n                if ($this->staticDereferenceLhsRequiresParens($subNode)\n                    && !$this->origTokens->haveParens($subStartPos, $subEndPos)\n                ) {\n                    return '(' . $this->p($subNode) . ')';\n                }\n                break;\n            case self::FIXUP_NEW:\n                if ($this->newOperandRequiresParens($subNode)\n                    && !$this->origTokens->haveParens($subStartPos, $subEndPos)) {\n                    return '(' . $this->p($subNode) . ')';\n                }\n                break;\n            case self::FIXUP_BRACED_NAME:\n            case self::FIXUP_VAR_BRACED_NAME:\n                if ($subNode instanceof Expr\n                    && !$this->origTokens->haveBraces($subStartPos, $subEndPos)\n                ) {\n                    return ($fixup === self::FIXUP_VAR_BRACED_NAME ? '$' : '')\n                        . '{' . $this->p($subNode) . '}';\n                }\n                break;\n            case self::FIXUP_ENCAPSED:\n                if (!$subNode instanceof Node\\InterpolatedStringPart\n                    && !$this->origTokens->haveBraces($subStartPos, $subEndPos)\n                ) {\n                    return '{' . $this->p($subNode) . '}';\n                }\n                break;\n            default:\n                throw new \\Exception('Cannot happen');\n        }\n\n        // Nothing special to do\n        return $this->p($subNode);\n    }\n\n    /**\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     */\n    protected function safeAppend(string &$str, string $append): void {\n        if ($str === \"\") {\n            $str = $append;\n            return;\n        }\n\n        if ($append === \"\") {\n            return;\n        }\n\n        if (!$this->labelCharMap[$append[0]]\n                || !$this->labelCharMap[$str[\\strlen($str) - 1]]) {\n            $str .= $append;\n        } else {\n            $str .= \" \" . $append;\n        }\n    }\n\n    /**\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     */\n    protected function callLhsRequiresParens(Node $node): bool {\n        if ($node instanceof Expr\\New_) {\n            return !$this->phpVersion->supportsNewDereferenceWithoutParentheses();\n        }\n        return !($node instanceof Node\\Name\n            || $node instanceof Expr\\Variable\n            || $node instanceof Expr\\ArrayDimFetch\n            || $node instanceof Expr\\FuncCall\n            || $node instanceof Expr\\MethodCall\n            || $node instanceof Expr\\NullsafeMethodCall\n            || $node instanceof Expr\\StaticCall\n            || $node instanceof Expr\\Array_);\n    }\n\n    /**\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     */\n    protected function dereferenceLhsRequiresParens(Node $node): bool {\n        // A constant can occur on the LHS of an array/object deref, but not a static deref.\n        return $this->staticDereferenceLhsRequiresParens($node)\n            && !$node instanceof Expr\\ConstFetch;\n    }\n\n    /**\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     */\n    protected function staticDereferenceLhsRequiresParens(Node $node): bool {\n        if ($node instanceof Expr\\New_) {\n            return !$this->phpVersion->supportsNewDereferenceWithoutParentheses();\n        }\n        return !($node instanceof Expr\\Variable\n            || $node instanceof Node\\Name\n            || $node instanceof Expr\\ArrayDimFetch\n            || $node instanceof Expr\\PropertyFetch\n            || $node instanceof Expr\\NullsafePropertyFetch\n            || $node instanceof Expr\\StaticPropertyFetch\n            || $node instanceof Expr\\FuncCall\n            || $node instanceof Expr\\MethodCall\n            || $node instanceof Expr\\NullsafeMethodCall\n            || $node instanceof Expr\\StaticCall\n            || $node instanceof Expr\\Array_\n            || $node instanceof Scalar\\String_\n            || $node instanceof Expr\\ClassConstFetch);\n    }\n\n    /**\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     */\n    protected function newOperandRequiresParens(Node $node): bool {\n        if ($node instanceof Node\\Name || $node instanceof Expr\\Variable) {\n            return false;\n        }\n        if ($node instanceof Expr\\ArrayDimFetch || $node instanceof Expr\\PropertyFetch ||\n            $node instanceof Expr\\NullsafePropertyFetch\n        ) {\n            return $this->newOperandRequiresParens($node->var);\n        }\n        if ($node instanceof Expr\\StaticPropertyFetch) {\n            return $this->newOperandRequiresParens($node->class);\n        }\n        return true;\n    }\n\n    /**\n     * Print modifiers, including trailing whitespace.\n     *\n     * @param int $modifiers Modifier mask to print\n     *\n     * @return string Printed modifiers\n     */\n    protected function pModifiers(int $modifiers): string {\n        return ($modifiers & Modifiers::FINAL ? 'final ' : '')\n             . ($modifiers & Modifiers::ABSTRACT ? 'abstract ' : '')\n             . ($modifiers & Modifiers::PUBLIC ? 'public ' : '')\n             . ($modifiers & Modifiers::PROTECTED ? 'protected ' : '')\n             . ($modifiers & Modifiers::PRIVATE ? 'private ' : '')\n             . ($modifiers & Modifiers::PUBLIC_SET ? 'public(set) ' : '')\n             . ($modifiers & Modifiers::PROTECTED_SET ? 'protected(set) ' : '')\n             . ($modifiers & Modifiers::PRIVATE_SET ? 'private(set) ' : '')\n             . ($modifiers & Modifiers::STATIC ? 'static ' : '')\n             . ($modifiers & Modifiers::READONLY ? 'readonly ' : '');\n    }\n\n    protected function pStatic(bool $static): string {\n        return $static ? 'static ' : '';\n    }\n\n    /**\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     */\n    protected function isMultiline(array $nodes): bool {\n        if (\\count($nodes) < 2) {\n            return false;\n        }\n\n        $pos = -1;\n        foreach ($nodes as $node) {\n            if (null === $node) {\n                continue;\n            }\n\n            $endPos = $node->getEndTokenPos() + 1;\n            if ($pos >= 0) {\n                $text = $this->origTokens->getTokenCode($pos, $endPos, 0);\n                if (false === strpos($text, \"\\n\")) {\n                    // We require that a newline is present between *every* item. If the formatting\n                    // is inconsistent, with only some items having newlines, we don't consider it\n                    // as multiline\n                    return false;\n                }\n            }\n            $pos = $endPos;\n        }\n\n        return true;\n    }\n\n    /**\n     * Lazily initializes label char map.\n     *\n     * The label char map determines whether a certain character may occur in a label.\n     */\n    protected function initializeLabelCharMap(): void {\n        if (isset($this->labelCharMap)) {\n            return;\n        }\n\n        $this->labelCharMap = [];\n        for ($i = 0; $i < 256; $i++) {\n            $chr = chr($i);\n            $this->labelCharMap[$chr] = (bool) preg_match('/^[a-zA-Z0-9_\\x80-\\xff]$/', $chr);\n        }\n\n        if ($this->phpVersion->allowsDelInIdentifiers()) {\n            $this->labelCharMap[\"\\x7f\"] = true;\n        }\n    }\n\n    /**\n     * Lazily initializes node list differ.\n     *\n     * The node list differ is used to determine differences between two array subnodes.\n     */\n    protected function initializeNodeListDiffer(): void {\n        if (isset($this->nodeListDiffer)) {\n            return;\n        }\n\n        $this->nodeListDiffer = new Internal\\Differ(function ($a, $b) {\n            if ($a instanceof Node && $b instanceof Node) {\n                return $a === $b->getAttribute('origNode');\n            }\n            // Can happen for array destructuring\n            return $a === null && $b === null;\n        });\n    }\n\n    /**\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     */\n    protected function initializeFixupMap(): void {\n        if (isset($this->fixupMap)) {\n            return;\n        }\n\n        $this->fixupMap = [\n            Expr\\Instanceof_::class => [\n                'expr' => self::FIXUP_PREC_UNARY,\n                'class' => self::FIXUP_NEW,\n            ],\n            Expr\\Ternary::class => [\n                'cond' => self::FIXUP_PREC_LEFT,\n                'else' => self::FIXUP_PREC_RIGHT,\n            ],\n            Expr\\Yield_::class => ['value' => self::FIXUP_PREC_UNARY],\n\n            Expr\\FuncCall::class => ['name' => self::FIXUP_CALL_LHS],\n            Expr\\StaticCall::class => ['class' => self::FIXUP_STATIC_DEREF_LHS],\n            Expr\\ArrayDimFetch::class => ['var' => self::FIXUP_DEREF_LHS],\n            Expr\\ClassConstFetch::class => [\n                'class' => self::FIXUP_STATIC_DEREF_LHS,\n                'name' => self::FIXUP_BRACED_NAME,\n            ],\n            Expr\\New_::class => ['class' => self::FIXUP_NEW],\n            Expr\\MethodCall::class => [\n                'var' => self::FIXUP_DEREF_LHS,\n                'name' => self::FIXUP_BRACED_NAME,\n            ],\n            Expr\\NullsafeMethodCall::class => [\n                'var' => self::FIXUP_DEREF_LHS,\n                'name' => self::FIXUP_BRACED_NAME,\n            ],\n            Expr\\StaticPropertyFetch::class => [\n                'class' => self::FIXUP_STATIC_DEREF_LHS,\n                'name' => self::FIXUP_VAR_BRACED_NAME,\n            ],\n            Expr\\PropertyFetch::class => [\n                'var' => self::FIXUP_DEREF_LHS,\n                'name' => self::FIXUP_BRACED_NAME,\n            ],\n            Expr\\NullsafePropertyFetch::class => [\n                'var' => self::FIXUP_DEREF_LHS,\n                'name' => self::FIXUP_BRACED_NAME,\n            ],\n            Scalar\\InterpolatedString::class => [\n                'parts' => self::FIXUP_ENCAPSED,\n            ],\n        ];\n\n        $binaryOps = [\n            BinaryOp\\Pow::class, BinaryOp\\Mul::class, BinaryOp\\Div::class, BinaryOp\\Mod::class,\n            BinaryOp\\Plus::class, BinaryOp\\Minus::class, BinaryOp\\Concat::class,\n            BinaryOp\\ShiftLeft::class, BinaryOp\\ShiftRight::class, BinaryOp\\Smaller::class,\n            BinaryOp\\SmallerOrEqual::class, BinaryOp\\Greater::class, BinaryOp\\GreaterOrEqual::class,\n            BinaryOp\\Equal::class, BinaryOp\\NotEqual::class, BinaryOp\\Identical::class,\n            BinaryOp\\NotIdentical::class, BinaryOp\\Spaceship::class, BinaryOp\\BitwiseAnd::class,\n            BinaryOp\\BitwiseXor::class, BinaryOp\\BitwiseOr::class, BinaryOp\\BooleanAnd::class,\n            BinaryOp\\BooleanOr::class, BinaryOp\\Coalesce::class, BinaryOp\\LogicalAnd::class,\n            BinaryOp\\LogicalXor::class, BinaryOp\\LogicalOr::class, BinaryOp\\Pipe::class,\n        ];\n        foreach ($binaryOps as $binaryOp) {\n            $this->fixupMap[$binaryOp] = [\n                'left' => self::FIXUP_PREC_LEFT,\n                'right' => self::FIXUP_PREC_RIGHT\n            ];\n        }\n\n        $prefixOps = [\n            Expr\\Clone_::class, Expr\\BitwiseNot::class, Expr\\BooleanNot::class, Expr\\UnaryPlus::class, Expr\\UnaryMinus::class,\n            Cast\\Int_::class, Cast\\Double::class, Cast\\String_::class, Cast\\Array_::class,\n            Cast\\Object_::class, Cast\\Bool_::class, Cast\\Unset_::class, Expr\\ErrorSuppress::class,\n            Expr\\YieldFrom::class, Expr\\Print_::class, Expr\\Include_::class,\n            Expr\\Assign::class, Expr\\AssignRef::class, AssignOp\\Plus::class, AssignOp\\Minus::class,\n            AssignOp\\Mul::class, AssignOp\\Div::class, AssignOp\\Concat::class, AssignOp\\Mod::class,\n            AssignOp\\BitwiseAnd::class, AssignOp\\BitwiseOr::class, AssignOp\\BitwiseXor::class,\n            AssignOp\\ShiftLeft::class, AssignOp\\ShiftRight::class, AssignOp\\Pow::class, AssignOp\\Coalesce::class,\n            Expr\\ArrowFunction::class, Expr\\Throw_::class,\n        ];\n        foreach ($prefixOps as $prefixOp) {\n            $this->fixupMap[$prefixOp] = ['expr' => self::FIXUP_PREC_UNARY];\n        }\n    }\n\n    /**\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     */\n    protected function initializeRemovalMap(): void {\n        if (isset($this->removalMap)) {\n            return;\n        }\n\n        $stripBoth = ['left' => \\T_WHITESPACE, 'right' => \\T_WHITESPACE];\n        $stripLeft = ['left' => \\T_WHITESPACE];\n        $stripRight = ['right' => \\T_WHITESPACE];\n        $stripDoubleArrow = ['right' => \\T_DOUBLE_ARROW];\n        $stripColon = ['left' => ':'];\n        $stripEquals = ['left' => '='];\n        $this->removalMap = [\n            'Expr_ArrayDimFetch->dim' => $stripBoth,\n            'ArrayItem->key' => $stripDoubleArrow,\n            'Expr_ArrowFunction->returnType' => $stripColon,\n            'Expr_Closure->returnType' => $stripColon,\n            'Expr_Exit->expr' => $stripBoth,\n            'Expr_Ternary->if' => $stripBoth,\n            'Expr_Yield->key' => $stripDoubleArrow,\n            'Expr_Yield->value' => $stripBoth,\n            'Param->type' => $stripRight,\n            'Param->default' => $stripEquals,\n            'Stmt_Break->num' => $stripBoth,\n            'Stmt_Catch->var' => $stripLeft,\n            'Stmt_ClassConst->type' => $stripRight,\n            'Stmt_ClassMethod->returnType' => $stripColon,\n            'Stmt_Class->extends' => ['left' => \\T_EXTENDS],\n            'Stmt_Enum->scalarType' => $stripColon,\n            'Stmt_EnumCase->expr' => $stripEquals,\n            'Expr_PrintableNewAnonClass->extends' => ['left' => \\T_EXTENDS],\n            'Stmt_Continue->num' => $stripBoth,\n            'Stmt_Foreach->keyVar' => $stripDoubleArrow,\n            'Stmt_Function->returnType' => $stripColon,\n            'Stmt_If->else' => $stripLeft,\n            'Stmt_Namespace->name' => $stripLeft,\n            'Stmt_Property->type' => $stripRight,\n            'PropertyItem->default' => $stripEquals,\n            'Stmt_Return->expr' => $stripBoth,\n            'Stmt_StaticVar->default' => $stripEquals,\n            'Stmt_TraitUseAdaptation_Alias->newName' => $stripLeft,\n            'Stmt_TryCatch->finally' => $stripLeft,\n            // 'Stmt_Case->cond': Replace with \"default\"\n            // 'Stmt_Class->name': Unclear what to do\n            // 'Stmt_Declare->stmts': Not a plain node\n            // 'Stmt_TraitUseAdaptation_Alias->newModifier': Not a plain node\n        ];\n    }\n\n    protected function initializeInsertionMap(): void {\n        if (isset($this->insertionMap)) {\n            return;\n        }\n\n        // TODO: \"yield\" where both key and value are inserted doesn't work\n        // [$find, $beforeToken, $extraLeft, $extraRight]\n        $this->insertionMap = [\n            'Expr_ArrayDimFetch->dim' => ['[', false, null, null],\n            'ArrayItem->key' => [null, false, null, ' => '],\n            'Expr_ArrowFunction->returnType' => [')', false, ': ', null],\n            'Expr_Closure->returnType' => [')', false, ': ', null],\n            'Expr_Ternary->if' => ['?', false, ' ', ' '],\n            'Expr_Yield->key' => [\\T_YIELD, false, null, ' => '],\n            'Expr_Yield->value' => [\\T_YIELD, false, ' ', null],\n            'Param->type' => [null, false, null, ' '],\n            'Param->default' => [null, false, ' = ', null],\n            'Stmt_Break->num' => [\\T_BREAK, false, ' ', null],\n            'Stmt_Catch->var' => [null, false, ' ', null],\n            'Stmt_ClassMethod->returnType' => [')', false, ': ', null],\n            'Stmt_ClassConst->type' => [\\T_CONST, false, ' ', null],\n            'Stmt_Class->extends' => [null, false, ' extends ', null],\n            'Stmt_Enum->scalarType' => [null, false, ' : ', null],\n            'Stmt_EnumCase->expr' => [null, false, ' = ', null],\n            'Expr_PrintableNewAnonClass->extends' => [null, false, ' extends ', null],\n            'Stmt_Continue->num' => [\\T_CONTINUE, false, ' ', null],\n            'Stmt_Foreach->keyVar' => [\\T_AS, false, null, ' => '],\n            'Stmt_Function->returnType' => [')', false, ': ', null],\n            'Stmt_If->else' => [null, false, ' ', null],\n            'Stmt_Namespace->name' => [\\T_NAMESPACE, false, ' ', null],\n            'Stmt_Property->type' => [\\T_VARIABLE, true, null, ' '],\n            'PropertyItem->default' => [null, false, ' = ', null],\n            'Stmt_Return->expr' => [\\T_RETURN, false, ' ', null],\n            'Stmt_StaticVar->default' => [null, false, ' = ', null],\n            //'Stmt_TraitUseAdaptation_Alias->newName' => [T_AS, false, ' ', null], // TODO\n            'Stmt_TryCatch->finally' => [null, false, ' ', null],\n\n            // 'Expr_Exit->expr': Complicated due to optional ()\n            // 'Stmt_Case->cond': Conversion from default to case\n            // 'Stmt_Class->name': Unclear\n            // 'Stmt_Declare->stmts': Not a proper node\n            // 'Stmt_TraitUseAdaptation_Alias->newModifier': Not a proper node\n        ];\n    }\n\n    protected function initializeListInsertionMap(): void {\n        if (isset($this->listInsertionMap)) {\n            return;\n        }\n\n        $this->listInsertionMap = [\n            // special\n            //'Expr_ShellExec->parts' => '', // TODO These need to be treated more carefully\n            //'Scalar_InterpolatedString->parts' => '',\n            Stmt\\Catch_::class . '->types' => '|',\n            UnionType::class . '->types' => '|',\n            IntersectionType::class . '->types' => '&',\n            Stmt\\If_::class . '->elseifs' => ' ',\n            Stmt\\TryCatch::class . '->catches' => ' ',\n\n            // comma-separated lists\n            Expr\\Array_::class . '->items' => ', ',\n            Expr\\ArrowFunction::class . '->params' => ', ',\n            Expr\\Closure::class . '->params' => ', ',\n            Expr\\Closure::class . '->uses' => ', ',\n            Expr\\FuncCall::class . '->args' => ', ',\n            Expr\\Isset_::class . '->vars' => ', ',\n            Expr\\List_::class . '->items' => ', ',\n            Expr\\MethodCall::class . '->args' => ', ',\n            Expr\\NullsafeMethodCall::class . '->args' => ', ',\n            Expr\\New_::class . '->args' => ', ',\n            PrintableNewAnonClassNode::class . '->args' => ', ',\n            Expr\\StaticCall::class . '->args' => ', ',\n            Stmt\\ClassConst::class . '->consts' => ', ',\n            Stmt\\ClassMethod::class . '->params' => ', ',\n            Stmt\\Class_::class . '->implements' => ', ',\n            Stmt\\Enum_::class . '->implements' => ', ',\n            PrintableNewAnonClassNode::class . '->implements' => ', ',\n            Stmt\\Const_::class . '->consts' => ', ',\n            Stmt\\Declare_::class . '->declares' => ', ',\n            Stmt\\Echo_::class . '->exprs' => ', ',\n            Stmt\\For_::class . '->init' => ', ',\n            Stmt\\For_::class . '->cond' => ', ',\n            Stmt\\For_::class . '->loop' => ', ',\n            Stmt\\Function_::class . '->params' => ', ',\n            Stmt\\Global_::class . '->vars' => ', ',\n            Stmt\\GroupUse::class . '->uses' => ', ',\n            Stmt\\Interface_::class . '->extends' => ', ',\n            Expr\\Match_::class . '->arms' => ', ',\n            Stmt\\Property::class . '->props' => ', ',\n            Stmt\\StaticVar::class . '->vars' => ', ',\n            Stmt\\TraitUse::class . '->traits' => ', ',\n            Stmt\\TraitUseAdaptation\\Precedence::class . '->insteadof' => ', ',\n            Stmt\\Unset_::class .  '->vars' => ', ',\n            Stmt\\UseUse::class . '->uses' => ', ',\n            MatchArm::class . '->conds' => ', ',\n            AttributeGroup::class . '->attrs' => ', ',\n            PropertyHook::class . '->params' => ', ',\n\n            // statement lists\n            Expr\\Closure::class . '->stmts' => \"\\n\",\n            Stmt\\Case_::class . '->stmts' => \"\\n\",\n            Stmt\\Catch_::class . '->stmts' => \"\\n\",\n            Stmt\\Class_::class . '->stmts' => \"\\n\",\n            Stmt\\Enum_::class . '->stmts' => \"\\n\",\n            PrintableNewAnonClassNode::class . '->stmts' => \"\\n\",\n            Stmt\\Interface_::class . '->stmts' => \"\\n\",\n            Stmt\\Trait_::class . '->stmts' => \"\\n\",\n            Stmt\\ClassMethod::class . '->stmts' => \"\\n\",\n            Stmt\\Declare_::class . '->stmts' => \"\\n\",\n            Stmt\\Do_::class . '->stmts' => \"\\n\",\n            Stmt\\ElseIf_::class . '->stmts' => \"\\n\",\n            Stmt\\Else_::class . '->stmts' => \"\\n\",\n            Stmt\\Finally_::class . '->stmts' => \"\\n\",\n            Stmt\\Foreach_::class . '->stmts' => \"\\n\",\n            Stmt\\For_::class . '->stmts' => \"\\n\",\n            Stmt\\Function_::class . '->stmts' => \"\\n\",\n            Stmt\\If_::class . '->stmts' => \"\\n\",\n            Stmt\\Namespace_::class . '->stmts' => \"\\n\",\n            Stmt\\Block::class . '->stmts' => \"\\n\",\n\n            // Attribute groups\n            Stmt\\Class_::class . '->attrGroups' => \"\\n\",\n            Stmt\\Enum_::class . '->attrGroups' => \"\\n\",\n            Stmt\\EnumCase::class . '->attrGroups' => \"\\n\",\n            Stmt\\Interface_::class . '->attrGroups' => \"\\n\",\n            Stmt\\Trait_::class . '->attrGroups' => \"\\n\",\n            Stmt\\Function_::class . '->attrGroups' => \"\\n\",\n            Stmt\\ClassMethod::class . '->attrGroups' => \"\\n\",\n            Stmt\\ClassConst::class . '->attrGroups' => \"\\n\",\n            Stmt\\Property::class . '->attrGroups' => \"\\n\",\n            PrintableNewAnonClassNode::class . '->attrGroups' => ' ',\n            Expr\\Closure::class . '->attrGroups' => ' ',\n            Expr\\ArrowFunction::class . '->attrGroups' => ' ',\n            Param::class . '->attrGroups' => ' ',\n            PropertyHook::class . '->attrGroups' => ' ',\n\n            Stmt\\Switch_::class . '->cases' => \"\\n\",\n            Stmt\\TraitUse::class . '->adaptations' => \"\\n\",\n            Stmt\\TryCatch::class . '->stmts' => \"\\n\",\n            Stmt\\While_::class . '->stmts' => \"\\n\",\n            PropertyHook::class . '->body' => \"\\n\",\n            Stmt\\Property::class . '->hooks' => \"\\n\",\n            Param::class . '->hooks' => \"\\n\",\n\n            // dummy for top-level context\n            'File->stmts' => \"\\n\",\n        ];\n    }\n\n    protected function initializeEmptyListInsertionMap(): void {\n        if (isset($this->emptyListInsertionMap)) {\n            return;\n        }\n\n        // TODO Insertion into empty statement lists.\n\n        // [$find, $extraLeft, $extraRight]\n        $this->emptyListInsertionMap = [\n            Expr\\ArrowFunction::class . '->params' => ['(', '', ''],\n            Expr\\Closure::class . '->uses' => [')', ' use (', ')'],\n            Expr\\Closure::class . '->params' => ['(', '', ''],\n            Expr\\FuncCall::class . '->args' => ['(', '', ''],\n            Expr\\MethodCall::class . '->args' => ['(', '', ''],\n            Expr\\NullsafeMethodCall::class . '->args' => ['(', '', ''],\n            Expr\\New_::class . '->args' => ['(', '', ''],\n            PrintableNewAnonClassNode::class . '->args' => ['(', '', ''],\n            PrintableNewAnonClassNode::class . '->implements' => [null, ' implements ', ''],\n            Expr\\StaticCall::class . '->args' => ['(', '', ''],\n            Stmt\\Class_::class . '->implements' => [null, ' implements ', ''],\n            Stmt\\Enum_::class . '->implements' => [null, ' implements ', ''],\n            Stmt\\ClassMethod::class . '->params' => ['(', '', ''],\n            Stmt\\Interface_::class . '->extends' => [null, ' extends ', ''],\n            Stmt\\Function_::class . '->params' => ['(', '', ''],\n            Stmt\\Interface_::class . '->attrGroups' => [null, '', \"\\n\"],\n            Stmt\\Class_::class . '->attrGroups' => [null, '', \"\\n\"],\n            Stmt\\ClassConst::class . '->attrGroups' => [null, '', \"\\n\"],\n            Stmt\\ClassMethod::class . '->attrGroups' => [null, '', \"\\n\"],\n            Stmt\\Function_::class . '->attrGroups' => [null, '', \"\\n\"],\n            Stmt\\Property::class . '->attrGroups' => [null, '', \"\\n\"],\n            Stmt\\Trait_::class . '->attrGroups' => [null, '', \"\\n\"],\n            Expr\\ArrowFunction::class . '->attrGroups' => [null, '', ' '],\n            Expr\\Closure::class . '->attrGroups' => [null, '', ' '],\n            Stmt\\Const_::class . '->attrGroups' => [null, '', \"\\n\"],\n            PrintableNewAnonClassNode::class . '->attrGroups' => [\\T_NEW, ' ', ''],\n\n            /* These cannot be empty to start with:\n             * Expr_Isset->vars\n             * Stmt_Catch->types\n             * Stmt_Const->consts\n             * Stmt_ClassConst->consts\n             * Stmt_Declare->declares\n             * Stmt_Echo->exprs\n             * Stmt_Global->vars\n             * Stmt_GroupUse->uses\n             * Stmt_Property->props\n             * Stmt_StaticVar->vars\n             * Stmt_TraitUse->traits\n             * Stmt_TraitUseAdaptation_Precedence->insteadof\n             * Stmt_Unset->vars\n             * Stmt_Use->uses\n             * UnionType->types\n             */\n\n            /* TODO\n             * Stmt_If->elseifs\n             * Stmt_TryCatch->catches\n             * Expr_Array->items\n             * Expr_List->items\n             * Stmt_For->init\n             * Stmt_For->cond\n             * Stmt_For->loop\n             */\n        ];\n    }\n\n    protected function initializeModifierChangeMap(): void {\n        if (isset($this->modifierChangeMap)) {\n            return;\n        }\n\n        $this->modifierChangeMap = [\n            Stmt\\ClassConst::class . '->flags' => ['pModifiers', \\T_WHITESPACE, \\T_CONST],\n            Stmt\\ClassMethod::class . '->flags' => ['pModifiers', \\T_WHITESPACE, \\T_FUNCTION],\n            Stmt\\Class_::class . '->flags' => ['pModifiers', \\T_WHITESPACE, \\T_CLASS],\n            Stmt\\Property::class . '->flags' => ['pModifiers', \\T_WHITESPACE, \\T_VARIABLE],\n            PrintableNewAnonClassNode::class . '->flags' => ['pModifiers', \\T_NEW, \\T_CLASS],\n            Param::class . '->flags' => ['pModifiers', \\T_WHITESPACE, \\T_VARIABLE],\n            PropertyHook::class . '->flags' => ['pModifiers', \\T_WHITESPACE, \\T_STRING],\n            Expr\\Closure::class . '->static' => ['pStatic', \\T_WHITESPACE, \\T_FUNCTION],\n            Expr\\ArrowFunction::class . '->static' => ['pStatic', \\T_WHITESPACE, \\T_FN],\n            //Stmt\\TraitUseAdaptation\\Alias::class . '->newModifier' => 0, // TODO\n        ];\n\n        // List of integer subnodes that are not modifiers:\n        // Expr_Include->type\n        // Stmt_GroupUse->type\n        // Stmt_Use->type\n        // UseItem->type\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/Token.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser;\n\n/**\n * A PHP token. On PHP 8.0 this extends from PhpToken.\n */\nclass Token extends Internal\\TokenPolyfill {\n    /** Get (exclusive) zero-based end position of the token. */\n    public function getEndPos(): int {\n        return $this->pos + \\strlen($this->text);\n    }\n\n    /** Get 1-based end line number of the token. */\n    public function getEndLine(): int {\n        return $this->line + \\substr_count($this->text, \"\\n\");\n    }\n}\n","vendor/nikic/php-parser/lib/PhpParser/compatibility_tokens.php":"<?php declare(strict_types=1);\n\nnamespace PhpParser;\n\nif (!\\function_exists('PhpParser\\defineCompatibilityTokens')) {\n    function defineCompatibilityTokens(): void {\n        $compatTokens = [\n            // PHP 8.0\n            'T_NAME_QUALIFIED',\n            'T_NAME_FULLY_QUALIFIED',\n            'T_NAME_RELATIVE',\n            'T_MATCH',\n            'T_NULLSAFE_OBJECT_OPERATOR',\n            'T_ATTRIBUTE',\n            // PHP 8.1\n            'T_ENUM',\n            'T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG',\n            'T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG',\n            'T_READONLY',\n            // PHP 8.4\n            'T_PROPERTY_C',\n            'T_PUBLIC_SET',\n            'T_PROTECTED_SET',\n            'T_PRIVATE_SET',\n            // PHP 8.5\n            'T_PIPE',\n            'T_VOID_CAST',\n        ];\n\n        // PHP-Parser might be used together with another library that also emulates some or all\n        // of these tokens. Perform a sanity-check that all already defined tokens have been\n        // assigned a unique ID.\n        $usedTokenIds = [];\n        foreach ($compatTokens as $token) {\n            if (\\defined($token)) {\n                $tokenId = \\constant($token);\n                if (!\\is_int($tokenId)) {\n                    throw new \\Error(sprintf(\n                        'Token %s has ID of type %s, should be int. ' .\n                        'You may be using a library with broken token emulation',\n                        $token, \\gettype($tokenId)\n                    ));\n                }\n                $clashingToken = $usedTokenIds[$tokenId] ?? null;\n                if ($clashingToken !== null) {\n                    throw new \\Error(sprintf(\n                        'Token %s has same ID as token %s, ' .\n                        'you may be using a library with broken token emulation',\n                        $token, $clashingToken\n                    ));\n                }\n                $usedTokenIds[$tokenId] = $token;\n            }\n        }\n\n        // Now define any tokens that have not yet been emulated. Try to assign IDs from -1\n        // downwards, but skip any IDs that may already be in use.\n        $newTokenId = -1;\n        foreach ($compatTokens as $token) {\n            if (!\\defined($token)) {\n                while (isset($usedTokenIds[$newTokenId])) {\n                    $newTokenId--;\n                }\n                \\define($token, $newTokenId);\n                $newTokenId--;\n            }\n        }\n    }\n\n    defineCompatibilityTokens();\n}\n","vendor/psr/container/.gitignore":"composer.lock\ncomposer.phar\n/vendor/\n","vendor/psr/container/LICENSE":"The MIT License (MIT)\n\nCopyright (c) 2013-2016 container-interop\nCopyright (c) 2016 PHP Framework Interoperability Group\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","vendor/psr/container/README.md":"Container interface\n==============\n\nThis repository holds all interfaces related to [PSR-11 (Container Interface)][psr-url].\n\nNote that this is not a Container implementation of its own. It is merely abstractions that describe the components of a Dependency Injection Container.\n\nThe installable [package][package-url] and [implementations][implementation-url] are listed on Packagist.\n\n[psr-url]: https://www.php-fig.org/psr/psr-11/\n[package-url]: https://packagist.org/packages/psr/container\n[implementation-url]: https://packagist.org/providers/psr/container-implementation\n\n","vendor/psr/container/composer.json":"{\n    \"name\": \"psr/container\",\n    \"type\": \"library\",\n    \"description\": \"Common Container Interface (PHP FIG PSR-11)\",\n    \"keywords\": [\"psr\", \"psr-11\", \"container\", \"container-interop\", \"container-interface\"],\n    \"homepage\": \"https://github.com/php-fig/container\",\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"PHP-FIG\",\n            \"homepage\": \"https://www.php-fig.org/\"\n        }\n    ],\n    \"require\": {\n        \"php\": \">=7.4.0\"\n    },\n    \"autoload\": {\n        \"psr-4\": {\n            \"Psr\\\\Container\\\\\": \"src/\"\n        }\n    },\n    \"extra\": {\n        \"branch-alias\": {\n            \"dev-master\": \"2.0.x-dev\"\n        }\n    }\n}\n","vendor/psr/container/src/ContainerExceptionInterface.php":"<?php\n\nnamespace Psr\\Container;\n\nuse Throwable;\n\n/**\n * Base interface representing a generic exception in a container.\n */\ninterface ContainerExceptionInterface extends Throwable\n{\n}\n","vendor/psr/container/src/ContainerInterface.php":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Psr\\Container;\n\n/**\n * Describes the interface of a container that exposes methods to read its entries.\n */\ninterface ContainerInterface\n{\n    /**\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     */\n    public function get(string $id);\n\n    /**\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     */\n    public function has(string $id): bool;\n}\n","vendor/psr/container/src/NotFoundExceptionInterface.php":"<?php\n\nnamespace Psr\\Container;\n\n/**\n * No entry was found in the container.\n */\ninterface NotFoundExceptionInterface extends ContainerExceptionInterface\n{\n}\n","vendor/symfony/console/Application.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console;\n\nuse Symfony\\Component\\Console\\Command\\Command;\nuse Symfony\\Component\\Console\\Command\\CompleteCommand;\nuse Symfony\\Component\\Console\\Command\\DumpCompletionCommand;\nuse Symfony\\Component\\Console\\Command\\HelpCommand;\nuse Symfony\\Component\\Console\\Command\\LazyCommand;\nuse Symfony\\Component\\Console\\Command\\ListCommand;\nuse Symfony\\Component\\Console\\CommandLoader\\CommandLoaderInterface;\nuse Symfony\\Component\\Console\\Completion\\CompletionInput;\nuse Symfony\\Component\\Console\\Completion\\CompletionSuggestions;\nuse Symfony\\Component\\Console\\Completion\\Suggestion;\nuse Symfony\\Component\\Console\\Event\\ConsoleAlarmEvent;\nuse Symfony\\Component\\Console\\Event\\ConsoleCommandEvent;\nuse Symfony\\Component\\Console\\Event\\ConsoleErrorEvent;\nuse Symfony\\Component\\Console\\Event\\ConsoleSignalEvent;\nuse Symfony\\Component\\Console\\Event\\ConsoleTerminateEvent;\nuse Symfony\\Component\\Console\\Exception\\CommandNotFoundException;\nuse Symfony\\Component\\Console\\Exception\\ExceptionInterface;\nuse Symfony\\Component\\Console\\Exception\\LogicException;\nuse Symfony\\Component\\Console\\Exception\\NamespaceNotFoundException;\nuse Symfony\\Component\\Console\\Exception\\RuntimeException;\nuse Symfony\\Component\\Console\\Formatter\\OutputFormatter;\nuse Symfony\\Component\\Console\\Helper\\DebugFormatterHelper;\nuse Symfony\\Component\\Console\\Helper\\DescriptorHelper;\nuse Symfony\\Component\\Console\\Helper\\FormatterHelper;\nuse Symfony\\Component\\Console\\Helper\\Helper;\nuse Symfony\\Component\\Console\\Helper\\HelperSet;\nuse Symfony\\Component\\Console\\Helper\\ProcessHelper;\nuse Symfony\\Component\\Console\\Helper\\QuestionHelper;\nuse Symfony\\Component\\Console\\Input\\ArgvInput;\nuse Symfony\\Component\\Console\\Input\\ArrayInput;\nuse Symfony\\Component\\Console\\Input\\InputArgument;\nuse Symfony\\Component\\Console\\Input\\InputAwareInterface;\nuse Symfony\\Component\\Console\\Input\\InputDefinition;\nuse Symfony\\Component\\Console\\Input\\InputInterface;\nuse Symfony\\Component\\Console\\Input\\InputOption;\nuse Symfony\\Component\\Console\\Output\\ConsoleOutput;\nuse Symfony\\Component\\Console\\Output\\ConsoleOutputInterface;\nuse Symfony\\Component\\Console\\Output\\OutputInterface;\nuse Symfony\\Component\\Console\\SignalRegistry\\SignalRegistry;\nuse Symfony\\Component\\Console\\Style\\SymfonyStyle;\nuse Symfony\\Component\\ErrorHandler\\ErrorHandler;\nuse Symfony\\Contracts\\EventDispatcher\\EventDispatcherInterface;\nuse Symfony\\Contracts\\Service\\ResetInterface;\n\n/**\n * An Application is the container for a collection of commands.\n *\n * It is the main entry point of a Console application.\n *\n * This class is optimized for a standard CLI environment.\n *\n * Usage:\n *\n *     $app = new Application('myapp', '1.0 (stable)');\n *     $app->addCommand(new SimpleCommand());\n *     $app->run();\n *\n * @author Fabien Potencier <fabien@symfony.com>\n */\nclass Application implements ResetInterface\n{\n    private array $commands = [];\n    private bool $wantHelps = false;\n    private ?Command $runningCommand = null;\n    private ?CommandLoaderInterface $commandLoader = null;\n    private bool $catchExceptions = true;\n    private bool $catchErrors = false;\n    private bool $autoExit = true;\n    private InputDefinition $definition;\n    private HelperSet $helperSet;\n    private ?EventDispatcherInterface $dispatcher = null;\n    private Terminal $terminal;\n    private string $defaultCommand;\n    private bool $singleCommand = false;\n    private bool $initialized = false;\n    private ?SignalRegistry $signalRegistry = null;\n    private array $signalsToDispatchEvent = [];\n    private ?int $alarmInterval = null;\n\n    public function __construct(\n        private string $name = 'UNKNOWN',\n        private string $version = 'UNKNOWN',\n    ) {\n        $this->terminal = new Terminal();\n        $this->defaultCommand = 'list';\n        if (\\defined('SIGINT') && SignalRegistry::isSupported()) {\n            $this->signalRegistry = new SignalRegistry();\n            $this->signalsToDispatchEvent = [\\SIGINT, \\SIGQUIT, \\SIGTERM, \\SIGUSR1, \\SIGUSR2, \\SIGALRM];\n        }\n    }\n\n    /**\n     * @final\n     */\n    public function setDispatcher(EventDispatcherInterface $dispatcher): void\n    {\n        $this->dispatcher = $dispatcher;\n    }\n\n    public function setCommandLoader(CommandLoaderInterface $commandLoader): void\n    {\n        $this->commandLoader = $commandLoader;\n    }\n\n    public function getSignalRegistry(): SignalRegistry\n    {\n        if (!$this->signalRegistry) {\n            throw new RuntimeException('Signals are not supported. Make sure that the \"pcntl\" extension is installed and that \"pcntl_*\" functions are not disabled by your php.ini\\'s \"disable_functions\" directive.');\n        }\n\n        return $this->signalRegistry;\n    }\n\n    public function setSignalsToDispatchEvent(int ...$signalsToDispatchEvent): void\n    {\n        $this->signalsToDispatchEvent = $signalsToDispatchEvent;\n    }\n\n    /**\n     * Sets the interval to schedule a SIGALRM signal in seconds.\n     */\n    public function setAlarmInterval(?int $seconds): void\n    {\n        $this->alarmInterval = $seconds;\n        $this->scheduleAlarm();\n    }\n\n    /**\n     * Gets the interval in seconds on which a SIGALRM signal is dispatched.\n     */\n    public function getAlarmInterval(): ?int\n    {\n        return $this->alarmInterval;\n    }\n\n    private function scheduleAlarm(): void\n    {\n        if (null !== $this->alarmInterval) {\n            $this->getSignalRegistry()->scheduleAlarm($this->alarmInterval);\n        }\n    }\n\n    /**\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     */\n    public function run(?InputInterface $input = null, ?OutputInterface $output = null): int\n    {\n        if (\\function_exists('putenv')) {\n            @putenv('LINES='.$this->terminal->getHeight());\n            @putenv('COLUMNS='.$this->terminal->getWidth());\n        }\n\n        $input ??= new ArgvInput();\n        $output ??= new ConsoleOutput();\n\n        $renderException = function (\\Throwable $e) use ($output) {\n            if ($output instanceof ConsoleOutputInterface) {\n                $this->renderThrowable($e, $output->getErrorOutput());\n            } else {\n                $this->renderThrowable($e, $output);\n            }\n        };\n        if ($phpHandler = set_exception_handler($renderException)) {\n            restore_exception_handler();\n            if (!\\is_array($phpHandler) || !$phpHandler[0] instanceof ErrorHandler) {\n                $errorHandler = true;\n            } elseif ($errorHandler = $phpHandler[0]->setExceptionHandler($renderException)) {\n                $phpHandler[0]->setExceptionHandler($errorHandler);\n            }\n        }\n\n        $empty = new \\stdClass();\n        $prevShellVerbosity = [$_ENV['SHELL_VERBOSITY'] ?? $empty, $_SERVER['SHELL_VERBOSITY'] ?? $empty, getenv('SHELL_VERBOSITY')];\n\n        try {\n            $this->configureIO($input, $output);\n\n            $exitCode = $this->doRun($input, $output);\n        } catch (\\Throwable $e) {\n            if ($e instanceof \\Exception && !$this->catchExceptions) {\n                throw $e;\n            }\n            if (!$e instanceof \\Exception && !$this->catchErrors) {\n                throw $e;\n            }\n\n            $renderException($e);\n\n            $exitCode = $e->getCode();\n            if (is_numeric($exitCode)) {\n                $exitCode = (int) $exitCode;\n                if ($exitCode <= 0) {\n                    $exitCode = 1;\n                }\n            } else {\n                $exitCode = 1;\n            }\n        } finally {\n            // if the exception handler changed, keep it\n            // otherwise, unregister $renderException\n            if (!$phpHandler) {\n                if (set_exception_handler($renderException) === $renderException) {\n                    restore_exception_handler();\n                }\n                restore_exception_handler();\n            } elseif (!$errorHandler) {\n                $finalHandler = $phpHandler[0]->setExceptionHandler(null);\n                if ($finalHandler !== $renderException) {\n                    $phpHandler[0]->setExceptionHandler($finalHandler);\n                }\n            }\n\n            // SHELL_VERBOSITY is set by Application::configureIO so we need to unset/reset it\n            // to its previous value to avoid one command verbosity to spread to other commands\n            if ($empty === $_ENV['SHELL_VERBOSITY'] = $prevShellVerbosity[0]) {\n                unset($_ENV['SHELL_VERBOSITY']);\n            }\n            if ($empty === $_SERVER['SHELL_VERBOSITY'] = $prevShellVerbosity[1]) {\n                unset($_SERVER['SHELL_VERBOSITY']);\n            }\n            if (\\function_exists('putenv')) {\n                @putenv('SHELL_VERBOSITY'.(false === ($prevShellVerbosity[2] ?? false) ? '' : '='.$prevShellVerbosity[2]));\n            }\n        }\n\n        if ($this->autoExit) {\n            if ($exitCode > 255) {\n                $exitCode = 255;\n            }\n\n            exit($exitCode);\n        }\n\n        return $exitCode;\n    }\n\n    /**\n     * Runs the current application.\n     *\n     * @return int 0 if everything went fine, or an error code\n     */\n    public function doRun(InputInterface $input, OutputInterface $output): int\n    {\n        if ($input->hasParameterOption(['--version', '-V'], true)) {\n            $output->writeln($this->getLongVersion());\n\n            return 0;\n        }\n\n        try {\n            // Makes ArgvInput::getFirstArgument() able to distinguish an option from an argument.\n            $input->bind($this->getDefinition());\n        } catch (ExceptionInterface) {\n            // Errors must be ignored, full binding/validation happens later when the command is known.\n        }\n\n        $name = $this->getCommandName($input);\n        if ($input->hasParameterOption(['--help', '-h'], true)) {\n            if (!$name) {\n                $name = 'help';\n                $input = new ArrayInput(['command_name' => $this->defaultCommand]);\n            } else {\n                $this->wantHelps = true;\n            }\n        }\n\n        if (!$name) {\n            $name = $this->defaultCommand;\n            $definition = $this->getDefinition();\n            $definition->setArguments(array_merge(\n                $definition->getArguments(),\n                [\n                    'command' => new InputArgument('command', InputArgument::OPTIONAL, $definition->getArgument('command')->getDescription(), $name),\n                ]\n            ));\n        }\n\n        try {\n            $this->runningCommand = null;\n            // the command name MUST be the first element of the input\n            $command = $this->find($name);\n        } catch (\\Throwable $e) {\n            if (($e instanceof CommandNotFoundException && !$e instanceof NamespaceNotFoundException) && 1 === \\count($alternatives = $e->getAlternatives()) && $input->isInteractive()) {\n                $alternative = $alternatives[0];\n\n                $style = new SymfonyStyle($input, $output);\n                $output->writeln('');\n                $formattedBlock = (new FormatterHelper())->formatBlock(\\sprintf('Command \"%s\" is not defined.', $name), 'error', true);\n                $output->writeln($formattedBlock);\n                if (!$style->confirm(\\sprintf('Do you want to run \"%s\" instead? ', $alternative), false)) {\n                    if (null !== $this->dispatcher) {\n                        $event = new ConsoleErrorEvent($input, $output, $e);\n                        $this->dispatcher->dispatch($event, ConsoleEvents::ERROR);\n\n                        return $event->getExitCode();\n                    }\n\n                    return 1;\n                }\n\n                $command = $this->find($alternative);\n            } else {\n                if (null !== $this->dispatcher) {\n                    $event = new ConsoleErrorEvent($input, $output, $e);\n                    $this->dispatcher->dispatch($event, ConsoleEvents::ERROR);\n\n                    if (0 === $event->getExitCode()) {\n                        return 0;\n                    }\n\n                    $e = $event->getError();\n                }\n\n                try {\n                    if ($e instanceof CommandNotFoundException && $namespace = $this->findNamespace($name)) {\n                        $helper = new DescriptorHelper();\n                        $helper->describe($output instanceof ConsoleOutputInterface ? $output->getErrorOutput() : $output, $this, [\n                            'format' => 'txt',\n                            'raw_text' => false,\n                            'namespace' => $namespace,\n                            'short' => false,\n                        ]);\n\n                        return isset($event) ? $event->getExitCode() : 1;\n                    }\n\n                    throw $e;\n                } catch (NamespaceNotFoundException) {\n                    throw $e;\n                }\n            }\n        }\n\n        if ($command instanceof LazyCommand) {\n            $command = $command->getCommand();\n        }\n\n        $this->runningCommand = $command;\n        $exitCode = $this->doRunCommand($command, $input, $output);\n        $this->runningCommand = null;\n\n        return $exitCode;\n    }\n\n    public function reset(): void\n    {\n    }\n\n    public function setHelperSet(HelperSet $helperSet): void\n    {\n        $this->helperSet = $helperSet;\n    }\n\n    /**\n     * Get the helper set associated with the command.\n     */\n    public function getHelperSet(): HelperSet\n    {\n        return $this->helperSet ??= $this->getDefaultHelperSet();\n    }\n\n    public function setDefinition(InputDefinition $definition): void\n    {\n        $this->definition = $definition;\n    }\n\n    /**\n     * Gets the InputDefinition related to this Application.\n     */\n    public function getDefinition(): InputDefinition\n    {\n        $this->definition ??= $this->getDefaultInputDefinition();\n\n        if ($this->singleCommand) {\n            $this->definition->setArguments();\n        }\n\n        return $this->definition;\n    }\n\n    /**\n     * Adds suggestions to $suggestions for the current completion input (e.g. option or argument).\n     */\n    public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void\n    {\n        if (\n            CompletionInput::TYPE_ARGUMENT_VALUE === $input->getCompletionType()\n            && 'command' === $input->getCompletionName()\n        ) {\n            foreach ($this->all() as $name => $command) {\n                // skip hidden commands and aliased commands as they already get added below\n                if ($command->isHidden() || $command->getName() !== $name) {\n                    continue;\n                }\n                $suggestions->suggestValue(new Suggestion($command->getName(), $command->getDescription()));\n                foreach ($command->getAliases() as $name) {\n                    $suggestions->suggestValue(new Suggestion($name, $command->getDescription()));\n                }\n            }\n\n            return;\n        }\n\n        if (CompletionInput::TYPE_OPTION_NAME === $input->getCompletionType()) {\n            $suggestions->suggestOptions($this->getDefinition()->getOptions());\n        }\n\n        if (\n            CompletionInput::TYPE_OPTION_VALUE === $input->getCompletionType()\n            && ($definition = $this->getDefinition())->hasOption($input->getCompletionName())\n        ) {\n            $definition->getOption($input->getCompletionName())->complete($input, $suggestions);\n\n            return;\n        }\n    }\n\n    /**\n     * Gets the help message.\n     */\n    public function getHelp(): string\n    {\n        return $this->getLongVersion();\n    }\n\n    /**\n     * Gets whether to catch exceptions or not during commands execution.\n     */\n    public function areExceptionsCaught(): bool\n    {\n        return $this->catchExceptions;\n    }\n\n    /**\n     * Sets whether to catch exceptions or not during commands execution.\n     */\n    public function setCatchExceptions(bool $boolean): void\n    {\n        $this->catchExceptions = $boolean;\n    }\n\n    /**\n     * Sets whether to catch errors or not during commands execution.\n     */\n    public function setCatchErrors(bool $catchErrors = true): void\n    {\n        $this->catchErrors = $catchErrors;\n    }\n\n    /**\n     * Gets whether to automatically exit after a command execution or not.\n     */\n    public function isAutoExitEnabled(): bool\n    {\n        return $this->autoExit;\n    }\n\n    /**\n     * Sets whether to automatically exit after a command execution or not.\n     */\n    public function setAutoExit(bool $boolean): void\n    {\n        $this->autoExit = $boolean;\n    }\n\n    /**\n     * Gets the name of the application.\n     */\n    public function getName(): string\n    {\n        return $this->name;\n    }\n\n    /**\n     * Sets the application name.\n     */\n    public function setName(string $name): void\n    {\n        $this->name = $name;\n    }\n\n    /**\n     * Gets the application version.\n     */\n    public function getVersion(): string\n    {\n        return $this->version;\n    }\n\n    /**\n     * Sets the application version.\n     */\n    public function setVersion(string $version): void\n    {\n        $this->version = $version;\n    }\n\n    /**\n     * Returns the long version of the application.\n     */\n    public function getLongVersion(): string\n    {\n        if ('UNKNOWN' !== $this->getName()) {\n            if ('UNKNOWN' !== $this->getVersion()) {\n                return \\sprintf('%s <info>%s</info>', $this->getName(), $this->getVersion());\n            }\n\n            return $this->getName();\n        }\n\n        return 'Console Tool';\n    }\n\n    /**\n     * Registers a new command.\n     */\n    public function register(string $name): Command\n    {\n        return $this->addCommand(new Command($name));\n    }\n\n    /**\n     * Adds an array of command objects.\n     *\n     * If a Command is not enabled it will not be added.\n     *\n     * @param callable[]|Command[] $commands An array of commands\n     */\n    public function addCommands(array $commands): void\n    {\n        foreach ($commands as $command) {\n            $this->addCommand($command);\n        }\n    }\n\n    /**\n     * @deprecated since Symfony 7.4, use Application::addCommand() instead\n     */\n    public function add(Command $command): ?Command\n    {\n        trigger_deprecation('symfony/console', '7.4', 'The \"%s()\" method is deprecated and will be removed in Symfony 8.0, use \"%s::addCommand()\" instead.', __METHOD__, self::class);\n\n        return $this->addCommand($command);\n    }\n\n    /**\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     */\n    public function addCommand(callable|Command $command): ?Command\n    {\n        $this->init();\n\n        if (!$command instanceof Command) {\n            $command = new Command(null, $command);\n        }\n\n        $command->setApplication($this);\n\n        if (!$command->isEnabled()) {\n            $command->setApplication(null);\n\n            return null;\n        }\n\n        if (!$command instanceof LazyCommand) {\n            // Will throw if the command is not correctly initialized.\n            $command->getDefinition();\n        }\n\n        if (!$command->getName()) {\n            throw new LogicException(\\sprintf('The command defined in \"%s\" cannot have an empty name.', get_debug_type($command)));\n        }\n\n        $this->commands[$command->getName()] = $command;\n\n        foreach ($command->getAliases() as $alias) {\n            $this->commands[$alias] = $command;\n        }\n\n        return $command;\n    }\n\n    /**\n     * Returns a registered command by name or alias.\n     *\n     * @throws CommandNotFoundException When given command name does not exist\n     */\n    public function get(string $name): Command\n    {\n        $this->init();\n\n        if (!$this->has($name)) {\n            throw new CommandNotFoundException(\\sprintf('The command \"%s\" does not exist.', $name));\n        }\n\n        // When the command has a different name than the one used at the command loader level\n        if (!isset($this->commands[$name])) {\n            throw new CommandNotFoundException(\\sprintf('The \"%s\" command cannot be found because it is registered under multiple names. Make sure you don\\'t set a different name via constructor or \"setName()\".', $name));\n        }\n\n        $command = $this->commands[$name];\n\n        if ($this->wantHelps) {\n            $this->wantHelps = false;\n\n            $helpCommand = $this->get('help');\n            $helpCommand->setCommand($command);\n\n            return $helpCommand;\n        }\n\n        return $command;\n    }\n\n    /**\n     * Returns true if the command exists, false otherwise.\n     */\n    public function has(string $name): bool\n    {\n        $this->init();\n\n        return isset($this->commands[$name]) || ($this->commandLoader?->has($name) && $this->addCommand($this->commandLoader->get($name)));\n    }\n\n    /**\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     */\n    public function getNamespaces(): array\n    {\n        $namespaces = [];\n        foreach ($this->all() as $command) {\n            if ($command->isHidden()) {\n                continue;\n            }\n\n            $namespaces[] = $this->extractAllNamespaces($command->getName());\n\n            foreach ($command->getAliases() as $alias) {\n                $namespaces[] = $this->extractAllNamespaces($alias);\n            }\n        }\n\n        return array_values(array_unique(array_filter(array_merge([], ...$namespaces))));\n    }\n\n    /**\n     * Finds a registered namespace by a name or an abbreviation.\n     *\n     * @throws NamespaceNotFoundException When namespace is incorrect or ambiguous\n     */\n    public function findNamespace(string $namespace): string\n    {\n        $allNamespaces = $this->getNamespaces();\n        $expr = implode('[^:]*:', array_map('preg_quote', explode(':', $namespace))).'[^:]*';\n        $namespaces = preg_grep('{^'.$expr.'}', $allNamespaces);\n\n        if (!$namespaces) {\n            $message = \\sprintf('There are no commands defined in the \"%s\" namespace.', $namespace);\n\n            if ($alternatives = $this->findAlternatives($namespace, $allNamespaces)) {\n                if (1 == \\count($alternatives)) {\n                    $message .= \"\\n\\nDid you mean this?\\n    \";\n                } else {\n                    $message .= \"\\n\\nDid you mean one of these?\\n    \";\n                }\n\n                $message .= implode(\"\\n    \", $alternatives);\n            }\n\n            throw new NamespaceNotFoundException($message, $alternatives);\n        }\n\n        $exact = \\in_array($namespace, $namespaces, true);\n        if (\\count($namespaces) > 1 && !$exact) {\n            throw new NamespaceNotFoundException(\\sprintf(\"The namespace \\\"%s\\\" is ambiguous.\\nDid you mean one of these?\\n%s.\", $namespace, $this->getAbbreviationSuggestions(array_values($namespaces))), array_values($namespaces));\n        }\n\n        return $exact ? $namespace : reset($namespaces);\n    }\n\n    /**\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     */\n    public function find(string $name): Command\n    {\n        $this->init();\n\n        $aliases = [];\n\n        foreach ($this->commands as $command) {\n            foreach ($command->getAliases() as $alias) {\n                if (!$this->has($alias)) {\n                    $this->commands[$alias] = $command;\n                }\n            }\n        }\n\n        if ($this->has($name)) {\n            return $this->get($name);\n        }\n\n        $allCommands = $this->commandLoader ? array_merge($this->commandLoader->getNames(), array_keys($this->commands)) : array_keys($this->commands);\n        $expr = implode('[^:]*:', array_map('preg_quote', explode(':', $name))).'[^:]*';\n        $commands = preg_grep('{^'.$expr.'}', $allCommands);\n\n        if (!$commands) {\n            $commands = preg_grep('{^'.$expr.'}i', $allCommands);\n        }\n\n        // if no commands matched or we just matched namespaces\n        if (!$commands || \\count(preg_grep('{^'.$expr.'$}i', $commands)) < 1) {\n            if (false !== $pos = strrpos($name, ':')) {\n                // check if a namespace exists and contains commands\n                $this->findNamespace(substr($name, 0, $pos));\n            }\n\n            $message = \\sprintf('Command \"%s\" is not defined.', $name);\n\n            if ($alternatives = $this->findAlternatives($name, $allCommands)) {\n                $wantHelps = $this->wantHelps;\n                $this->wantHelps = false;\n\n                // remove hidden commands\n                if ($alternatives = array_filter($alternatives, fn ($name) => !$this->get($name)->isHidden())) {\n                    $message .= \\sprintf(\"\\n\\nDid you mean %s?\\n    %s\", 1 === \\count($alternatives) ? 'this' : 'one of these', implode(\"\\n    \", $alternatives));\n                }\n                $this->wantHelps = $wantHelps;\n            }\n\n            throw new CommandNotFoundException($message, array_values($alternatives));\n        }\n\n        // filter out aliases for commands which are already on the list\n        if (\\count($commands) > 1) {\n            $commandList = $this->commandLoader ? array_merge(array_flip($this->commandLoader->getNames()), $this->commands) : $this->commands;\n            $commands = array_unique(array_filter($commands, function ($nameOrAlias) use (&$commandList, $commands, &$aliases) {\n                if (!$commandList[$nameOrAlias] instanceof Command) {\n                    $commandList[$nameOrAlias] = $this->commandLoader->get($nameOrAlias);\n                }\n\n                $commandName = $commandList[$nameOrAlias]->getName();\n\n                $aliases[$nameOrAlias] = $commandName;\n\n                return $commandName === $nameOrAlias || !\\in_array($commandName, $commands, true);\n            }));\n        }\n\n        // check whether all commands left are aliases to the same one\n        if (\\count($commands) > 1) {\n            $uniqueCommands = array_unique(array_map(function ($nameOrAlias) use (&$commandList) {\n                if (!$commandList[$nameOrAlias] instanceof Command) {\n                    $commandList[$nameOrAlias] = $this->commandLoader->get($nameOrAlias);\n                }\n\n                return $commandList[$nameOrAlias]->getName();\n            }, $commands));\n\n            if (1 === \\count($uniqueCommands)) {\n                $commands = [reset($uniqueCommands)];\n            }\n        }\n\n        if (\\count($commands) > 1) {\n            $usableWidth = $this->terminal->getWidth() - 10;\n            $abbrevs = array_values($commands);\n            $maxLen = 0;\n            foreach ($abbrevs as $abbrev) {\n                $maxLen = max(Helper::width($abbrev), $maxLen);\n            }\n            $abbrevs = array_map(static function ($cmd) use ($commandList, $usableWidth, $maxLen, &$commands) {\n                if ($commandList[$cmd]->isHidden()) {\n                    unset($commands[array_search($cmd, $commands)]);\n\n                    return false;\n                }\n\n                $abbrev = str_pad($cmd, $maxLen, ' ').' '.$commandList[$cmd]->getDescription();\n\n                return Helper::width($abbrev) > $usableWidth ? Helper::substr($abbrev, 0, $usableWidth - 3).'...' : $abbrev;\n            }, array_values($commands));\n\n            if (\\count($commands) > 1) {\n                $suggestions = $this->getAbbreviationSuggestions(array_filter($abbrevs));\n\n                throw new CommandNotFoundException(\\sprintf(\"Command \\\"%s\\\" is ambiguous.\\nDid you mean one of these?\\n%s.\", $name, $suggestions), array_values($commands));\n            }\n        }\n\n        $command = $commands ? $this->get(reset($commands)) : null;\n\n        if (!$command || $command->isHidden()) {\n            throw new CommandNotFoundException(\\sprintf('The command \"%s\" does not exist.', $name));\n        }\n\n        return $command;\n    }\n\n    /**\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     */\n    public function all(?string $namespace = null): array\n    {\n        $this->init();\n\n        if (null === $namespace) {\n            if (!$this->commandLoader) {\n                return $this->commands;\n            }\n\n            $commands = $this->commands;\n            foreach ($this->commandLoader->getNames() as $name) {\n                if (!isset($commands[$name]) && $this->has($name)) {\n                    $commands[$name] = $this->get($name);\n                }\n            }\n\n            return $commands;\n        }\n\n        $commands = [];\n        foreach ($this->commands as $name => $command) {\n            if ($namespace === $this->extractNamespace($name, substr_count($namespace, ':') + 1)) {\n                $commands[$name] = $command;\n            }\n        }\n\n        if ($this->commandLoader) {\n            foreach ($this->commandLoader->getNames() as $name) {\n                if (!isset($commands[$name]) && $namespace === $this->extractNamespace($name, substr_count($namespace, ':') + 1) && $this->has($name)) {\n                    $commands[$name] = $this->get($name);\n                }\n            }\n        }\n\n        return $commands;\n    }\n\n    /**\n     * Returns an array of possible abbreviations given a set of names.\n     *\n     * @return string[][]\n     */\n    public static function getAbbreviations(array $names): array\n    {\n        $abbrevs = [];\n        foreach ($names as $name) {\n            for ($len = \\strlen($name); $len > 0; --$len) {\n                $abbrev = substr($name, 0, $len);\n                $abbrevs[$abbrev][] = $name;\n            }\n        }\n\n        return $abbrevs;\n    }\n\n    public function renderThrowable(\\Throwable $e, OutputInterface $output): void\n    {\n        $output->writeln('', OutputInterface::VERBOSITY_QUIET);\n\n        $this->doRenderThrowable($e, $output);\n\n        if (null !== $this->runningCommand) {\n            $output->writeln(\\sprintf('<info>%s</info>', OutputFormatter::escape(\\sprintf($this->runningCommand->getSynopsis(), $this->getName()))), OutputInterface::VERBOSITY_QUIET);\n            $output->writeln('', OutputInterface::VERBOSITY_QUIET);\n        }\n    }\n\n    protected function doRenderThrowable(\\Throwable $e, OutputInterface $output): void\n    {\n        do {\n            $message = trim($e->getMessage());\n            if ('' === $message || OutputInterface::VERBOSITY_VERBOSE <= $output->getVerbosity()) {\n                $class = get_debug_type($e);\n                $title = \\sprintf('  [%s%s]  ', $class, 0 !== ($code = $e->getCode()) ? ' ('.$code.')' : '');\n                $len = Helper::width($title);\n            } else {\n                $len = 0;\n            }\n\n            if (str_contains($message, \"@anonymous\\0\")) {\n                $message = preg_replace_callback('/[a-zA-Z_\\x7f-\\xff][\\\\\\\\a-zA-Z0-9_\\x7f-\\xff]*+@anonymous\\x00.*?\\.php(?:0x?|:[0-9]++\\$)?[0-9a-fA-F]++/', static fn ($m) => class_exists($m[0], false) ? (get_parent_class($m[0]) ?: key(class_implements($m[0])) ?: 'class').'@anonymous' : $m[0], $message);\n            }\n\n            $width = $this->terminal->getWidth() ? $this->terminal->getWidth() - 1 : \\PHP_INT_MAX;\n            $lines = [];\n            foreach ('' !== $message ? preg_split('/\\r?\\n/', $message) : [] as $line) {\n                foreach ($this->splitStringByWidth($line, $width - 4) as $line) {\n                    // pre-format lines to get the right string length\n                    $lineLength = Helper::width($line) + 4;\n                    $lines[] = [$line, $lineLength];\n\n                    $len = max($lineLength, $len);\n                }\n            }\n\n            $messages = [];\n            if (!$e instanceof ExceptionInterface || OutputInterface::VERBOSITY_VERBOSE <= $output->getVerbosity()) {\n                $messages[] = \\sprintf('<comment>%s</comment>', OutputFormatter::escape(\\sprintf('In %s line %s:', basename($e->getFile()) ?: 'n/a', $e->getLine() ?: 'n/a')));\n            }\n            $messages[] = $emptyLine = \\sprintf('<error>%s</error>', str_repeat(' ', $len));\n            if ('' === $message || OutputInterface::VERBOSITY_VERBOSE <= $output->getVerbosity()) {\n                $messages[] = \\sprintf('<error>%s%s</error>', $title, str_repeat(' ', max(0, $len - Helper::width($title))));\n            }\n            foreach ($lines as $line) {\n                $messages[] = \\sprintf('<error>  %s  %s</error>', OutputFormatter::escape($line[0]), str_repeat(' ', $len - $line[1]));\n            }\n            $messages[] = $emptyLine;\n            $messages[] = '';\n\n            $output->writeln($messages, OutputInterface::VERBOSITY_QUIET);\n\n            if (OutputInterface::VERBOSITY_VERBOSE <= $output->getVerbosity()) {\n                $output->writeln('<comment>Exception trace:</comment>', OutputInterface::VERBOSITY_QUIET);\n\n                // exception related properties\n                $trace = $e->getTrace();\n\n                array_unshift($trace, [\n                    'function' => '',\n                    'file' => $e->getFile() ?: 'n/a',\n                    'line' => $e->getLine() ?: 'n/a',\n                    'args' => [],\n                ]);\n\n                for ($i = 0, $count = \\count($trace); $i < $count; ++$i) {\n                    $class = $trace[$i]['class'] ?? '';\n                    $type = $trace[$i]['type'] ?? '';\n                    $function = $trace[$i]['function'] ?? '';\n                    $file = $trace[$i]['file'] ?? 'n/a';\n                    $line = $trace[$i]['line'] ?? 'n/a';\n\n                    $output->writeln(\\sprintf(' %s%s at <info>%s:%s</info>', $class, $function ? $type.$function.'()' : '', $file, $line), OutputInterface::VERBOSITY_QUIET);\n                }\n\n                $output->writeln('', OutputInterface::VERBOSITY_QUIET);\n            }\n        } while ($e = $e->getPrevious());\n    }\n\n    /**\n     * Configures the input and output instances based on the user arguments and options.\n     */\n    protected function configureIO(InputInterface $input, OutputInterface $output): void\n    {\n        if ($input->hasParameterOption(['--ansi'], true)) {\n            $output->setDecorated(true);\n        } elseif ($input->hasParameterOption(['--no-ansi'], true)) {\n            $output->setDecorated(false);\n        }\n\n        $shellVerbosity = match (true) {\n            $input->hasParameterOption(['--silent'], true) => -2,\n            $input->hasParameterOption(['--quiet', '-q'], true) => -1,\n            $input->hasParameterOption('-vvv', true) || $input->hasParameterOption('--verbose=3', true) || 3 === $input->getParameterOption('--verbose', false, true) => 3,\n            $input->hasParameterOption('-vv', true) || $input->hasParameterOption('--verbose=2', true) || 2 === $input->getParameterOption('--verbose', false, true) => 2,\n            $input->hasParameterOption('-v', true) || $input->hasParameterOption('--verbose=1', true) || $input->hasParameterOption('--verbose', true) || $input->getParameterOption('--verbose', false, true) => 1,\n            default => (int) ($_ENV['SHELL_VERBOSITY'] ?? $_SERVER['SHELL_VERBOSITY'] ?? getenv('SHELL_VERBOSITY')),\n        };\n\n        $output->setVerbosity(match ($shellVerbosity) {\n            -2 => OutputInterface::VERBOSITY_SILENT,\n            -1 => OutputInterface::VERBOSITY_QUIET,\n            1 => OutputInterface::VERBOSITY_VERBOSE,\n            2 => OutputInterface::VERBOSITY_VERY_VERBOSE,\n            3 => OutputInterface::VERBOSITY_DEBUG,\n            default => ($shellVerbosity = 0) ?: $output->getVerbosity(),\n        });\n\n        if (0 > $shellVerbosity || $input->hasParameterOption(['--no-interaction', '-n'], true)) {\n            $input->setInteractive(false);\n        }\n\n        if (\\function_exists('putenv')) {\n            @putenv('SHELL_VERBOSITY='.$shellVerbosity);\n        }\n        $_ENV['SHELL_VERBOSITY'] = $shellVerbosity;\n        $_SERVER['SHELL_VERBOSITY'] = $shellVerbosity;\n    }\n\n    /**\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     */\n    protected function doRunCommand(Command $command, InputInterface $input, OutputInterface $output): int\n    {\n        foreach ($command->getHelperSet() as $helper) {\n            if ($helper instanceof InputAwareInterface) {\n                $helper->setInput($input);\n            }\n        }\n\n        $registeredSignals = false;\n        if (($commandSignals = $command->getSubscribedSignals()) || $this->dispatcher && $this->signalsToDispatchEvent) {\n            $signalRegistry = $this->getSignalRegistry();\n\n            $registeredSignals = true;\n            $this->getSignalRegistry()->pushCurrentHandlers();\n\n            if ($this->dispatcher) {\n                // We register application signals, so that we can dispatch the event\n                foreach ($this->signalsToDispatchEvent as $signal) {\n                    $signalEvent = new ConsoleSignalEvent($command, $input, $output, $signal);\n                    $alarmEvent = \\SIGALRM === $signal ? new ConsoleAlarmEvent($command, $input, $output) : null;\n\n                    $signalRegistry->register($signal, function ($signal) use ($signalEvent, $alarmEvent, $command, $commandSignals, $input, $output) {\n                        $this->dispatcher->dispatch($signalEvent, ConsoleEvents::SIGNAL);\n                        $exitCode = $signalEvent->getExitCode();\n\n                        if (null !== $alarmEvent) {\n                            if (false !== $exitCode) {\n                                $alarmEvent->setExitCode($exitCode);\n                            } else {\n                                $alarmEvent->abortExit();\n                            }\n                            $this->dispatcher->dispatch($alarmEvent);\n                            $exitCode = $alarmEvent->getExitCode();\n                        }\n\n                        // If the command is signalable, we call the handleSignal() method\n                        if (\\in_array($signal, $commandSignals, true)) {\n                            $exitCode = $command->handleSignal($signal, $exitCode);\n                        }\n\n                        if (\\SIGALRM === $signal) {\n                            $this->scheduleAlarm();\n                        }\n\n                        if (false !== $exitCode) {\n                            $event = new ConsoleTerminateEvent($command, $input, $output, $exitCode, $signal);\n                            $this->dispatcher->dispatch($event, ConsoleEvents::TERMINATE);\n\n                            exit($event->getExitCode());\n                        }\n                    });\n                }\n\n                // then we register command signals, but not if already handled after the dispatcher\n                $commandSignals = array_diff($commandSignals, $this->signalsToDispatchEvent);\n            }\n\n            foreach ($commandSignals as $signal) {\n                $signalRegistry->register($signal, function (int $signal) use ($command): void {\n                    if (\\SIGALRM === $signal) {\n                        $this->scheduleAlarm();\n                    }\n\n                    if (false !== $exitCode = $command->handleSignal($signal)) {\n                        exit($exitCode);\n                    }\n                });\n            }\n        }\n\n        if (null === $this->dispatcher) {\n            try {\n                return $command->run($input, $output);\n            } finally {\n                if ($registeredSignals) {\n                    $this->getSignalRegistry()->popPreviousHandlers();\n                }\n            }\n        }\n\n        // bind before the console.command event, so the listeners have access to input options/arguments\n        try {\n            $command->mergeApplicationDefinition();\n            $input->bind($command->getDefinition());\n        } catch (ExceptionInterface) {\n            // ignore invalid options/arguments for now, to allow the event listeners to customize the InputDefinition\n        }\n\n        $event = new ConsoleCommandEvent($command, $input, $output);\n        $e = null;\n\n        try {\n            $this->dispatcher->dispatch($event, ConsoleEvents::COMMAND);\n\n            if ($event->commandShouldRun()) {\n                $exitCode = $command->run($input, $output);\n            } else {\n                $exitCode = ConsoleCommandEvent::RETURN_CODE_DISABLED;\n            }\n        } catch (\\Throwable $e) {\n            $event = new ConsoleErrorEvent($input, $output, $e, $command);\n            $this->dispatcher->dispatch($event, ConsoleEvents::ERROR);\n            $e = $event->getError();\n\n            if (0 === $exitCode = $event->getExitCode()) {\n                $e = null;\n            }\n        } finally {\n            if ($registeredSignals) {\n                $this->getSignalRegistry()->popPreviousHandlers();\n            }\n        }\n\n        $event = new ConsoleTerminateEvent($command, $input, $output, $exitCode);\n        $this->dispatcher->dispatch($event, ConsoleEvents::TERMINATE);\n\n        if (null !== $e) {\n            throw $e;\n        }\n\n        return $event->getExitCode();\n    }\n\n    /**\n     * Gets the name of the command based on input.\n     */\n    protected function getCommandName(InputInterface $input): ?string\n    {\n        return $this->singleCommand ? $this->defaultCommand : $input->getFirstArgument();\n    }\n\n    /**\n     * Gets the default input definition.\n     */\n    protected function getDefaultInputDefinition(): InputDefinition\n    {\n        return new InputDefinition([\n            new InputArgument('command', InputArgument::REQUIRED, 'The command to execute'),\n            new InputOption('--help', '-h', InputOption::VALUE_NONE, 'Display help for the given command. When no command is given display help for the <info>'.$this->defaultCommand.'</info> command'),\n            new InputOption('--silent', null, InputOption::VALUE_NONE, 'Do not output any message'),\n            new InputOption('--quiet', '-q', InputOption::VALUE_NONE, 'Only errors are displayed. All other output is suppressed'),\n            new InputOption('--verbose', '-v|vv|vvv', InputOption::VALUE_NONE, 'Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug'),\n            new InputOption('--version', '-V', InputOption::VALUE_NONE, 'Display this application version'),\n            new InputOption('--ansi', '', InputOption::VALUE_NEGATABLE, 'Force (or disable --no-ansi) ANSI output', null),\n            new InputOption('--no-interaction', '-n', InputOption::VALUE_NONE, 'Do not ask any interactive question'),\n        ]);\n    }\n\n    /**\n     * Gets the default commands that should always be available.\n     *\n     * @return Command[]\n     */\n    protected function getDefaultCommands(): array\n    {\n        return [new HelpCommand(), new ListCommand(), new CompleteCommand(), new DumpCompletionCommand()];\n    }\n\n    /**\n     * Gets the default helper set with the helpers that should always be available.\n     */\n    protected function getDefaultHelperSet(): HelperSet\n    {\n        return new HelperSet([\n            new FormatterHelper(),\n            new DebugFormatterHelper(),\n            new ProcessHelper(),\n            new QuestionHelper(),\n        ]);\n    }\n\n    /**\n     * Returns abbreviated suggestions in string format.\n     */\n    private function getAbbreviationSuggestions(array $abbrevs): string\n    {\n        return '    '.implode(\"\\n    \", $abbrevs);\n    }\n\n    /**\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     */\n    public function extractNamespace(string $name, ?int $limit = null): string\n    {\n        $parts = explode(':', $name, -1);\n\n        return implode(':', null === $limit ? $parts : \\array_slice($parts, 0, $limit));\n    }\n\n    /**\n     * Finds alternative of $name among $collection,\n     * if nothing is found in $collection, try in $abbrevs.\n     *\n     * @return string[]\n     */\n    private function findAlternatives(string $name, iterable $collection): array\n    {\n        $threshold = 1e3;\n        $alternatives = [];\n\n        $collectionParts = [];\n        foreach ($collection as $item) {\n            $collectionParts[$item] = explode(':', $item);\n        }\n\n        foreach (explode(':', $name) as $i => $subname) {\n            foreach ($collectionParts as $collectionName => $parts) {\n                $exists = isset($alternatives[$collectionName]);\n                if (!isset($parts[$i]) && $exists) {\n                    $alternatives[$collectionName] += $threshold;\n                    continue;\n                } elseif (!isset($parts[$i])) {\n                    continue;\n                }\n\n                $lev = levenshtein($subname, $parts[$i]);\n                if ($lev <= \\strlen($subname) / 3 || '' !== $subname && str_contains($parts[$i], $subname)) {\n                    $alternatives[$collectionName] = $exists ? $alternatives[$collectionName] + $lev : $lev;\n                } elseif ($exists) {\n                    $alternatives[$collectionName] += $threshold;\n                }\n            }\n        }\n\n        foreach ($collection as $item) {\n            $lev = levenshtein($name, $item);\n            if ($lev <= \\strlen($name) / 3 || str_contains($item, $name)) {\n                $alternatives[$item] = isset($alternatives[$item]) ? $alternatives[$item] - $lev : $lev;\n            }\n        }\n\n        $alternatives = array_filter($alternatives, static fn ($lev) => $lev < 2 * $threshold);\n        ksort($alternatives, \\SORT_NATURAL | \\SORT_FLAG_CASE);\n\n        return array_keys($alternatives);\n    }\n\n    /**\n     * Sets the default Command name.\n     *\n     * @return $this\n     */\n    public function setDefaultCommand(string $commandName, bool $isSingleCommand = false): static\n    {\n        $this->defaultCommand = explode('|', ltrim($commandName, '|'))[0];\n\n        if ($isSingleCommand) {\n            // Ensure the command exist\n            $this->find($commandName);\n\n            $this->singleCommand = true;\n        }\n\n        return $this;\n    }\n\n    /**\n     * @internal\n     */\n    public function isSingleCommand(): bool\n    {\n        return $this->singleCommand;\n    }\n\n    private function splitStringByWidth(string $string, int $width): array\n    {\n        // str_split is not suitable for multi-byte characters, we should use preg_split to get char array properly.\n        // additionally, array_slice() is not enough as some character has doubled width.\n        // we need a function to split string not by character count but by string width\n        if (false === $encoding = mb_detect_encoding($string, null, true)) {\n            return str_split($string, $width);\n        }\n\n        $utf8String = mb_convert_encoding($string, 'utf8', $encoding);\n        $lines = [];\n        $line = '';\n\n        $offset = 0;\n        while (preg_match('/.{1,10000}/u', $utf8String, $m, 0, $offset)) {\n            $offset += \\strlen($m[0]);\n\n            foreach (preg_split('//u', $m[0]) as $char) {\n                // test if $char could be appended to current line\n                if (Helper::width($line.$char) <= $width) {\n                    $line .= $char;\n                    continue;\n                }\n                // if not, push current line to array and make new line\n                $lines[] = str_pad($line, $width);\n                $line = $char;\n            }\n        }\n\n        $lines[] = \\count($lines) ? str_pad($line, $width) : $line;\n\n        return mb_convert_encoding($lines, $encoding, 'utf8');\n    }\n\n    /**\n     * Returns all namespaces of the command name.\n     *\n     * @return string[]\n     */\n    private function extractAllNamespaces(string $name): array\n    {\n        // -1 as third argument is needed to skip the command short name when exploding\n        $parts = explode(':', $name, -1);\n        $namespaces = [];\n\n        foreach ($parts as $part) {\n            if ($namespaces) {\n                $namespaces[] = end($namespaces).':'.$part;\n            } else {\n                $namespaces[] = $part;\n            }\n        }\n\n        return $namespaces;\n    }\n\n    private function init(): void\n    {\n        if ($this->initialized) {\n            return;\n        }\n        $this->initialized = true;\n\n        if ((new \\ReflectionMethod($this, 'add'))->getDeclaringClass()->getName() !== (new \\ReflectionMethod($this, 'addCommand'))->getDeclaringClass()->getName()) {\n            $adder = $this->add(...);\n        } else {\n            $adder = $this->addCommand(...);\n        }\n\n        foreach ($this->getDefaultCommands() as $command) {\n            $adder($command);\n        }\n    }\n}\n","vendor/symfony/console/Attribute/Argument.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Attribute;\n\nuse Symfony\\Component\\Console\\Attribute\\Reflection\\ReflectionMember;\nuse Symfony\\Component\\Console\\Completion\\CompletionInput;\nuse Symfony\\Component\\Console\\Completion\\Suggestion;\nuse Symfony\\Component\\Console\\Exception\\InvalidArgumentException;\nuse Symfony\\Component\\Console\\Exception\\LogicException;\nuse Symfony\\Component\\Console\\Input\\InputArgument;\nuse Symfony\\Component\\Console\\Input\\InputInterface;\nuse Symfony\\Component\\String\\UnicodeString;\n\n#[\\Attribute(\\Attribute::TARGET_PARAMETER | \\Attribute::TARGET_PROPERTY)]\nclass Argument\n{\n    private const ALLOWED_TYPES = ['string', 'bool', 'int', 'float', 'array'];\n\n    private string|bool|int|float|array|null $default = null;\n    private array|\\Closure $suggestedValues;\n    private ?int $mode = null;\n    /**\n     * @var string|class-string<\\BackedEnum>\n     */\n    private string $typeName = '';\n    private ?InteractiveAttributeInterface $interactiveAttribute = null;\n\n    /**\n     * Represents a console command <argument> definition.\n     *\n     * If unset, the `name` value will be inferred from the parameter definition.\n     *\n     * @param array<string|Suggestion>|callable(CompletionInput):list<string|Suggestion> $suggestedValues The values used for input completion\n     */\n    public function __construct(\n        public string $description = '',\n        public string $name = '',\n        array|callable $suggestedValues = [],\n    ) {\n        $this->suggestedValues = \\is_callable($suggestedValues) ? $suggestedValues(...) : $suggestedValues;\n    }\n\n    /**\n     * @internal\n     */\n    public static function tryFrom(\\ReflectionParameter|\\ReflectionProperty $member): ?self\n    {\n        $reflection = new ReflectionMember($member);\n\n        if (!$self = $reflection->getAttribute(self::class)) {\n            return null;\n        }\n\n        $type = $reflection->getType();\n        $name = $reflection->getName();\n\n        if (!$type instanceof \\ReflectionNamedType) {\n            throw new LogicException(\\sprintf('The %s \"$%s\" of \"%s\" must have a named type. Untyped, Union or Intersection types are not supported for command arguments.', $reflection->getMemberName(), $name, $reflection->getSourceName()));\n        }\n\n        $self->typeName = $type->getName();\n        $isBackedEnum = is_subclass_of($self->typeName, \\BackedEnum::class);\n\n        if (!\\in_array($self->typeName, self::ALLOWED_TYPES, true) && !$isBackedEnum) {\n            throw new LogicException(\\sprintf('The type \"%s\" on %s \"$%s\" of \"%s\" is not supported as a command argument. Only \"%s\" types and backed enums are allowed.', $self->typeName, $reflection->getMemberName(), $name, $reflection->getSourceName(), implode('\", \"', self::ALLOWED_TYPES)));\n        }\n\n        if (!$self->name) {\n            $self->name = (new UnicodeString($name))->kebab();\n        }\n\n        $self->default = $reflection->hasDefaultValue() ? $reflection->getDefaultValue() : null;\n\n        $isOptional = $reflection->hasDefaultValue() || $reflection->isNullable();\n        $self->mode = $isOptional ? InputArgument::OPTIONAL : InputArgument::REQUIRED;\n        if ('array' === $self->typeName) {\n            $self->mode |= InputArgument::IS_ARRAY;\n        }\n\n        if (\\is_array($self->suggestedValues) && !\\is_callable($self->suggestedValues) && 2 === \\count($self->suggestedValues) && ($instance = $reflection->getSourceThis()) && $instance::class === $self->suggestedValues[0] && \\is_callable([$instance, $self->suggestedValues[1]])) {\n            // In case that the callback is declared as a static method `[Foo::class, 'methodName']` - yet it is not callable,\n            // while non-static method `[Foo $instance, 'methodName']` would be callable, we transform the callback on the fly into a non-static version.\n            $self->suggestedValues = [$instance, $self->suggestedValues[1]];\n        }\n\n        if ($isBackedEnum && !$self->suggestedValues) {\n            $self->suggestedValues = array_column($self->typeName::cases(), 'value');\n        }\n\n        $self->interactiveAttribute = Ask::tryFrom($member, $self->name);\n\n        if ($self->interactiveAttribute && $isOptional) {\n            throw new LogicException(\\sprintf('The %s \"$%s\" argument of \"%s\" cannot be both interactive and optional.', $reflection->getMemberName(), $self->name, $reflection->getSourceName()));\n        }\n\n        return $self;\n    }\n\n    /**\n     * @internal\n     */\n    public function toInputArgument(): InputArgument\n    {\n        $suggestedValues = \\is_callable($this->suggestedValues) ? ($this->suggestedValues)(...) : $this->suggestedValues;\n\n        return new InputArgument($this->name, $this->mode, $this->description, $this->default, $suggestedValues);\n    }\n\n    /**\n     * @internal\n     */\n    public function resolveValue(InputInterface $input): mixed\n    {\n        $value = $input->getArgument($this->name);\n\n        if (is_subclass_of($this->typeName, \\BackedEnum::class) && (\\is_string($value) || \\is_int($value))) {\n            return $this->typeName::tryFrom($value) ?? throw InvalidArgumentException::fromEnumValue($this->name, $value, $this->suggestedValues);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @internal\n     */\n    public function getInteractiveAttribute(): ?InteractiveAttributeInterface\n    {\n        return $this->interactiveAttribute;\n    }\n\n    /**\n     * @internal\n     */\n    public function isRequired(): bool\n    {\n        return InputArgument::REQUIRED === (InputArgument::REQUIRED & $this->mode);\n    }\n}\n","vendor/symfony/console/Attribute/AsCommand.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Attribute;\n\n/**\n * Service tag to autoconfigure commands.\n *\n * @final since Symfony 7.3\n */\n#[\\Attribute(\\Attribute::TARGET_CLASS)]\nclass AsCommand\n{\n    /**\n     * @param string      $name        The name of the command, used when calling it (i.e. \"cache:clear\")\n     * @param string|null $description The description of the command, displayed with the help page\n     * @param string[]    $aliases     The list of aliases of the command. The command will be executed when using one of them (i.e. \"cache:clean\")\n     * @param bool        $hidden      If true, the command won't be shown when listing all the available commands, but it can still be run as any other command\n     * @param string|null $help        The help content of the command, displayed with the help page\n     * @param string[]    $usages      The list of usage examples, displayed with the help page\n     */\n    public function __construct(\n        public string $name,\n        public ?string $description = null,\n        array $aliases = [],\n        bool $hidden = false,\n        public ?string $help = null,\n        public array $usages = [],\n    ) {\n        if (!$hidden && !$aliases) {\n            return;\n        }\n\n        $name = explode('|', $name);\n        $name = array_merge($name, $aliases);\n\n        if ($hidden && '' !== $name[0]) {\n            array_unshift($name, '');\n        }\n\n        $this->name = implode('|', $name);\n    }\n}\n","vendor/symfony/console/Attribute/Ask.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Attribute;\n\nuse Symfony\\Component\\Console\\Attribute\\Reflection\\ReflectionMember;\nuse Symfony\\Component\\Console\\Exception\\InvalidArgumentException;\nuse Symfony\\Component\\Console\\Exception\\LogicException;\nuse Symfony\\Component\\Console\\Input\\InputInterface;\nuse Symfony\\Component\\Console\\Question\\ConfirmationQuestion;\nuse Symfony\\Component\\Console\\Question\\Question;\nuse Symfony\\Component\\Console\\Style\\SymfonyStyle;\n\n#[\\Attribute(\\Attribute::TARGET_PARAMETER | \\Attribute::TARGET_PROPERTY)]\nclass Ask implements InteractiveAttributeInterface\n{\n    public ?\\Closure $normalizer;\n    public ?\\Closure $validator;\n    private \\Closure $closure;\n\n    /**\n     * @param string                     $question    The question to ask the user\n     * @param string|bool|int|float|null $default     The default answer to return if the user enters nothing\n     * @param bool                       $hidden      Whether the user response must be hidden or not\n     * @param bool                       $multiline   Whether the user response should accept newline characters\n     * @param bool                       $trimmable   Whether the user response must be trimmed or not\n     * @param int|null                   $timeout     The maximum time the user has to answer the question in seconds\n     * @param callable|null              $validator   The validator for the question\n     * @param int|null                   $maxAttempts The maximum number of attempts allowed to answer the question.\n     *                                                Null means an unlimited number of attempts\n     */\n    public function __construct(\n        public string $question,\n        public string|bool|int|float|null $default = null,\n        public bool $hidden = false,\n        public bool $multiline = false,\n        public bool $trimmable = true,\n        public ?int $timeout = null,\n        ?callable $normalizer = null,\n        ?callable $validator = null,\n        public ?int $maxAttempts = null,\n    ) {\n        $this->normalizer = $normalizer ? $normalizer(...) : null;\n        $this->validator = $validator ? $validator(...) : null;\n    }\n\n    /**\n     * @internal\n     */\n    public static function tryFrom(\\ReflectionParameter|\\ReflectionProperty $member, string $name): ?self\n    {\n        $reflection = new ReflectionMember($member);\n\n        if (!$self = $reflection->getAttribute(self::class)) {\n            return null;\n        }\n\n        $type = $reflection->getType();\n\n        if (!$type instanceof \\ReflectionNamedType) {\n            throw new LogicException(\\sprintf('The %s \"$%s\" of \"%s\" must have a named type. Untyped, Union or Intersection types are not supported for interactive questions.', $reflection->getMemberName(), $name, $reflection->getSourceName()));\n        }\n\n        if ('array' === $type->getName() && null !== $self->default) {\n            throw new LogicException(\\sprintf('The \"%s::$default\" value is not supported for the array \"$%s\" of \"%s\", because an empty answer ends the collection.', self::class, $name, $reflection->getSourceName()));\n        }\n\n        $self->closure = function (SymfonyStyle $io, InputInterface $input) use ($self, $reflection, $name, $type) {\n            if ($reflection->isProperty() && isset($this->{$reflection->getName()})) {\n                return;\n            }\n\n            if ($reflection->isParameter() && !\\in_array($input->getArgument($name), [null, []], true)) {\n                return;\n            }\n\n            if ('bool' === $type->getName()) {\n                $self->default ??= false;\n\n                if (!\\is_bool($self->default)) {\n                    throw new LogicException(\\sprintf('The \"%s::$default\" value for the %s \"$%s\" of \"%s\" must be a boolean.', self::class, $reflection->getMemberName(), $name, $reflection->getSourceName()));\n                }\n\n                $question = new ConfirmationQuestion($self->question, $self->default);\n            } else {\n                $question = new Question($self->question, $self->default);\n            }\n            $question->setHidden($self->hidden);\n            $question->setMultiline($self->multiline);\n            $question->setTrimmable($self->trimmable);\n            $question->setTimeout($self->timeout);\n\n            if (!$self->validator && $reflection->isProperty() && 'array' !== $type->getName()) {\n                $self->validator = fn (mixed $value): mixed => $this->{$reflection->getName()} = $value;\n            }\n\n            $question->setValidator($self->validator);\n            $question->setMaxAttempts($self->maxAttempts);\n\n            if ($self->normalizer) {\n                $question->setNormalizer($self->normalizer);\n            } elseif (is_subclass_of($type->getName(), \\BackedEnum::class)) {\n                /** @var class-string<\\BackedEnum> $backedType */\n                $backedType = $reflection->getType()->getName();\n                $question->setNormalizer(static fn (string|int $value) => $backedType::tryFrom($value) ?? throw InvalidArgumentException::fromEnumValue($reflection->getName(), $value, array_column($backedType::cases(), 'value')));\n            }\n\n            if ('array' === $type->getName()) {\n                $value = [];\n                while (null !== $v = $io->askQuestion($question)) {\n                    if ($question->isTrimmable()) {\n                        $v = trim($v);\n                    }\n                    if (\"\\x4\" === $v || \\PHP_EOL === $v || '' === $v) {\n                        break;\n                    }\n                    $value[] = $v;\n                }\n            } else {\n                $value = $io->askQuestion($question);\n            }\n\n            if (null === $value && !$reflection->isNullable()) {\n                return;\n            }\n\n            if ($reflection->isProperty()) {\n                $this->{$reflection->getName()} = $value;\n            } else {\n                $input->setArgument($name, $value);\n            }\n        };\n\n        return $self;\n    }\n\n    /**\n     * @internal\n     */\n    public function getFunction(object $instance): \\ReflectionFunction\n    {\n        return new \\ReflectionFunction($this->closure->bindTo($instance, $instance::class));\n    }\n}\n","vendor/symfony/console/Attribute/Interact.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Attribute;\n\nuse Symfony\\Component\\Console\\Exception\\LogicException;\n\n#[\\Attribute(\\Attribute::TARGET_METHOD)]\nclass Interact implements InteractiveAttributeInterface\n{\n    private \\ReflectionMethod $method;\n\n    /**\n     * @internal\n     */\n    public static function tryFrom(\\ReflectionMethod $method): ?self\n    {\n        /** @var self|null $self */\n        if (!$self = ($method->getAttributes(self::class)[0] ?? null)?->newInstance()) {\n            return null;\n        }\n\n        if (!$method->isPublic() || $method->isStatic()) {\n            throw new LogicException(\\sprintf('The interactive method \"%s::%s()\" must be public and non-static.', $method->getDeclaringClass()->getName(), $method->getName()));\n        }\n\n        if ('__invoke' === $method->getName()) {\n            throw new LogicException(\\sprintf('The \"%s::__invoke()\" method cannot be used as an interactive method.', $method->getDeclaringClass()->getName()));\n        }\n\n        $self->method = $method;\n\n        return $self;\n    }\n\n    /**\n     * @internal\n     */\n    public function getFunction(object $instance): \\ReflectionFunction\n    {\n        return new \\ReflectionFunction($this->method->getClosure($instance));\n    }\n}\n","vendor/symfony/console/Attribute/InteractiveAttributeInterface.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Attribute;\n\n/**\n * @internal\n */\ninterface InteractiveAttributeInterface\n{\n    public function getFunction(object $instance): \\ReflectionFunction;\n}\n","vendor/symfony/console/Attribute/MapInput.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Attribute;\n\nuse Symfony\\Component\\Console\\Attribute\\Reflection\\ReflectionMember;\nuse Symfony\\Component\\Console\\Exception\\LogicException;\nuse Symfony\\Component\\Console\\Input\\InputInterface;\nuse Symfony\\Component\\Console\\Interaction\\Interaction;\n\n/**\n * Maps a command input into an object (DTO).\n */\n#[\\Attribute(\\Attribute::TARGET_PARAMETER | \\Attribute::TARGET_PROPERTY)]\nfinal class MapInput\n{\n    /**\n     * @var array<string, Argument|Option|self>\n     */\n    private array $definition = [];\n\n    private \\ReflectionClass $class;\n\n    /**\n     * @var list<Interact>\n     */\n    private array $interactiveAttributes = [];\n\n    /**\n     * @internal\n     */\n    public static function tryFrom(\\ReflectionParameter|\\ReflectionProperty $member): ?self\n    {\n        $reflection = new ReflectionMember($member);\n\n        if (!$self = $reflection->getAttribute(self::class)) {\n            return null;\n        }\n\n        $type = $reflection->getType();\n\n        if (!$type instanceof \\ReflectionNamedType) {\n            throw new LogicException(\\sprintf('The input %s \"%s\" must have a named type.', $reflection->getMemberName(), $member->name));\n        }\n\n        if (!class_exists($class = $type->getName())) {\n            throw new LogicException(\\sprintf('The input class \"%s\" does not exist.', $type->getName()));\n        }\n\n        $self->class = new \\ReflectionClass($class);\n\n        foreach ($self->class->getProperties() as $property) {\n            if ($argument = Argument::tryFrom($property)) {\n                $self->definition[$property->name] = $argument;\n            } elseif ($option = Option::tryFrom($property)) {\n                $self->definition[$property->name] = $option;\n            } elseif ($input = self::tryFrom($property)) {\n                $self->definition[$property->name] = $input;\n            }\n\n            if (isset($self->definition[$property->name]) && (!$property->isPublic() || $property->isStatic())) {\n                throw new LogicException(\\sprintf('The input property \"%s::$%s\" must be public and non-static.', $self->class->name, $property->name));\n            }\n        }\n\n        if (!$self->definition) {\n            throw new LogicException(\\sprintf('The input class \"%s\" must have at least one argument or option.', $self->class->name));\n        }\n\n        foreach ($self->class->getMethods() as $method) {\n            if ($attribute = Interact::tryFrom($method)) {\n                $self->interactiveAttributes[] = $attribute;\n            }\n        }\n\n        return $self;\n    }\n\n    /**\n     * @internal\n     */\n    public function resolveValue(InputInterface $input): object\n    {\n        $instance = $this->class->newInstanceWithoutConstructor();\n\n        foreach ($this->definition as $name => $spec) {\n            // ignore required arguments that are not set yet (may happen in interactive mode)\n            if ($spec instanceof Argument && $spec->isRequired() && \\in_array($input->getArgument($spec->name), [null, []], true)) {\n                continue;\n            }\n\n            $instance->$name = $spec->resolveValue($input);\n        }\n\n        return $instance;\n    }\n\n    /**\n     * @internal\n     */\n    public function setValue(InputInterface $input, object $object): void\n    {\n        foreach ($this->definition as $name => $spec) {\n            $property = $this->class->getProperty($name);\n\n            if (!$property->isInitialized($object) || \\in_array($value = $property->getValue($object), [null, []], true)) {\n                continue;\n            }\n\n            match (true) {\n                $spec instanceof Argument => $input->setArgument($spec->name, $value),\n                $spec instanceof Option => $input->setOption($spec->name, $value),\n                $spec instanceof self => $spec->setValue($input, $value),\n                default => throw new LogicException('Unexpected specification type.'),\n            };\n        }\n    }\n\n    /**\n     * @return iterable<Argument>\n     */\n    public function getArguments(): iterable\n    {\n        foreach ($this->definition as $spec) {\n            if ($spec instanceof Argument) {\n                yield $spec;\n            } elseif ($spec instanceof self) {\n                yield from $spec->getArguments();\n            }\n        }\n    }\n\n    /**\n     * @return iterable<Option>\n     */\n    public function getOptions(): iterable\n    {\n        foreach ($this->definition as $spec) {\n            if ($spec instanceof Option) {\n                yield $spec;\n            } elseif ($spec instanceof self) {\n                yield from $spec->getOptions();\n            }\n        }\n    }\n\n    /**\n     * @internal\n     *\n     * @return iterable<Interaction>\n     */\n    public function getPropertyInteractions(): iterable\n    {\n        foreach ($this->definition as $spec) {\n            if ($spec instanceof self) {\n                yield from $spec->getPropertyInteractions();\n            } elseif ($spec instanceof Argument && $attribute = $spec->getInteractiveAttribute()) {\n                yield new Interaction($this, $attribute);\n            }\n        }\n    }\n\n    /**\n     * @internal\n     *\n     * @return iterable<Interaction>\n     */\n    public function getMethodInteractions(): iterable\n    {\n        foreach ($this->definition as $spec) {\n            if ($spec instanceof self) {\n                yield from $spec->getMethodInteractions();\n            }\n        }\n\n        foreach ($this->interactiveAttributes as $attribute) {\n            yield new Interaction($this, $attribute);\n        }\n    }\n}\n","vendor/symfony/console/Attribute/Option.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Attribute;\n\nuse Symfony\\Component\\Console\\Attribute\\Reflection\\ReflectionMember;\nuse Symfony\\Component\\Console\\Completion\\CompletionInput;\nuse Symfony\\Component\\Console\\Completion\\Suggestion;\nuse Symfony\\Component\\Console\\Exception\\InvalidOptionException;\nuse Symfony\\Component\\Console\\Exception\\LogicException;\nuse Symfony\\Component\\Console\\Input\\InputInterface;\nuse Symfony\\Component\\Console\\Input\\InputOption;\nuse Symfony\\Component\\String\\UnicodeString;\n\n#[\\Attribute(\\Attribute::TARGET_PARAMETER | \\Attribute::TARGET_PROPERTY)]\nclass Option\n{\n    private const ALLOWED_TYPES = ['string', 'bool', 'int', 'float', 'array'];\n    private const ALLOWED_UNION_TYPES = ['bool|string', 'bool|int', 'bool|float'];\n\n    private string|bool|int|float|array|null $default = null;\n    private array|\\Closure $suggestedValues;\n    private ?int $mode = null;\n    /**\n     * @var string|class-string<\\BackedEnum>\n     */\n    private string $typeName = '';\n    private bool $allowNull = false;\n    private string $memberName = '';\n    private string $sourceName = '';\n\n    /**\n     * Represents a console command --option definition.\n     *\n     * If unset, the `name` value will be inferred from the parameter definition.\n     *\n     * @param array|string|null                                                          $shortcut        The shortcuts, can be null, a string of shortcuts delimited by | or an array of shortcuts\n     * @param array<string|Suggestion>|callable(CompletionInput):list<string|Suggestion> $suggestedValues The values used for input completion\n     */\n    public function __construct(\n        public string $description = '',\n        public string $name = '',\n        public array|string|null $shortcut = null,\n        array|callable $suggestedValues = [],\n    ) {\n        $this->suggestedValues = \\is_callable($suggestedValues) ? $suggestedValues(...) : $suggestedValues;\n    }\n\n    /**\n     * @internal\n     */\n    public static function tryFrom(\\ReflectionParameter|\\ReflectionProperty $member): ?self\n    {\n        $reflection = new ReflectionMember($member);\n\n        if (!$self = $reflection->getAttribute(self::class)) {\n            return null;\n        }\n\n        $self->memberName = $reflection->getMemberName();\n        $self->sourceName = $reflection->getSourceName();\n\n        $name = $reflection->getName();\n        $type = $reflection->getType();\n\n        if (!$reflection->hasDefaultValue()) {\n            throw new LogicException(\\sprintf('The option %s \"$%s\" of \"%s\" must declare a default value.', $self->memberName, $name, $self->sourceName));\n        }\n\n        if (!$self->name) {\n            $self->name = (new UnicodeString($name))->kebab();\n        }\n\n        $self->default = $reflection->getDefaultValue();\n        $self->allowNull = $reflection->isNullable();\n\n        if ($type instanceof \\ReflectionUnionType) {\n            return $self->handleUnion($type);\n        }\n\n        if (!$type instanceof \\ReflectionNamedType) {\n            throw new LogicException(\\sprintf('The %s \"$%s\" of \"%s\" must have a named type. Untyped or Intersection types are not supported for command options.', $self->memberName, $name, $self->sourceName));\n        }\n\n        $self->typeName = $type->getName();\n        $isBackedEnum = is_subclass_of($self->typeName, \\BackedEnum::class);\n\n        if (!\\in_array($self->typeName, self::ALLOWED_TYPES, true) && !$isBackedEnum) {\n            throw new LogicException(\\sprintf('The type \"%s\" on %s \"$%s\" of \"%s\" is not supported as a command option. Only \"%s\" types and BackedEnum are allowed.', $self->typeName, $self->memberName, $name, $self->sourceName, implode('\", \"', self::ALLOWED_TYPES)));\n        }\n\n        if ('bool' === $self->typeName && $self->allowNull && \\in_array($self->default, [true, false], true)) {\n            throw new LogicException(\\sprintf('The option %s \"$%s\" of \"%s\" must not be nullable when it has a default boolean value.', $self->memberName, $name, $self->sourceName));\n        }\n\n        if ($self->allowNull && null !== $self->default) {\n            throw new LogicException(\\sprintf('The option %s \"$%s\" of \"%s\" must either be not-nullable or have a default of null.', $self->memberName, $name, $self->sourceName));\n        }\n\n        if ('bool' === $self->typeName) {\n            $self->mode = InputOption::VALUE_NONE;\n            if (false !== $self->default) {\n                $self->mode |= InputOption::VALUE_NEGATABLE;\n            }\n        } elseif ('array' === $self->typeName) {\n            $self->mode = InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY;\n        } else {\n            $self->mode = InputOption::VALUE_REQUIRED;\n        }\n\n        if (\\is_array($self->suggestedValues) && !\\is_callable($self->suggestedValues) && 2 === \\count($self->suggestedValues) && ($instance = $reflection->getSourceThis()) && $instance::class === $self->suggestedValues[0] && \\is_callable([$instance, $self->suggestedValues[1]])) {\n            $self->suggestedValues = [$instance, $self->suggestedValues[1]];\n        }\n\n        if ($isBackedEnum && !$self->suggestedValues) {\n            $self->suggestedValues = array_column($self->typeName::cases(), 'value');\n        }\n\n        return $self;\n    }\n\n    /**\n     * @internal\n     */\n    public function toInputOption(): InputOption\n    {\n        $default = InputOption::VALUE_NONE === (InputOption::VALUE_NONE & $this->mode) ? null : $this->default;\n        $suggestedValues = \\is_callable($this->suggestedValues) ? ($this->suggestedValues)(...) : $this->suggestedValues;\n\n        return new InputOption($this->name, $this->shortcut, $this->mode, $this->description, $default, $suggestedValues);\n    }\n\n    /**\n     * @internal\n     */\n    public function resolveValue(InputInterface $input): mixed\n    {\n        $value = $input->getOption($this->name);\n\n        if (null === $value && \\in_array($this->typeName, self::ALLOWED_UNION_TYPES, true)) {\n            return true;\n        }\n\n        if (is_subclass_of($this->typeName, \\BackedEnum::class) && (\\is_string($value) || \\is_int($value))) {\n            return $this->typeName::tryFrom($value) ?? throw InvalidOptionException::fromEnumValue($this->name, $value, $this->suggestedValues);\n        }\n\n        if ('array' === $this->typeName && $this->allowNull && [] === $value) {\n            return null;\n        }\n\n        if ('bool' !== $this->typeName) {\n            return $value;\n        }\n\n        if ($this->allowNull && null === $value) {\n            return null;\n        }\n\n        return $value ?? $this->default;\n    }\n\n    private function handleUnion(\\ReflectionUnionType $type): self\n    {\n        $types = array_map(\n            static fn (\\ReflectionType $t) => $t instanceof \\ReflectionNamedType ? $t->getName() : null,\n            $type->getTypes(),\n        );\n\n        sort($types);\n\n        $this->typeName = implode('|', array_filter($types));\n\n        if (!\\in_array($this->typeName, self::ALLOWED_UNION_TYPES, true)) {\n            throw new LogicException(\\sprintf('The union type for %s \"$%s\" of \"%s\" is not supported as a command option. Only \"%s\" types are allowed.', $this->memberName, $this->name, $this->sourceName, implode('\", \"', self::ALLOWED_UNION_TYPES)));\n        }\n\n        if (false !== $this->default) {\n            throw new LogicException(\\sprintf('The option %s \"$%s\" of \"%s\" must have a default value of false.', $this->memberName, $this->name, $this->sourceName));\n        }\n\n        $this->mode = InputOption::VALUE_OPTIONAL;\n\n        return $this;\n    }\n}\n","vendor/symfony/console/Attribute/Reflection/ReflectionMember.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Attribute\\Reflection;\n\n/**\n * @internal\n */\nclass ReflectionMember\n{\n    public function __construct(\n        private readonly \\ReflectionParameter|\\ReflectionProperty $member,\n    ) {\n    }\n\n    /**\n     * @template T of object\n     *\n     * @param class-string<T> $class\n     *\n     * @return T|null\n     */\n    public function getAttribute(string $class): ?object\n    {\n        return ($this->member->getAttributes($class, \\ReflectionAttribute::IS_INSTANCEOF)[0] ?? null)?->newInstance();\n    }\n\n    public function getSourceName(): string\n    {\n        if ($this->member instanceof \\ReflectionProperty) {\n            return $this->member->getDeclaringClass()->name;\n        }\n\n        $function = $this->member->getDeclaringFunction();\n\n        if ($function instanceof \\ReflectionMethod) {\n            return $function->class.'::'.$function->name.'()';\n        }\n\n        return $function->name.'()';\n    }\n\n    public function getSourceThis(): ?object\n    {\n        if ($this->member instanceof \\ReflectionParameter) {\n            return $this->member->getDeclaringFunction()->getClosureThis();\n        }\n\n        return null;\n    }\n\n    public function getType(): ?\\ReflectionType\n    {\n        return $this->member->getType();\n    }\n\n    public function getName(): string\n    {\n        return $this->member->getName();\n    }\n\n    public function hasDefaultValue(): bool\n    {\n        if ($this->member instanceof \\ReflectionParameter) {\n            return $this->member->isDefaultValueAvailable();\n        }\n\n        return $this->member->hasDefaultValue();\n    }\n\n    public function getDefaultValue(): mixed\n    {\n        $defaultValue = $this->member->getDefaultValue();\n\n        if ($defaultValue instanceof \\BackedEnum) {\n            return $defaultValue->value;\n        }\n\n        return $defaultValue;\n    }\n\n    public function isNullable(): bool\n    {\n        return (bool) $this->member->getType()?->allowsNull();\n    }\n\n    public function getMemberName(): string\n    {\n        return $this->member instanceof \\ReflectionParameter ? 'parameter' : 'property';\n    }\n\n    public function isParameter(): bool\n    {\n        return $this->member instanceof \\ReflectionParameter;\n    }\n\n    public function isProperty(): bool\n    {\n        return $this->member instanceof \\ReflectionProperty;\n    }\n}\n","vendor/symfony/console/CHANGELOG.md":"CHANGELOG\n=========\n\n7.4\n---\n\n * Add `Command::getCode()` to get the code set via `setCode()`\n * Allow setting aliases and the hidden flag via the command name passed to the constructor\n * Introduce `Symfony\\Component\\Console\\Application::addCommand()` to simplify using invokable commands when the component is used standalone\n * Deprecate `Symfony\\Component\\Console\\Application::add()` in favor of `Symfony\\Component\\Console\\Application::addCommand()`\n * Add `BackedEnum` support with `#[Argument]` and `#[Option]` inputs in invokable commands\n * Allow Usages to be specified via `#[AsCommand]` attribute.\n * Allow passing invokable commands to `Symfony\\Component\\Console\\Tester\\CommandTester`\n * Add `#[MapInput]` attribute to support DTOs in commands\n * Add optional timeout for interaction in `QuestionHelper`\n * Add support for interactive invokable commands with `#[Interact]` and `#[Ask]` attributes\n * Add support for `Cursor` helper in invokable commands\n\n7.3\n---\n\n * Add `TreeHelper` and `TreeStyle` to display tree-like structures\n * Add `SymfonyStyle::createTree()`\n * Add support for invokable commands and add `#[Argument]` and `#[Option]` attributes to define input arguments and options\n * Deprecate not declaring the parameter type in callable commands defined through `setCode` method\n * Add support for help definition via `AsCommand` attribute\n * Deprecate methods `Command::getDefaultName()` and `Command::getDefaultDescription()` in favor of the `#[AsCommand]` attribute\n * Add support for Markdown format in `Table`\n * Add support for `LockableTrait` in invokable commands\n * Deprecate returning a non-integer value from a `\\Closure` function set via `Command::setCode()`\n * Mark `#[AsCommand]` attribute as `@final`\n * Add support for `SignalableCommandInterface` with invokable commands\n\n7.2\n---\n\n * Add support for `FORCE_COLOR` environment variable\n * Add `verbosity` argument to `mustRun` process helper method\n * [BC BREAK] Add silent verbosity (`--silent`/`SHELL_VERBOSITY=-2`) to suppress all output, including errors\n * Add `OutputInterface::isSilent()`, `Output::isSilent()`, `OutputStyle::isSilent()` methods\n * Add a configurable finished indicator to the progress indicator to show that the progress is finished\n * Add ability to schedule alarm signals and a `ConsoleAlarmEvent`\n\n7.1\n---\n\n * Add `ArgvInput::getRawTokens()`\n\n7.0\n---\n\n * Add method `__toString()` to `InputInterface`\n * Remove `Command::$defaultName` and `Command::$defaultDescription`, use the `AsCommand` attribute instead\n * Require explicit argument when calling `*Command::setApplication()`, `*FormatterStyle::setForeground/setBackground()`, `Helper::setHelpSet()`, `Input*::setDefault()` and `Question::setAutocompleterCallback/setValidator()`\n * Remove `StringInput::REGEX_STRING`\n\n6.4\n---\n\n * Add `SignalMap` to map signal value to its name\n * Multi-line text in vertical tables is aligned properly\n * The application can also catch errors with `Application::setCatchErrors(true)`\n * Add `RunCommandMessage` and `RunCommandMessageHandler`\n * Dispatch `ConsoleTerminateEvent` after an exit on signal handling and add `ConsoleTerminateEvent::getInterruptingSignal()`\n\n6.3\n---\n\n * Add support for choosing exit code while handling signal, or to not exit at all\n * Add `ProgressBar::setPlaceholderFormatter` to set a placeholder attached to a instance, instead of being global.\n * Add `ReStructuredTextDescriptor`\n\n6.2\n---\n\n * Improve truecolor terminal detection in some cases\n * Add support for 256 color terminals (conversion from Ansi24 to Ansi8 if terminal is capable of it)\n * Deprecate calling `*Command::setApplication()`, `*FormatterStyle::setForeground/setBackground()`, `Helper::setHelpSet()`, `Input*::setDefault()`, `Question::setAutocompleterCallback/setValidator()`without any arguments\n * Change the signature of `OutputFormatterStyleInterface::setForeground/setBackground()` to `setForeground/setBackground(?string)`\n * Change the signature of `HelperInterface::setHelperSet()` to `setHelperSet(?HelperSet)`\n\n6.1\n---\n\n * Add support to display table vertically when calling setVertical()\n * Add method `__toString()` to `InputInterface`\n * Added `OutputWrapper` to prevent truncated URL in `SymfonyStyle::createBlock`.\n * Deprecate `Command::$defaultName` and `Command::$defaultDescription`, use the `AsCommand` attribute instead\n * Add suggested values for arguments and options in input definition, for input completion\n * Add `$resumeAt` parameter to `ProgressBar#start()`, so that one can easily 'resume' progress on longer tasks, and still get accurate `getEstimate()` and `getRemaining()` results.\n\n6.0\n---\n\n * `Command::setHidden()` has a default value (`true`) for `$hidden` parameter and is final\n * Remove `Helper::strlen()`, use `Helper::width()` instead\n * Remove `Helper::strlenWithoutDecoration()`, use `Helper::removeDecoration()` instead\n * `AddConsoleCommandPass` can not be configured anymore\n * Remove `HelperSet::setCommand()` and `getCommand()` without replacement\n\n5.4\n---\n\n * Add `TesterTrait::assertCommandIsSuccessful()` to test command\n * Deprecate `HelperSet::setCommand()` and `getCommand()` without replacement\n\n5.3\n---\n\n * Add `GithubActionReporter` to render annotations in a Github Action\n * Add `InputOption::VALUE_NEGATABLE` flag to handle `--foo`/`--no-foo` options\n * Add the `Command::$defaultDescription` static property and the `description` attribute\n   on the `console.command` tag to allow the `list` command to instantiate commands lazily\n * Add option `--short` to the `list` command\n * Add support for bright colors\n * Add `#[AsCommand]` attribute for declaring commands on PHP 8\n * Add `Helper::width()` and `Helper::length()`\n * The `--ansi` and `--no-ansi` options now default to `null`.\n\n5.2.0\n-----\n\n * Added `SingleCommandApplication::setAutoExit()` to allow testing via `CommandTester`\n * added support for multiline responses to questions through `Question::setMultiline()`\n   and `Question::isMultiline()`\n * Added `SignalRegistry` class to stack signals handlers\n * Added support for signals:\n    * Added `Application::getSignalRegistry()` and `Application::setSignalsToDispatchEvent()` methods\n    * Added `SignalableCommandInterface` interface\n * Added `TableCellStyle` class to customize table cell\n * Removed `php ` prefix invocation from help messages.\n\n5.1.0\n-----\n\n * `Command::setHidden()` is final since Symfony 5.1\n * Add `SingleCommandApplication`\n * Add `Cursor` class\n\n5.0.0\n-----\n\n * removed support for finding hidden commands using an abbreviation, use the full name instead\n * removed `TableStyle::setCrossingChar()` method in favor of `TableStyle::setDefaultCrossingChar()`\n * removed `TableStyle::setHorizontalBorderChar()` method in favor of `TableStyle::setDefaultCrossingChars()`\n * removed `TableStyle::getHorizontalBorderChar()` method in favor of `TableStyle::getBorderChars()`\n * removed `TableStyle::setVerticalBorderChar()` method in favor of `TableStyle::setVerticalBorderChars()`\n * removed `TableStyle::getVerticalBorderChar()` method in favor of `TableStyle::getBorderChars()`\n * removed support for returning `null` from `Command::execute()`, return `0` instead\n * `ProcessHelper::run()` accepts only `array|Symfony\\Component\\Process\\Process` for its `command` argument\n * `Application::setDispatcher` accepts only `Symfony\\Contracts\\EventDispatcher\\EventDispatcherInterface`\n   for its `dispatcher` argument\n * renamed `Application::renderException()` and `Application::doRenderException()`\n   to `renderThrowable()` and `doRenderThrowable()` respectively.\n\n4.4.0\n-----\n\n * deprecated finding hidden commands using an abbreviation, use the full name instead\n * added `Question::setTrimmable` default to true to allow the answer to be trimmed\n * added method `minSecondsBetweenRedraws()` and `maxSecondsBetweenRedraws()` on `ProgressBar`\n * `Application` implements `ResetInterface`\n * marked all dispatched event classes as `@final`\n * added support for displaying table horizontally\n * deprecated returning `null` from `Command::execute()`, return `0` instead\n * Deprecated the `Application::renderException()` and `Application::doRenderException()` methods,\n   use `renderThrowable()` and `doRenderThrowable()` instead.\n * added support for the `NO_COLOR` env var (https://no-color.org/)\n\n4.3.0\n-----\n\n * added support for hyperlinks\n * added `ProgressBar::iterate()` method that simplify updating the progress bar when iterating\n * added `Question::setAutocompleterCallback()` to provide a callback function\n   that dynamically generates suggestions as the user types\n\n4.2.0\n-----\n\n * allowed passing commands as `[$process, 'ENV_VAR' => 'value']` to\n   `ProcessHelper::run()` to pass environment variables\n * deprecated passing a command as a string to `ProcessHelper::run()`,\n   pass it the command as an array of its arguments instead\n * made the `ProcessHelper` class final\n * added `WrappableOutputFormatterInterface::formatAndWrap()` (implemented in `OutputFormatter`)\n * added `capture_stderr_separately` option to `CommandTester::execute()`\n\n4.1.0\n-----\n\n * added option to run suggested command if command is not found and only 1 alternative is available\n * added option to modify console output and print multiple modifiable sections\n * added support for iterable messages in output `write` and `writeln` methods\n\n4.0.0\n-----\n\n * `OutputFormatter` throws an exception when unknown options are used\n * removed `QuestionHelper::setInputStream()/getInputStream()`\n * removed `Application::getTerminalWidth()/getTerminalHeight()` and\n   `Application::setTerminalDimensions()/getTerminalDimensions()`\n * removed `ConsoleExceptionEvent`\n * removed `ConsoleEvents::EXCEPTION`\n\n3.4.0\n-----\n\n * added `SHELL_VERBOSITY` env var to control verbosity\n * added `CommandLoaderInterface`, `FactoryCommandLoader` and PSR-11\n   `ContainerCommandLoader` for commands lazy-loading\n * added a case-insensitive command name matching fallback\n * added static `Command::$defaultName/getDefaultName()`, allowing for\n   commands to be registered at compile time in the application command loader.\n   Setting the `$defaultName` property avoids the need for filling the `command`\n   attribute on the `console.command` tag when using `AddConsoleCommandPass`.\n\n3.3.0\n-----\n\n * added `ExceptionListener`\n * added `AddConsoleCommandPass` (originally in FrameworkBundle)\n * [BC BREAK] `Input::getOption()` no longer returns the default value for options\n   with value optional explicitly passed empty\n * added console.error event to catch exceptions thrown by other listeners\n * deprecated console.exception event in favor of console.error\n * added ability to handle `CommandNotFoundException` through the\n   `console.error` event\n * deprecated default validation in `SymfonyQuestionHelper::ask`\n\n3.2.0\n------\n\n * added `setInputs()` method to CommandTester for ease testing of commands expecting inputs\n * added `setStream()` and `getStream()` methods to Input (implement StreamableInputInterface)\n * added StreamableInputInterface\n * added LockableTrait\n\n3.1.0\n-----\n\n * added truncate method to FormatterHelper\n * added setColumnWidth(s) method to Table\n\n2.8.3\n-----\n\n * remove readline support from the question helper as it caused issues\n\n2.8.0\n-----\n\n * use readline for user input in the question helper when available to allow\n   the use of arrow keys\n\n2.6.0\n-----\n\n * added a Process helper\n * added a DebugFormatter helper\n\n2.5.0\n-----\n\n * deprecated the dialog helper (use the question helper instead)\n * deprecated TableHelper in favor of Table\n * deprecated ProgressHelper in favor of ProgressBar\n * added ConsoleLogger\n * added a question helper\n * added a way to set the process name of a command\n * added a way to set a default command instead of `ListCommand`\n\n2.4.0\n-----\n\n * added a way to force terminal dimensions\n * added a convenient method to detect verbosity level\n * [BC BREAK] made descriptors use output instead of returning a string\n\n2.3.0\n-----\n\n * added multiselect support to the select dialog helper\n * added Table Helper for tabular data rendering\n * added support for events in `Application`\n * added a way to normalize EOLs in `ApplicationTester::getDisplay()` and `CommandTester::getDisplay()`\n * added a way to set the progress bar progress via the `setCurrent` method\n * added support for multiple InputOption shortcuts, written as `'-a|-b|-c'`\n * added two additional verbosity levels, VERBOSITY_VERY_VERBOSE and VERBOSITY_DEBUG\n\n2.2.0\n-----\n\n * added support for colorization on Windows via ConEmu\n * add a method to Dialog Helper to ask for a question and hide the response\n * added support for interactive selections in console (DialogHelper::select())\n * added support for autocompletion as you type in Dialog Helper\n\n2.1.0\n-----\n\n * added ConsoleOutputInterface\n * added the possibility to disable a command (Command::isEnabled())\n * added suggestions when a command does not exist\n * added a --raw option to the list command\n * added support for STDERR in the console output class (errors are now sent\n   to STDERR)\n * made the defaults (helper set, commands, input definition) in Application\n   more easily customizable\n * added support for the shell even if readline is not available\n * added support for process isolation in Symfony shell via\n   `--process-isolation` switch\n * added support for `--`, which disables options parsing after that point\n   (tokens will be parsed as arguments)\n","vendor/symfony/console/CI/GithubActionReporter.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\CI;\n\nuse Symfony\\Component\\Console\\Output\\OutputInterface;\n\n/**\n * Utility class for Github actions.\n *\n * @author Maxime Steinhausser <maxime.steinhausser@gmail.com>\n */\nclass GithubActionReporter\n{\n    /**\n     * @see https://github.com/actions/toolkit/blob/5e5e1b7aacba68a53836a34db4a288c3c1c1585b/packages/core/src/command.ts#L80-L85\n     */\n    private const ESCAPED_DATA = [\n        '%' => '%25',\n        \"\\r\" => '%0D',\n        \"\\n\" => '%0A',\n    ];\n\n    /**\n     * @see https://github.com/actions/toolkit/blob/5e5e1b7aacba68a53836a34db4a288c3c1c1585b/packages/core/src/command.ts#L87-L94\n     */\n    private const ESCAPED_PROPERTIES = [\n        '%' => '%25',\n        \"\\r\" => '%0D',\n        \"\\n\" => '%0A',\n        ':' => '%3A',\n        ',' => '%2C',\n    ];\n\n    public function __construct(\n        private OutputInterface $output,\n    ) {\n    }\n\n    public static function isGithubActionEnvironment(): bool\n    {\n        return false !== getenv('GITHUB_ACTIONS');\n    }\n\n    /**\n     * Output an error using the Github annotations format.\n     *\n     * @see https://docs.github.com/en/free-pro-team@latest/actions/reference/workflow-commands-for-github-actions#setting-an-error-message\n     */\n    public function error(string $message, ?string $file = null, ?int $line = null, ?int $col = null): void\n    {\n        $this->log('error', $message, $file, $line, $col);\n    }\n\n    /**\n     * Output a warning using the Github annotations format.\n     *\n     * @see https://docs.github.com/en/free-pro-team@latest/actions/reference/workflow-commands-for-github-actions#setting-a-warning-message\n     */\n    public function warning(string $message, ?string $file = null, ?int $line = null, ?int $col = null): void\n    {\n        $this->log('warning', $message, $file, $line, $col);\n    }\n\n    /**\n     * Output a debug log using the Github annotations format.\n     *\n     * @see https://docs.github.com/en/free-pro-team@latest/actions/reference/workflow-commands-for-github-actions#setting-a-debug-message\n     */\n    public function debug(string $message, ?string $file = null, ?int $line = null, ?int $col = null): void\n    {\n        $this->log('debug', $message, $file, $line, $col);\n    }\n\n    private function log(string $type, string $message, ?string $file = null, ?int $line = null, ?int $col = null): void\n    {\n        // Some values must be encoded.\n        $message = strtr($message, self::ESCAPED_DATA);\n\n        if (!$file) {\n            // No file provided, output the message solely:\n            $this->output->writeln(\\sprintf('::%s::%s', $type, $message));\n\n            return;\n        }\n\n        $this->output->writeln(\\sprintf('::%s file=%s,line=%s,col=%s::%s', $type, strtr($file, self::ESCAPED_PROPERTIES), strtr($line ?? 1, self::ESCAPED_PROPERTIES), strtr($col ?? 0, self::ESCAPED_PROPERTIES), $message));\n    }\n}\n","vendor/symfony/console/Color.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console;\n\nuse Symfony\\Component\\Console\\Exception\\InvalidArgumentException;\n\n/**\n * @author Fabien Potencier <fabien@symfony.com>\n */\nfinal class Color\n{\n    private const COLORS = [\n        'black' => 0,\n        'red' => 1,\n        'green' => 2,\n        'yellow' => 3,\n        'blue' => 4,\n        'magenta' => 5,\n        'cyan' => 6,\n        'white' => 7,\n        'default' => 9,\n    ];\n\n    private const BRIGHT_COLORS = [\n        'gray' => 0,\n        'bright-red' => 1,\n        'bright-green' => 2,\n        'bright-yellow' => 3,\n        'bright-blue' => 4,\n        'bright-magenta' => 5,\n        'bright-cyan' => 6,\n        'bright-white' => 7,\n    ];\n\n    private const AVAILABLE_OPTIONS = [\n        'bold' => ['set' => 1, 'unset' => 22],\n        'underscore' => ['set' => 4, 'unset' => 24],\n        'blink' => ['set' => 5, 'unset' => 25],\n        'reverse' => ['set' => 7, 'unset' => 27],\n        'conceal' => ['set' => 8, 'unset' => 28],\n    ];\n\n    private string $foreground;\n    private string $background;\n    private array $options = [];\n\n    public function __construct(string $foreground = '', string $background = '', array $options = [])\n    {\n        $this->foreground = $this->parseColor($foreground);\n        $this->background = $this->parseColor($background, true);\n\n        foreach ($options as $option) {\n            if (!isset(self::AVAILABLE_OPTIONS[$option])) {\n                throw new InvalidArgumentException(\\sprintf('Invalid option specified: \"%s\". Expected one of (%s).', $option, implode(', ', array_keys(self::AVAILABLE_OPTIONS))));\n            }\n\n            $this->options[$option] = self::AVAILABLE_OPTIONS[$option];\n        }\n    }\n\n    public function apply(string $text): string\n    {\n        return $this->set().$text.$this->unset();\n    }\n\n    public function set(): string\n    {\n        $setCodes = [];\n        if ('' !== $this->foreground) {\n            $setCodes[] = $this->foreground;\n        }\n        if ('' !== $this->background) {\n            $setCodes[] = $this->background;\n        }\n        foreach ($this->options as $option) {\n            $setCodes[] = $option['set'];\n        }\n        if (!$setCodes) {\n            return '';\n        }\n\n        return \\sprintf(\"\\033[%sm\", implode(';', $setCodes));\n    }\n\n    public function unset(): string\n    {\n        $unsetCodes = [];\n        if ('' !== $this->foreground) {\n            $unsetCodes[] = 39;\n        }\n        if ('' !== $this->background) {\n            $unsetCodes[] = 49;\n        }\n        foreach ($this->options as $option) {\n            $unsetCodes[] = $option['unset'];\n        }\n        if (!$unsetCodes) {\n            return '';\n        }\n\n        return \\sprintf(\"\\033[%sm\", implode(';', $unsetCodes));\n    }\n\n    private function parseColor(string $color, bool $background = false): string\n    {\n        if ('' === $color) {\n            return '';\n        }\n\n        if ('#' === $color[0]) {\n            return ($background ? '4' : '3').Terminal::getColorMode()->convertFromHexToAnsiColorCode($color);\n        }\n\n        if (isset(self::COLORS[$color])) {\n            return ($background ? '4' : '3').self::COLORS[$color];\n        }\n\n        if (isset(self::BRIGHT_COLORS[$color])) {\n            return ($background ? '10' : '9').self::BRIGHT_COLORS[$color];\n        }\n\n        throw new InvalidArgumentException(\\sprintf('Invalid \"%s\" color; expected one of (%s).', $color, implode(', ', array_merge(array_keys(self::COLORS), array_keys(self::BRIGHT_COLORS)))));\n    }\n}\n","vendor/symfony/console/Command/Command.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Command;\n\nuse Symfony\\Component\\Console\\Application;\nuse Symfony\\Component\\Console\\Attribute\\AsCommand;\nuse Symfony\\Component\\Console\\Completion\\CompletionInput;\nuse Symfony\\Component\\Console\\Completion\\CompletionSuggestions;\nuse Symfony\\Component\\Console\\Completion\\Suggestion;\nuse Symfony\\Component\\Console\\Exception\\ExceptionInterface;\nuse Symfony\\Component\\Console\\Exception\\InvalidArgumentException;\nuse Symfony\\Component\\Console\\Exception\\LogicException;\nuse Symfony\\Component\\Console\\Helper\\HelperInterface;\nuse Symfony\\Component\\Console\\Helper\\HelperSet;\nuse Symfony\\Component\\Console\\Input\\InputArgument;\nuse Symfony\\Component\\Console\\Input\\InputDefinition;\nuse Symfony\\Component\\Console\\Input\\InputInterface;\nuse Symfony\\Component\\Console\\Input\\InputOption;\nuse Symfony\\Component\\Console\\Output\\OutputInterface;\n\n/**\n * Base class for all commands.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n */\nclass Command implements SignalableCommandInterface\n{\n    // see https://tldp.org/LDP/abs/html/exitcodes.html\n    public const SUCCESS = 0;\n    public const FAILURE = 1;\n    public const INVALID = 2;\n\n    private ?Application $application = null;\n    private ?string $name = null;\n    private ?string $processTitle = null;\n    private array $aliases = [];\n    private InputDefinition $definition;\n    private bool $hidden = false;\n    private string $help = '';\n    private string $description = '';\n    private ?InputDefinition $fullDefinition = null;\n    private bool $ignoreValidationErrors = false;\n    private ?InvokableCommand $code = null;\n    private array $synopsis = [];\n    private array $usages = [];\n    private ?HelperSet $helperSet = null;\n\n    /**\n     * @deprecated since Symfony 7.3, use the #[AsCommand] attribute instead\n     */\n    public static function getDefaultName(): ?string\n    {\n        trigger_deprecation('symfony/console', '7.3', 'Method \"%s()\" is deprecated and will be removed in Symfony 8.0, use the #[AsCommand] attribute instead.', __METHOD__);\n\n        if ($attribute = (new \\ReflectionClass(static::class))->getAttributes(AsCommand::class)) {\n            return $attribute[0]->newInstance()->name;\n        }\n\n        return null;\n    }\n\n    /**\n     * @deprecated since Symfony 7.3, use the #[AsCommand] attribute instead\n     */\n    public static function getDefaultDescription(): ?string\n    {\n        trigger_deprecation('symfony/console', '7.3', 'Method \"%s()\" is deprecated and will be removed in Symfony 8.0, use the #[AsCommand] attribute instead.', __METHOD__);\n\n        if ($attribute = (new \\ReflectionClass(static::class))->getAttributes(AsCommand::class)) {\n            return $attribute[0]->newInstance()->description;\n        }\n\n        return null;\n    }\n\n    /**\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     */\n    public function __construct(?string $name = null, ?callable $code = null)\n    {\n        if (null !== $code) {\n            if (!\\is_object($code) || $code instanceof \\Closure) {\n                throw new InvalidArgumentException(\\sprintf('The command must be an instance of \"%s\" or an invokable object.', self::class));\n            }\n            /** @var AsCommand $attribute */\n            $attribute = ((new \\ReflectionObject($code))->getAttributes(AsCommand::class)[0] ?? null)?->newInstance()\n                ?? throw new LogicException(\\sprintf('The command must use the \"%s\" attribute.', AsCommand::class));\n            $this->setCode($code);\n        } else {\n            $attribute = ((new \\ReflectionClass(static::class))->getAttributes(AsCommand::class)[0] ?? null)?->newInstance();\n        }\n\n        $this->definition = new InputDefinition();\n        if (null === $name) {\n            if (self::class !== (new \\ReflectionMethod($this, 'getDefaultName'))->class) {\n                trigger_deprecation('symfony/console', '7.3', 'Overriding \"Command::getDefaultName()\" in \"%s\" is deprecated and will be removed in Symfony 8.0, use the #[AsCommand] attribute instead.', static::class);\n\n                $name = static::getDefaultName();\n            } else {\n                $name = $attribute?->name;\n            }\n        }\n\n        if (null !== $name) {\n            $aliases = explode('|', $name);\n\n            if ('' === $name = array_shift($aliases)) {\n                $this->setHidden(true);\n                $name = array_shift($aliases);\n            }\n\n            // we must not overwrite existing aliases, combine new ones with existing ones\n            $aliases = array_unique([\n                ...$this->aliases,\n                ...$aliases,\n            ]);\n\n            $this->setAliases($aliases);\n        }\n\n        if (null !== $name) {\n            $this->setName($name);\n        }\n\n        if ('' === $this->description) {\n            if (self::class !== (new \\ReflectionMethod($this, 'getDefaultDescription'))->class) {\n                trigger_deprecation('symfony/console', '7.3', 'Overriding \"Command::getDefaultDescription()\" in \"%s\" is deprecated and will be removed in Symfony 8.0, use the #[AsCommand] attribute instead.', static::class);\n\n                $defaultDescription = static::getDefaultDescription();\n            } else {\n                $defaultDescription = $attribute?->description;\n            }\n\n            $this->setDescription($defaultDescription ?? '');\n        }\n\n        if ('' === $this->help) {\n            $this->setHelp($attribute?->help ?? '');\n        }\n\n        foreach ($attribute?->usages ?? [] as $usage) {\n            $this->addUsage($usage);\n        }\n\n        if (!$code && \\is_callable($this) && self::class === (new \\ReflectionMethod($this, 'execute'))->getDeclaringClass()->name) {\n            $this->code = new InvokableCommand($this, $this(...));\n        }\n\n        $this->configure();\n    }\n\n    /**\n     * Ignores validation errors.\n     *\n     * This is mainly useful for the help command.\n     */\n    public function ignoreValidationErrors(): void\n    {\n        $this->ignoreValidationErrors = true;\n    }\n\n    public function setApplication(?Application $application): void\n    {\n        $this->application = $application;\n        if ($application) {\n            $this->setHelperSet($application->getHelperSet());\n        } else {\n            $this->helperSet = null;\n        }\n\n        $this->fullDefinition = null;\n    }\n\n    public function setHelperSet(HelperSet $helperSet): void\n    {\n        $this->helperSet = $helperSet;\n    }\n\n    /**\n     * Gets the helper set.\n     */\n    public function getHelperSet(): ?HelperSet\n    {\n        return $this->helperSet;\n    }\n\n    /**\n     * Gets the application instance for this command.\n     */\n    public function getApplication(): ?Application\n    {\n        return $this->application;\n    }\n\n    /**\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     */\n    public function isEnabled(): bool\n    {\n        return true;\n    }\n\n    /**\n     * Configures the current command.\n     *\n     * @return void\n     */\n    protected function configure()\n    {\n    }\n\n    /**\n     * Executes the current command.\n     *\n     * This method is not abstract because you can use this class\n     * as a concrete class. In this case, instead of defining the\n     * execute() method, you set the code to execute by passing\n     * a Closure to the setCode() method.\n     *\n     * @return int 0 if everything went fine, or an exit code\n     *\n     * @throws LogicException When this abstract method is not implemented\n     *\n     * @see setCode()\n     */\n    protected function execute(InputInterface $input, OutputInterface $output): int\n    {\n        throw new LogicException('You must override the execute() method in the concrete command class.');\n    }\n\n    /**\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     */\n    protected function interact(InputInterface $input, OutputInterface $output)\n    {\n    }\n\n    /**\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     */\n    protected function initialize(InputInterface $input, OutputInterface $output)\n    {\n    }\n\n    /**\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     */\n    public function run(InputInterface $input, OutputInterface $output): int\n    {\n        // add the application arguments and options\n        $this->mergeApplicationDefinition();\n\n        // bind the input against the command specific arguments/options\n        try {\n            $input->bind($this->getDefinition());\n        } catch (ExceptionInterface $e) {\n            if (!$this->ignoreValidationErrors) {\n                throw $e;\n            }\n        }\n\n        $this->initialize($input, $output);\n\n        if (null !== $this->processTitle) {\n            if (\\function_exists('cli_set_process_title')) {\n                if (!@cli_set_process_title($this->processTitle)) {\n                    if ('Darwin' === \\PHP_OS) {\n                        $output->writeln('<comment>Running \"cli_set_process_title\" as an unprivileged user is not supported on MacOS.</comment>', OutputInterface::VERBOSITY_VERY_VERBOSE);\n                    } else {\n                        cli_set_process_title($this->processTitle);\n                    }\n                }\n            } elseif (\\function_exists('setproctitle')) {\n                setproctitle($this->processTitle);\n            } elseif (OutputInterface::VERBOSITY_VERY_VERBOSE === $output->getVerbosity()) {\n                $output->writeln('<comment>Install the proctitle PECL to be able to change the process title.</comment>');\n            }\n        }\n\n        if ($input->isInteractive()) {\n            $this->interact($input, $output);\n\n            if ($this->code?->isInteractive()) {\n                $this->code->interact($input, $output);\n            }\n        }\n\n        // The command name argument is often omitted when a command is executed directly with its run() method.\n        // It would fail the validation if we didn't make sure the command argument is present,\n        // since it's required by the application.\n        if ($input->hasArgument('command') && null === $input->getArgument('command')) {\n            $input->setArgument('command', $this->getName());\n        }\n\n        $input->validate();\n\n        if ($this->code) {\n            return ($this->code)($input, $output);\n        }\n\n        return $this->execute($input, $output);\n    }\n\n    /**\n     * Supplies suggestions when resolving possible completion options for input (e.g. option or argument).\n     */\n    public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void\n    {\n        $definition = $this->getDefinition();\n        if (CompletionInput::TYPE_OPTION_VALUE === $input->getCompletionType() && $definition->hasOption($input->getCompletionName())) {\n            $definition->getOption($input->getCompletionName())->complete($input, $suggestions);\n        } elseif (CompletionInput::TYPE_ARGUMENT_VALUE === $input->getCompletionType() && $definition->hasArgument($input->getCompletionName())) {\n            $definition->getArgument($input->getCompletionName())->complete($input, $suggestions);\n        }\n    }\n\n    /**\n     * Gets the code that is executed by the command.\n     *\n     * @return ?callable null if the code has not been set with setCode()\n     */\n    public function getCode(): ?callable\n    {\n        return $this->code?->getCode();\n    }\n\n    /**\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     */\n    public function setCode(callable $code): static\n    {\n        $this->code = new InvokableCommand($this, $code);\n\n        return $this;\n    }\n\n    /**\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     */\n    public function mergeApplicationDefinition(bool $mergeArgs = true): void\n    {\n        if (null === $this->application) {\n            return;\n        }\n\n        $this->fullDefinition = new InputDefinition();\n        $this->fullDefinition->setOptions($this->definition->getOptions());\n        $this->fullDefinition->addOptions($this->application->getDefinition()->getOptions());\n\n        if ($mergeArgs) {\n            $this->fullDefinition->setArguments($this->application->getDefinition()->getArguments());\n            $this->fullDefinition->addArguments($this->definition->getArguments());\n        } else {\n            $this->fullDefinition->setArguments($this->definition->getArguments());\n        }\n    }\n\n    /**\n     * Sets an array of argument and option instances.\n     *\n     * @return $this\n     */\n    public function setDefinition(array|InputDefinition $definition): static\n    {\n        if ($definition instanceof InputDefinition) {\n            $this->definition = $definition;\n        } else {\n            $this->definition->setDefinition($definition);\n        }\n\n        $this->fullDefinition = null;\n\n        return $this;\n    }\n\n    /**\n     * Gets the InputDefinition attached to this Command.\n     */\n    public function getDefinition(): InputDefinition\n    {\n        return $this->fullDefinition ?? $this->getNativeDefinition();\n    }\n\n    /**\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     */\n    public function getNativeDefinition(): InputDefinition\n    {\n        $definition = $this->definition ?? throw new LogicException(\\sprintf('Command class \"%s\" is not correctly initialized. You probably forgot to call the parent constructor.', static::class));\n\n        if ($this->code && !$definition->getArguments() && !$definition->getOptions()) {\n            $this->code->configure($definition);\n        }\n\n        return $definition;\n    }\n\n    /**\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     */\n    public function addArgument(string $name, ?int $mode = null, string $description = '', mixed $default = null, array|\\Closure $suggestedValues = []): static\n    {\n        $this->definition->addArgument(new InputArgument($name, $mode, $description, $default, $suggestedValues));\n        $this->fullDefinition?->addArgument(new InputArgument($name, $mode, $description, $default, $suggestedValues));\n\n        return $this;\n    }\n\n    /**\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     */\n    public function addOption(string $name, string|array|null $shortcut = null, ?int $mode = null, string $description = '', mixed $default = null, array|\\Closure $suggestedValues = []): static\n    {\n        $this->definition->addOption(new InputOption($name, $shortcut, $mode, $description, $default, $suggestedValues));\n        $this->fullDefinition?->addOption(new InputOption($name, $shortcut, $mode, $description, $default, $suggestedValues));\n\n        return $this;\n    }\n\n    /**\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     */\n    public function setName(string $name): static\n    {\n        $this->validateName($name);\n\n        $this->name = $name;\n\n        return $this;\n    }\n\n    /**\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     */\n    public function setProcessTitle(string $title): static\n    {\n        $this->processTitle = $title;\n\n        return $this;\n    }\n\n    /**\n     * Returns the command name.\n     */\n    public function getName(): ?string\n    {\n        return $this->name;\n    }\n\n    /**\n     * @param bool $hidden Whether or not the command should be hidden from the list of commands\n     *\n     * @return $this\n     */\n    public function setHidden(bool $hidden = true): static\n    {\n        $this->hidden = $hidden;\n\n        return $this;\n    }\n\n    /**\n     * @return bool whether the command should be publicly shown or not\n     */\n    public function isHidden(): bool\n    {\n        return $this->hidden;\n    }\n\n    /**\n     * Sets the description for the command.\n     *\n     * @return $this\n     */\n    public function setDescription(string $description): static\n    {\n        $this->description = $description;\n\n        return $this;\n    }\n\n    /**\n     * Returns the description for the command.\n     */\n    public function getDescription(): string\n    {\n        return $this->description;\n    }\n\n    /**\n     * Sets the help for the command.\n     *\n     * @return $this\n     */\n    public function setHelp(string $help): static\n    {\n        $this->help = $help;\n\n        return $this;\n    }\n\n    /**\n     * Returns the help for the command.\n     */\n    public function getHelp(): string\n    {\n        return $this->help;\n    }\n\n    /**\n     * Returns the processed help for the command replacing the %command.name% and\n     * %command.full_name% patterns with the real values dynamically.\n     */\n    public function getProcessedHelp(): string\n    {\n        $name = $this->name;\n        $isSingleCommand = $this->application?->isSingleCommand();\n\n        $placeholders = [\n            '%command.name%',\n            '%command.full_name%',\n        ];\n        $replacements = [\n            $name,\n            $isSingleCommand ? $_SERVER['PHP_SELF'] : $_SERVER['PHP_SELF'].' '.$name,\n        ];\n\n        return str_replace($placeholders, $replacements, $this->getHelp() ?: $this->getDescription());\n    }\n\n    /**\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     */\n    public function setAliases(iterable $aliases): static\n    {\n        $list = [];\n\n        foreach ($aliases as $alias) {\n            $this->validateName($alias);\n            $list[] = $alias;\n        }\n\n        $this->aliases = \\is_array($aliases) ? $aliases : $list;\n\n        return $this;\n    }\n\n    /**\n     * Returns the aliases for the command.\n     */\n    public function getAliases(): array\n    {\n        return $this->aliases;\n    }\n\n    /**\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     */\n    public function getSynopsis(bool $short = false): string\n    {\n        $key = $short ? 'short' : 'long';\n\n        if (!isset($this->synopsis[$key])) {\n            $this->synopsis[$key] = trim(\\sprintf('%s %s', $this->name, $this->definition->getSynopsis($short)));\n        }\n\n        return $this->synopsis[$key];\n    }\n\n    /**\n     * Add a command usage example, it'll be prefixed with the command name.\n     *\n     * @return $this\n     */\n    public function addUsage(string $usage): static\n    {\n        if (!str_starts_with($usage, $this->name)) {\n            $usage = \\sprintf('%s %s', $this->name, $usage);\n        }\n\n        $this->usages[] = $usage;\n\n        return $this;\n    }\n\n    /**\n     * Returns alternative usages of the command.\n     */\n    public function getUsages(): array\n    {\n        return $this->usages;\n    }\n\n    /**\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     */\n    public function getHelper(string $name): HelperInterface\n    {\n        if (null === $this->helperSet) {\n            throw new LogicException(\\sprintf('Cannot retrieve helper \"%s\" because there is no HelperSet defined. Did you forget to add your command to the application or to set the application on the command using the setApplication() method? You can also set the HelperSet directly using the setHelperSet() method.', $name));\n        }\n\n        return $this->helperSet->get($name);\n    }\n\n    public function getSubscribedSignals(): array\n    {\n        return $this->code?->getSubscribedSignals() ?? [];\n    }\n\n    public function handleSignal(int $signal, int|false $previousExitCode = 0): int|false\n    {\n        return $this->code?->handleSignal($signal, $previousExitCode) ?? false;\n    }\n\n    /**\n     * Validates a command name.\n     *\n     * It must be non-empty and parts can optionally be separated by \":\".\n     *\n     * @throws InvalidArgumentException When the name is invalid\n     */\n    private function validateName(string $name): void\n    {\n        if (!preg_match('/^[^\\:]++(\\:[^\\:]++)*$/', $name)) {\n            throw new InvalidArgumentException(\\sprintf('Command name \"%s\" is invalid.', $name));\n        }\n    }\n}\n","vendor/symfony/console/Command/CompleteCommand.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Command;\n\nuse Symfony\\Component\\Console\\Attribute\\AsCommand;\nuse Symfony\\Component\\Console\\Completion\\CompletionInput;\nuse Symfony\\Component\\Console\\Completion\\CompletionSuggestions;\nuse Symfony\\Component\\Console\\Completion\\Output\\BashCompletionOutput;\nuse Symfony\\Component\\Console\\Completion\\Output\\CompletionOutputInterface;\nuse Symfony\\Component\\Console\\Completion\\Output\\FishCompletionOutput;\nuse Symfony\\Component\\Console\\Completion\\Output\\ZshCompletionOutput;\nuse Symfony\\Component\\Console\\Exception\\CommandNotFoundException;\nuse Symfony\\Component\\Console\\Exception\\ExceptionInterface;\nuse Symfony\\Component\\Console\\Input\\InputInterface;\nuse Symfony\\Component\\Console\\Input\\InputOption;\nuse Symfony\\Component\\Console\\Output\\OutputInterface;\n\n/**\n * Responsible for providing the values to the shell completion.\n *\n * @author Wouter de Jong <wouter@wouterj.nl>\n */\n#[AsCommand(name: '|_complete', description: 'Internal command to provide shell completion suggestions')]\nfinal class CompleteCommand extends Command\n{\n    public const COMPLETION_API_VERSION = '1';\n\n    private array $completionOutputs;\n    private bool $isDebug = false;\n\n    /**\n     * @param array<string, class-string<CompletionOutputInterface>> $completionOutputs A list of additional completion outputs, with shell name as key and FQCN as value\n     */\n    public function __construct(array $completionOutputs = [])\n    {\n        // must be set before the parent constructor, as the property value is used in configure()\n        $this->completionOutputs = $completionOutputs + [\n            'bash' => BashCompletionOutput::class,\n            'fish' => FishCompletionOutput::class,\n            'zsh' => ZshCompletionOutput::class,\n        ];\n\n        parent::__construct();\n    }\n\n    protected function configure(): void\n    {\n        $this\n            ->addOption('shell', 's', InputOption::VALUE_REQUIRED, 'The shell type (\"'.implode('\", \"', array_keys($this->completionOutputs)).'\")')\n            ->addOption('input', 'i', InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'An array of input tokens (e.g. COMP_WORDS or argv)')\n            ->addOption('current', 'c', InputOption::VALUE_REQUIRED, 'The index of the \"input\" array that the cursor is in (e.g. COMP_CWORD)')\n            ->addOption('api-version', 'a', InputOption::VALUE_REQUIRED, 'The API version of the completion script')\n            ->addOption('symfony', 'S', InputOption::VALUE_REQUIRED, 'deprecated')\n        ;\n    }\n\n    protected function initialize(InputInterface $input, OutputInterface $output): void\n    {\n        $this->isDebug = filter_var(getenv('SYMFONY_COMPLETION_DEBUG'), \\FILTER_VALIDATE_BOOL);\n    }\n\n    protected function execute(InputInterface $input, OutputInterface $output): int\n    {\n        try {\n            // \"symfony\" must be kept for compat with the shell scripts generated by Symfony Console 5.4 - 6.1\n            $version = $input->getOption('symfony') ? '1' : $input->getOption('api-version');\n            if ($version && version_compare($version, self::COMPLETION_API_VERSION, '<')) {\n                $message = \\sprintf('Completion script version is not supported (\"%s\" given, \">=%s\" required).', $version, self::COMPLETION_API_VERSION);\n                $this->log($message);\n\n                $output->writeln($message.' Install the Symfony completion script again by using the \"completion\" command.');\n\n                return 126;\n            }\n\n            $shell = $input->getOption('shell');\n            if (!$shell) {\n                throw new \\RuntimeException('The \"--shell\" option must be set.');\n            }\n\n            if (!$completionOutput = $this->completionOutputs[$shell] ?? false) {\n                throw new \\RuntimeException(\\sprintf('Shell completion is not supported for your shell: \"%s\" (supported: \"%s\").', $shell, implode('\", \"', array_keys($this->completionOutputs))));\n            }\n\n            $completionInput = $this->createCompletionInput($input);\n            $suggestions = new CompletionSuggestions();\n\n            $this->log([\n                '',\n                '<comment>'.date('Y-m-d H:i:s').'</>',\n                '<info>Input:</> <comment>(\"|\" indicates the cursor position)</>',\n                '  '.$completionInput,\n                '<info>Command:</>',\n                '  '.implode(' ', $_SERVER['argv']),\n                '<info>Messages:</>',\n            ]);\n\n            if ($command = $this->findCommand($completionInput)) {\n                $command->mergeApplicationDefinition();\n                $completionInput->bind($command->getDefinition());\n            }\n            if (null === $command) {\n                $this->log('  No command found, completing using the Application class.');\n\n                $this->getApplication()->complete($completionInput, $suggestions);\n            } elseif (\n                $completionInput->mustSuggestArgumentValuesFor('command')\n            ) {\n                $this->log('  Command found, completing command name.');\n\n                // expand shortcut names (\"cache:cl<TAB>\") into their full name (\"cache:clear\")\n                $commandNames = array_filter(array_merge([$command->getName()], $command->getAliases()));\n                foreach ($commandNames as $name) {\n                    if (str_starts_with($name, $completionInput->getCompletionValue())) {\n                        $commandNames = [$name];\n                        break;\n                    }\n                }\n                $suggestions->suggestValues($commandNames);\n            } else {\n                if (CompletionInput::TYPE_OPTION_NAME === $completionInput->getCompletionType()) {\n                    $this->log('  Completing option names for the <comment>'.($command instanceof LazyCommand ? $command->getCommand() : $command)::class.'</> command.');\n\n                    $suggestions->suggestOptions($command->getDefinition()->getOptions());\n                } else {\n                    $this->log([\n                        '  Completing using the <comment>'.($command instanceof LazyCommand ? $command->getCommand() : $command)::class.'</> class.',\n                        '  Completing <comment>'.$completionInput->getCompletionType().'</> for <comment>'.$completionInput->getCompletionName().'</>',\n                    ]);\n                    if (null !== $compval = $completionInput->getCompletionValue()) {\n                        $this->log('  Current value: <comment>'.$compval.'</>');\n                    }\n\n                    $command->complete($completionInput, $suggestions);\n                }\n            }\n\n            /** @var CompletionOutputInterface $completionOutput */\n            $completionOutput = new $completionOutput();\n\n            $this->log('<info>Suggestions:</>');\n            if ($options = $suggestions->getOptionSuggestions()) {\n                $this->log('  --'.implode(' --', array_map(static fn ($o) => $o->getName(), $options)));\n            } elseif ($values = $suggestions->getValueSuggestions()) {\n                $this->log('  '.implode(' ', $values));\n            } else {\n                $this->log('  <comment>No suggestions were provided</>');\n            }\n\n            $completionOutput->write($suggestions, $output);\n        } catch (\\Throwable $e) {\n            $this->log([\n                '<error>Error!</error>',\n                (string) $e,\n            ]);\n\n            if ($output->isDebug()) {\n                throw $e;\n            }\n\n            return 2;\n        }\n\n        return 0;\n    }\n\n    private function createCompletionInput(InputInterface $input): CompletionInput\n    {\n        $currentIndex = $input->getOption('current');\n        if (!$currentIndex || !ctype_digit($currentIndex)) {\n            throw new \\RuntimeException('The \"--current\" option must be set and it must be an integer.');\n        }\n\n        $completionInput = CompletionInput::fromTokens($input->getOption('input'), (int) $currentIndex);\n\n        try {\n            $completionInput->bind($this->getApplication()->getDefinition());\n        } catch (ExceptionInterface) {\n        }\n\n        return $completionInput;\n    }\n\n    private function findCommand(CompletionInput $completionInput): ?Command\n    {\n        try {\n            $inputName = $completionInput->getFirstArgument();\n            if (null === $inputName) {\n                return null;\n            }\n\n            return $this->getApplication()->find($inputName);\n        } catch (CommandNotFoundException) {\n        }\n\n        return null;\n    }\n\n    private function log($messages): void\n    {\n        if (!$this->isDebug) {\n            return;\n        }\n\n        $commandName = basename($_SERVER['argv'][0]);\n        file_put_contents(sys_get_temp_dir().'/sf_'.$commandName.'.log', implode(\\PHP_EOL, (array) $messages).\\PHP_EOL, \\FILE_APPEND);\n    }\n}\n","vendor/symfony/console/Command/DumpCompletionCommand.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Command;\n\nuse Symfony\\Component\\Console\\Attribute\\AsCommand;\nuse Symfony\\Component\\Console\\Input\\InputArgument;\nuse Symfony\\Component\\Console\\Input\\InputInterface;\nuse Symfony\\Component\\Console\\Input\\InputOption;\nuse Symfony\\Component\\Console\\Output\\ConsoleOutputInterface;\nuse Symfony\\Component\\Console\\Output\\OutputInterface;\nuse Symfony\\Component\\Process\\Process;\n\n/**\n * Dumps the completion script for the current shell.\n *\n * @author Wouter de Jong <wouter@wouterj.nl>\n */\n#[AsCommand(name: 'completion', description: 'Dump the shell completion script')]\nfinal class DumpCompletionCommand extends Command\n{\n    private array $supportedShells;\n\n    protected function configure(): void\n    {\n        $fullCommand = $_SERVER['PHP_SELF'];\n        $commandName = basename($fullCommand);\n        $fullCommand = @realpath($fullCommand) ?: $fullCommand;\n\n        $shell = self::guessShell();\n        [$rcFile, $completionFile] = match ($shell) {\n            'fish' => ['~/.config/fish/config.fish', \"/etc/fish/completions/$commandName.fish\"],\n            'zsh' => ['~/.zshrc', '$fpath[1]/_'.$commandName],\n            default => ['~/.bashrc', \"/etc/bash_completion.d/$commandName\"],\n        };\n\n        $supportedShells = implode(', ', $this->getSupportedShells());\n\n        $this\n            ->setHelp(<<<EOH\n                The <info>%command.name%</> command dumps the shell completion script required\n                to use shell autocompletion (currently, {$supportedShells} completion are supported).\n\n                <comment>Static installation\n                -------------------</>\n\n                Dump the script to a global completion file and restart your shell:\n\n                    <info>%command.full_name% {$shell} | sudo tee {$completionFile}</>\n\n                Or dump the script to a local file and source it:\n\n                    <info>%command.full_name% {$shell} > completion.sh</>\n\n                    <comment># source the file whenever you use the project</>\n                    <info>source completion.sh</>\n\n                    <comment># or add this line at the end of your \"{$rcFile}\" file:</>\n                    <info>source /path/to/completion.sh</>\n\n                <comment>Dynamic installation\n                --------------------</>\n\n                Add this to the end of your shell configuration file (e.g. <info>\"{$rcFile}\"</>):\n\n                    <info>eval \"$({$fullCommand} completion {$shell})\"</>\n                EOH\n            )\n            ->addArgument('shell', InputArgument::OPTIONAL, 'The shell type (e.g. \"bash\"), the value of the \"$SHELL\" env var will be used if this is not given', null, $this->getSupportedShells(...))\n            ->addOption('debug', null, InputOption::VALUE_NONE, 'Tail the completion debug log')\n        ;\n    }\n\n    protected function execute(InputInterface $input, OutputInterface $output): int\n    {\n        $commandName = basename($_SERVER['argv'][0]);\n\n        if ($input->getOption('debug')) {\n            $this->tailDebugLog($commandName, $output);\n\n            return 0;\n        }\n\n        $shell = $input->getArgument('shell') ?? self::guessShell();\n        $completionFile = __DIR__.'/../Resources/completion.'.$shell;\n        if (!file_exists($completionFile)) {\n            $supportedShells = $this->getSupportedShells();\n\n            if ($output instanceof ConsoleOutputInterface) {\n                $output = $output->getErrorOutput();\n            }\n            if ($shell) {\n                $output->writeln(\\sprintf('<error>Detected shell \"%s\", which is not supported by Symfony shell completion (supported shells: \"%s\").</>', $shell, implode('\", \"', $supportedShells)));\n            } else {\n                $output->writeln(\\sprintf('<error>Shell not detected, Symfony shell completion only supports \"%s\").</>', implode('\", \"', $supportedShells)));\n            }\n\n            return 2;\n        }\n\n        $output->write(str_replace(['{{ COMMAND_NAME }}', '{{ VERSION }}'], [$commandName, CompleteCommand::COMPLETION_API_VERSION], file_get_contents($completionFile)));\n\n        return 0;\n    }\n\n    private static function guessShell(): string\n    {\n        return basename($_SERVER['SHELL'] ?? '');\n    }\n\n    private function tailDebugLog(string $commandName, OutputInterface $output): void\n    {\n        $debugFile = sys_get_temp_dir().'/sf_'.$commandName.'.log';\n        if (!file_exists($debugFile)) {\n            touch($debugFile);\n        }\n        $process = new Process(['tail', '-f', $debugFile], null, null, null, 0);\n        $process->run(static function (string $type, string $line) use ($output): void {\n            $output->write($line);\n        });\n    }\n\n    /**\n     * @return string[]\n     */\n    private function getSupportedShells(): array\n    {\n        if (isset($this->supportedShells)) {\n            return $this->supportedShells;\n        }\n\n        $shells = [];\n\n        foreach (new \\DirectoryIterator(__DIR__.'/../Resources/') as $file) {\n            if (str_starts_with($file->getBasename(), 'completion.') && $file->isFile()) {\n                $shells[] = $file->getExtension();\n            }\n        }\n        sort($shells);\n\n        return $this->supportedShells = $shells;\n    }\n}\n","vendor/symfony/console/Command/HelpCommand.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Command;\n\nuse Symfony\\Component\\Console\\Descriptor\\ApplicationDescription;\nuse Symfony\\Component\\Console\\Helper\\DescriptorHelper;\nuse Symfony\\Component\\Console\\Input\\InputArgument;\nuse Symfony\\Component\\Console\\Input\\InputInterface;\nuse Symfony\\Component\\Console\\Input\\InputOption;\nuse Symfony\\Component\\Console\\Output\\OutputInterface;\n\n/**\n * HelpCommand displays the help for a given command.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n */\nclass HelpCommand extends Command\n{\n    private Command $command;\n\n    protected function configure(): void\n    {\n        $this->ignoreValidationErrors();\n\n        $this\n            ->setName('help')\n            ->setDefinition([\n                new InputArgument('command_name', InputArgument::OPTIONAL, 'The command name', 'help', fn () => array_keys((new ApplicationDescription($this->getApplication()))->getCommands())),\n                new InputOption('format', null, InputOption::VALUE_REQUIRED, 'The output format (txt, xml, json, or md)', 'txt', static fn () => (new DescriptorHelper())->getFormats()),\n                new InputOption('raw', null, InputOption::VALUE_NONE, 'To output raw command help'),\n            ])\n            ->setDescription('Display help for a command')\n            ->setHelp(<<<'EOF'\n                The <info>%command.name%</info> command displays help for a given command:\n\n                  <info>%command.full_name% list</info>\n\n                You can also output the help in other formats by using the <info>--format</info> option:\n\n                  <info>%command.full_name% --format=xml list</info>\n\n                To display the list of available commands, please use the <info>list</info> command.\n                EOF\n            )\n        ;\n    }\n\n    public function setCommand(Command $command): void\n    {\n        $this->command = $command;\n    }\n\n    protected function execute(InputInterface $input, OutputInterface $output): int\n    {\n        $this->command ??= $this->getApplication()->find($input->getArgument('command_name'));\n\n        $helper = new DescriptorHelper();\n        $helper->describe($output, $this->command, [\n            'format' => $input->getOption('format'),\n            'raw_text' => $input->getOption('raw'),\n        ]);\n\n        unset($this->command);\n\n        return 0;\n    }\n}\n","vendor/symfony/console/Command/InvokableCommand.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Command;\n\nuse Symfony\\Component\\Console\\Application;\nuse Symfony\\Component\\Console\\Attribute\\Argument;\nuse Symfony\\Component\\Console\\Attribute\\Interact;\nuse Symfony\\Component\\Console\\Attribute\\MapInput;\nuse Symfony\\Component\\Console\\Attribute\\Option;\nuse Symfony\\Component\\Console\\Cursor;\nuse Symfony\\Component\\Console\\Exception\\LogicException;\nuse Symfony\\Component\\Console\\Exception\\RuntimeException;\nuse Symfony\\Component\\Console\\Input\\InputArgument;\nuse Symfony\\Component\\Console\\Input\\InputDefinition;\nuse Symfony\\Component\\Console\\Input\\InputInterface;\nuse Symfony\\Component\\Console\\Interaction\\Interaction;\nuse Symfony\\Component\\Console\\Output\\OutputInterface;\nuse Symfony\\Component\\Console\\Style\\SymfonyStyle;\n\n/**\n * Represents an invokable command.\n *\n * @author Yonel Ceruto <open@yceruto.dev>\n *\n * @internal\n */\nclass InvokableCommand implements SignalableCommandInterface\n{\n    private readonly ?SignalableCommandInterface $signalableCommand;\n    private readonly \\ReflectionFunction $invokable;\n    /**\n     * @var list<Interaction>|null\n     */\n    private ?array $interactions = null;\n    private bool $triggerDeprecations = false;\n    private $code;\n\n    public function __construct(\n        private readonly Command $command,\n        callable $code,\n    ) {\n        $this->code = $code;\n        $this->signalableCommand = $code instanceof SignalableCommandInterface ? $code : null;\n        $this->invokable = new \\ReflectionFunction($this->getClosure($code));\n    }\n\n    /**\n     * Invokes a callable with parameters generated from the input interface.\n     */\n    public function __invoke(InputInterface $input, OutputInterface $output): int\n    {\n        $statusCode = $this->invokable->invoke(...$this->getParameters($this->invokable, $input, $output));\n\n        if (!\\is_int($statusCode)) {\n            if ($this->triggerDeprecations) {\n                trigger_deprecation('symfony/console', '7.3', \\sprintf('Returning a non-integer value from the command \"%s\" is deprecated and will throw an exception in Symfony 8.0.', $this->command->getName()));\n\n                return 0;\n            }\n\n            throw new \\TypeError(\\sprintf('The command \"%s\" must return an integer value in the \"%s\" method, but \"%s\" was returned.', $this->command->getName(), $this->invokable->getName(), get_debug_type($statusCode)));\n        }\n\n        return $statusCode;\n    }\n\n    /**\n     * Configures the input definition from an invokable-defined function.\n     *\n     * Processes the parameters of the reflection function to extract and\n     * add arguments or options to the provided input definition.\n     */\n    public function configure(InputDefinition $definition): void\n    {\n        foreach ($this->invokable->getParameters() as $parameter) {\n            if ($argument = Argument::tryFrom($parameter)) {\n                $definition->addArgument($argument->toInputArgument());\n                continue;\n            }\n\n            if ($option = Option::tryFrom($parameter)) {\n                $definition->addOption($option->toInputOption());\n                continue;\n            }\n\n            if ($input = MapInput::tryFrom($parameter)) {\n                $inputArguments = array_map(static fn (Argument $a) => $a->toInputArgument(), iterator_to_array($input->getArguments(), false));\n\n                // make sure optional arguments are defined after required ones\n                usort($inputArguments, static fn (InputArgument $a, InputArgument $b) => (int) $b->isRequired() - (int) $a->isRequired());\n\n                foreach ($inputArguments as $inputArgument) {\n                    $definition->addArgument($inputArgument);\n                }\n\n                foreach ($input->getOptions() as $option) {\n                    $definition->addOption($option->toInputOption());\n                }\n            }\n        }\n    }\n\n    public function getCode(): callable\n    {\n        return $this->code;\n    }\n\n    private function getClosure(callable $code): \\Closure\n    {\n        if (!$code instanceof \\Closure) {\n            return $code(...);\n        }\n\n        $this->triggerDeprecations = true;\n\n        if (null !== (new \\ReflectionFunction($code))->getClosureThis()) {\n            return $code;\n        }\n\n        set_error_handler(static function () {});\n        try {\n            if ($c = \\Closure::bind($code, $this->command)) {\n                $code = $c;\n            }\n        } finally {\n            restore_error_handler();\n        }\n\n        return $code;\n    }\n\n    private function getParameters(\\ReflectionFunction $function, InputInterface $input, OutputInterface $output): array\n    {\n        $parameters = [];\n        foreach ($function->getParameters() as $parameter) {\n            if ($argument = Argument::tryFrom($parameter)) {\n                $parameters[] = $argument->resolveValue($input);\n\n                continue;\n            }\n\n            if ($option = Option::tryFrom($parameter)) {\n                $parameters[] = $option->resolveValue($input);\n\n                continue;\n            }\n\n            if ($in = MapInput::tryFrom($parameter)) {\n                $parameters[] = $in->resolveValue($input);\n\n                continue;\n            }\n\n            $type = $parameter->getType();\n\n            if (!$type instanceof \\ReflectionNamedType) {\n                if ($this->triggerDeprecations) {\n                    trigger_deprecation('symfony/console', '7.3', \\sprintf('Omitting the type declaration for the parameter \"$%s\" is deprecated and will throw an exception in Symfony 8.0.', $parameter->getName()));\n\n                    continue;\n                }\n\n                throw new LogicException(\\sprintf('The parameter \"$%s\" must have a named type. Untyped, Union or Intersection types are not supported.', $parameter->getName()));\n            }\n\n            $parameters[] = match ($type->getName()) {\n                InputInterface::class => $input,\n                OutputInterface::class => $output,\n                Cursor::class => new Cursor($output),\n                SymfonyStyle::class => new SymfonyStyle($input, $output),\n                Application::class => $this->command->getApplication(),\n                default => throw new RuntimeException(\\sprintf('Unsupported type \"%s\" for parameter \"$%s\".', $type->getName(), $parameter->getName())),\n            };\n        }\n\n        return $parameters ?: [$input, $output];\n    }\n\n    public function getSubscribedSignals(): array\n    {\n        return $this->signalableCommand?->getSubscribedSignals() ?? [];\n    }\n\n    public function handleSignal(int $signal, int|false $previousExitCode = 0): int|false\n    {\n        return $this->signalableCommand?->handleSignal($signal, $previousExitCode) ?? false;\n    }\n\n    public function isInteractive(): bool\n    {\n        if (null === $this->interactions) {\n            $this->collectInteractions();\n        }\n\n        return [] !== $this->interactions;\n    }\n\n    public function interact(InputInterface $input, OutputInterface $output): void\n    {\n        if (null === $this->interactions) {\n            $this->collectInteractions();\n        }\n\n        foreach ($this->interactions as $interaction) {\n            $interaction->interact($input, $output, $this->getParameters(...));\n        }\n    }\n\n    private function collectInteractions(): void\n    {\n        $invokableThis = $this->invokable->getClosureThis();\n\n        $this->interactions = [];\n        foreach ($this->invokable->getParameters() as $parameter) {\n            if ($spec = Argument::tryFrom($parameter)) {\n                if ($attribute = $spec->getInteractiveAttribute()) {\n                    $this->interactions[] = new Interaction($invokableThis, $attribute);\n                }\n\n                continue;\n            }\n\n            if ($spec = MapInput::tryFrom($parameter)) {\n                $this->interactions = [...$this->interactions, ...$spec->getPropertyInteractions(), ...$spec->getMethodInteractions()];\n            }\n        }\n\n        if (!$class = $this->invokable->getClosureCalledClass()) {\n            return;\n        }\n\n        foreach ($class->getMethods() as $method) {\n            if ($attribute = Interact::tryFrom($method)) {\n                $this->interactions[] = new Interaction($invokableThis, $attribute);\n            }\n        }\n    }\n}\n","vendor/symfony/console/Command/LazyCommand.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Command;\n\nuse Symfony\\Component\\Console\\Application;\nuse Symfony\\Component\\Console\\Completion\\CompletionInput;\nuse Symfony\\Component\\Console\\Completion\\CompletionSuggestions;\nuse Symfony\\Component\\Console\\Completion\\Suggestion;\nuse Symfony\\Component\\Console\\Helper\\HelperInterface;\nuse Symfony\\Component\\Console\\Helper\\HelperSet;\nuse Symfony\\Component\\Console\\Input\\InputDefinition;\nuse Symfony\\Component\\Console\\Input\\InputInterface;\nuse Symfony\\Component\\Console\\Output\\OutputInterface;\n\n/**\n * @author Nicolas Grekas <p@tchwork.com>\n */\nfinal class LazyCommand extends Command\n{\n    private \\Closure|Command $command;\n\n    public function __construct(\n        string $name,\n        array $aliases,\n        string $description,\n        bool $isHidden,\n        \\Closure $commandFactory,\n        private ?bool $isEnabled = true,\n    ) {\n        $this->setName($name)\n            ->setAliases($aliases)\n            ->setHidden($isHidden)\n            ->setDescription($description);\n\n        $this->command = $commandFactory;\n    }\n\n    public function ignoreValidationErrors(): void\n    {\n        $this->getCommand()->ignoreValidationErrors();\n    }\n\n    public function setApplication(?Application $application): void\n    {\n        if ($this->command instanceof parent) {\n            $this->command->setApplication($application);\n        }\n\n        parent::setApplication($application);\n    }\n\n    public function setHelperSet(HelperSet $helperSet): void\n    {\n        if ($this->command instanceof parent) {\n            $this->command->setHelperSet($helperSet);\n        }\n\n        parent::setHelperSet($helperSet);\n    }\n\n    public function isEnabled(): bool\n    {\n        return $this->isEnabled ?? $this->getCommand()->isEnabled();\n    }\n\n    public function run(InputInterface $input, OutputInterface $output): int\n    {\n        return $this->getCommand()->run($input, $output);\n    }\n\n    public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void\n    {\n        $this->getCommand()->complete($input, $suggestions);\n    }\n\n    public function setCode(callable $code): static\n    {\n        $this->getCommand()->setCode($code);\n\n        return $this;\n    }\n\n    /**\n     * @internal\n     */\n    public function mergeApplicationDefinition(bool $mergeArgs = true): void\n    {\n        $this->getCommand()->mergeApplicationDefinition($mergeArgs);\n    }\n\n    public function setDefinition(array|InputDefinition $definition): static\n    {\n        $this->getCommand()->setDefinition($definition);\n\n        return $this;\n    }\n\n    public function getDefinition(): InputDefinition\n    {\n        return $this->getCommand()->getDefinition();\n    }\n\n    public function getNativeDefinition(): InputDefinition\n    {\n        return $this->getCommand()->getNativeDefinition();\n    }\n\n    /**\n     * @param array|\\Closure(CompletionInput,CompletionSuggestions):list<string|Suggestion> $suggestedValues The values used for input completion\n     */\n    public function addArgument(string $name, ?int $mode = null, string $description = '', mixed $default = null, array|\\Closure $suggestedValues = []): static\n    {\n        $this->getCommand()->addArgument($name, $mode, $description, $default, $suggestedValues);\n\n        return $this;\n    }\n\n    /**\n     * @param array|\\Closure(CompletionInput,CompletionSuggestions):list<string|Suggestion> $suggestedValues The values used for input completion\n     */\n    public function addOption(string $name, string|array|null $shortcut = null, ?int $mode = null, string $description = '', mixed $default = null, array|\\Closure $suggestedValues = []): static\n    {\n        $this->getCommand()->addOption($name, $shortcut, $mode, $description, $default, $suggestedValues);\n\n        return $this;\n    }\n\n    public function setProcessTitle(string $title): static\n    {\n        $this->getCommand()->setProcessTitle($title);\n\n        return $this;\n    }\n\n    public function setHelp(string $help): static\n    {\n        $this->getCommand()->setHelp($help);\n\n        return $this;\n    }\n\n    public function getHelp(): string\n    {\n        return $this->getCommand()->getHelp();\n    }\n\n    public function getProcessedHelp(): string\n    {\n        return $this->getCommand()->getProcessedHelp();\n    }\n\n    public function getSynopsis(bool $short = false): string\n    {\n        return $this->getCommand()->getSynopsis($short);\n    }\n\n    public function addUsage(string $usage): static\n    {\n        $this->getCommand()->addUsage($usage);\n\n        return $this;\n    }\n\n    public function getUsages(): array\n    {\n        return $this->getCommand()->getUsages();\n    }\n\n    public function getHelper(string $name): HelperInterface\n    {\n        return $this->getCommand()->getHelper($name);\n    }\n\n    public function getCommand(): parent\n    {\n        if (!$this->command instanceof \\Closure) {\n            return $this->command;\n        }\n\n        $command = $this->command = ($this->command)();\n        $command->setApplication($this->getApplication());\n\n        if (null !== $this->getHelperSet()) {\n            $command->setHelperSet($this->getHelperSet());\n        }\n\n        $command->setName($this->getName())\n            ->setAliases($this->getAliases())\n            ->setHidden($this->isHidden())\n            ->setDescription($this->getDescription());\n\n        // Will throw if the command is not correctly initialized.\n        $command->getDefinition();\n\n        return $command;\n    }\n}\n","vendor/symfony/console/Command/ListCommand.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Command;\n\nuse Symfony\\Component\\Console\\Descriptor\\ApplicationDescription;\nuse Symfony\\Component\\Console\\Helper\\DescriptorHelper;\nuse Symfony\\Component\\Console\\Input\\InputArgument;\nuse Symfony\\Component\\Console\\Input\\InputInterface;\nuse Symfony\\Component\\Console\\Input\\InputOption;\nuse Symfony\\Component\\Console\\Output\\OutputInterface;\n\n/**\n * ListCommand displays the list of all available commands for the application.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n */\nclass ListCommand extends Command\n{\n    protected function configure(): void\n    {\n        $this\n            ->setName('list')\n            ->setDefinition([\n                new InputArgument('namespace', InputArgument::OPTIONAL, 'The namespace name', null, fn () => array_keys((new ApplicationDescription($this->getApplication()))->getNamespaces())),\n                new InputOption('raw', null, InputOption::VALUE_NONE, 'To output raw command list'),\n                new InputOption('format', null, InputOption::VALUE_REQUIRED, 'The output format (txt, xml, json, or md)', 'txt', static fn () => (new DescriptorHelper())->getFormats()),\n                new InputOption('short', null, InputOption::VALUE_NONE, 'To skip describing commands\\' arguments'),\n            ])\n            ->setDescription('List commands')\n            ->setHelp(<<<'EOF'\n                The <info>%command.name%</info> command lists all commands:\n\n                  <info>%command.full_name%</info>\n\n                You can also display the commands for a specific namespace:\n\n                  <info>%command.full_name% test</info>\n\n                You can also output the information in other formats by using the <info>--format</info> option:\n\n                  <info>%command.full_name% --format=xml</info>\n\n                It's also possible to get raw list of commands (useful for embedding command runner):\n\n                  <info>%command.full_name% --raw</info>\n                EOF\n            )\n        ;\n    }\n\n    protected function execute(InputInterface $input, OutputInterface $output): int\n    {\n        $helper = new DescriptorHelper();\n        $helper->describe($output, $this->getApplication(), [\n            'format' => $input->getOption('format'),\n            'raw_text' => $input->getOption('raw'),\n            'namespace' => $input->getArgument('namespace'),\n            'short' => $input->getOption('short'),\n        ]);\n\n        return 0;\n    }\n}\n","vendor/symfony/console/Command/LockableTrait.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Command;\n\nuse Symfony\\Component\\Console\\Attribute\\AsCommand;\nuse Symfony\\Component\\Console\\Exception\\LogicException;\nuse Symfony\\Component\\Lock\\LockFactory;\nuse Symfony\\Component\\Lock\\LockInterface;\nuse Symfony\\Component\\Lock\\Store\\FlockStore;\nuse Symfony\\Component\\Lock\\Store\\SemaphoreStore;\n\n/**\n * Basic lock feature for commands.\n *\n * @author Geoffrey Brier <geoffrey.brier@gmail.com>\n */\ntrait LockableTrait\n{\n    private ?LockInterface $lock = null;\n\n    private ?LockFactory $lockFactory = null;\n\n    /**\n     * Locks a command.\n     */\n    private function lock(?string $name = null, bool $blocking = false): bool\n    {\n        if (!class_exists(SemaphoreStore::class)) {\n            throw new LogicException('To enable the locking feature you must install the symfony/lock component. Try running \"composer require symfony/lock\".');\n        }\n\n        if (null !== $this->lock) {\n            throw new LogicException('A lock is already in place.');\n        }\n\n        if (null === $this->lockFactory) {\n            if (SemaphoreStore::isSupported()) {\n                $store = new SemaphoreStore();\n            } else {\n                $store = new FlockStore();\n            }\n\n            $this->lockFactory = new LockFactory($store);\n        }\n\n        if (!$name) {\n            if ($this instanceof Command) {\n                $name = $this->getName();\n            } elseif ($attribute = (new \\ReflectionClass($this::class))->getAttributes(AsCommand::class)) {\n                $name = $attribute[0]->newInstance()->name;\n            } else {\n                throw new LogicException(\\sprintf('Lock name missing: provide it via \"%s()\", #[AsCommand] attribute, or by extending Command class.', __METHOD__));\n            }\n        }\n\n        $this->lock = $this->lockFactory->createLock($name);\n        if (!$this->lock->acquire($blocking)) {\n            $this->lock = null;\n\n            return false;\n        }\n\n        return true;\n    }\n\n    /**\n     * Releases the command lock if there is one.\n     */\n    private function release(): void\n    {\n        if ($this->lock) {\n            $this->lock->release();\n            $this->lock = null;\n        }\n    }\n}\n","vendor/symfony/console/Command/SignalableCommandInterface.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Command;\n\n/**\n * Interface for command reacting to signal.\n *\n * @author Grégoire Pineau <lyrixx@lyrix.info>\n */\ninterface SignalableCommandInterface\n{\n    /**\n     * Returns the list of signals to subscribe.\n     *\n     * @return list<\\SIG*>\n     *\n     * @see https://php.net/pcntl.constants for signals\n     */\n    public function getSubscribedSignals(): array;\n\n    /**\n     * The method will be called when the application is signaled.\n     *\n     * @return int|false The exit code to return or false to continue the normal execution\n     */\n    public function handleSignal(int $signal, int|false $previousExitCode = 0): int|false;\n}\n","vendor/symfony/console/Command/TraceableCommand.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Command;\n\nuse Symfony\\Component\\Console\\Application;\nuse Symfony\\Component\\Console\\Completion\\CompletionInput;\nuse Symfony\\Component\\Console\\Completion\\CompletionSuggestions;\nuse Symfony\\Component\\Console\\Helper\\HelperInterface;\nuse Symfony\\Component\\Console\\Helper\\HelperSet;\nuse Symfony\\Component\\Console\\Input\\InputDefinition;\nuse Symfony\\Component\\Console\\Input\\InputInterface;\nuse Symfony\\Component\\Console\\Output\\ConsoleOutputInterface;\nuse Symfony\\Component\\Console\\Output\\OutputInterface;\nuse Symfony\\Component\\Stopwatch\\Stopwatch;\n\n/**\n * @internal\n *\n * @author Jules Pietri <jules@heahprod.com>\n */\nfinal class TraceableCommand extends Command\n{\n    public readonly Command $command;\n    public int $exitCode;\n    public ?int $interruptedBySignal = null;\n    public bool $ignoreValidation;\n    public bool $isInteractive = false;\n    public string $duration = 'n/a';\n    public string $maxMemoryUsage = 'n/a';\n    public InputInterface $input;\n    public OutputInterface $output;\n    /** @var array<string, mixed> */\n    public array $arguments;\n    /** @var array<string, mixed> */\n    public array $options;\n    /** @var array<string, mixed> */\n    public array $interactiveInputs = [];\n    public array $handledSignals = [];\n    public ?array $invokableCommandInfo = null;\n\n    public function __construct(\n        Command $command,\n        private readonly Stopwatch $stopwatch,\n    ) {\n        if ($command instanceof LazyCommand) {\n            $command = $command->getCommand();\n        }\n\n        $this->command = $command;\n\n        // prevent call to self::getDefaultDescription()\n        $this->setDescription($command->getDescription());\n\n        parent::__construct($command->getName());\n\n        // init below enables calling {@see parent::run()}\n        [$code, $processTitle, $ignoreValidationErrors] = \\Closure::bind(fn () => [$this->code, $this->processTitle, $this->ignoreValidationErrors], $command, Command::class)();\n\n        if (\\is_callable($code)) {\n            $this->setCode($code);\n        }\n\n        if ($processTitle) {\n            parent::setProcessTitle($processTitle);\n        }\n\n        if ($ignoreValidationErrors) {\n            parent::ignoreValidationErrors();\n        }\n\n        $this->ignoreValidation = $ignoreValidationErrors;\n    }\n\n    public function __call(string $name, array $arguments): mixed\n    {\n        return $this->command->{$name}(...$arguments);\n    }\n\n    public function getSubscribedSignals(): array\n    {\n        return $this->command->getSubscribedSignals();\n    }\n\n    public function handleSignal(int $signal, int|false $previousExitCode = 0): int|false\n    {\n        $event = $this->stopwatch->start($this->getName().'.handle_signal');\n\n        $exit = $this->command->handleSignal($signal, $previousExitCode);\n\n        $event->stop();\n\n        if (!isset($this->handledSignals[$signal])) {\n            $this->handledSignals[$signal] = [\n                'handled' => 0,\n                'duration' => 0,\n                'memory' => 0,\n            ];\n        }\n\n        ++$this->handledSignals[$signal]['handled'];\n        $this->handledSignals[$signal]['duration'] += $event->getDuration();\n        $this->handledSignals[$signal]['memory'] = max(\n            $this->handledSignals[$signal]['memory'],\n            $event->getMemory() >> 20\n        );\n\n        return $exit;\n    }\n\n    /**\n     * {@inheritdoc}\n     *\n     * Calling parent method is required to be used in {@see parent::run()}.\n     */\n    public function ignoreValidationErrors(): void\n    {\n        $this->ignoreValidation = true;\n        $this->command->ignoreValidationErrors();\n\n        parent::ignoreValidationErrors();\n    }\n\n    public function setApplication(?Application $application = null): void\n    {\n        $this->command->setApplication($application);\n    }\n\n    public function getApplication(): ?Application\n    {\n        return $this->command->getApplication();\n    }\n\n    public function setHelperSet(HelperSet $helperSet): void\n    {\n        $this->command->setHelperSet($helperSet);\n    }\n\n    public function getHelperSet(): ?HelperSet\n    {\n        return $this->command->getHelperSet();\n    }\n\n    public function isEnabled(): bool\n    {\n        return $this->command->isEnabled();\n    }\n\n    public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void\n    {\n        $this->command->complete($input, $suggestions);\n    }\n\n    /**\n     * {@inheritdoc}\n     *\n     * Calling parent method is required to be used in {@see parent::run()}.\n     */\n    public function setCode(callable $code): static\n    {\n        if ($code instanceof InvokableCommand) {\n            $r = \\Closure::bind(fn () => $this->invokable, $code, InvokableCommand::class)();\n\n            $this->invokableCommandInfo = [\n                'class' => $r->getClosureScopeClass()->name,\n                'file' => $r->getFileName(),\n                'line' => $r->getStartLine(),\n            ];\n\n            // Pass the original callable to avoid double-wrapping in Command::setCode()\n            $this->command->setCode($code->getCode());\n        } else {\n            $this->command->setCode($code);\n        }\n\n        return parent::setCode(function (InputInterface $input, OutputInterface $output) use ($code): int {\n            $event = $this->stopwatch->start($this->getName().'.code');\n\n            $this->exitCode = $code($input, $output);\n\n            $event->stop();\n\n            return $this->exitCode;\n        });\n    }\n\n    /**\n     * @internal\n     */\n    public function mergeApplicationDefinition(bool $mergeArgs = true): void\n    {\n        $this->command->mergeApplicationDefinition($mergeArgs);\n    }\n\n    public function setDefinition(array|InputDefinition $definition): static\n    {\n        $this->command->setDefinition($definition);\n\n        return $this;\n    }\n\n    public function getDefinition(): InputDefinition\n    {\n        return $this->command->getDefinition();\n    }\n\n    public function getNativeDefinition(): InputDefinition\n    {\n        return $this->command->getNativeDefinition();\n    }\n\n    public function addArgument(string $name, ?int $mode = null, string $description = '', mixed $default = null, array|\\Closure $suggestedValues = []): static\n    {\n        $this->command->addArgument($name, $mode, $description, $default, $suggestedValues);\n\n        return $this;\n    }\n\n    public function addOption(string $name, string|array|null $shortcut = null, ?int $mode = null, string $description = '', mixed $default = null, array|\\Closure $suggestedValues = []): static\n    {\n        $this->command->addOption($name, $shortcut, $mode, $description, $default, $suggestedValues);\n\n        return $this;\n    }\n\n    /**\n     * {@inheritdoc}\n     *\n     * Calling parent method is required to be used in {@see parent::run()}.\n     */\n    public function setProcessTitle(string $title): static\n    {\n        $this->command->setProcessTitle($title);\n\n        return parent::setProcessTitle($title);\n    }\n\n    public function setHelp(string $help): static\n    {\n        $this->command->setHelp($help);\n\n        return $this;\n    }\n\n    public function getHelp(): string\n    {\n        return $this->command->getHelp();\n    }\n\n    public function getProcessedHelp(): string\n    {\n        return $this->command->getProcessedHelp();\n    }\n\n    public function getSynopsis(bool $short = false): string\n    {\n        return $this->command->getSynopsis($short);\n    }\n\n    public function addUsage(string $usage): static\n    {\n        $this->command->addUsage($usage);\n\n        return $this;\n    }\n\n    public function getUsages(): array\n    {\n        return $this->command->getUsages();\n    }\n\n    public function getHelper(string $name): HelperInterface\n    {\n        return $this->command->getHelper($name);\n    }\n\n    public function run(InputInterface $input, OutputInterface $output): int\n    {\n        $this->input = $input;\n        $this->output = $output;\n        $initialArguments = $input->getArguments();\n        $initialOptions = $input->getOptions();\n        $event = $this->stopwatch->start($this->getName(), 'command');\n\n        try {\n            $this->exitCode = $this->command->run($input, $output);\n        } finally {\n            $event->stop();\n\n            if ($output instanceof ConsoleOutputInterface && $output->isDebug()) {\n                $output->getErrorOutput()->writeln((string) $event);\n            }\n\n            $this->duration = $event->getDuration().' ms';\n            $this->maxMemoryUsage = ($event->getMemory() >> 20).' MiB';\n\n            $this->arguments = $input->getArguments();\n            $this->options = $input->getOptions();\n\n            $this->extractInteractiveInputs($initialArguments, $initialOptions);\n            $this->isInteractive = $this->isInteractive || $this->interactiveInputs;\n        }\n\n        return $this->exitCode;\n    }\n\n    protected function initialize(InputInterface $input, OutputInterface $output): void\n    {\n        $event = $this->stopwatch->start($this->getName().'.init', 'command');\n\n        $this->command->initialize($input, $output);\n\n        $event->stop();\n    }\n\n    protected function interact(InputInterface $input, OutputInterface $output): void\n    {\n        if (!$this->isInteractive = Command::class !== (new \\ReflectionMethod($this->command, 'interact'))->getDeclaringClass()->getName()) {\n            return;\n        }\n\n        $event = $this->stopwatch->start($this->getName().'.interact', 'command');\n\n        $this->command->interact($input, $output);\n\n        $event->stop();\n    }\n\n    protected function execute(InputInterface $input, OutputInterface $output): int\n    {\n        $event = $this->stopwatch->start($this->getName().'.execute', 'command');\n\n        $exitCode = $this->command->execute($input, $output);\n\n        $event->stop();\n\n        return $exitCode;\n    }\n\n    private function extractInteractiveInputs(array $initialArguments, array $initialOptions): void\n    {\n        $nativeDefinition = $this->command->getNativeDefinition();\n\n        foreach ($nativeDefinition->getArguments() as $argName => $argument) {\n            if (\\array_key_exists($argName, $initialArguments) && $initialArguments[$argName] === $this->arguments[$argName]) {\n                continue;\n            }\n\n            $this->interactiveInputs[$argName] = $this->arguments[$argName];\n        }\n\n        foreach ($nativeDefinition->getOptions() as $optName => $option) {\n            if (\\array_key_exists($optName, $initialOptions) && $initialOptions[$optName] === $this->options[$optName]) {\n                continue;\n            }\n\n            $this->interactiveInputs['--'.$optName] = $this->options[$optName];\n        }\n    }\n}\n","vendor/symfony/console/CommandLoader/CommandLoaderInterface.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\CommandLoader;\n\nuse Symfony\\Component\\Console\\Command\\Command;\nuse Symfony\\Component\\Console\\Exception\\CommandNotFoundException;\n\n/**\n * @author Robin Chalas <robin.chalas@gmail.com>\n */\ninterface CommandLoaderInterface\n{\n    /**\n     * Loads a command.\n     *\n     * @throws CommandNotFoundException\n     */\n    public function get(string $name): Command;\n\n    /**\n     * Checks if a command exists.\n     */\n    public function has(string $name): bool;\n\n    /**\n     * @return string[]\n     */\n    public function getNames(): array;\n}\n","vendor/symfony/console/CommandLoader/ContainerCommandLoader.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\CommandLoader;\n\nuse Psr\\Container\\ContainerInterface;\nuse Symfony\\Component\\Console\\Command\\Command;\nuse Symfony\\Component\\Console\\Exception\\CommandNotFoundException;\n\n/**\n * Loads commands from a PSR-11 container.\n *\n * @author Robin Chalas <robin.chalas@gmail.com>\n */\nclass ContainerCommandLoader implements CommandLoaderInterface\n{\n    /**\n     * @param array $commandMap An array with command names as keys and service ids as values\n     */\n    public function __construct(\n        private ContainerInterface $container,\n        private array $commandMap,\n    ) {\n    }\n\n    public function get(string $name): Command\n    {\n        if (!$this->has($name)) {\n            throw new CommandNotFoundException(\\sprintf('Command \"%s\" does not exist.', $name));\n        }\n\n        return $this->container->get($this->commandMap[$name]);\n    }\n\n    public function has(string $name): bool\n    {\n        return isset($this->commandMap[$name]) && $this->container->has($this->commandMap[$name]);\n    }\n\n    public function getNames(): array\n    {\n        return array_keys($this->commandMap);\n    }\n}\n","vendor/symfony/console/CommandLoader/FactoryCommandLoader.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\CommandLoader;\n\nuse Symfony\\Component\\Console\\Command\\Command;\nuse Symfony\\Component\\Console\\Exception\\CommandNotFoundException;\n\n/**\n * A simple command loader using factories to instantiate commands lazily.\n *\n * @author Maxime Steinhausser <maxime.steinhausser@gmail.com>\n */\nclass FactoryCommandLoader implements CommandLoaderInterface\n{\n    /**\n     * @param callable[] $factories Indexed by command names\n     */\n    public function __construct(\n        private array $factories,\n    ) {\n    }\n\n    public function has(string $name): bool\n    {\n        return isset($this->factories[$name]);\n    }\n\n    public function get(string $name): Command\n    {\n        if (!isset($this->factories[$name])) {\n            throw new CommandNotFoundException(\\sprintf('Command \"%s\" does not exist.', $name));\n        }\n\n        $factory = $this->factories[$name];\n\n        return $factory();\n    }\n\n    public function getNames(): array\n    {\n        return array_keys($this->factories);\n    }\n}\n","vendor/symfony/console/Completion/CompletionInput.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Completion;\n\nuse Symfony\\Component\\Console\\Exception\\RuntimeException;\nuse Symfony\\Component\\Console\\Input\\ArgvInput;\nuse Symfony\\Component\\Console\\Input\\InputDefinition;\nuse Symfony\\Component\\Console\\Input\\InputOption;\n\n/**\n * An input specialized for shell completion.\n *\n * This input allows unfinished option names or values and exposes what kind of\n * completion is expected.\n *\n * @author Wouter de Jong <wouter@wouterj.nl>\n */\nfinal class CompletionInput extends ArgvInput\n{\n    public const TYPE_ARGUMENT_VALUE = 'argument_value';\n    public const TYPE_OPTION_VALUE = 'option_value';\n    public const TYPE_OPTION_NAME = 'option_name';\n    public const TYPE_NONE = 'none';\n\n    private array $tokens;\n    private int $currentIndex;\n    private string $completionType;\n    private ?string $completionName = null;\n    private string $completionValue = '';\n\n    /**\n     * Converts a terminal string into tokens.\n     *\n     * This is required for shell completions without COMP_WORDS support.\n     */\n    public static function fromString(string $inputStr, int $currentIndex): self\n    {\n        preg_match_all('/(?<=^|\\s)([\\'\"]?)(.+?)(?<!\\\\\\\\)\\1(?=$|\\s)/', $inputStr, $tokens);\n\n        return self::fromTokens($tokens[0], $currentIndex);\n    }\n\n    /**\n     * Create an input based on an COMP_WORDS token list.\n     *\n     * @param string[] $tokens       the set of split tokens (e.g. COMP_WORDS or argv)\n     * @param int      $currentIndex the index of the cursor (e.g. COMP_CWORD)\n     */\n    public static function fromTokens(array $tokens, int $currentIndex): self\n    {\n        $input = new self($tokens);\n        $input->tokens = $tokens;\n        $input->currentIndex = $currentIndex;\n\n        return $input;\n    }\n\n    public function bind(InputDefinition $definition): void\n    {\n        parent::bind($definition);\n\n        $relevantToken = $this->getRelevantToken();\n        if ('-' === $relevantToken[0]) {\n            // the current token is an input option: complete either option name or option value\n            [$optionToken, $optionValue] = explode('=', $relevantToken, 2) + ['', ''];\n\n            $option = $this->getOptionFromToken($optionToken);\n            if (null === $option && !$this->isCursorFree()) {\n                $this->completionType = self::TYPE_OPTION_NAME;\n                $this->completionValue = $relevantToken;\n\n                return;\n            }\n\n            if ($option?->acceptValue()) {\n                $this->completionType = self::TYPE_OPTION_VALUE;\n                $this->completionName = $option->getName();\n                $this->completionValue = $optionValue ?: (!str_starts_with($optionToken, '--') ? substr($optionToken, 2) : '');\n\n                return;\n            }\n        }\n\n        $previousToken = $this->tokens[$this->currentIndex - 1];\n        if ('-' === $previousToken[0] && '' !== trim($previousToken, '-')) {\n            // check if previous option accepted a value\n            $previousOption = $this->getOptionFromToken($previousToken);\n            if ($previousOption?->acceptValue()) {\n                $this->completionType = self::TYPE_OPTION_VALUE;\n                $this->completionName = $previousOption->getName();\n                $this->completionValue = $relevantToken;\n\n                return;\n            }\n        }\n\n        // complete argument value\n        $this->completionType = self::TYPE_ARGUMENT_VALUE;\n\n        foreach ($this->definition->getArguments() as $argumentName => $argument) {\n            if (!isset($this->arguments[$argumentName])) {\n                break;\n            }\n\n            $argumentValue = $this->arguments[$argumentName];\n            $this->completionName = $argumentName;\n            if (\\is_array($argumentValue)) {\n                $this->completionValue = $argumentValue ? $argumentValue[array_key_last($argumentValue)] : null;\n            } else {\n                $this->completionValue = $argumentValue;\n            }\n        }\n\n        if ($this->currentIndex >= \\count($this->tokens)) {\n            if (!isset($this->arguments[$argumentName]) || $this->definition->getArgument($argumentName)->isArray()) {\n                $this->completionName = $argumentName;\n            } else {\n                // we've reached the end\n                $this->completionType = self::TYPE_NONE;\n                $this->completionName = null;\n            }\n\n            $this->completionValue = '';\n        }\n    }\n\n    /**\n     * Returns the type of completion required.\n     *\n     * TYPE_ARGUMENT_VALUE when completing the value of an input argument\n     * TYPE_OPTION_VALUE   when completing the value of an input option\n     * TYPE_OPTION_NAME    when completing the name of an input option\n     * TYPE_NONE           when nothing should be completed\n     *\n     * TYPE_OPTION_NAME and TYPE_NONE are already implemented by the Console component.\n     *\n     * @return self::TYPE_*\n     */\n    public function getCompletionType(): string\n    {\n        return $this->completionType;\n    }\n\n    /**\n     * The name of the input option or argument when completing a value.\n     *\n     * @return string|null returns null when completing an option name\n     */\n    public function getCompletionName(): ?string\n    {\n        return $this->completionName;\n    }\n\n    /**\n     * The value already typed by the user (or empty string).\n     */\n    public function getCompletionValue(): string\n    {\n        return $this->completionValue;\n    }\n\n    public function mustSuggestOptionValuesFor(string $optionName): bool\n    {\n        return self::TYPE_OPTION_VALUE === $this->getCompletionType() && $optionName === $this->getCompletionName();\n    }\n\n    public function mustSuggestArgumentValuesFor(string $argumentName): bool\n    {\n        return self::TYPE_ARGUMENT_VALUE === $this->getCompletionType() && $argumentName === $this->getCompletionName();\n    }\n\n    protected function parseToken(string $token, bool $parseOptions): bool\n    {\n        try {\n            return parent::parseToken($token, $parseOptions);\n        } catch (RuntimeException) {\n            // suppress errors, completed input is almost never valid\n        }\n\n        return $parseOptions;\n    }\n\n    private function getOptionFromToken(string $optionToken): ?InputOption\n    {\n        $optionName = ltrim($optionToken, '-');\n        if (!$optionName) {\n            return null;\n        }\n\n        if ('-' === ($optionToken[1] ?? ' ')) {\n            // long option name\n            return $this->definition->hasOption($optionName) ? $this->definition->getOption($optionName) : null;\n        }\n\n        // short option name\n        return $this->definition->hasShortcut($optionName[0]) ? $this->definition->getOptionForShortcut($optionName[0]) : null;\n    }\n\n    /**\n     * The token of the cursor, or the last token if the cursor is at the end of the input.\n     */\n    private function getRelevantToken(): string\n    {\n        return $this->tokens[$this->isCursorFree() ? $this->currentIndex - 1 : $this->currentIndex];\n    }\n\n    /**\n     * Whether the cursor is \"free\" (i.e. at the end of the input preceded by a space).\n     */\n    private function isCursorFree(): bool\n    {\n        $nrOfTokens = \\count($this->tokens);\n        if ($this->currentIndex > $nrOfTokens) {\n            throw new \\LogicException('Current index is invalid, it must be the number of input tokens or one more.');\n        }\n\n        return $this->currentIndex >= $nrOfTokens;\n    }\n\n    public function __toString(): string\n    {\n        $str = '';\n        foreach ($this->tokens as $i => $token) {\n            $str .= $token;\n\n            if ($this->currentIndex === $i) {\n                $str .= '|';\n            }\n\n            $str .= ' ';\n        }\n\n        if ($this->currentIndex > $i) {\n            $str .= '|';\n        }\n\n        return rtrim($str);\n    }\n}\n","vendor/symfony/console/Completion/CompletionSuggestions.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Completion;\n\nuse Symfony\\Component\\Console\\Input\\InputOption;\n\n/**\n * Stores all completion suggestions for the current input.\n *\n * @author Wouter de Jong <wouter@wouterj.nl>\n */\nfinal class CompletionSuggestions\n{\n    private array $valueSuggestions = [];\n    private array $optionSuggestions = [];\n\n    /**\n     * Add a suggested value for an input option or argument.\n     *\n     * @return $this\n     */\n    public function suggestValue(string|Suggestion $value): static\n    {\n        $this->valueSuggestions[] = !$value instanceof Suggestion ? new Suggestion($value) : $value;\n\n        return $this;\n    }\n\n    /**\n     * Add multiple suggested values at once for an input option or argument.\n     *\n     * @param list<string|Suggestion> $values\n     *\n     * @return $this\n     */\n    public function suggestValues(array $values): static\n    {\n        foreach ($values as $value) {\n            $this->suggestValue($value);\n        }\n\n        return $this;\n    }\n\n    /**\n     * Add a suggestion for an input option name.\n     *\n     * @return $this\n     */\n    public function suggestOption(InputOption $option): static\n    {\n        $this->optionSuggestions[] = $option;\n\n        return $this;\n    }\n\n    /**\n     * Add multiple suggestions for input option names at once.\n     *\n     * @param InputOption[] $options\n     *\n     * @return $this\n     */\n    public function suggestOptions(array $options): static\n    {\n        foreach ($options as $option) {\n            $this->suggestOption($option);\n        }\n\n        return $this;\n    }\n\n    /**\n     * @return InputOption[]\n     */\n    public function getOptionSuggestions(): array\n    {\n        return $this->optionSuggestions;\n    }\n\n    /**\n     * @return Suggestion[]\n     */\n    public function getValueSuggestions(): array\n    {\n        return $this->valueSuggestions;\n    }\n}\n","vendor/symfony/console/Completion/Output/BashCompletionOutput.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Completion\\Output;\n\nuse Symfony\\Component\\Console\\Completion\\CompletionSuggestions;\nuse Symfony\\Component\\Console\\Output\\OutputInterface;\n\n/**\n * @author Wouter de Jong <wouter@wouterj.nl>\n */\nclass BashCompletionOutput implements CompletionOutputInterface\n{\n    public function write(CompletionSuggestions $suggestions, OutputInterface $output): void\n    {\n        $values = $suggestions->getValueSuggestions();\n        foreach ($suggestions->getOptionSuggestions() as $option) {\n            $values[] = '--'.$option->getName();\n            if ($option->isNegatable()) {\n                $values[] = '--no-'.$option->getName();\n            }\n        }\n        $output->writeln(implode(\"\\n\", $values));\n    }\n}\n","vendor/symfony/console/Completion/Output/CompletionOutputInterface.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Completion\\Output;\n\nuse Symfony\\Component\\Console\\Completion\\CompletionSuggestions;\nuse Symfony\\Component\\Console\\Output\\OutputInterface;\n\n/**\n * Transforms the {@see CompletionSuggestions} object into output readable by the shell completion.\n *\n * @author Wouter de Jong <wouter@wouterj.nl>\n */\ninterface CompletionOutputInterface\n{\n    public function write(CompletionSuggestions $suggestions, OutputInterface $output): void;\n}\n","vendor/symfony/console/Completion/Output/FishCompletionOutput.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Completion\\Output;\n\nuse Symfony\\Component\\Console\\Completion\\CompletionSuggestions;\nuse Symfony\\Component\\Console\\Output\\OutputInterface;\n\n/**\n * @author Guillaume Aveline <guillaume.aveline@pm.me>\n */\nclass FishCompletionOutput implements CompletionOutputInterface\n{\n    public function write(CompletionSuggestions $suggestions, OutputInterface $output): void\n    {\n        $values = [];\n        foreach ($suggestions->getValueSuggestions() as $value) {\n            $values[] = $value->getValue().($value->getDescription() ? \"\\t\".$value->getDescription() : '');\n        }\n        foreach ($suggestions->getOptionSuggestions() as $option) {\n            $values[] = '--'.$option->getName().($option->getDescription() ? \"\\t\".$option->getDescription() : '');\n            if ($option->isNegatable()) {\n                $values[] = '--no-'.$option->getName().($option->getDescription() ? \"\\t\".$option->getDescription() : '');\n            }\n        }\n        $output->write(implode(\"\\n\", $values));\n    }\n}\n","vendor/symfony/console/Completion/Output/ZshCompletionOutput.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Completion\\Output;\n\nuse Symfony\\Component\\Console\\Completion\\CompletionSuggestions;\nuse Symfony\\Component\\Console\\Output\\OutputInterface;\n\n/**\n * @author Jitendra A <adhocore@gmail.com>\n */\nclass ZshCompletionOutput implements CompletionOutputInterface\n{\n    public function write(CompletionSuggestions $suggestions, OutputInterface $output): void\n    {\n        $values = [];\n        foreach ($suggestions->getValueSuggestions() as $value) {\n            $values[] = $value->getValue().($value->getDescription() ? \"\\t\".$value->getDescription() : '');\n        }\n        foreach ($suggestions->getOptionSuggestions() as $option) {\n            $values[] = '--'.$option->getName().($option->getDescription() ? \"\\t\".$option->getDescription() : '');\n            if ($option->isNegatable()) {\n                $values[] = '--no-'.$option->getName().($option->getDescription() ? \"\\t\".$option->getDescription() : '');\n            }\n        }\n        $output->write(implode(\"\\n\", $values).\"\\n\");\n    }\n}\n","vendor/symfony/console/Completion/Suggestion.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Completion;\n\n/**\n * Represents a single suggested value.\n *\n * @author Wouter de Jong <wouter@wouterj.nl>\n */\nclass Suggestion implements \\Stringable\n{\n    public function __construct(\n        private readonly string $value,\n        private readonly string $description = '',\n    ) {\n    }\n\n    public function getValue(): string\n    {\n        return $this->value;\n    }\n\n    public function getDescription(): string\n    {\n        return $this->description;\n    }\n\n    public function __toString(): string\n    {\n        return $this->getValue();\n    }\n}\n","vendor/symfony/console/ConsoleEvents.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console;\n\nuse Symfony\\Component\\Console\\Event\\ConsoleCommandEvent;\nuse Symfony\\Component\\Console\\Event\\ConsoleErrorEvent;\nuse Symfony\\Component\\Console\\Event\\ConsoleSignalEvent;\nuse Symfony\\Component\\Console\\Event\\ConsoleTerminateEvent;\n\n/**\n * Contains all events dispatched by an Application.\n *\n * @author Francesco Levorato <git@flevour.net>\n */\nfinal class ConsoleEvents\n{\n    /**\n     * The COMMAND event allows you to attach listeners before any command is\n     * executed by the console. It also allows you to modify the command, input and output\n     * before they are handed to the command.\n     *\n     * @Event(\"Symfony\\Component\\Console\\Event\\ConsoleCommandEvent\")\n     */\n    public const COMMAND = 'console.command';\n\n    /**\n     * The SIGNAL event allows you to perform some actions\n     * after the command execution was interrupted.\n     *\n     * @Event(\"Symfony\\Component\\Console\\Event\\ConsoleSignalEvent\")\n     */\n    public const SIGNAL = 'console.signal';\n\n    /**\n     * The TERMINATE event allows you to attach listeners after a command is\n     * executed by the console.\n     *\n     * @Event(\"Symfony\\Component\\Console\\Event\\ConsoleTerminateEvent\")\n     */\n    public const TERMINATE = 'console.terminate';\n\n    /**\n     * The ERROR event occurs when an uncaught exception or error appears.\n     *\n     * This event allows you to deal with the exception/error or\n     * to modify the thrown exception.\n     *\n     * @Event(\"Symfony\\Component\\Console\\Event\\ConsoleErrorEvent\")\n     */\n    public const ERROR = 'console.error';\n\n    /**\n     * Event aliases.\n     *\n     * These aliases can be consumed by RegisterListenersPass.\n     */\n    public const ALIASES = [\n        ConsoleCommandEvent::class => self::COMMAND,\n        ConsoleErrorEvent::class => self::ERROR,\n        ConsoleSignalEvent::class => self::SIGNAL,\n        ConsoleTerminateEvent::class => self::TERMINATE,\n    ];\n}\n","vendor/symfony/console/Cursor.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console;\n\nuse Symfony\\Component\\Console\\Output\\OutputInterface;\n\n/**\n * @author Pierre du Plessis <pdples@gmail.com>\n */\nfinal class Cursor\n{\n    /** @var resource */\n    private $input;\n\n    /**\n     * @param resource|null $input\n     */\n    public function __construct(\n        private OutputInterface $output,\n        $input = null,\n    ) {\n        $this->input = $input ?? (\\defined('STDIN') ? \\STDIN : fopen('php://input', 'r+'));\n    }\n\n    /**\n     * @return $this\n     */\n    public function moveUp(int $lines = 1): static\n    {\n        $this->output->write(\\sprintf(\"\\x1b[%dA\", $lines));\n\n        return $this;\n    }\n\n    /**\n     * @return $this\n     */\n    public function moveDown(int $lines = 1): static\n    {\n        $this->output->write(\\sprintf(\"\\x1b[%dB\", $lines));\n\n        return $this;\n    }\n\n    /**\n     * @return $this\n     */\n    public function moveRight(int $columns = 1): static\n    {\n        $this->output->write(\\sprintf(\"\\x1b[%dC\", $columns));\n\n        return $this;\n    }\n\n    /**\n     * @return $this\n     */\n    public function moveLeft(int $columns = 1): static\n    {\n        $this->output->write(\\sprintf(\"\\x1b[%dD\", $columns));\n\n        return $this;\n    }\n\n    /**\n     * @return $this\n     */\n    public function moveToColumn(int $column): static\n    {\n        $this->output->write(\\sprintf(\"\\x1b[%dG\", $column));\n\n        return $this;\n    }\n\n    /**\n     * @return $this\n     */\n    public function moveToPosition(int $column, int $row): static\n    {\n        $this->output->write(\\sprintf(\"\\x1b[%d;%dH\", $row + 1, $column));\n\n        return $this;\n    }\n\n    /**\n     * @return $this\n     */\n    public function savePosition(): static\n    {\n        $this->output->write(\"\\x1b7\");\n\n        return $this;\n    }\n\n    /**\n     * @return $this\n     */\n    public function restorePosition(): static\n    {\n        $this->output->write(\"\\x1b8\");\n\n        return $this;\n    }\n\n    /**\n     * @return $this\n     */\n    public function hide(): static\n    {\n        $this->output->write(\"\\x1b[?25l\");\n\n        return $this;\n    }\n\n    /**\n     * @return $this\n     */\n    public function show(): static\n    {\n        $this->output->write(\"\\x1b[?25h\\x1b[?0c\");\n\n        return $this;\n    }\n\n    /**\n     * Clears all the output from the current line.\n     *\n     * @return $this\n     */\n    public function clearLine(): static\n    {\n        $this->output->write(\"\\x1b[2K\");\n\n        return $this;\n    }\n\n    /**\n     * Clears all the output from the current line after the current position.\n     */\n    public function clearLineAfter(): self\n    {\n        $this->output->write(\"\\x1b[K\");\n\n        return $this;\n    }\n\n    /**\n     * Clears all the output from the cursors' current position to the end of the screen.\n     *\n     * @return $this\n     */\n    public function clearOutput(): static\n    {\n        $this->output->write(\"\\x1b[0J\");\n\n        return $this;\n    }\n\n    /**\n     * Clears the entire screen.\n     *\n     * @return $this\n     */\n    public function clearScreen(): static\n    {\n        $this->output->write(\"\\x1b[2J\");\n\n        return $this;\n    }\n\n    /**\n     * Returns the current cursor position as x,y coordinates.\n     */\n    public function getCurrentPosition(): array\n    {\n        static $isTtySupported;\n\n        if (!$isTtySupported ??= '/' === \\DIRECTORY_SEPARATOR && stream_isatty(\\STDOUT)) {\n            return [1, 1];\n        }\n\n        $sttyMode = shell_exec('stty -g');\n        shell_exec('stty -icanon -echo');\n\n        @fwrite($this->input, \"\\033[6n\");\n\n        $code = trim(fread($this->input, 1024));\n\n        shell_exec(\\sprintf('stty %s', $sttyMode));\n\n        sscanf($code, \"\\033[%d;%dR\", $row, $col);\n\n        return [$col, $row];\n    }\n}\n","vendor/symfony/console/DataCollector/CommandDataCollector.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\DataCollector;\n\nuse Symfony\\Component\\Console\\Command\\Command;\nuse Symfony\\Component\\Console\\Debug\\CliRequest;\nuse Symfony\\Component\\Console\\Output\\OutputInterface;\nuse Symfony\\Component\\Console\\SignalRegistry\\SignalMap;\nuse Symfony\\Component\\HttpFoundation\\Request;\nuse Symfony\\Component\\HttpFoundation\\Response;\nuse Symfony\\Component\\HttpKernel\\DataCollector\\DataCollector;\nuse Symfony\\Component\\VarDumper\\Cloner\\Data;\n\n/**\n * @internal\n *\n * @author Jules Pietri <jules@heahprod.com>\n */\nfinal class CommandDataCollector extends DataCollector\n{\n    public function collect(Request $request, Response $response, ?\\Throwable $exception = null): void\n    {\n        if (!$request instanceof CliRequest) {\n            return;\n        }\n\n        $command = $request->command;\n        $application = $command->getApplication();\n\n        $this->data = [\n            'command' => $command->invokableCommandInfo ?? $this->cloneVar($command->command),\n            'exit_code' => $command->exitCode,\n            'interrupted_by_signal' => $command->interruptedBySignal,\n            'duration' => $command->duration,\n            'max_memory_usage' => $command->maxMemoryUsage,\n            'verbosity_level' => match ($command->output->getVerbosity()) {\n                OutputInterface::VERBOSITY_SILENT => 'silent',\n                OutputInterface::VERBOSITY_QUIET => 'quiet',\n                OutputInterface::VERBOSITY_NORMAL => 'normal',\n                OutputInterface::VERBOSITY_VERBOSE => 'verbose',\n                OutputInterface::VERBOSITY_VERY_VERBOSE => 'very verbose',\n                OutputInterface::VERBOSITY_DEBUG => 'debug',\n            },\n            'interactive' => $command->isInteractive,\n            'validate_input' => !$command->ignoreValidation,\n            'enabled' => $command->isEnabled(),\n            'visible' => !$command->isHidden(),\n            'input' => $this->cloneVar($command->input),\n            'output' => $this->cloneVar($command->output),\n            'interactive_inputs' => array_map($this->cloneVar(...), $command->interactiveInputs),\n            'signalable' => $command->getSubscribedSignals(),\n            'handled_signals' => $command->handledSignals,\n            'helper_set' => array_map($this->cloneVar(...), iterator_to_array($command->getHelperSet())),\n        ];\n\n        $baseDefinition = $application->getDefinition();\n\n        foreach ($command->arguments as $argName => $argValue) {\n            if ($baseDefinition->hasArgument($argName)) {\n                $this->data['application_inputs'][$argName] = $this->cloneVar($argValue);\n            } else {\n                $this->data['arguments'][$argName] = $this->cloneVar($argValue);\n            }\n        }\n\n        foreach ($command->options as $optName => $optValue) {\n            if ($baseDefinition->hasOption($optName)) {\n                $this->data['application_inputs']['--'.$optName] = $this->cloneVar($optValue);\n            } else {\n                $this->data['options'][$optName] = $this->cloneVar($optValue);\n            }\n        }\n    }\n\n    public function getName(): string\n    {\n        return 'command';\n    }\n\n    /**\n     * @return array{\n     *     class?: class-string,\n     *     executor?: string,\n     *     file: string,\n     *     line: int,\n     * }\n     */\n    public function getCommand(): array\n    {\n        if (\\is_array($this->data['command'])) {\n            return $this->data['command'];\n        }\n\n        $class = $this->data['command']->getType();\n        $r = new \\ReflectionMethod($class, 'execute');\n\n        if (Command::class !== $r->getDeclaringClass()) {\n            return [\n                'executor' => $class.'::'.$r->name,\n                'file' => $r->getFileName(),\n                'line' => $r->getStartLine(),\n            ];\n        }\n\n        $r = new \\ReflectionClass($class);\n\n        return [\n            'class' => $class,\n            'file' => $r->getFileName(),\n            'line' => $r->getStartLine(),\n        ];\n    }\n\n    public function getInterruptedBySignal(): ?string\n    {\n        if (isset($this->data['interrupted_by_signal'])) {\n            return \\sprintf('%s (%d)', SignalMap::getSignalName($this->data['interrupted_by_signal']), $this->data['interrupted_by_signal']);\n        }\n\n        return null;\n    }\n\n    public function getDuration(): string\n    {\n        return $this->data['duration'];\n    }\n\n    public function getMaxMemoryUsage(): string\n    {\n        return $this->data['max_memory_usage'];\n    }\n\n    public function getVerbosityLevel(): string\n    {\n        return $this->data['verbosity_level'];\n    }\n\n    public function getInteractive(): bool\n    {\n        return $this->data['interactive'];\n    }\n\n    public function getValidateInput(): bool\n    {\n        return $this->data['validate_input'];\n    }\n\n    public function getEnabled(): bool\n    {\n        return $this->data['enabled'];\n    }\n\n    public function getVisible(): bool\n    {\n        return $this->data['visible'];\n    }\n\n    public function getInput(): Data\n    {\n        return $this->data['input'];\n    }\n\n    public function getOutput(): Data\n    {\n        return $this->data['output'];\n    }\n\n    /**\n     * @return Data[]\n     */\n    public function getArguments(): array\n    {\n        return $this->data['arguments'] ?? [];\n    }\n\n    /**\n     * @return Data[]\n     */\n    public function getOptions(): array\n    {\n        return $this->data['options'] ?? [];\n    }\n\n    /**\n     * @return Data[]\n     */\n    public function getApplicationInputs(): array\n    {\n        return $this->data['application_inputs'] ?? [];\n    }\n\n    /**\n     * @return Data[]\n     */\n    public function getInteractiveInputs(): array\n    {\n        return $this->data['interactive_inputs'] ?? [];\n    }\n\n    public function getSignalable(): array\n    {\n        return array_map(\n            static fn (int $signal): string => \\sprintf('%s (%d)', SignalMap::getSignalName($signal), $signal),\n            $this->data['signalable']\n        );\n    }\n\n    public function getHandledSignals(): array\n    {\n        $keys = array_map(\n            static fn (int $signal): string => \\sprintf('%s (%d)', SignalMap::getSignalName($signal), $signal),\n            array_keys($this->data['handled_signals'])\n        );\n\n        return array_combine($keys, array_values($this->data['handled_signals']));\n    }\n\n    /**\n     * @return Data[]\n     */\n    public function getHelperSet(): array\n    {\n        return $this->data['helper_set'] ?? [];\n    }\n\n    public function reset(): void\n    {\n        $this->data = [];\n    }\n}\n","vendor/symfony/console/Debug/CliRequest.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Debug;\n\nuse Symfony\\Component\\Console\\Command\\TraceableCommand;\nuse Symfony\\Component\\HttpFoundation\\Request;\nuse Symfony\\Component\\HttpFoundation\\Response;\n\n/**\n * @internal\n */\nfinal class CliRequest extends Request\n{\n    public function __construct(\n        public readonly TraceableCommand $command,\n    ) {\n        parent::__construct(\n            attributes: ['_controller' => $command->command::class, '_virtual_type' => 'command'],\n            server: $_SERVER,\n        );\n    }\n\n    // Methods below allow to populate a profile, thus enable search and filtering\n    public function getUri(): string\n    {\n        if ($this->server->has('SYMFONY_CLI_BINARY_NAME')) {\n            $binary = $this->server->get('SYMFONY_CLI_BINARY_NAME').' console';\n        } else {\n            $binary = $this->server->get('argv')[0];\n        }\n\n        return $binary.' '.$this->command->input;\n    }\n\n    public function getMethod(): string\n    {\n        return $this->command->isInteractive ? 'INTERACTIVE' : 'BATCH';\n    }\n\n    public function getResponse(): Response\n    {\n        return new class($this->command->exitCode) extends Response {\n            public function __construct(int $exitCode)\n            {\n                parent::__construct();\n\n                // getStatusCode() is final and setStatusCode() rejects an exit code\n                $this->statusCode = $exitCode;\n            }\n        };\n    }\n\n    public function getClientIp(): string\n    {\n        $application = $this->command->getApplication();\n\n        return $application->getName().' '.$application->getVersion();\n    }\n}\n","vendor/symfony/console/DependencyInjection/AddConsoleCommandPass.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\DependencyInjection;\n\nuse Symfony\\Component\\Console\\Attribute\\AsCommand;\nuse Symfony\\Component\\Console\\Command\\Command;\nuse Symfony\\Component\\Console\\Command\\LazyCommand;\nuse Symfony\\Component\\Console\\CommandLoader\\ContainerCommandLoader;\nuse Symfony\\Component\\DependencyInjection\\Argument\\ServiceClosureArgument;\nuse Symfony\\Component\\DependencyInjection\\Compiler\\CompilerPassInterface;\nuse Symfony\\Component\\DependencyInjection\\Compiler\\ServiceLocatorTagPass;\nuse Symfony\\Component\\DependencyInjection\\ContainerBuilder;\nuse Symfony\\Component\\DependencyInjection\\Exception\\InvalidArgumentException;\nuse Symfony\\Component\\DependencyInjection\\Reference;\nuse Symfony\\Component\\DependencyInjection\\TypedReference;\n\n/**\n * Registers console commands.\n *\n * @author Grégoire Pineau <lyrixx@lyrixx.info>\n */\nclass AddConsoleCommandPass implements CompilerPassInterface\n{\n    public function process(ContainerBuilder $container): void\n    {\n        $commandServices = $container->findTaggedServiceIds('console.command', true);\n        $lazyCommandMap = [];\n        $lazyCommandRefs = [];\n        $serviceIds = [];\n\n        foreach ($commandServices as $id => $tags) {\n            $definition = $container->getDefinition($id);\n            $class = $container->getParameterBag()->resolveValue($definition->getClass());\n\n            if (!$r = $container->getReflectionClass($class)) {\n                throw new InvalidArgumentException(\\sprintf('Class \"%s\" used for service \"%s\" cannot be found.', $class, $id));\n            }\n\n            if (!$r->isSubclassOf(Command::class)) {\n                if (!$r->hasMethod('__invoke')) {\n                    throw new InvalidArgumentException(\\sprintf('The service \"%s\" tagged \"%s\" must either be a subclass of \"%s\" or have an \"__invoke()\" method.', $id, 'console.command', Command::class));\n                }\n\n                $invokableRef = new Reference($id);\n                $definition = $container->register($id .= '.command', $class = Command::class)\n                    ->addMethodCall('setCode', [$invokableRef]);\n            } else {\n                $invokableRef = null;\n            }\n\n            $definition->addTag('container.no_preload');\n\n            /** @var AsCommand|null $attribute */\n            $attribute = ($r->getAttributes(AsCommand::class)[0] ?? null)?->newInstance();\n\n            if (Command::class !== (new \\ReflectionMethod($class, 'getDefaultName'))->class) {\n                trigger_deprecation('symfony/console', '7.3', 'Overriding \"Command::getDefaultName()\" in \"%s\" is deprecated and will be removed in Symfony 8.0, use the #[AsCommand] attribute instead.', $class);\n\n                $defaultName = $class::getDefaultName();\n            } else {\n                $defaultName = $attribute?->name;\n            }\n\n            $aliases = str_replace('%', '%%', $tags[0]['command'] ?? $defaultName ?? '');\n            $aliases = explode('|', $aliases);\n            $commandName = array_shift($aliases);\n\n            if ($isHidden = '' === $commandName) {\n                $commandName = array_shift($aliases);\n            }\n\n            if (null === $commandName) {\n                if ($definition->isPrivate() || $definition->hasTag('container.private')) {\n                    $commandId = 'console.command.public_alias.'.$id;\n                    $container->setAlias($commandId, $id)->setPublic(true);\n                    $id = $commandId;\n                }\n                $serviceIds[] = $id;\n\n                continue;\n            }\n\n            $description = $tags[0]['description'] ?? null;\n            $help = $tags[0]['help'] ?? null;\n            $usages = $tags[0]['usages'] ?? null;\n\n            unset($tags[0]);\n            $lazyCommandMap[$commandName] = $id;\n            $lazyCommandRefs[$id] = new TypedReference($id, $class);\n\n            foreach ($aliases as $alias) {\n                $lazyCommandMap[$alias] = $id;\n            }\n\n            foreach ($tags as $tag) {\n                if (isset($tag['command'])) {\n                    $aliases[] = $tag['command'];\n                    $lazyCommandMap[$tag['command']] = $id;\n                }\n\n                $description ??= $tag['description'] ?? null;\n                $help ??= $tag['help'] ?? null;\n                $usages ??= $tag['usages'] ?? null;\n            }\n\n            $definition->addMethodCall('setName', [$commandName]);\n\n            if ($aliases) {\n                $definition->addMethodCall('setAliases', [$aliases]);\n            }\n\n            if ($isHidden) {\n                $definition->addMethodCall('setHidden', [true]);\n            }\n\n            if ($help && $invokableRef) {\n                $definition->addMethodCall('setHelp', [str_replace('%', '%%', $help)]);\n            }\n\n            if ($usages) {\n                foreach ($usages as $usage) {\n                    $definition->addMethodCall('addUsage', [$usage]);\n                }\n            }\n\n            if (!$description) {\n                if (Command::class !== (new \\ReflectionMethod($class, 'getDefaultDescription'))->class) {\n                    trigger_deprecation('symfony/console', '7.3', 'Overriding \"Command::getDefaultDescription()\" in \"%s\" is deprecated and will be removed in Symfony 8.0, use the #[AsCommand] attribute instead.', $class);\n\n                    $description = $class::getDefaultDescription();\n                } else {\n                    $description = $attribute?->description;\n                }\n            }\n\n            if ($description) {\n                $escapedDescription = str_replace('%', '%%', $description);\n                $definition->addMethodCall('setDescription', [$escapedDescription]);\n\n                $container->register('.'.$id.'.lazy', LazyCommand::class)\n                    ->setArguments([$commandName, $aliases, $escapedDescription, $isHidden, new ServiceClosureArgument($lazyCommandRefs[$id])]);\n\n                $lazyCommandRefs[$id] = new Reference('.'.$id.'.lazy');\n            }\n        }\n\n        $container\n            ->register('console.command_loader', ContainerCommandLoader::class)\n            ->setPublic(true)\n            ->addTag('container.no_preload')\n            ->setArguments([ServiceLocatorTagPass::register($container, $lazyCommandRefs), $lazyCommandMap]);\n\n        $container->setParameter('console.command.ids', $serviceIds);\n    }\n}\n","vendor/symfony/console/Descriptor/ApplicationDescription.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Descriptor;\n\nuse Symfony\\Component\\Console\\Application;\nuse Symfony\\Component\\Console\\Command\\Command;\nuse Symfony\\Component\\Console\\Exception\\CommandNotFoundException;\n\n/**\n * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>\n *\n * @internal\n */\nclass ApplicationDescription\n{\n    public const GLOBAL_NAMESPACE = '_global';\n\n    private array $namespaces;\n\n    /**\n     * @var array<string, Command>\n     */\n    private array $commands;\n\n    /**\n     * @var array<string, Command>\n     */\n    private array $aliases = [];\n\n    public function __construct(\n        private Application $application,\n        private ?string $namespace = null,\n        private bool $showHidden = false,\n    ) {\n    }\n\n    public function getNamespaces(): array\n    {\n        if (!isset($this->namespaces)) {\n            $this->inspectApplication();\n        }\n\n        return $this->namespaces;\n    }\n\n    /**\n     * @return Command[]\n     */\n    public function getCommands(): array\n    {\n        if (!isset($this->commands)) {\n            $this->inspectApplication();\n        }\n\n        return $this->commands;\n    }\n\n    /**\n     * @throws CommandNotFoundException\n     */\n    public function getCommand(string $name): Command\n    {\n        if (!isset($this->commands[$name]) && !isset($this->aliases[$name])) {\n            throw new CommandNotFoundException(\\sprintf('Command \"%s\" does not exist.', $name));\n        }\n\n        return $this->commands[$name] ?? $this->aliases[$name];\n    }\n\n    private function inspectApplication(): void\n    {\n        $this->commands = [];\n        $this->namespaces = [];\n\n        $all = $this->application->all($this->namespace ? $this->application->findNamespace($this->namespace) : null);\n        foreach ($this->sortCommands($all) as $namespace => $commands) {\n            $names = [];\n\n            foreach ($commands as $name => $command) {\n                if (!$command->getName() || (!$this->showHidden && $command->isHidden())) {\n                    continue;\n                }\n\n                if ($command->getName() === $name) {\n                    $this->commands[$name] = $command;\n                } else {\n                    $this->aliases[$name] = $command;\n                }\n\n                $names[] = $name;\n            }\n\n            $this->namespaces[$namespace] = ['id' => $namespace, 'commands' => $names];\n        }\n    }\n\n    /**\n     * @return array<string, array<string, Command>>\n     */\n    private function sortCommands(array $commands): array\n    {\n        $namespacedCommands = [];\n        $globalCommands = [];\n        $sortedCommands = [];\n        foreach ($commands as $name => $command) {\n            $key = $this->application->extractNamespace($name, 1);\n            if (\\in_array($key, ['', self::GLOBAL_NAMESPACE], true)) {\n                $globalCommands[$name] = $command;\n            } else {\n                $namespacedCommands[$key][$name] = $command;\n            }\n        }\n\n        if ($globalCommands) {\n            ksort($globalCommands);\n            $sortedCommands[self::GLOBAL_NAMESPACE] = $globalCommands;\n        }\n\n        if ($namespacedCommands) {\n            ksort($namespacedCommands, \\SORT_STRING);\n            foreach ($namespacedCommands as $key => $commandsSet) {\n                ksort($commandsSet);\n                $sortedCommands[$key] = $commandsSet;\n            }\n        }\n\n        return $sortedCommands;\n    }\n}\n","vendor/symfony/console/Descriptor/Descriptor.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Descriptor;\n\nuse Symfony\\Component\\Console\\Application;\nuse Symfony\\Component\\Console\\Command\\Command;\nuse Symfony\\Component\\Console\\Exception\\InvalidArgumentException;\nuse Symfony\\Component\\Console\\Input\\InputArgument;\nuse Symfony\\Component\\Console\\Input\\InputDefinition;\nuse Symfony\\Component\\Console\\Input\\InputOption;\nuse Symfony\\Component\\Console\\Output\\OutputInterface;\n\n/**\n * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>\n *\n * @internal\n */\nabstract class Descriptor implements DescriptorInterface\n{\n    protected OutputInterface $output;\n\n    public function describe(OutputInterface $output, object $object, array $options = []): void\n    {\n        $this->output = $output;\n\n        match (true) {\n            $object instanceof InputArgument => $this->describeInputArgument($object, $options),\n            $object instanceof InputOption => $this->describeInputOption($object, $options),\n            $object instanceof InputDefinition => $this->describeInputDefinition($object, $options),\n            $object instanceof Command => $this->describeCommand($object, $options),\n            $object instanceof Application => $this->describeApplication($object, $options),\n            default => throw new InvalidArgumentException(\\sprintf('Object of type \"%s\" is not describable.', get_debug_type($object))),\n        };\n    }\n\n    protected function write(string $content, bool $decorated = false): void\n    {\n        $this->output->write($content, false, $decorated ? OutputInterface::OUTPUT_NORMAL : OutputInterface::OUTPUT_RAW);\n    }\n\n    /**\n     * Describes an InputArgument instance.\n     */\n    abstract protected function describeInputArgument(InputArgument $argument, array $options = []): void;\n\n    /**\n     * Describes an InputOption instance.\n     */\n    abstract protected function describeInputOption(InputOption $option, array $options = []): void;\n\n    /**\n     * Describes an InputDefinition instance.\n     */\n    abstract protected function describeInputDefinition(InputDefinition $definition, array $options = []): void;\n\n    /**\n     * Describes a Command instance.\n     */\n    abstract protected function describeCommand(Command $command, array $options = []): void;\n\n    /**\n     * Describes an Application instance.\n     */\n    abstract protected function describeApplication(Application $application, array $options = []): void;\n}\n","vendor/symfony/console/Descriptor/DescriptorInterface.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Descriptor;\n\nuse Symfony\\Component\\Console\\Output\\OutputInterface;\n\n/**\n * Descriptor interface.\n *\n * @author Jean-François Simon <contact@jfsimon.fr>\n */\ninterface DescriptorInterface\n{\n    public function describe(OutputInterface $output, object $object, array $options = []): void;\n}\n","vendor/symfony/console/Descriptor/JsonDescriptor.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Descriptor;\n\nuse Symfony\\Component\\Console\\Application;\nuse Symfony\\Component\\Console\\Command\\Command;\nuse Symfony\\Component\\Console\\Input\\InputArgument;\nuse Symfony\\Component\\Console\\Input\\InputDefinition;\nuse Symfony\\Component\\Console\\Input\\InputOption;\n\n/**\n * JSON descriptor.\n *\n * @author Jean-François Simon <contact@jfsimon.fr>\n *\n * @internal\n */\nclass JsonDescriptor extends Descriptor\n{\n    protected function describeInputArgument(InputArgument $argument, array $options = []): void\n    {\n        $this->writeData($this->getInputArgumentData($argument), $options);\n    }\n\n    protected function describeInputOption(InputOption $option, array $options = []): void\n    {\n        $this->writeData($this->getInputOptionData($option), $options);\n        if ($option->isNegatable()) {\n            $this->writeData($this->getInputOptionData($option, true), $options);\n        }\n    }\n\n    protected function describeInputDefinition(InputDefinition $definition, array $options = []): void\n    {\n        $this->writeData($this->getInputDefinitionData($definition), $options);\n    }\n\n    protected function describeCommand(Command $command, array $options = []): void\n    {\n        $this->writeData($this->getCommandData($command, $options['short'] ?? false), $options);\n    }\n\n    protected function describeApplication(Application $application, array $options = []): void\n    {\n        $describedNamespace = $options['namespace'] ?? null;\n        $description = new ApplicationDescription($application, $describedNamespace, true);\n        $commands = [];\n\n        foreach ($description->getCommands() as $command) {\n            $commands[] = $this->getCommandData($command, $options['short'] ?? false);\n        }\n\n        $data = [];\n        if ('UNKNOWN' !== $application->getName()) {\n            $data['application']['name'] = $application->getName();\n            if ('UNKNOWN' !== $application->getVersion()) {\n                $data['application']['version'] = $application->getVersion();\n            }\n        }\n\n        $data['commands'] = $commands;\n\n        if ($describedNamespace) {\n            $data['namespace'] = $describedNamespace;\n        } else {\n            $data['namespaces'] = array_values($description->getNamespaces());\n        }\n\n        $this->writeData($data, $options);\n    }\n\n    /**\n     * Writes data as json.\n     */\n    private function writeData(array $data, array $options): void\n    {\n        $flags = $options['json_encoding'] ?? 0;\n\n        $this->write(json_encode($data, $flags));\n    }\n\n    private function getInputArgumentData(InputArgument $argument): array\n    {\n        return [\n            'name' => $argument->getName(),\n            'is_required' => $argument->isRequired(),\n            'is_array' => $argument->isArray(),\n            'description' => preg_replace('/\\s*[\\r\\n]\\s*/', ' ', $argument->getDescription()),\n            'default' => \\INF === $argument->getDefault() ? 'INF' : $argument->getDefault(),\n        ];\n    }\n\n    private function getInputOptionData(InputOption $option, bool $negated = false): array\n    {\n        return $negated ? [\n            'name' => '--no-'.$option->getName(),\n            'shortcut' => '',\n            'accept_value' => false,\n            'is_value_required' => false,\n            'is_multiple' => false,\n            'description' => 'Negate the \"--'.$option->getName().'\" option',\n            'default' => null === $option->getDefault() ? null : !$option->getDefault(),\n        ] : [\n            'name' => '--'.$option->getName(),\n            'shortcut' => $option->getShortcut() ? '-'.str_replace('|', '|-', $option->getShortcut()) : '',\n            'accept_value' => $option->acceptValue(),\n            'is_value_required' => $option->isValueRequired(),\n            'is_multiple' => $option->isArray(),\n            'description' => preg_replace('/\\s*[\\r\\n]\\s*/', ' ', $option->getDescription()),\n            'default' => \\INF === $option->getDefault() ? 'INF' : $option->getDefault(),\n        ];\n    }\n\n    private function getInputDefinitionData(InputDefinition $definition): array\n    {\n        $inputArguments = [];\n        foreach ($definition->getArguments() as $name => $argument) {\n            $inputArguments[$name] = $this->getInputArgumentData($argument);\n        }\n\n        $inputOptions = [];\n        foreach ($definition->getOptions() as $name => $option) {\n            $inputOptions[$name] = $this->getInputOptionData($option);\n            if ($option->isNegatable()) {\n                $inputOptions['no-'.$name] = $this->getInputOptionData($option, true);\n            }\n        }\n\n        return ['arguments' => $inputArguments, 'options' => $inputOptions];\n    }\n\n    private function getCommandData(Command $command, bool $short = false): array\n    {\n        $data = [\n            'name' => $command->getName(),\n            'description' => $command->getDescription(),\n        ];\n\n        if ($short) {\n            $data += [\n                'usage' => $command->getAliases(),\n            ];\n        } else {\n            $command->mergeApplicationDefinition(false);\n\n            $data += [\n                'usage' => array_merge([$command->getSynopsis()], $command->getUsages(), $command->getAliases()),\n                'help' => $command->getProcessedHelp(),\n                'definition' => $this->getInputDefinitionData($command->getDefinition()),\n            ];\n        }\n\n        $data['hidden'] = $command->isHidden();\n\n        return $data;\n    }\n}\n","vendor/symfony/console/Descriptor/MarkdownDescriptor.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Descriptor;\n\nuse Symfony\\Component\\Console\\Application;\nuse Symfony\\Component\\Console\\Command\\Command;\nuse Symfony\\Component\\Console\\Helper\\Helper;\nuse Symfony\\Component\\Console\\Input\\InputArgument;\nuse Symfony\\Component\\Console\\Input\\InputDefinition;\nuse Symfony\\Component\\Console\\Input\\InputOption;\nuse Symfony\\Component\\Console\\Output\\OutputInterface;\n\n/**\n * Markdown descriptor.\n *\n * @author Jean-François Simon <contact@jfsimon.fr>\n *\n * @internal\n */\nclass MarkdownDescriptor extends Descriptor\n{\n    public function describe(OutputInterface $output, object $object, array $options = []): void\n    {\n        $decorated = $output->isDecorated();\n        $output->setDecorated(false);\n\n        parent::describe($output, $object, $options);\n\n        $output->setDecorated($decorated);\n    }\n\n    protected function write(string $content, bool $decorated = true): void\n    {\n        parent::write($content, $decorated);\n    }\n\n    protected function describeInputArgument(InputArgument $argument, array $options = []): void\n    {\n        $this->write(\n            '#### `'.($argument->getName() ?: '<none>').\"`\\n\\n\"\n            .($argument->getDescription() ? preg_replace('/\\s*[\\r\\n]\\s*/', \"\\n\", $argument->getDescription()).\"\\n\\n\" : '')\n            .'* Is required: '.($argument->isRequired() ? 'yes' : 'no').\"\\n\"\n            .'* Is array: '.($argument->isArray() ? 'yes' : 'no').\"\\n\"\n            .'* Default: `'.str_replace(\"\\n\", '', var_export($argument->getDefault(), true)).'`'\n        );\n    }\n\n    protected function describeInputOption(InputOption $option, array $options = []): void\n    {\n        $name = '--'.$option->getName();\n        if ($option->isNegatable()) {\n            $name .= '|--no-'.$option->getName();\n        }\n        if ($option->getShortcut()) {\n            $name .= '|-'.str_replace('|', '|-', $option->getShortcut()).'';\n        }\n\n        $this->write(\n            '#### `'.$name.'`'.\"\\n\\n\"\n            .($option->getDescription() ? preg_replace('/\\s*[\\r\\n]\\s*/', \"\\n\", $option->getDescription()).\"\\n\\n\" : '')\n            .'* Accept value: '.($option->acceptValue() ? 'yes' : 'no').\"\\n\"\n            .'* Is value required: '.($option->isValueRequired() ? 'yes' : 'no').\"\\n\"\n            .'* Is multiple: '.($option->isArray() ? 'yes' : 'no').\"\\n\"\n            .'* Is negatable: '.($option->isNegatable() ? 'yes' : 'no').\"\\n\"\n            .'* Default: `'.str_replace(\"\\n\", '', var_export($option->getDefault(), true)).'`'\n        );\n    }\n\n    protected function describeInputDefinition(InputDefinition $definition, array $options = []): void\n    {\n        if ($showArguments = $definition->getArguments()) {\n            $this->write('### Arguments');\n            foreach ($definition->getArguments() as $argument) {\n                $this->write(\"\\n\\n\");\n                $this->describeInputArgument($argument);\n            }\n        }\n\n        if (\\count($definition->getOptions()) > 0) {\n            if ($showArguments) {\n                $this->write(\"\\n\\n\");\n            }\n\n            $this->write('### Options');\n            foreach ($definition->getOptions() as $option) {\n                $this->write(\"\\n\\n\");\n                $this->describeInputOption($option);\n            }\n        }\n    }\n\n    protected function describeCommand(Command $command, array $options = []): void\n    {\n        if ($options['short'] ?? false) {\n            $this->write(\n                '`'.$command->getName().\"`\\n\"\n                .str_repeat('-', Helper::width($command->getName()) + 2).\"\\n\\n\"\n                .($command->getDescription() ? $command->getDescription().\"\\n\\n\" : '')\n                .'### Usage'.\"\\n\\n\"\n                .array_reduce($command->getAliases(), static fn ($carry, $usage) => $carry.'* `'.$usage.'`'.\"\\n\")\n            );\n\n            return;\n        }\n\n        $command->mergeApplicationDefinition(false);\n\n        $this->write(\n            '`'.$command->getName().\"`\\n\"\n            .str_repeat('-', Helper::width($command->getName()) + 2).\"\\n\\n\"\n            .($command->getDescription() ? $command->getDescription().\"\\n\\n\" : '')\n            .'### Usage'.\"\\n\\n\"\n            .array_reduce(array_merge([$command->getSynopsis()], $command->getAliases(), $command->getUsages()), static fn ($carry, $usage) => $carry.'* `'.$usage.'`'.\"\\n\")\n        );\n\n        if ($help = $command->getProcessedHelp()) {\n            $this->write(\"\\n\");\n            $this->write($help);\n        }\n\n        $definition = $command->getDefinition();\n        if ($definition->getOptions() || $definition->getArguments()) {\n            $this->write(\"\\n\\n\");\n            $this->describeInputDefinition($definition);\n        }\n    }\n\n    protected function describeApplication(Application $application, array $options = []): void\n    {\n        $describedNamespace = $options['namespace'] ?? null;\n        $description = new ApplicationDescription($application, $describedNamespace);\n        $title = $this->getApplicationTitle($application);\n\n        $this->write($title.\"\\n\".str_repeat('=', Helper::width($title)));\n\n        foreach ($description->getNamespaces() as $namespace) {\n            if (ApplicationDescription::GLOBAL_NAMESPACE !== $namespace['id']) {\n                $this->write(\"\\n\\n\");\n                $this->write('**'.$namespace['id'].':**');\n            }\n\n            $this->write(\"\\n\\n\");\n            $this->write(implode(\"\\n\", array_map(static fn ($commandName) => \\sprintf('* [`%s`](#%s)', $commandName, str_replace(':', '', $description->getCommand($commandName)->getName())), $namespace['commands'])));\n        }\n\n        foreach ($description->getCommands() as $command) {\n            $this->write(\"\\n\\n\");\n            $this->describeCommand($command, $options);\n        }\n    }\n\n    private function getApplicationTitle(Application $application): string\n    {\n        if ('UNKNOWN' !== $application->getName()) {\n            if ('UNKNOWN' !== $application->getVersion()) {\n                return \\sprintf('%s %s', $application->getName(), $application->getVersion());\n            }\n\n            return $application->getName();\n        }\n\n        return 'Console Tool';\n    }\n}\n","vendor/symfony/console/Descriptor/ReStructuredTextDescriptor.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Descriptor;\n\nuse Symfony\\Component\\Console\\Application;\nuse Symfony\\Component\\Console\\Command\\Command;\nuse Symfony\\Component\\Console\\Helper\\Helper;\nuse Symfony\\Component\\Console\\Input\\InputArgument;\nuse Symfony\\Component\\Console\\Input\\InputDefinition;\nuse Symfony\\Component\\Console\\Input\\InputOption;\nuse Symfony\\Component\\Console\\Output\\OutputInterface;\nuse Symfony\\Component\\String\\UnicodeString;\n\nclass ReStructuredTextDescriptor extends Descriptor\n{\n    // <h1>\n    private string $partChar = '=';\n    // <h2>\n    private string $chapterChar = '-';\n    // <h3>\n    private string $sectionChar = '~';\n    // <h4>\n    private string $subsectionChar = '.';\n    // <h5>\n    private string $subsubsectionChar = '^';\n    // <h6>\n    private string $paragraphsChar = '\"';\n\n    private array $visibleNamespaces = [];\n\n    public function describe(OutputInterface $output, object $object, array $options = []): void\n    {\n        $decorated = $output->isDecorated();\n        $output->setDecorated(false);\n\n        parent::describe($output, $object, $options);\n\n        $output->setDecorated($decorated);\n    }\n\n    /**\n     * Override parent method to set $decorated = true.\n     */\n    protected function write(string $content, bool $decorated = true): void\n    {\n        parent::write($content, $decorated);\n    }\n\n    protected function describeInputArgument(InputArgument $argument, array $options = []): void\n    {\n        $this->write(\n            $argument->getName() ?: '<none>'.\"\\n\".str_repeat($this->paragraphsChar, Helper::width($argument->getName())).\"\\n\\n\"\n                .($argument->getDescription() ? preg_replace('/\\s*[\\r\\n]\\s*/', \"\\n\", $argument->getDescription()).\"\\n\\n\" : '')\n                .'- **Is required**: '.($argument->isRequired() ? 'yes' : 'no').\"\\n\"\n                .'- **Is array**: '.($argument->isArray() ? 'yes' : 'no').\"\\n\"\n                .'- **Default**: ``'.str_replace(\"\\n\", '', var_export($argument->getDefault(), true)).'``'\n        );\n    }\n\n    protected function describeInputOption(InputOption $option, array $options = []): void\n    {\n        $name = '\\-\\-'.$option->getName();\n        if ($option->isNegatable()) {\n            $name .= '|\\-\\-no-'.$option->getName();\n        }\n        if ($option->getShortcut()) {\n            $name .= '|-'.str_replace('|', '|-', $option->getShortcut());\n        }\n\n        $optionDescription = $option->getDescription() ? preg_replace('/\\s*[\\r\\n]\\s*/', \"\\n\\n\", $option->getDescription()).\"\\n\\n\" : '';\n        $optionDescription = (new UnicodeString($optionDescription))->ascii();\n        $this->write(\n            $name.\"\\n\".str_repeat($this->paragraphsChar, Helper::width($name)).\"\\n\\n\"\n            .$optionDescription\n            .'- **Accept value**: '.($option->acceptValue() ? 'yes' : 'no').\"\\n\"\n            .'- **Is value required**: '.($option->isValueRequired() ? 'yes' : 'no').\"\\n\"\n            .'- **Is multiple**: '.($option->isArray() ? 'yes' : 'no').\"\\n\"\n            .'- **Is negatable**: '.($option->isNegatable() ? 'yes' : 'no').\"\\n\"\n            .'- **Default**: ``'.str_replace(\"\\n\", '', var_export($option->getDefault(), true)).'``'.\"\\n\"\n        );\n    }\n\n    protected function describeInputDefinition(InputDefinition $definition, array $options = []): void\n    {\n        if ($showArguments = ((bool) $definition->getArguments())) {\n            $this->write(\"Arguments\\n\".str_repeat($this->subsubsectionChar, 9));\n            foreach ($definition->getArguments() as $argument) {\n                $this->write(\"\\n\\n\");\n                $this->describeInputArgument($argument);\n            }\n        }\n\n        if ($nonDefaultOptions = $this->getNonDefaultOptions($definition)) {\n            if ($showArguments) {\n                $this->write(\"\\n\\n\");\n            }\n\n            $this->write(\"Options\\n\".str_repeat($this->subsubsectionChar, 7).\"\\n\\n\");\n            foreach ($nonDefaultOptions as $option) {\n                $this->describeInputOption($option);\n                $this->write(\"\\n\");\n            }\n        }\n    }\n\n    protected function describeCommand(Command $command, array $options = []): void\n    {\n        if ($options['short'] ?? false) {\n            $this->write(\n                '``'.$command->getName().\"``\\n\"\n                .str_repeat($this->subsectionChar, Helper::width($command->getName())).\"\\n\\n\"\n                .($command->getDescription() ? $command->getDescription().\"\\n\\n\" : '')\n                .\"Usage\\n\".str_repeat($this->paragraphsChar, 5).\"\\n\\n\"\n                .array_reduce($command->getAliases(), static fn ($carry, $usage) => $carry.'- ``'.$usage.'``'.\"\\n\")\n            );\n\n            return;\n        }\n\n        $command->mergeApplicationDefinition(false);\n\n        foreach ($command->getAliases() as $alias) {\n            $this->write('.. _'.$alias.\":\\n\\n\");\n        }\n        $this->write(\n            $command->getName().\"\\n\"\n            .str_repeat($this->subsectionChar, Helper::width($command->getName())).\"\\n\\n\"\n            .($command->getDescription() ? $command->getDescription().\"\\n\\n\" : '')\n            .\"Usage\\n\".str_repeat($this->subsubsectionChar, 5).\"\\n\\n\"\n            .array_reduce(array_merge([$command->getSynopsis()], $command->getAliases(), $command->getUsages()), static fn ($carry, $usage) => $carry.'- ``'.$usage.'``'.\"\\n\")\n        );\n\n        if ($help = $command->getProcessedHelp()) {\n            $this->write(\"\\n\");\n            $this->write($help);\n        }\n\n        $definition = $command->getDefinition();\n        if ($definition->getOptions() || $definition->getArguments()) {\n            $this->write(\"\\n\\n\");\n            $this->describeInputDefinition($definition);\n        }\n    }\n\n    protected function describeApplication(Application $application, array $options = []): void\n    {\n        $description = new ApplicationDescription($application, $options['namespace'] ?? null);\n        $title = $this->getApplicationTitle($application);\n\n        $this->write($title.\"\\n\".str_repeat($this->partChar, Helper::width($title)));\n        $this->createTableOfContents($description, $application);\n        $this->describeCommands($application, $options);\n    }\n\n    private function getApplicationTitle(Application $application): string\n    {\n        if ('UNKNOWN' === $application->getName()) {\n            return 'Console Tool';\n        }\n        if ('UNKNOWN' !== $application->getVersion()) {\n            return \\sprintf('%s %s', $application->getName(), $application->getVersion());\n        }\n\n        return $application->getName();\n    }\n\n    private function describeCommands($application, array $options): void\n    {\n        $title = 'Commands';\n        $this->write(\"\\n\\n$title\\n\".str_repeat($this->chapterChar, Helper::width($title)).\"\\n\\n\");\n        foreach ($this->visibleNamespaces as $namespace) {\n            if ('_global' === $namespace) {\n                $commands = $application->all('');\n                $this->write('Global'.\"\\n\".str_repeat($this->sectionChar, Helper::width('Global')).\"\\n\\n\");\n            } else {\n                $commands = $application->all($namespace);\n                $this->write($namespace.\"\\n\".str_repeat($this->sectionChar, Helper::width($namespace)).\"\\n\\n\");\n            }\n\n            foreach ($this->removeAliasesAndHiddenCommands($commands) as $command) {\n                $this->describeCommand($command, $options);\n                $this->write(\"\\n\\n\");\n            }\n        }\n    }\n\n    private function createTableOfContents(ApplicationDescription $description, Application $application): void\n    {\n        $this->setVisibleNamespaces($description);\n        $chapterTitle = 'Table of Contents';\n        $this->write(\"\\n\\n$chapterTitle\\n\".str_repeat($this->chapterChar, Helper::width($chapterTitle)).\"\\n\\n\");\n        foreach ($this->visibleNamespaces as $namespace) {\n            if ('_global' === $namespace) {\n                $commands = $application->all('');\n            } else {\n                $commands = $application->all($namespace);\n                $this->write(\"\\n\\n\");\n                $this->write($namespace.\"\\n\".str_repeat($this->sectionChar, Helper::width($namespace)).\"\\n\\n\");\n            }\n            $commands = $this->removeAliasesAndHiddenCommands($commands);\n\n            $this->write(\"\\n\\n\");\n            $this->write(implode(\"\\n\", array_map(static fn ($commandName) => \\sprintf('- `%s`_', $commandName), array_keys($commands))));\n        }\n    }\n\n    private function getNonDefaultOptions(InputDefinition $definition): array\n    {\n        $globalOptions = [\n            'help',\n            'silent',\n            'quiet',\n            'verbose',\n            'version',\n            'ansi',\n            'no-interaction',\n        ];\n        $nonDefaultOptions = [];\n        foreach ($definition->getOptions() as $option) {\n            // Skip global options.\n            if (!\\in_array($option->getName(), $globalOptions, true)) {\n                $nonDefaultOptions[] = $option;\n            }\n        }\n\n        return $nonDefaultOptions;\n    }\n\n    private function setVisibleNamespaces(ApplicationDescription $description): void\n    {\n        $commands = $description->getCommands();\n        foreach ($description->getNamespaces() as $namespace) {\n            try {\n                $namespaceCommands = $namespace['commands'];\n                foreach ($namespaceCommands as $key => $commandName) {\n                    if (!\\array_key_exists($commandName, $commands)) {\n                        // If the array key does not exist, then this is an alias.\n                        unset($namespaceCommands[$key]);\n                    } elseif ($commands[$commandName]->isHidden()) {\n                        unset($namespaceCommands[$key]);\n                    }\n                }\n                if (!$namespaceCommands) {\n                    // If the namespace contained only aliases or hidden commands, skip the namespace.\n                    continue;\n                }\n            } catch (\\Exception) {\n            }\n            $this->visibleNamespaces[] = $namespace['id'];\n        }\n    }\n\n    private function removeAliasesAndHiddenCommands(array $commands): array\n    {\n        foreach ($commands as $key => $command) {\n            if ($command->isHidden() || \\in_array($key, $command->getAliases(), true)) {\n                unset($commands[$key]);\n            }\n        }\n        unset($commands['completion']);\n\n        return $commands;\n    }\n}\n","vendor/symfony/console/Descriptor/TextDescriptor.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Descriptor;\n\nuse Symfony\\Component\\Console\\Application;\nuse Symfony\\Component\\Console\\Command\\Command;\nuse Symfony\\Component\\Console\\Formatter\\OutputFormatter;\nuse Symfony\\Component\\Console\\Helper\\Helper;\nuse Symfony\\Component\\Console\\Input\\InputArgument;\nuse Symfony\\Component\\Console\\Input\\InputDefinition;\nuse Symfony\\Component\\Console\\Input\\InputOption;\n\n/**\n * Text descriptor.\n *\n * @author Jean-François Simon <contact@jfsimon.fr>\n *\n * @internal\n */\nclass TextDescriptor extends Descriptor\n{\n    protected function describeInputArgument(InputArgument $argument, array $options = []): void\n    {\n        if (null !== $argument->getDefault() && (!\\is_array($argument->getDefault()) || \\count($argument->getDefault()))) {\n            $default = \\sprintf('<comment> [default: %s]</comment>', $this->formatDefaultValue($argument->getDefault()));\n        } else {\n            $default = '';\n        }\n\n        $totalWidth = $options['total_width'] ?? Helper::width($argument->getName());\n        $spacingWidth = $totalWidth - Helper::width($argument->getName());\n\n        $this->writeText(\\sprintf('  <info>%s</info>  %s%s%s',\n            $argument->getName(),\n            str_repeat(' ', $spacingWidth),\n            // + 4 = 2 spaces before <info>, 2 spaces after </info>\n            preg_replace('/\\s*[\\r\\n]\\s*/', \"\\n\".str_repeat(' ', $totalWidth + 4), $argument->getDescription()),\n            $default\n        ), $options);\n    }\n\n    protected function describeInputOption(InputOption $option, array $options = []): void\n    {\n        if ($option->acceptValue() && null !== $option->getDefault() && (!\\is_array($option->getDefault()) || \\count($option->getDefault()))) {\n            $default = \\sprintf('<comment> [default: %s]</comment>', $this->formatDefaultValue($option->getDefault()));\n        } else {\n            $default = '';\n        }\n\n        $value = '';\n        if ($option->acceptValue()) {\n            $value = '='.strtoupper($option->getName());\n\n            if ($option->isValueOptional()) {\n                $value = '['.$value.']';\n            }\n        }\n\n        $totalWidth = $options['total_width'] ?? $this->calculateTotalWidthForOptions([$option]);\n        $synopsis = \\sprintf('%s%s',\n            $option->getShortcut() ? \\sprintf('-%s, ', $option->getShortcut()) : '    ',\n            \\sprintf($option->isNegatable() ? '--%1$s|--no-%1$s' : '--%1$s%2$s', $option->getName(), $value)\n        );\n\n        $spacingWidth = $totalWidth - Helper::width($synopsis);\n\n        $this->writeText(\\sprintf('  <info>%s</info>  %s%s%s%s',\n            $synopsis,\n            str_repeat(' ', $spacingWidth),\n            // + 4 = 2 spaces before <info>, 2 spaces after </info>\n            preg_replace('/\\s*[\\r\\n]\\s*/', \"\\n\".str_repeat(' ', $totalWidth + 4), $option->getDescription()),\n            $default,\n            $option->isArray() ? '<comment> (multiple values allowed)</comment>' : ''\n        ), $options);\n    }\n\n    protected function describeInputDefinition(InputDefinition $definition, array $options = []): void\n    {\n        $totalWidth = $this->calculateTotalWidthForOptions($definition->getOptions());\n        foreach ($definition->getArguments() as $argument) {\n            $totalWidth = max($totalWidth, Helper::width($argument->getName()));\n        }\n\n        if ($definition->getArguments()) {\n            $this->writeText('<comment>Arguments:</comment>', $options);\n            $this->writeText(\"\\n\");\n            foreach ($definition->getArguments() as $argument) {\n                $this->describeInputArgument($argument, array_merge($options, ['total_width' => $totalWidth]));\n                $this->writeText(\"\\n\");\n            }\n        }\n\n        if ($definition->getArguments() && $definition->getOptions()) {\n            $this->writeText(\"\\n\");\n        }\n\n        if ($definition->getOptions()) {\n            $laterOptions = [];\n\n            $this->writeText('<comment>Options:</comment>', $options);\n            foreach ($definition->getOptions() as $option) {\n                if (\\strlen($option->getShortcut() ?? '') > 1) {\n                    $laterOptions[] = $option;\n                    continue;\n                }\n                $this->writeText(\"\\n\");\n                $this->describeInputOption($option, array_merge($options, ['total_width' => $totalWidth]));\n            }\n            foreach ($laterOptions as $option) {\n                $this->writeText(\"\\n\");\n                $this->describeInputOption($option, array_merge($options, ['total_width' => $totalWidth]));\n            }\n        }\n    }\n\n    protected function describeCommand(Command $command, array $options = []): void\n    {\n        $command->mergeApplicationDefinition(false);\n\n        if ($description = $command->getDescription()) {\n            $this->writeText('<comment>Description:</comment>', $options);\n            $this->writeText(\"\\n\");\n            $this->writeText('  '.$description);\n            $this->writeText(\"\\n\\n\");\n        }\n\n        $this->writeText('<comment>Usage:</comment>', $options);\n        foreach (array_merge([$command->getSynopsis(true)], $command->getAliases(), $command->getUsages()) as $usage) {\n            $this->writeText(\"\\n\");\n            $this->writeText('  '.OutputFormatter::escape($usage), $options);\n        }\n        $this->writeText(\"\\n\");\n\n        $definition = $command->getDefinition();\n        if ($definition->getOptions() || $definition->getArguments()) {\n            $this->writeText(\"\\n\");\n            $this->describeInputDefinition($definition, $options);\n            $this->writeText(\"\\n\");\n        }\n\n        $help = $command->getProcessedHelp();\n        if ($help && $help !== $description) {\n            $this->writeText(\"\\n\");\n            $this->writeText('<comment>Help:</comment>', $options);\n            $this->writeText(\"\\n\");\n            $this->writeText('  '.str_replace(\"\\n\", \"\\n  \", $help), $options);\n            $this->writeText(\"\\n\");\n        }\n    }\n\n    protected function describeApplication(Application $application, array $options = []): void\n    {\n        $describedNamespace = $options['namespace'] ?? null;\n        $description = new ApplicationDescription($application, $describedNamespace);\n\n        if (isset($options['raw_text']) && $options['raw_text']) {\n            $width = $this->getColumnWidth($description->getCommands());\n\n            foreach ($description->getCommands() as $command) {\n                $this->writeText(\\sprintf(\"%-{$width}s %s\", $command->getName(), $command->getDescription()), $options);\n                $this->writeText(\"\\n\");\n            }\n        } else {\n            if ('' != $help = $application->getHelp()) {\n                $this->writeText(\"$help\\n\\n\", $options);\n            }\n\n            $this->writeText(\"<comment>Usage:</comment>\\n\", $options);\n            $this->writeText(\"  command [options] [arguments]\\n\\n\", $options);\n\n            $this->describeInputDefinition(new InputDefinition($application->getDefinition()->getOptions()), $options);\n\n            $this->writeText(\"\\n\");\n            $this->writeText(\"\\n\");\n\n            $commands = $description->getCommands();\n            $namespaces = $description->getNamespaces();\n            if ($describedNamespace && $namespaces) {\n                // make sure all alias commands are included when describing a specific namespace\n                $describedNamespaceInfo = reset($namespaces);\n                foreach ($describedNamespaceInfo['commands'] as $name) {\n                    $commands[$name] = $description->getCommand($name);\n                }\n            }\n\n            // calculate max. width based on available commands per namespace\n            $width = $this->getColumnWidth(array_merge(...array_values(array_map(static fn ($namespace) => array_intersect($namespace['commands'], array_keys($commands)), array_values($namespaces)))));\n\n            if ($describedNamespace) {\n                $this->writeText(\\sprintf('<comment>Available commands for the \"%s\" namespace:</comment>', $describedNamespace), $options);\n            } else {\n                $this->writeText('<comment>Available commands:</comment>', $options);\n            }\n\n            foreach ($namespaces as $namespace) {\n                $namespace['commands'] = array_filter($namespace['commands'], static fn ($name) => isset($commands[$name]));\n\n                if (!$namespace['commands']) {\n                    continue;\n                }\n\n                if (!$describedNamespace && ApplicationDescription::GLOBAL_NAMESPACE !== $namespace['id']) {\n                    $this->writeText(\"\\n\");\n                    $this->writeText(' <comment>'.$namespace['id'].'</comment>', $options);\n                }\n\n                foreach ($namespace['commands'] as $name) {\n                    $this->writeText(\"\\n\");\n                    $spacingWidth = $width - Helper::width($name);\n                    $command = $commands[$name];\n                    $commandAliases = $name === $command->getName() ? $this->getCommandAliasesText($command) : '';\n                    $this->writeText(\\sprintf('  <info>%s</info>%s%s', $name, str_repeat(' ', $spacingWidth), $commandAliases.$command->getDescription()), $options);\n                }\n            }\n\n            $this->writeText(\"\\n\");\n        }\n    }\n\n    private function writeText(string $content, array $options = []): void\n    {\n        $this->write(\n            isset($options['raw_text']) && $options['raw_text'] ? strip_tags($content) : $content,\n            isset($options['raw_output']) ? !$options['raw_output'] : true\n        );\n    }\n\n    /**\n     * Formats command aliases to show them in the command description.\n     */\n    private function getCommandAliasesText(Command $command): string\n    {\n        $text = '';\n        $aliases = $command->getAliases();\n\n        if ($aliases) {\n            $text = '['.implode('|', $aliases).'] ';\n        }\n\n        return $text;\n    }\n\n    /**\n     * Formats input option/argument default value.\n     */\n    private function formatDefaultValue(mixed $default): string\n    {\n        if (\\INF === $default) {\n            return 'INF';\n        }\n\n        if (\\is_string($default)) {\n            $default = OutputFormatter::escape($default);\n        } elseif (\\is_array($default)) {\n            foreach ($default as $key => $value) {\n                if (\\is_string($value)) {\n                    $default[$key] = OutputFormatter::escape($value);\n                }\n            }\n        }\n\n        return str_replace('\\\\\\\\', '\\\\', json_encode($default, \\JSON_UNESCAPED_SLASHES | \\JSON_UNESCAPED_UNICODE));\n    }\n\n    /**\n     * @param array<Command|string> $commands\n     */\n    private function getColumnWidth(array $commands): int\n    {\n        $widths = [];\n\n        foreach ($commands as $command) {\n            if ($command instanceof Command) {\n                $widths[] = Helper::width($command->getName());\n                foreach ($command->getAliases() as $alias) {\n                    $widths[] = Helper::width($alias);\n                }\n            } else {\n                $widths[] = Helper::width($command);\n            }\n        }\n\n        return $widths ? max($widths) + 2 : 0;\n    }\n\n    /**\n     * @param InputOption[] $options\n     */\n    private function calculateTotalWidthForOptions(array $options): int\n    {\n        $totalWidth = 0;\n        foreach ($options as $option) {\n            // \"-\" + shortcut + \", --\" + name\n            $nameLength = 1 + max(Helper::width($option->getShortcut()), 1) + 4 + Helper::width($option->getName());\n            if ($option->isNegatable()) {\n                $nameLength += 6 + Helper::width($option->getName()); // |--no- + name\n            } elseif ($option->acceptValue()) {\n                $valueLength = 1 + Helper::width($option->getName()); // = + value\n                $valueLength += $option->isValueOptional() ? 2 : 0; // [ + ]\n\n                $nameLength += $valueLength;\n            }\n            $totalWidth = max($totalWidth, $nameLength);\n        }\n\n        return $totalWidth;\n    }\n}\n","vendor/symfony/console/Descriptor/XmlDescriptor.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Descriptor;\n\nuse Symfony\\Component\\Console\\Application;\nuse Symfony\\Component\\Console\\Command\\Command;\nuse Symfony\\Component\\Console\\Input\\InputArgument;\nuse Symfony\\Component\\Console\\Input\\InputDefinition;\nuse Symfony\\Component\\Console\\Input\\InputOption;\n\n/**\n * XML descriptor.\n *\n * @author Jean-François Simon <contact@jfsimon.fr>\n *\n * @internal\n */\nclass XmlDescriptor extends Descriptor\n{\n    public function getInputDefinitionDocument(InputDefinition $definition): \\DOMDocument\n    {\n        $dom = new \\DOMDocument('1.0', 'UTF-8');\n        $dom->appendChild($definitionXML = $dom->createElement('definition'));\n\n        $definitionXML->appendChild($argumentsXML = $dom->createElement('arguments'));\n        foreach ($definition->getArguments() as $argument) {\n            $this->appendDocument($argumentsXML, $this->getInputArgumentDocument($argument));\n        }\n\n        $definitionXML->appendChild($optionsXML = $dom->createElement('options'));\n        foreach ($definition->getOptions() as $option) {\n            $this->appendDocument($optionsXML, $this->getInputOptionDocument($option));\n        }\n\n        return $dom;\n    }\n\n    public function getCommandDocument(Command $command, bool $short = false): \\DOMDocument\n    {\n        $dom = new \\DOMDocument('1.0', 'UTF-8');\n        $dom->appendChild($commandXML = $dom->createElement('command'));\n\n        $commandXML->setAttribute('id', $command->getName());\n        $commandXML->setAttribute('name', $command->getName());\n        $commandXML->setAttribute('hidden', $command->isHidden() ? 1 : 0);\n\n        $commandXML->appendChild($usagesXML = $dom->createElement('usages'));\n\n        $commandXML->appendChild($descriptionXML = $dom->createElement('description'));\n        $descriptionXML->appendChild($dom->createTextNode(str_replace(\"\\n\", \"\\n \", $command->getDescription())));\n\n        if ($short) {\n            foreach ($command->getAliases() as $usage) {\n                $usagesXML->appendChild($dom->createElement('usage', $usage));\n            }\n        } else {\n            $command->mergeApplicationDefinition(false);\n\n            foreach (array_merge([$command->getSynopsis()], $command->getAliases(), $command->getUsages()) as $usage) {\n                $usagesXML->appendChild($dom->createElement('usage', $usage));\n            }\n\n            $commandXML->appendChild($helpXML = $dom->createElement('help'));\n            $helpXML->appendChild($dom->createTextNode(str_replace(\"\\n\", \"\\n \", $command->getProcessedHelp())));\n\n            $definitionXML = $this->getInputDefinitionDocument($command->getDefinition());\n            $this->appendDocument($commandXML, $definitionXML->getElementsByTagName('definition')->item(0));\n        }\n\n        return $dom;\n    }\n\n    public function getApplicationDocument(Application $application, ?string $namespace = null, bool $short = false): \\DOMDocument\n    {\n        $dom = new \\DOMDocument('1.0', 'UTF-8');\n        $dom->appendChild($rootXml = $dom->createElement('symfony'));\n\n        if ('UNKNOWN' !== $application->getName()) {\n            $rootXml->setAttribute('name', $application->getName());\n            if ('UNKNOWN' !== $application->getVersion()) {\n                $rootXml->setAttribute('version', $application->getVersion());\n            }\n        }\n\n        $rootXml->appendChild($commandsXML = $dom->createElement('commands'));\n\n        $description = new ApplicationDescription($application, $namespace, true);\n\n        if ($namespace) {\n            $commandsXML->setAttribute('namespace', $namespace);\n        }\n\n        foreach ($description->getCommands() as $command) {\n            $this->appendDocument($commandsXML, $this->getCommandDocument($command, $short));\n        }\n\n        if (!$namespace) {\n            $rootXml->appendChild($namespacesXML = $dom->createElement('namespaces'));\n\n            foreach ($description->getNamespaces() as $namespaceDescription) {\n                $namespacesXML->appendChild($namespaceArrayXML = $dom->createElement('namespace'));\n                $namespaceArrayXML->setAttribute('id', $namespaceDescription['id']);\n\n                foreach ($namespaceDescription['commands'] as $name) {\n                    $namespaceArrayXML->appendChild($commandXML = $dom->createElement('command'));\n                    $commandXML->appendChild($dom->createTextNode($name));\n                }\n            }\n        }\n\n        return $dom;\n    }\n\n    protected function describeInputArgument(InputArgument $argument, array $options = []): void\n    {\n        $this->writeDocument($this->getInputArgumentDocument($argument));\n    }\n\n    protected function describeInputOption(InputOption $option, array $options = []): void\n    {\n        $this->writeDocument($this->getInputOptionDocument($option));\n    }\n\n    protected function describeInputDefinition(InputDefinition $definition, array $options = []): void\n    {\n        $this->writeDocument($this->getInputDefinitionDocument($definition));\n    }\n\n    protected function describeCommand(Command $command, array $options = []): void\n    {\n        $this->writeDocument($this->getCommandDocument($command, $options['short'] ?? false));\n    }\n\n    protected function describeApplication(Application $application, array $options = []): void\n    {\n        $this->writeDocument($this->getApplicationDocument($application, $options['namespace'] ?? null, $options['short'] ?? false));\n    }\n\n    /**\n     * Appends document children to parent node.\n     */\n    private function appendDocument(\\DOMNode $parentNode, \\DOMNode $importedParent): void\n    {\n        foreach ($importedParent->childNodes as $childNode) {\n            $parentNode->appendChild($parentNode->ownerDocument->importNode($childNode, true));\n        }\n    }\n\n    /**\n     * Writes DOM document.\n     */\n    private function writeDocument(\\DOMDocument $dom): void\n    {\n        $dom->formatOutput = true;\n        $this->write($dom->saveXML());\n    }\n\n    private function getInputArgumentDocument(InputArgument $argument): \\DOMDocument\n    {\n        $dom = new \\DOMDocument('1.0', 'UTF-8');\n\n        $dom->appendChild($objectXML = $dom->createElement('argument'));\n        $objectXML->setAttribute('name', $argument->getName());\n        $objectXML->setAttribute('is_required', $argument->isRequired() ? 1 : 0);\n        $objectXML->setAttribute('is_array', $argument->isArray() ? 1 : 0);\n        $objectXML->appendChild($descriptionXML = $dom->createElement('description'));\n        $descriptionXML->appendChild($dom->createTextNode($argument->getDescription()));\n\n        $objectXML->appendChild($defaultsXML = $dom->createElement('defaults'));\n        $defaults = \\is_array($argument->getDefault()) ? $argument->getDefault() : (\\is_bool($argument->getDefault()) ? [var_export($argument->getDefault(), true)] : ($argument->getDefault() ? [$argument->getDefault()] : []));\n        foreach ($defaults as $default) {\n            $defaultsXML->appendChild($defaultXML = $dom->createElement('default'));\n            $defaultXML->appendChild($dom->createTextNode($default));\n        }\n\n        return $dom;\n    }\n\n    private function getInputOptionDocument(InputOption $option): \\DOMDocument\n    {\n        $dom = new \\DOMDocument('1.0', 'UTF-8');\n\n        $dom->appendChild($objectXML = $dom->createElement('option'));\n        $objectXML->setAttribute('name', '--'.$option->getName());\n        $pos = strpos($option->getShortcut() ?? '', '|');\n        if (false !== $pos) {\n            $objectXML->setAttribute('shortcut', '-'.substr($option->getShortcut(), 0, $pos));\n            $objectXML->setAttribute('shortcuts', '-'.str_replace('|', '|-', $option->getShortcut()));\n        } else {\n            $objectXML->setAttribute('shortcut', $option->getShortcut() ? '-'.$option->getShortcut() : '');\n        }\n        $objectXML->setAttribute('accept_value', $option->acceptValue() ? 1 : 0);\n        $objectXML->setAttribute('is_value_required', $option->isValueRequired() ? 1 : 0);\n        $objectXML->setAttribute('is_multiple', $option->isArray() ? 1 : 0);\n        $objectXML->appendChild($descriptionXML = $dom->createElement('description'));\n        $descriptionXML->appendChild($dom->createTextNode($option->getDescription()));\n\n        if ($option->acceptValue()) {\n            $defaults = \\is_array($option->getDefault()) ? $option->getDefault() : (\\is_bool($option->getDefault()) ? [var_export($option->getDefault(), true)] : ($option->getDefault() ? [$option->getDefault()] : []));\n            $objectXML->appendChild($defaultsXML = $dom->createElement('defaults'));\n\n            foreach ($defaults as $default) {\n                $defaultsXML->appendChild($defaultXML = $dom->createElement('default'));\n                $defaultXML->appendChild($dom->createTextNode($default));\n            }\n        }\n\n        if ($option->isNegatable()) {\n            $dom->appendChild($objectXML = $dom->createElement('option'));\n            $objectXML->setAttribute('name', '--no-'.$option->getName());\n            $objectXML->setAttribute('shortcut', '');\n            $objectXML->setAttribute('accept_value', 0);\n            $objectXML->setAttribute('is_value_required', 0);\n            $objectXML->setAttribute('is_multiple', 0);\n            $objectXML->appendChild($descriptionXML = $dom->createElement('description'));\n            $descriptionXML->appendChild($dom->createTextNode('Negate the \"--'.$option->getName().'\" option'));\n        }\n\n        return $dom;\n    }\n}\n","vendor/symfony/console/Event/ConsoleAlarmEvent.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Event;\n\nuse Symfony\\Component\\Console\\Command\\Command;\nuse Symfony\\Component\\Console\\Input\\InputInterface;\nuse Symfony\\Component\\Console\\Output\\OutputInterface;\n\nfinal class ConsoleAlarmEvent extends ConsoleEvent\n{\n    public function __construct(\n        Command $command,\n        InputInterface $input,\n        OutputInterface $output,\n        private int|false $exitCode = 0,\n    ) {\n        parent::__construct($command, $input, $output);\n    }\n\n    public function setExitCode(int $exitCode): void\n    {\n        if ($exitCode < 0 || $exitCode > 255) {\n            throw new \\InvalidArgumentException('Exit code must be between 0 and 255.');\n        }\n\n        $this->exitCode = $exitCode;\n    }\n\n    public function abortExit(): void\n    {\n        $this->exitCode = false;\n    }\n\n    public function getExitCode(): int|false\n    {\n        return $this->exitCode;\n    }\n}\n","vendor/symfony/console/Event/ConsoleCommandEvent.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Event;\n\n/**\n * Allows to do things before the command is executed, like skipping the command or executing code before the command is\n * going to be executed.\n *\n * Changing the input arguments will have no effect.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n */\nfinal class ConsoleCommandEvent extends ConsoleEvent\n{\n    /**\n     * The return code for skipped commands, this will also be passed into the terminate event.\n     */\n    public const RETURN_CODE_DISABLED = 113;\n\n    /**\n     * Indicates if the command should be run or skipped.\n     */\n    private bool $commandShouldRun = true;\n\n    /**\n     * Disables the command, so it won't be run.\n     */\n    public function disableCommand(): bool\n    {\n        return $this->commandShouldRun = false;\n    }\n\n    public function enableCommand(): bool\n    {\n        return $this->commandShouldRun = true;\n    }\n\n    /**\n     * Returns true if the command is runnable, false otherwise.\n     */\n    public function commandShouldRun(): bool\n    {\n        return $this->commandShouldRun;\n    }\n}\n","vendor/symfony/console/Event/ConsoleErrorEvent.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Event;\n\nuse Symfony\\Component\\Console\\Command\\Command;\nuse Symfony\\Component\\Console\\Input\\InputInterface;\nuse Symfony\\Component\\Console\\Output\\OutputInterface;\n\n/**\n * Allows to handle throwables thrown while running a command.\n *\n * @author Wouter de Jong <wouter@wouterj.nl>\n */\nfinal class ConsoleErrorEvent extends ConsoleEvent\n{\n    private int $exitCode;\n\n    public function __construct(\n        InputInterface $input,\n        OutputInterface $output,\n        private \\Throwable $error,\n        ?Command $command = null,\n    ) {\n        parent::__construct($command, $input, $output);\n    }\n\n    public function getError(): \\Throwable\n    {\n        return $this->error;\n    }\n\n    public function setError(\\Throwable $error): void\n    {\n        $this->error = $error;\n    }\n\n    public function setExitCode(int $exitCode): void\n    {\n        $this->exitCode = $exitCode;\n\n        $r = new \\ReflectionProperty($this->error, 'code');\n        $r->setValue($this->error, $this->exitCode);\n    }\n\n    public function getExitCode(): int\n    {\n        return $this->exitCode ?? (\\is_int($this->error->getCode()) && 0 !== $this->error->getCode() ? $this->error->getCode() : 1);\n    }\n}\n","vendor/symfony/console/Event/ConsoleEvent.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Event;\n\nuse Symfony\\Component\\Console\\Command\\Command;\nuse Symfony\\Component\\Console\\Input\\InputInterface;\nuse Symfony\\Component\\Console\\Output\\OutputInterface;\nuse Symfony\\Contracts\\EventDispatcher\\Event;\n\n/**\n * Allows to inspect input and output of a command.\n *\n * @author Francesco Levorato <git@flevour.net>\n */\nclass ConsoleEvent extends Event\n{\n    public function __construct(\n        protected ?Command $command,\n        private InputInterface $input,\n        private OutputInterface $output,\n    ) {\n    }\n\n    /**\n     * Gets the command that is executed.\n     */\n    public function getCommand(): ?Command\n    {\n        return $this->command;\n    }\n\n    /**\n     * Gets the input instance.\n     */\n    public function getInput(): InputInterface\n    {\n        return $this->input;\n    }\n\n    /**\n     * Gets the output instance.\n     */\n    public function getOutput(): OutputInterface\n    {\n        return $this->output;\n    }\n}\n","vendor/symfony/console/Event/ConsoleSignalEvent.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Event;\n\nuse Symfony\\Component\\Console\\Command\\Command;\nuse Symfony\\Component\\Console\\Input\\InputInterface;\nuse Symfony\\Component\\Console\\Output\\OutputInterface;\n\n/**\n * @author marie <marie@users.noreply.github.com>\n */\nfinal class ConsoleSignalEvent extends ConsoleEvent\n{\n    public function __construct(\n        Command $command,\n        InputInterface $input,\n        OutputInterface $output,\n        private int $handlingSignal,\n        private int|false $exitCode = 0,\n    ) {\n        parent::__construct($command, $input, $output);\n    }\n\n    public function getHandlingSignal(): int\n    {\n        return $this->handlingSignal;\n    }\n\n    public function setExitCode(int $exitCode): void\n    {\n        if ($exitCode < 0 || $exitCode > 255) {\n            throw new \\InvalidArgumentException('Exit code must be between 0 and 255.');\n        }\n\n        $this->exitCode = $exitCode;\n    }\n\n    public function abortExit(): void\n    {\n        $this->exitCode = false;\n    }\n\n    public function getExitCode(): int|false\n    {\n        return $this->exitCode;\n    }\n}\n","vendor/symfony/console/Event/ConsoleTerminateEvent.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Event;\n\nuse Symfony\\Component\\Console\\Command\\Command;\nuse Symfony\\Component\\Console\\Input\\InputInterface;\nuse Symfony\\Component\\Console\\Output\\OutputInterface;\n\n/**\n * Allows to manipulate the exit code of a command after its execution.\n *\n * @author Francesco Levorato <git@flevour.net>\n * @author Jules Pietri <jules@heahprod.com>\n */\nfinal class ConsoleTerminateEvent extends ConsoleEvent\n{\n    public function __construct(\n        Command $command,\n        InputInterface $input,\n        OutputInterface $output,\n        private int $exitCode,\n        private readonly ?int $interruptingSignal = null,\n    ) {\n        parent::__construct($command, $input, $output);\n    }\n\n    public function setExitCode(int $exitCode): void\n    {\n        $this->exitCode = $exitCode;\n    }\n\n    public function getExitCode(): int\n    {\n        return $this->exitCode;\n    }\n\n    public function getInterruptingSignal(): ?int\n    {\n        return $this->interruptingSignal;\n    }\n}\n","vendor/symfony/console/EventListener/ErrorListener.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\EventListener;\n\nuse Psr\\Log\\LoggerInterface;\nuse Symfony\\Component\\Console\\ConsoleEvents;\nuse Symfony\\Component\\Console\\Event\\ConsoleErrorEvent;\nuse Symfony\\Component\\Console\\Event\\ConsoleEvent;\nuse Symfony\\Component\\Console\\Event\\ConsoleTerminateEvent;\nuse Symfony\\Component\\EventDispatcher\\EventSubscriberInterface;\n\n/**\n * @author James Halsall <james.t.halsall@googlemail.com>\n * @author Robin Chalas <robin.chalas@gmail.com>\n */\nclass ErrorListener implements EventSubscriberInterface\n{\n    public function __construct(\n        private ?LoggerInterface $logger = null,\n    ) {\n    }\n\n    public function onConsoleError(ConsoleErrorEvent $event): void\n    {\n        if (null === $this->logger) {\n            return;\n        }\n\n        $error = $event->getError();\n\n        if (!$inputString = self::getInputString($event)) {\n            $this->logger->critical('An error occurred while using the console. Message: \"{message}\"', ['exception' => $error, 'message' => $error->getMessage()]);\n\n            return;\n        }\n\n        $this->logger->critical('Error thrown while running command \"{command}\". Message: \"{message}\"', ['exception' => $error, 'command' => $inputString, 'message' => $error->getMessage()]);\n    }\n\n    public function onConsoleTerminate(ConsoleTerminateEvent $event): void\n    {\n        if (null === $this->logger) {\n            return;\n        }\n\n        $exitCode = $event->getExitCode();\n\n        if (0 === $exitCode) {\n            return;\n        }\n\n        if (!$inputString = self::getInputString($event)) {\n            $this->logger->debug('The console exited with code \"{code}\"', ['code' => $exitCode]);\n\n            return;\n        }\n\n        $this->logger->debug('Command \"{command}\" exited with code \"{code}\"', ['command' => $inputString, 'code' => $exitCode]);\n    }\n\n    public static function getSubscribedEvents(): array\n    {\n        return [\n            ConsoleEvents::ERROR => ['onConsoleError', -128],\n            ConsoleEvents::TERMINATE => ['onConsoleTerminate', -128],\n        ];\n    }\n\n    private static function getInputString(ConsoleEvent $event): string\n    {\n        $commandName = $event->getCommand()?->getName();\n        $inputString = (string) $event->getInput();\n\n        if ($commandName) {\n            return str_replace([\"'$commandName'\", \"\\\"$commandName\\\"\"], $commandName, $inputString);\n        }\n\n        return $inputString;\n    }\n}\n","vendor/symfony/console/Exception/CommandNotFoundException.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Exception;\n\n/**\n * Represents an incorrect command name typed in the console.\n *\n * @author Jérôme Tamarelle <jerome@tamarelle.net>\n */\nclass CommandNotFoundException extends \\InvalidArgumentException implements ExceptionInterface\n{\n    /**\n     * @param string          $message      Exception message to throw\n     * @param string[]        $alternatives List of similar defined names\n     * @param int             $code         Exception code\n     * @param \\Throwable|null $previous     Previous exception used for the exception chaining\n     */\n    public function __construct(\n        string $message,\n        private array $alternatives = [],\n        int $code = 0,\n        ?\\Throwable $previous = null,\n    ) {\n        parent::__construct($message, $code, $previous);\n    }\n\n    /**\n     * @return string[]\n     */\n    public function getAlternatives(): array\n    {\n        return $this->alternatives;\n    }\n}\n","vendor/symfony/console/Exception/ExceptionInterface.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Exception;\n\n/**\n * ExceptionInterface.\n *\n * @author Jérôme Tamarelle <jerome@tamarelle.net>\n */\ninterface ExceptionInterface extends \\Throwable\n{\n}\n","vendor/symfony/console/Exception/InvalidArgumentException.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Exception;\n\n/**\n * @author Jérôme Tamarelle <jerome@tamarelle.net>\n */\nclass InvalidArgumentException extends \\InvalidArgumentException implements ExceptionInterface\n{\n    /**\n     * @internal\n     */\n    public static function fromEnumValue(string $name, string $value, array|\\Closure $suggestedValues): self\n    {\n        $error = \\sprintf('The value \"%s\" is not valid for the \"%s\" argument.', $value, $name);\n\n        if (\\is_array($suggestedValues)) {\n            $error .= \\sprintf(' Supported values are \"%s\".', implode('\", \"', $suggestedValues));\n        }\n\n        return new self($error);\n    }\n}\n","vendor/symfony/console/Exception/InvalidOptionException.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Exception;\n\n/**\n * Represents an incorrect option name or value typed in the console.\n *\n * @author Jérôme Tamarelle <jerome@tamarelle.net>\n */\nclass InvalidOptionException extends \\InvalidArgumentException implements ExceptionInterface\n{\n    /**\n     * @internal\n     */\n    public static function fromEnumValue(string $name, string $value, array|\\Closure $suggestedValues): self\n    {\n        $error = \\sprintf('The value \"%s\" is not valid for the \"%s\" option.', $value, $name);\n\n        if (\\is_array($suggestedValues)) {\n            $error .= \\sprintf(' Supported values are \"%s\".', implode('\", \"', $suggestedValues));\n        }\n\n        return new self($error);\n    }\n}\n","vendor/symfony/console/Exception/LogicException.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Exception;\n\n/**\n * @author Jérôme Tamarelle <jerome@tamarelle.net>\n */\nclass LogicException extends \\LogicException implements ExceptionInterface\n{\n}\n","vendor/symfony/console/Exception/MissingInputException.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Exception;\n\n/**\n * Represents failure to read input from stdin.\n *\n * @author Gabriel Ostrolucký <gabriel.ostrolucky@gmail.com>\n */\nclass MissingInputException extends RuntimeException implements ExceptionInterface\n{\n}\n","vendor/symfony/console/Exception/NamespaceNotFoundException.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Exception;\n\n/**\n * Represents an incorrect namespace typed in the console.\n *\n * @author Pierre du Plessis <pdples@gmail.com>\n */\nclass NamespaceNotFoundException extends CommandNotFoundException\n{\n}\n","vendor/symfony/console/Exception/RunCommandFailedException.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Exception;\n\nuse Symfony\\Component\\Console\\Messenger\\RunCommandContext;\n\n/**\n * @author Kevin Bond <kevinbond@gmail.com>\n */\nfinal class RunCommandFailedException extends RuntimeException\n{\n    public function __construct(\\Throwable|string $exception, public readonly RunCommandContext $context)\n    {\n        parent::__construct(\n            $exception instanceof \\Throwable ? $exception->getMessage() : $exception,\n            $exception instanceof \\Throwable && \\is_int($exception->getCode()) ? $exception->getCode() : 0,\n            $exception instanceof \\Throwable ? $exception : null,\n        );\n    }\n}\n","vendor/symfony/console/Exception/RuntimeException.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Exception;\n\n/**\n * @author Jérôme Tamarelle <jerome@tamarelle.net>\n */\nclass RuntimeException extends \\RuntimeException implements ExceptionInterface\n{\n}\n","vendor/symfony/console/Formatter/NullOutputFormatter.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Formatter;\n\n/**\n * @author Tien Xuan Vo <tien.xuan.vo@gmail.com>\n */\nfinal class NullOutputFormatter implements OutputFormatterInterface\n{\n    private NullOutputFormatterStyle $style;\n\n    public function format(?string $message): ?string\n    {\n        return null;\n    }\n\n    public function getStyle(string $name): OutputFormatterStyleInterface\n    {\n        // to comply with the interface we must return a OutputFormatterStyleInterface\n        return $this->style ??= new NullOutputFormatterStyle();\n    }\n\n    public function hasStyle(string $name): bool\n    {\n        return false;\n    }\n\n    public function isDecorated(): bool\n    {\n        return false;\n    }\n\n    public function setDecorated(bool $decorated): void\n    {\n        // do nothing\n    }\n\n    public function setStyle(string $name, OutputFormatterStyleInterface $style): void\n    {\n        // do nothing\n    }\n}\n","vendor/symfony/console/Formatter/NullOutputFormatterStyle.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Formatter;\n\n/**\n * @author Tien Xuan Vo <tien.xuan.vo@gmail.com>\n */\nfinal class NullOutputFormatterStyle implements OutputFormatterStyleInterface\n{\n    public function apply(string $text): string\n    {\n        return $text;\n    }\n\n    public function setBackground(?string $color): void\n    {\n        // do nothing\n    }\n\n    public function setForeground(?string $color): void\n    {\n        // do nothing\n    }\n\n    public function setOption(string $option): void\n    {\n        // do nothing\n    }\n\n    public function setOptions(array $options): void\n    {\n        // do nothing\n    }\n\n    public function unsetOption(string $option): void\n    {\n        // do nothing\n    }\n}\n","vendor/symfony/console/Formatter/OutputFormatter.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Formatter;\n\nuse Symfony\\Component\\Console\\Exception\\InvalidArgumentException;\nuse Symfony\\Component\\Console\\Helper\\Helper;\n\nuse function Symfony\\Component\\String\\b;\n\n/**\n * Formatter class for console output.\n *\n * @author Konstantin Kudryashov <ever.zet@gmail.com>\n * @author Roland Franssen <franssen.roland@gmail.com>\n */\nclass OutputFormatter implements WrappableOutputFormatterInterface\n{\n    private array $styles = [];\n    private OutputFormatterStyleStack $styleStack;\n\n    public function __clone()\n    {\n        $this->styleStack = clone $this->styleStack;\n        foreach ($this->styles as $key => $value) {\n            $this->styles[$key] = clone $value;\n        }\n    }\n\n    /**\n     * Escapes \"<\" and \">\" special chars in given text.\n     */\n    public static function escape(string $text): string\n    {\n        $text = str_replace(['<', '>'], ['\\\\<', '\\\\>'], $text);\n\n        return self::escapeTrailingBackslash($text);\n    }\n\n    /**\n     * Escapes trailing \"\\\" in given text.\n     *\n     * @internal\n     */\n    public static function escapeTrailingBackslash(string $text): string\n    {\n        if (str_ends_with($text, '\\\\')) {\n            $len = \\strlen($text);\n            $text = rtrim($text, '\\\\');\n            $text = str_replace(\"\\0\", '', $text);\n            $text .= str_repeat(\"\\0\", $len - \\strlen($text));\n        }\n\n        return $text;\n    }\n\n    /**\n     * Initializes console output formatter.\n     *\n     * @param OutputFormatterStyleInterface[] $styles Array of \"name => FormatterStyle\" instances\n     */\n    public function __construct(\n        private bool $decorated = false,\n        array $styles = [],\n    ) {\n        $this->setStyle('error', new OutputFormatterStyle('white', 'red'));\n        $this->setStyle('info', new OutputFormatterStyle('green'));\n        $this->setStyle('comment', new OutputFormatterStyle('yellow'));\n        $this->setStyle('question', new OutputFormatterStyle('black', 'cyan'));\n\n        foreach ($styles as $name => $style) {\n            $this->setStyle($name, $style);\n        }\n\n        $this->styleStack = new OutputFormatterStyleStack();\n    }\n\n    public function setDecorated(bool $decorated): void\n    {\n        $this->decorated = $decorated;\n    }\n\n    public function isDecorated(): bool\n    {\n        return $this->decorated;\n    }\n\n    public function setStyle(string $name, OutputFormatterStyleInterface $style): void\n    {\n        $this->styles[strtolower($name)] = $style;\n    }\n\n    public function hasStyle(string $name): bool\n    {\n        return isset($this->styles[strtolower($name)]);\n    }\n\n    public function getStyle(string $name): OutputFormatterStyleInterface\n    {\n        if (!$this->hasStyle($name)) {\n            throw new InvalidArgumentException(\\sprintf('Undefined style: \"%s\".', $name));\n        }\n\n        return $this->styles[strtolower($name)];\n    }\n\n    public function format(?string $message): ?string\n    {\n        return $this->formatAndWrap($message, 0);\n    }\n\n    public function formatAndWrap(?string $message, int $width): string\n    {\n        if (null === $message) {\n            return '';\n        }\n\n        // For ASCII-only strings, byte positions equal character positions,\n        // so we can use native strlen/substr which is much faster than Helper::length/substr.\n        $isAscii = !preg_match('/[\\x80-\\xFF]/', $message);\n\n        $offset = 0;\n        $output = '';\n        $openTagRegex = '[a-z](?:[^\\\\\\\\<>]*+ | \\\\\\\\.)*';\n        $closeTagRegex = '[a-z][^<>]*+';\n        $currentLineLength = 0;\n        preg_match_all(\"#<(($openTagRegex) | /($closeTagRegex)?)>#ix\", $message, $matches, \\PREG_OFFSET_CAPTURE);\n        foreach ($matches[0] as $i => $match) {\n            $pos = $match[1];\n            $text = $match[0];\n\n            if (0 != $pos && '\\\\' == $message[$pos - 1]) {\n                continue;\n            }\n\n            if ($isAscii) {\n                // For ASCII, byte position = character position, no conversion needed\n                $output .= $this->applyCurrentStyle(substr($message, $offset, $pos - $offset), $output, $width, $currentLineLength);\n                $offset = $pos + \\strlen($text);\n            } else {\n                // convert byte position to character position.\n                $pos = Helper::length(substr($message, 0, $pos));\n                // add the text up to the next tag\n                $output .= $this->applyCurrentStyle(Helper::substr($message, $offset, $pos - $offset), $output, $width, $currentLineLength);\n                $offset = $pos + Helper::length($text);\n            }\n\n            // opening tag?\n            if ($open = '/' !== $text[1]) {\n                $tag = $matches[1][$i][0];\n            } else {\n                $tag = $matches[3][$i][0] ?? '';\n            }\n\n            if (!$open && !$tag) {\n                // </>\n                $this->styleStack->pop();\n            } elseif (null === $style = $this->createStyleFromString($tag)) {\n                $output .= $this->applyCurrentStyle($text, $output, $width, $currentLineLength);\n            } elseif ($open) {\n                $this->styleStack->push($style);\n            } else {\n                $this->styleStack->pop($style);\n            }\n        }\n\n        $output .= $this->applyCurrentStyle($isAscii ? substr($message, $offset) : Helper::substr($message, $offset), $output, $width, $currentLineLength);\n\n        return strtr($output, [\"\\0\" => '\\\\', '\\\\<' => '<', '\\\\>' => '>']);\n    }\n\n    public function getStyleStack(): OutputFormatterStyleStack\n    {\n        return $this->styleStack;\n    }\n\n    /**\n     * Tries to create new style instance from string.\n     */\n    private function createStyleFromString(string $string): ?OutputFormatterStyleInterface\n    {\n        if (isset($this->styles[$string])) {\n            return $this->styles[$string];\n        }\n\n        if (!preg_match_all('/([^=]+)=([^;]+)(;|$)/', $string, $matches, \\PREG_SET_ORDER)) {\n            return null;\n        }\n\n        $style = new OutputFormatterStyle();\n        foreach ($matches as $match) {\n            array_shift($match);\n            $match[0] = strtolower($match[0]);\n\n            if ('fg' == $match[0]) {\n                $style->setForeground(strtolower($match[1]));\n            } elseif ('bg' == $match[0]) {\n                $style->setBackground(strtolower($match[1]));\n            } elseif ('href' === $match[0]) {\n                $url = preg_replace('{\\\\\\\\([<>])}', '$1', $match[1]);\n                $style->setHref($url);\n            } elseif ('options' === $match[0]) {\n                preg_match_all('([^,;]+)', strtolower($match[1]), $options);\n                $options = array_shift($options);\n                foreach ($options as $option) {\n                    $style->setOption($option);\n                }\n            } else {\n                return null;\n            }\n        }\n\n        return $style;\n    }\n\n    /**\n     * Applies current style from stack to text, if must be applied.\n     */\n    private function applyCurrentStyle(string $text, string $current, int $width, int &$currentLineLength): string\n    {\n        if ('' === $text) {\n            return '';\n        }\n\n        if (!$width) {\n            return $this->isDecorated() ? $this->styleStack->getCurrent()->apply($text) : $text;\n        }\n\n        if (!$currentLineLength && '' !== $current) {\n            $text = ltrim($text);\n        }\n\n        if ($currentLineLength) {\n            $lines = explode(\"\\n\", $text, 2);\n            $prefix = Helper::substr($lines[0], 0, $i = $width - $currentLineLength).\"\\n\";\n            $text = Helper::substr($lines[0], $i);\n\n            if (isset($lines[1])) {\n                // $prefix may contain the full first line in which the \\n is already a part of $prefix.\n                if ('' !== $text) {\n                    $text .= \"\\n\";\n                }\n\n                $text .= $lines[1];\n            }\n        } else {\n            $prefix = '';\n        }\n\n        preg_match('~(\\\\n)$~', $text, $matches);\n        $text = $prefix.$this->addLineBreaks($text, $width);\n        $text = rtrim($text, \"\\n\").($matches[1] ?? '');\n\n        if (!$currentLineLength && '' !== $current && !str_ends_with($current, \"\\n\")) {\n            $text = \"\\n\".$text;\n        }\n\n        $lines = explode(\"\\n\", $text);\n\n        foreach ($lines as $i => $line) {\n            $currentLineLength = 0 === $i ? $currentLineLength + Helper::length($line) : Helper::length($line);\n            if ($width <= $currentLineLength) {\n                $currentLineLength = 0;\n            }\n        }\n\n        if ($this->isDecorated()) {\n            foreach ($lines as $i => $line) {\n                $lines[$i] = $this->styleStack->getCurrent()->apply($line);\n            }\n        }\n\n        return implode(\"\\n\", $lines);\n    }\n\n    private function addLineBreaks(string $text, int $width): string\n    {\n        $encoding = mb_detect_encoding($text, null, true) ?: 'UTF-8';\n\n        return b($text)->toUnicodeString($encoding)->wordwrap($width, \"\\n\", true)->toByteString($encoding);\n    }\n}\n","vendor/symfony/console/Formatter/OutputFormatterInterface.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Formatter;\n\n/**\n * Formatter interface for console output.\n *\n * @author Konstantin Kudryashov <ever.zet@gmail.com>\n */\ninterface OutputFormatterInterface\n{\n    /**\n     * Sets the decorated flag.\n     */\n    public function setDecorated(bool $decorated): void;\n\n    /**\n     * Whether the output will decorate messages.\n     */\n    public function isDecorated(): bool;\n\n    /**\n     * Sets a new style.\n     */\n    public function setStyle(string $name, OutputFormatterStyleInterface $style): void;\n\n    /**\n     * Checks if output formatter has style with specified name.\n     */\n    public function hasStyle(string $name): bool;\n\n    /**\n     * Gets style options from style with specified name.\n     *\n     * @throws \\InvalidArgumentException When style isn't defined\n     */\n    public function getStyle(string $name): OutputFormatterStyleInterface;\n\n    /**\n     * Formats a message according to the given styles.\n     */\n    public function format(?string $message): ?string;\n}\n","vendor/symfony/console/Formatter/OutputFormatterStyle.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Formatter;\n\nuse Symfony\\Component\\Console\\Color;\n\n/**\n * Formatter style class for defining styles.\n *\n * @author Konstantin Kudryashov <ever.zet@gmail.com>\n */\nclass OutputFormatterStyle implements OutputFormatterStyleInterface\n{\n    private Color $color;\n    private string $foreground;\n    private string $background;\n    private array $options;\n    private ?string $href = null;\n    private bool $handlesHrefGracefully;\n\n    /**\n     * Initializes output formatter style.\n     *\n     * @param string|null $foreground The style foreground color name\n     * @param string|null $background The style background color name\n     */\n    public function __construct(?string $foreground = null, ?string $background = null, array $options = [])\n    {\n        $this->color = new Color($this->foreground = $foreground ?: '', $this->background = $background ?: '', $this->options = $options);\n    }\n\n    public function setForeground(?string $color): void\n    {\n        $this->color = new Color($this->foreground = $color ?: '', $this->background, $this->options);\n    }\n\n    public function setBackground(?string $color): void\n    {\n        $this->color = new Color($this->foreground, $this->background = $color ?: '', $this->options);\n    }\n\n    public function setHref(string $url): void\n    {\n        $this->href = $url;\n    }\n\n    public function setOption(string $option): void\n    {\n        $this->options[] = $option;\n        $this->color = new Color($this->foreground, $this->background, $this->options);\n    }\n\n    public function unsetOption(string $option): void\n    {\n        $pos = array_search($option, $this->options);\n        if (false !== $pos) {\n            unset($this->options[$pos]);\n        }\n\n        $this->color = new Color($this->foreground, $this->background, $this->options);\n    }\n\n    public function setOptions(array $options): void\n    {\n        $this->color = new Color($this->foreground, $this->background, $this->options = $options);\n    }\n\n    public function apply(string $text): string\n    {\n        $this->handlesHrefGracefully ??= 'JetBrains-JediTerm' !== getenv('TERMINAL_EMULATOR')\n            && (!getenv('KONSOLE_VERSION') || (int) getenv('KONSOLE_VERSION') > 201100)\n            && !isset($_SERVER['IDEA_INITIAL_DIRECTORY']);\n\n        if (null !== $this->href && $this->handlesHrefGracefully) {\n            $text = \"\\033]8;;$this->href\\033\\\\$text\\033]8;;\\033\\\\\";\n        }\n\n        return $this->color->apply($text);\n    }\n}\n","vendor/symfony/console/Formatter/OutputFormatterStyleInterface.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Formatter;\n\n/**\n * Formatter style interface for defining styles.\n *\n * @author Konstantin Kudryashov <ever.zet@gmail.com>\n */\ninterface OutputFormatterStyleInterface\n{\n    /**\n     * Sets style foreground color.\n     */\n    public function setForeground(?string $color): void;\n\n    /**\n     * Sets style background color.\n     */\n    public function setBackground(?string $color): void;\n\n    /**\n     * Sets some specific style option.\n     */\n    public function setOption(string $option): void;\n\n    /**\n     * Unsets some specific style option.\n     */\n    public function unsetOption(string $option): void;\n\n    /**\n     * Sets multiple style options at once.\n     */\n    public function setOptions(array $options): void;\n\n    /**\n     * Applies the style to a given text.\n     */\n    public function apply(string $text): string;\n}\n","vendor/symfony/console/Formatter/OutputFormatterStyleStack.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Formatter;\n\nuse Symfony\\Component\\Console\\Exception\\InvalidArgumentException;\nuse Symfony\\Contracts\\Service\\ResetInterface;\n\n/**\n * @author Jean-François Simon <contact@jfsimon.fr>\n */\nclass OutputFormatterStyleStack implements ResetInterface\n{\n    /**\n     * @var OutputFormatterStyleInterface[]\n     */\n    private array $styles = [];\n\n    private OutputFormatterStyleInterface $emptyStyle;\n\n    public function __construct(?OutputFormatterStyleInterface $emptyStyle = null)\n    {\n        $this->emptyStyle = $emptyStyle ?? new OutputFormatterStyle();\n        $this->reset();\n    }\n\n    /**\n     * Resets stack (ie. empty internal arrays).\n     */\n    public function reset(): void\n    {\n        $this->styles = [];\n    }\n\n    /**\n     * Pushes a style in the stack.\n     */\n    public function push(OutputFormatterStyleInterface $style): void\n    {\n        $this->styles[] = $style;\n    }\n\n    /**\n     * Pops a style from the stack.\n     *\n     * @throws InvalidArgumentException When style tags incorrectly nested\n     */\n    public function pop(?OutputFormatterStyleInterface $style = null): OutputFormatterStyleInterface\n    {\n        if (!$this->styles) {\n            return $this->emptyStyle;\n        }\n\n        if (null === $style) {\n            return array_pop($this->styles);\n        }\n\n        foreach (array_reverse($this->styles, true) as $index => $stackedStyle) {\n            if ($style->apply('') === $stackedStyle->apply('')) {\n                $this->styles = \\array_slice($this->styles, 0, $index);\n\n                return $stackedStyle;\n            }\n        }\n\n        throw new InvalidArgumentException('Incorrectly nested style tag found.');\n    }\n\n    /**\n     * Computes current style with stacks top codes.\n     */\n    public function getCurrent(): OutputFormatterStyleInterface\n    {\n        if (!$this->styles) {\n            return $this->emptyStyle;\n        }\n\n        return $this->styles[\\count($this->styles) - 1];\n    }\n\n    /**\n     * @return $this\n     */\n    public function setEmptyStyle(OutputFormatterStyleInterface $emptyStyle): static\n    {\n        $this->emptyStyle = $emptyStyle;\n\n        return $this;\n    }\n\n    public function getEmptyStyle(): OutputFormatterStyleInterface\n    {\n        return $this->emptyStyle;\n    }\n}\n","vendor/symfony/console/Formatter/WrappableOutputFormatterInterface.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Formatter;\n\n/**\n * Formatter interface for console output that supports word wrapping.\n *\n * @author Roland Franssen <franssen.roland@gmail.com>\n */\ninterface WrappableOutputFormatterInterface extends OutputFormatterInterface\n{\n    /**\n     * Formats a message according to the given styles, wrapping at `$width` (0 means no wrapping).\n     */\n    public function formatAndWrap(?string $message, int $width): string;\n}\n","vendor/symfony/console/Helper/DebugFormatterHelper.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Helper;\n\n/**\n * Helps outputting debug information when running an external program from a command.\n *\n * An external program can be a Process, an HTTP request, or anything else.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n */\nclass DebugFormatterHelper extends Helper\n{\n    private const COLORS = ['black', 'red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'white', 'default'];\n    private array $started = [];\n    private int $count = -1;\n\n    /**\n     * Starts a debug formatting session.\n     */\n    public function start(string $id, string $message, string $prefix = 'RUN'): string\n    {\n        $this->started[$id] = ['border' => ++$this->count % \\count(self::COLORS)];\n\n        return \\sprintf(\"%s<bg=blue;fg=white> %s </> <fg=blue>%s</>\\n\", $this->getBorder($id), $prefix, $message);\n    }\n\n    /**\n     * Adds progress to a formatting session.\n     */\n    public function progress(string $id, string $buffer, bool $error = false, string $prefix = 'OUT', string $errorPrefix = 'ERR'): string\n    {\n        $message = '';\n\n        if ($error) {\n            if (isset($this->started[$id]['out'])) {\n                $message .= \"\\n\";\n                unset($this->started[$id]['out']);\n            }\n            if (!isset($this->started[$id]['err'])) {\n                $message .= \\sprintf('%s<bg=red;fg=white> %s </> ', $this->getBorder($id), $errorPrefix);\n                $this->started[$id]['err'] = true;\n            }\n\n            $message .= str_replace(\"\\n\", \\sprintf(\"\\n%s<bg=red;fg=white> %s </> \", $this->getBorder($id), $errorPrefix), $buffer);\n        } else {\n            if (isset($this->started[$id]['err'])) {\n                $message .= \"\\n\";\n                unset($this->started[$id]['err']);\n            }\n            if (!isset($this->started[$id]['out'])) {\n                $message .= \\sprintf('%s<bg=green;fg=white> %s </> ', $this->getBorder($id), $prefix);\n                $this->started[$id]['out'] = true;\n            }\n\n            $message .= str_replace(\"\\n\", \\sprintf(\"\\n%s<bg=green;fg=white> %s </> \", $this->getBorder($id), $prefix), $buffer);\n        }\n\n        return $message;\n    }\n\n    /**\n     * Stops a formatting session.\n     */\n    public function stop(string $id, string $message, bool $successful, string $prefix = 'RES'): string\n    {\n        $trailingEOL = isset($this->started[$id]['out']) || isset($this->started[$id]['err']) ? \"\\n\" : '';\n\n        if ($successful) {\n            return \\sprintf(\"%s%s<bg=green;fg=white> %s </> <fg=green>%s</>\\n\", $trailingEOL, $this->getBorder($id), $prefix, $message);\n        }\n\n        $message = \\sprintf(\"%s%s<bg=red;fg=white> %s </> <fg=red>%s</>\\n\", $trailingEOL, $this->getBorder($id), $prefix, $message);\n\n        unset($this->started[$id]['out'], $this->started[$id]['err']);\n\n        return $message;\n    }\n\n    private function getBorder(string $id): string\n    {\n        return \\sprintf('<bg=%s> </>', self::COLORS[$this->started[$id]['border']]);\n    }\n\n    public function getName(): string\n    {\n        return 'debug_formatter';\n    }\n}\n","vendor/symfony/console/Helper/DescriptorHelper.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Helper;\n\nuse Symfony\\Component\\Console\\Descriptor\\DescriptorInterface;\nuse Symfony\\Component\\Console\\Descriptor\\JsonDescriptor;\nuse Symfony\\Component\\Console\\Descriptor\\MarkdownDescriptor;\nuse Symfony\\Component\\Console\\Descriptor\\ReStructuredTextDescriptor;\nuse Symfony\\Component\\Console\\Descriptor\\TextDescriptor;\nuse Symfony\\Component\\Console\\Descriptor\\XmlDescriptor;\nuse Symfony\\Component\\Console\\Exception\\InvalidArgumentException;\nuse Symfony\\Component\\Console\\Output\\OutputInterface;\n\n/**\n * This class adds helper method to describe objects in various formats.\n *\n * @author Jean-François Simon <contact@jfsimon.fr>\n */\nclass DescriptorHelper extends Helper\n{\n    /**\n     * @var DescriptorInterface[]\n     */\n    private array $descriptors = [];\n\n    public function __construct()\n    {\n        $this\n            ->register('txt', new TextDescriptor())\n            ->register('xml', new XmlDescriptor())\n            ->register('json', new JsonDescriptor())\n            ->register('md', new MarkdownDescriptor())\n            ->register('rst', new ReStructuredTextDescriptor())\n        ;\n    }\n\n    /**\n     * Describes an object if supported.\n     *\n     * Available options are:\n     * * format: string, the output format name\n     * * raw_text: boolean, sets output type as raw\n     *\n     * @throws InvalidArgumentException when the given format is not supported\n     */\n    public function describe(OutputInterface $output, ?object $object, array $options = []): void\n    {\n        $options = array_merge([\n            'raw_text' => false,\n            'format' => 'txt',\n        ], $options);\n\n        if (!isset($this->descriptors[$options['format']])) {\n            throw new InvalidArgumentException(\\sprintf('Unsupported format \"%s\".', $options['format']));\n        }\n\n        $descriptor = $this->descriptors[$options['format']];\n        $descriptor->describe($output, $object, $options);\n    }\n\n    /**\n     * Registers a descriptor.\n     *\n     * @return $this\n     */\n    public function register(string $format, DescriptorInterface $descriptor): static\n    {\n        $this->descriptors[$format] = $descriptor;\n\n        return $this;\n    }\n\n    public function getName(): string\n    {\n        return 'descriptor';\n    }\n\n    public function getFormats(): array\n    {\n        return array_keys($this->descriptors);\n    }\n}\n","vendor/symfony/console/Helper/Dumper.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Helper;\n\nuse Symfony\\Component\\Console\\Output\\OutputInterface;\nuse Symfony\\Component\\VarDumper\\Cloner\\ClonerInterface;\nuse Symfony\\Component\\VarDumper\\Cloner\\VarCloner;\nuse Symfony\\Component\\VarDumper\\Dumper\\CliDumper;\n\n/**\n * @author Roland Franssen <franssen.roland@gmail.com>\n */\nfinal class Dumper\n{\n    private \\Closure $handler;\n\n    public function __construct(\n        private OutputInterface $output,\n        private ?CliDumper $dumper = null,\n        private ?ClonerInterface $cloner = null,\n    ) {\n        if (class_exists(CliDumper::class)) {\n            $this->handler = function ($var): string {\n                $dumper = $this->dumper ??= new CliDumper(null, null, CliDumper::DUMP_LIGHT_ARRAY | CliDumper::DUMP_COMMA_SEPARATOR);\n                $dumper->setColors($this->output->isDecorated());\n\n                return rtrim($dumper->dump(($this->cloner ??= new VarCloner())->cloneVar($var)->withRefHandles(false), true));\n            };\n        } else {\n            $this->handler = static fn ($var): string => match (true) {\n                null === $var => 'null',\n                true === $var => 'true',\n                false === $var => 'false',\n                \\is_string($var) => '\"'.$var.'\"',\n                default => rtrim(print_r($var, true)),\n            };\n        }\n    }\n\n    public function __invoke(mixed $var): string\n    {\n        return ($this->handler)($var);\n    }\n}\n","vendor/symfony/console/Helper/FormatterHelper.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Helper;\n\nuse Symfony\\Component\\Console\\Formatter\\OutputFormatter;\n\n/**\n * The Formatter class provides helpers to format messages.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n */\nclass FormatterHelper extends Helper\n{\n    /**\n     * Formats a message within a section.\n     */\n    public function formatSection(string $section, string $message, string $style = 'info'): string\n    {\n        return \\sprintf('<%s>[%s]</%s> %s', $style, $section, $style, $message);\n    }\n\n    /**\n     * Formats a message as a block of text.\n     */\n    public function formatBlock(string|array $messages, string $style, bool $large = false): string\n    {\n        if (!\\is_array($messages)) {\n            $messages = [$messages];\n        }\n\n        $len = 0;\n        $lines = [];\n        foreach ($messages as $message) {\n            $message = OutputFormatter::escape($message);\n            $lines[] = \\sprintf($large ? '  %s  ' : ' %s ', $message);\n            $len = max(self::width($message) + ($large ? 4 : 2), $len);\n        }\n\n        $messages = $large ? [str_repeat(' ', $len)] : [];\n        for ($i = 0; isset($lines[$i]); ++$i) {\n            $messages[] = $lines[$i].str_repeat(' ', $len - self::width($lines[$i]));\n        }\n        if ($large) {\n            $messages[] = str_repeat(' ', $len);\n        }\n\n        for ($i = 0; isset($messages[$i]); ++$i) {\n            $messages[$i] = \\sprintf('<%s>%s</%s>', $style, $messages[$i], $style);\n        }\n\n        return implode(\"\\n\", $messages);\n    }\n\n    /**\n     * Truncates a message to the given length.\n     */\n    public function truncate(string $message, int $length, string $suffix = '...'): string\n    {\n        $computedLength = $length - self::width($suffix);\n\n        if ($computedLength > self::width($message)) {\n            return $message;\n        }\n\n        return self::substr($message, 0, $length).$suffix;\n    }\n\n    public function getName(): string\n    {\n        return 'formatter';\n    }\n}\n","vendor/symfony/console/Helper/Helper.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Helper;\n\nuse Symfony\\Component\\Console\\Formatter\\OutputFormatterInterface;\nuse Symfony\\Component\\String\\UnicodeString;\n\n/**\n * Helper is the base class for all helper classes.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n */\nabstract class Helper implements HelperInterface\n{\n    protected ?HelperSet $helperSet = null;\n\n    public function setHelperSet(?HelperSet $helperSet): void\n    {\n        $this->helperSet = $helperSet;\n    }\n\n    public function getHelperSet(): ?HelperSet\n    {\n        return $this->helperSet;\n    }\n\n    /**\n     * Returns the width of a string, using mb_strwidth if it is available.\n     * The width is how many characters positions the string will use.\n     */\n    public static function width(?string $string): int\n    {\n        $string ??= '';\n\n        if (preg_match('//u', $string)) {\n            $string = preg_replace('/[\\p{Cc}\\x7F]++/u', '', $string, -1, $count);\n\n            return (new UnicodeString($string))->width(false) + $count;\n        }\n\n        if (false === $encoding = mb_detect_encoding($string, null, true)) {\n            return \\strlen($string);\n        }\n\n        return mb_strwidth($string, $encoding);\n    }\n\n    /**\n     * Returns the length of a string, using mb_strlen if it is available.\n     * The length is related to how many bytes the string will use.\n     */\n    public static function length(?string $string): int\n    {\n        $string ??= '';\n\n        if (preg_match('//u', $string)) {\n            return (new UnicodeString($string))->length();\n        }\n\n        if (false === $encoding = mb_detect_encoding($string, null, true)) {\n            return \\strlen($string);\n        }\n\n        return mb_strlen($string, $encoding);\n    }\n\n    /**\n     * Returns the subset of a string, using mb_substr if it is available.\n     */\n    public static function substr(?string $string, int $from, ?int $length = null): string\n    {\n        $string ??= '';\n\n        if (preg_match('//u', $string)) {\n            return (new UnicodeString($string))->slice($from, $length);\n        }\n\n        if (false === $encoding = mb_detect_encoding($string, null, true)) {\n            return substr($string, $from, $length);\n        }\n\n        return mb_substr($string, $from, $length, $encoding);\n    }\n\n    public static function formatTime(int|float $secs, int $precision = 1): string\n    {\n        $ms = (int) ($secs * 1000);\n        $secs = (int) floor($secs);\n\n        if (0 === $ms) {\n            return '< 1 ms';\n        }\n\n        static $timeFormats = [\n            [1, 'ms'],\n            [1000, 's'],\n            [60000, 'min'],\n            [3600000, 'h'],\n            [86_400_000, 'd'],\n        ];\n\n        $times = [];\n        foreach ($timeFormats as $index => $format) {\n            $milliSeconds = isset($timeFormats[$index + 1]) ? $ms % $timeFormats[$index + 1][0] : $ms;\n\n            if (isset($times[$index - $precision])) {\n                unset($times[$index - $precision]);\n            }\n\n            if (0 === $milliSeconds) {\n                continue;\n            }\n\n            $unitCount = ($milliSeconds / $format[0]);\n            $times[$index] = $unitCount.' '.$format[1];\n\n            if ($ms === $milliSeconds) {\n                break;\n            }\n\n            $ms -= $milliSeconds;\n        }\n\n        return implode(', ', array_reverse($times));\n    }\n\n    public static function formatMemory(int $memory): string\n    {\n        if ($memory >= 1024 * 1024 * 1024) {\n            return \\sprintf('%.1f GiB', $memory / 1024 / 1024 / 1024);\n        }\n\n        if ($memory >= 1024 * 1024) {\n            return \\sprintf('%.1f MiB', $memory / 1024 / 1024);\n        }\n\n        if ($memory >= 1024) {\n            return \\sprintf('%d KiB', $memory / 1024);\n        }\n\n        return \\sprintf('%d B', $memory);\n    }\n\n    public static function removeDecoration(OutputFormatterInterface $formatter, ?string $string): string\n    {\n        $isDecorated = $formatter->isDecorated();\n        $formatter->setDecorated(false);\n        // remove <...> formatting\n        $string = $formatter->format($string ?? '');\n        // remove already formatted characters\n        $string = preg_replace(\"/\\033\\[[^m]*m/\", '', $string ?? '');\n        // remove terminal hyperlinks\n        $string = preg_replace('/\\\\033]8;[^;]*;[^\\\\033]*\\\\033\\\\\\\\/', '', $string ?? '');\n        $formatter->setDecorated($isDecorated);\n\n        return $string;\n    }\n}\n","vendor/symfony/console/Helper/HelperInterface.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Helper;\n\n/**\n * HelperInterface is the interface all helpers must implement.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n */\ninterface HelperInterface\n{\n    /**\n     * Sets the helper set associated with this helper.\n     */\n    public function setHelperSet(?HelperSet $helperSet): void;\n\n    /**\n     * Gets the helper set associated with this helper.\n     */\n    public function getHelperSet(): ?HelperSet;\n\n    /**\n     * Returns the canonical name of this helper.\n     */\n    public function getName(): string;\n}\n","vendor/symfony/console/Helper/HelperSet.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Helper;\n\nuse Symfony\\Component\\Console\\Exception\\InvalidArgumentException;\n\n/**\n * HelperSet represents a set of helpers to be used with a command.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n *\n * @implements \\IteratorAggregate<string, HelperInterface>\n */\nclass HelperSet implements \\IteratorAggregate\n{\n    /** @var array<string, HelperInterface> */\n    private array $helpers = [];\n\n    /**\n     * @param HelperInterface[] $helpers\n     */\n    public function __construct(array $helpers = [])\n    {\n        foreach ($helpers as $alias => $helper) {\n            $this->set($helper, \\is_int($alias) ? null : $alias);\n        }\n    }\n\n    public function set(HelperInterface $helper, ?string $alias = null): void\n    {\n        $this->helpers[$helper->getName()] = $helper;\n        if (null !== $alias) {\n            $this->helpers[$alias] = $helper;\n        }\n\n        $helper->setHelperSet($this);\n    }\n\n    /**\n     * Returns true if the helper if defined.\n     */\n    public function has(string $name): bool\n    {\n        return isset($this->helpers[$name]);\n    }\n\n    /**\n     * Gets a helper value.\n     *\n     * @throws InvalidArgumentException if the helper is not defined\n     */\n    public function get(string $name): HelperInterface\n    {\n        if (!$this->has($name)) {\n            throw new InvalidArgumentException(\\sprintf('The helper \"%s\" is not defined.', $name));\n        }\n\n        return $this->helpers[$name];\n    }\n\n    public function getIterator(): \\Traversable\n    {\n        return new \\ArrayIterator($this->helpers);\n    }\n}\n","vendor/symfony/console/Helper/InputAwareHelper.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Helper;\n\nuse Symfony\\Component\\Console\\Input\\InputAwareInterface;\nuse Symfony\\Component\\Console\\Input\\InputInterface;\n\n/**\n * An implementation of InputAwareInterface for Helpers.\n *\n * @author Wouter J <waldio.webdesign@gmail.com>\n */\nabstract class InputAwareHelper extends Helper implements InputAwareInterface\n{\n    protected InputInterface $input;\n\n    public function setInput(InputInterface $input): void\n    {\n        $this->input = $input;\n    }\n}\n","vendor/symfony/console/Helper/OutputWrapper.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Helper;\n\n/**\n * Simple output wrapper for \"tagged outputs\" instead of wordwrap(). This solution is based on a StackOverflow\n * answer: https://stackoverflow.com/a/20434776/1476819 from user557597 (alias SLN).\n *\n *  (?:\n *       # -- Words/Characters\n *       (                       # (1 start)\n *            (?>                     # Atomic Group - Match words with valid breaks\n *                 .{1,16}                 #  1-N characters\n *                                         #  Followed by one of 4 prioritized, non-linebreak whitespace\n *                 (?:                     #  break types:\n *                      (?<= [^\\S\\r\\n] )        # 1. - Behind a non-linebreak whitespace\n *                      [^\\S\\r\\n]?              #      ( optionally accept an extra non-linebreak whitespace )\n *                   |  (?= \\r? \\n )            # 2. - Ahead a linebreak\n *                   |  $                       # 3. - EOS\n *                   |  [^\\S\\r\\n]               # 4. - Accept an extra non-linebreak whitespace\n *                 )\n *            )                       # End atomic group\n *         |\n *            .{1,16}                 # No valid word breaks, just break on the N'th character\n *       )                       # (1 end)\n *       (?: \\r? \\n )?           # Optional linebreak after Words/Characters\n *    |\n *       # -- Or, Linebreak\n *       (?: \\r? \\n | $ )        # Stand alone linebreak or at EOS\n *  )\n *\n * @author Krisztián Ferenczi <ferenczi.krisztian@gmail.com>\n *\n * @see https://stackoverflow.com/a/20434776/1476819\n */\nfinal class OutputWrapper\n{\n    private const TAG_OPEN_REGEX_SEGMENT = '[a-z](?:[^\\\\\\\\<>]*+ | \\\\\\\\.)*';\n    private const TAG_CLOSE_REGEX_SEGMENT = '[a-z][^<>]*+';\n    private const URL_PATTERN = 'https?://\\S+';\n\n    public function __construct(\n        private bool $allowCutUrls = false,\n    ) {\n    }\n\n    public function wrap(string $text, int $width, string $break = \"\\n\"): string\n    {\n        if (!$width) {\n            return $text;\n        }\n\n        $tagPattern = \\sprintf('<(?:(?:%s)|/(?:%s)?)>', self::TAG_OPEN_REGEX_SEGMENT, self::TAG_CLOSE_REGEX_SEGMENT);\n        $limitPattern = \"{1,$width}\";\n        $patternBlocks = [$tagPattern];\n        if (!$this->allowCutUrls) {\n            $patternBlocks[] = self::URL_PATTERN;\n        }\n        $patternBlocks[] = '.';\n        $blocks = implode('|', $patternBlocks);\n        $rowPattern = \"(?:$blocks)$limitPattern\";\n        $pattern = \\sprintf('#(?:((?>(%1$s)((?<=[^\\S\\r\\n])[^\\S\\r\\n]?|(?=\\r?\\n)|$|[^\\S\\r\\n]))|(%1$s))(?:\\r?\\n)?|(?:\\r?\\n|$))#imux', $rowPattern);\n        $output = rtrim(preg_replace($pattern, '\\\\1'.$break, $text), $break);\n\n        return str_replace(' '.$break, $break, $output);\n    }\n}\n","vendor/symfony/console/Helper/ProcessHelper.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Helper;\n\nuse Symfony\\Component\\Console\\Output\\ConsoleOutputInterface;\nuse Symfony\\Component\\Console\\Output\\OutputInterface;\nuse Symfony\\Component\\Process\\Exception\\ProcessFailedException;\nuse Symfony\\Component\\Process\\Process;\n\n/**\n * The ProcessHelper class provides helpers to run external processes.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n *\n * @final\n */\nclass ProcessHelper extends Helper\n{\n    /**\n     * Runs an external process.\n     *\n     * @param array|Process $cmd      An instance of Process or an array of the command and arguments\n     * @param callable|null $callback A PHP callback to run whenever there is some\n     *                                output available on STDOUT or STDERR\n     */\n    public function run(OutputInterface $output, array|Process $cmd, ?string $error = null, ?callable $callback = null, int $verbosity = OutputInterface::VERBOSITY_VERY_VERBOSE): Process\n    {\n        if (!class_exists(Process::class)) {\n            throw new \\LogicException('The ProcessHelper cannot be run as the Process component is not installed. Try running \"compose require symfony/process\".');\n        }\n\n        if ($output instanceof ConsoleOutputInterface) {\n            $output = $output->getErrorOutput();\n        }\n\n        $formatter = $this->getHelperSet()->get('debug_formatter');\n\n        if ($cmd instanceof Process) {\n            $cmd = [$cmd];\n        }\n\n        if (\\is_string($cmd[0] ?? null)) {\n            $process = new Process($cmd);\n            $cmd = [];\n        } elseif (($cmd[0] ?? null) instanceof Process) {\n            $process = $cmd[0];\n            unset($cmd[0]);\n        } else {\n            throw new \\InvalidArgumentException(\\sprintf('Invalid command provided to \"%s()\": the command should be an array whose first element is either the path to the binary to run or a \"Process\" object.', __METHOD__));\n        }\n\n        if ($verbosity <= $output->getVerbosity()) {\n            $output->write($formatter->start(spl_object_id($process), $this->escapeString($process->getCommandLine())));\n        }\n\n        if ($output->isDebug()) {\n            $callback = $this->wrapCallback($output, $process, $callback);\n        }\n\n        $process->run($callback, $cmd);\n\n        if ($verbosity <= $output->getVerbosity()) {\n            $message = $process->isSuccessful() ? 'Command ran successfully' : \\sprintf('%s Command did not run successfully', $process->getExitCode());\n            $output->write($formatter->stop(spl_object_id($process), $message, $process->isSuccessful()));\n        }\n\n        if (!$process->isSuccessful() && null !== $error) {\n            $output->writeln(\\sprintf('<error>%s</error>', $this->escapeString($error)));\n        }\n\n        return $process;\n    }\n\n    /**\n     * Runs the process.\n     *\n     * This is identical to run() except that an exception is thrown if the process\n     * exits with a non-zero exit code.\n     *\n     * @param array|Process $cmd      An instance of Process or a command to run\n     * @param callable|null $callback A PHP callback to run whenever there is some\n     *                                output available on STDOUT or STDERR\n     *\n     * @throws ProcessFailedException\n     *\n     * @see run()\n     */\n    public function mustRun(OutputInterface $output, array|Process $cmd, ?string $error = null, ?callable $callback = null, int $verbosity = OutputInterface::VERBOSITY_VERY_VERBOSE): Process\n    {\n        $process = $this->run($output, $cmd, $error, $callback, $verbosity);\n\n        if (!$process->isSuccessful()) {\n            throw new ProcessFailedException($process);\n        }\n\n        return $process;\n    }\n\n    /**\n     * Wraps a Process callback to add debugging output.\n     */\n    public function wrapCallback(OutputInterface $output, Process $process, ?callable $callback = null): callable\n    {\n        if ($output instanceof ConsoleOutputInterface) {\n            $output = $output->getErrorOutput();\n        }\n\n        $formatter = $this->getHelperSet()->get('debug_formatter');\n\n        return function ($type, $buffer) use ($output, $process, $callback, $formatter) {\n            $output->write($formatter->progress(spl_object_id($process), $this->escapeString($buffer), Process::ERR === $type));\n\n            if (null !== $callback) {\n                $callback($type, $buffer);\n            }\n        };\n    }\n\n    private function escapeString(string $str): string\n    {\n        return str_replace('<', '\\\\<', $str);\n    }\n\n    public function getName(): string\n    {\n        return 'process';\n    }\n}\n","vendor/symfony/console/Helper/ProgressBar.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Helper;\n\nuse Symfony\\Component\\Console\\Cursor;\nuse Symfony\\Component\\Console\\Exception\\LogicException;\nuse Symfony\\Component\\Console\\Output\\ConsoleOutputInterface;\nuse Symfony\\Component\\Console\\Output\\ConsoleSectionOutput;\nuse Symfony\\Component\\Console\\Output\\OutputInterface;\nuse Symfony\\Component\\Console\\Terminal;\n\n/**\n * The ProgressBar provides helpers to display progress output.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n * @author Chris Jones <leeked@gmail.com>\n */\nfinal class ProgressBar\n{\n    public const FORMAT_VERBOSE = 'verbose';\n    public const FORMAT_VERY_VERBOSE = 'very_verbose';\n    public const FORMAT_DEBUG = 'debug';\n    public const FORMAT_NORMAL = 'normal';\n\n    private const FORMAT_VERBOSE_NOMAX = 'verbose_nomax';\n    private const FORMAT_VERY_VERBOSE_NOMAX = 'very_verbose_nomax';\n    private const FORMAT_DEBUG_NOMAX = 'debug_nomax';\n    private const FORMAT_NORMAL_NOMAX = 'normal_nomax';\n\n    private int $barWidth = 28;\n    private string $barChar;\n    private string $emptyBarChar = '-';\n    private string $progressChar = '>';\n    private ?string $format = null;\n    private ?string $internalFormat = null;\n    private ?int $redrawFreq = 1;\n    private int $writeCount = 0;\n    private float $lastWriteTime = 0;\n    private float $minSecondsBetweenRedraws = 0;\n    private float $maxSecondsBetweenRedraws = 1;\n    private OutputInterface $output;\n    private int $step = 0;\n    private int $startingStep = 0;\n    private ?int $max = null;\n    private int $startTime;\n    private int $stepWidth;\n    private float $percent = 0.0;\n    private array $messages = [];\n    private bool $overwrite = true;\n    private Terminal $terminal;\n    private ?string $previousMessage = null;\n    private Cursor $cursor;\n    private array $placeholders = [];\n\n    private static array $formatters;\n    private static array $formats;\n\n    /**\n     * @param int $max Maximum steps (0 if unknown)\n     */\n    public function __construct(OutputInterface $output, int $max = 0, float $minSecondsBetweenRedraws = 1 / 25)\n    {\n        if ($output instanceof ConsoleOutputInterface) {\n            $output = $output->getErrorOutput();\n        }\n\n        $this->output = $output;\n        $this->setMaxSteps($max);\n        $this->terminal = new Terminal();\n\n        if (0 < $minSecondsBetweenRedraws) {\n            $this->redrawFreq = null;\n            $this->minSecondsBetweenRedraws = $minSecondsBetweenRedraws;\n        }\n\n        if (!$this->output->isDecorated()) {\n            // disable overwrite when output does not support ANSI codes.\n            $this->overwrite = false;\n\n            // set a reasonable redraw frequency so output isn't flooded\n            $this->redrawFreq = null;\n        }\n\n        $this->startTime = time();\n        $this->cursor = new Cursor($output);\n    }\n\n    /**\n     * Sets a placeholder formatter for a given name, globally for all instances of ProgressBar.\n     *\n     * This method also allow you to override an existing placeholder.\n     *\n     * @param string                       $name     The placeholder name (including the delimiter char like %)\n     * @param callable(ProgressBar):string $callable A PHP callable\n     */\n    public static function setPlaceholderFormatterDefinition(string $name, callable $callable): void\n    {\n        self::$formatters ??= self::initPlaceholderFormatters();\n\n        self::$formatters[$name] = $callable;\n    }\n\n    /**\n     * Gets the placeholder formatter for a given name.\n     *\n     * @param string $name The placeholder name (including the delimiter char like %)\n     */\n    public static function getPlaceholderFormatterDefinition(string $name): ?callable\n    {\n        self::$formatters ??= self::initPlaceholderFormatters();\n\n        return self::$formatters[$name] ?? null;\n    }\n\n    /**\n     * Sets a placeholder formatter for a given name, for this instance only.\n     *\n     * @param callable(ProgressBar):string $callable A PHP callable\n     */\n    public function setPlaceholderFormatter(string $name, callable $callable): void\n    {\n        $this->placeholders[$name] = $callable;\n    }\n\n    /**\n     * Gets the placeholder formatter for a given name.\n     *\n     * @param string $name The placeholder name (including the delimiter char like %)\n     */\n    public function getPlaceholderFormatter(string $name): ?callable\n    {\n        return $this->placeholders[$name] ?? $this::getPlaceholderFormatterDefinition($name);\n    }\n\n    /**\n     * Sets a format for a given name.\n     *\n     * This method also allow you to override an existing format.\n     *\n     * @param string $name   The format name\n     * @param string $format A format string\n     */\n    public static function setFormatDefinition(string $name, string $format): void\n    {\n        self::$formats ??= self::initFormats();\n\n        self::$formats[$name] = $format;\n    }\n\n    /**\n     * Gets the format for a given name.\n     *\n     * @param string $name The format name\n     */\n    public static function getFormatDefinition(string $name): ?string\n    {\n        self::$formats ??= self::initFormats();\n\n        return self::$formats[$name] ?? null;\n    }\n\n    /**\n     * Associates a text with a named placeholder.\n     *\n     * The text is displayed when the progress bar is rendered but only\n     * when the corresponding placeholder is part of the custom format line\n     * (by wrapping the name with %).\n     *\n     * @param string $message The text to associate with the placeholder\n     * @param string $name    The name of the placeholder\n     */\n    public function setMessage(string $message, string $name = 'message'): void\n    {\n        $this->messages[$name] = $message;\n    }\n\n    public function getMessage(string $name = 'message'): ?string\n    {\n        return $this->messages[$name] ?? null;\n    }\n\n    public function getStartTime(): int\n    {\n        return $this->startTime;\n    }\n\n    public function getMaxSteps(): int\n    {\n        return $this->max ?? 0;\n    }\n\n    public function getProgress(): int\n    {\n        return $this->step;\n    }\n\n    private function getStepWidth(): int\n    {\n        return $this->stepWidth;\n    }\n\n    public function getProgressPercent(): float\n    {\n        return $this->percent;\n    }\n\n    public function getBarOffset(): float\n    {\n        return floor(null !== $this->max ? $this->percent * $this->barWidth : (null === $this->redrawFreq ? (int) (min(5, $this->barWidth / 15) * $this->writeCount) : $this->step) % $this->barWidth);\n    }\n\n    public function getEstimated(): float\n    {\n        if (0 === $this->step || $this->step === $this->startingStep) {\n            return 0;\n        }\n\n        return round((time() - $this->startTime) / ($this->step - $this->startingStep) * $this->max);\n    }\n\n    public function getRemaining(): float\n    {\n        if (0 === $this->step || $this->step === $this->startingStep) {\n            return 0;\n        }\n\n        return round((time() - $this->startTime) / ($this->step - $this->startingStep) * ($this->max - $this->step));\n    }\n\n    public function setBarWidth(int $size): void\n    {\n        $this->barWidth = max(1, $size);\n    }\n\n    public function getBarWidth(): int\n    {\n        return $this->barWidth;\n    }\n\n    public function setBarCharacter(string $char): void\n    {\n        $this->barChar = $char;\n    }\n\n    public function getBarCharacter(): string\n    {\n        return $this->barChar ?? (null !== $this->max ? '=' : $this->emptyBarChar);\n    }\n\n    public function setEmptyBarCharacter(string $char): void\n    {\n        $this->emptyBarChar = $char;\n    }\n\n    public function getEmptyBarCharacter(): string\n    {\n        return $this->emptyBarChar;\n    }\n\n    public function setProgressCharacter(string $char): void\n    {\n        $this->progressChar = $char;\n    }\n\n    public function getProgressCharacter(): string\n    {\n        return $this->progressChar;\n    }\n\n    public function setFormat(string $format): void\n    {\n        $this->format = null;\n        $this->internalFormat = $format;\n    }\n\n    /**\n     * Sets the redraw frequency.\n     *\n     * @param int|null $freq The frequency in steps\n     */\n    public function setRedrawFrequency(?int $freq): void\n    {\n        $this->redrawFreq = null !== $freq ? max(1, $freq) : null;\n    }\n\n    public function minSecondsBetweenRedraws(float $seconds): void\n    {\n        $this->minSecondsBetweenRedraws = $seconds;\n    }\n\n    public function maxSecondsBetweenRedraws(float $seconds): void\n    {\n        $this->maxSecondsBetweenRedraws = $seconds;\n    }\n\n    /**\n     * Returns an iterator that will automatically update the progress bar when iterated.\n     *\n     * @template TKey\n     * @template TValue\n     *\n     * @param iterable<TKey, TValue> $iterable\n     * @param int|null               $max      Number of steps to complete the bar (0 if indeterminate), if null it will be inferred from $iterable\n     *\n     * @return iterable<TKey, TValue>\n     */\n    public function iterate(iterable $iterable, ?int $max = null): iterable\n    {\n        if (0 === $max) {\n            $max = null;\n        }\n\n        $max ??= is_countable($iterable) ? \\count($iterable) : null;\n\n        if (0 === $max) {\n            $this->max = 0;\n            $this->stepWidth = 2;\n            $this->finish();\n\n            return;\n        }\n\n        $this->start($max);\n\n        foreach ($iterable as $key => $value) {\n            yield $key => $value;\n\n            $this->advance();\n        }\n\n        $this->finish();\n    }\n\n    /**\n     * Starts the progress output.\n     *\n     * @param int|null $max     Number of steps to complete the bar (0 if indeterminate), null to leave unchanged\n     * @param int      $startAt The starting point of the bar (useful e.g. when resuming a previously started bar)\n     */\n    public function start(?int $max = null, int $startAt = 0): void\n    {\n        $this->startTime = time();\n        $this->step = $startAt;\n        $this->startingStep = $startAt;\n\n        $startAt > 0 ? $this->setProgress($startAt) : $this->percent = 0.0;\n\n        if (null !== $max) {\n            $this->setMaxSteps($max);\n        }\n\n        $this->display();\n    }\n\n    /**\n     * Advances the progress output X steps.\n     *\n     * @param int $step Number of steps to advance\n     */\n    public function advance(int $step = 1): void\n    {\n        $this->setProgress($this->step + $step);\n    }\n\n    /**\n     * Sets whether to overwrite the progressbar, false for new line.\n     */\n    public function setOverwrite(bool $overwrite): void\n    {\n        $this->overwrite = $overwrite;\n    }\n\n    public function setProgress(int $step): void\n    {\n        if ($this->max && $step > $this->max) {\n            $this->max = $step;\n        } elseif ($step < 0) {\n            $step = 0;\n        }\n\n        $redrawFreq = $this->redrawFreq ?? (($this->max ?? 10) / 10);\n        $prevPeriod = $redrawFreq ? (int) ($this->step / $redrawFreq) : 0;\n        $currPeriod = $redrawFreq ? (int) ($step / $redrawFreq) : 0;\n        $this->step = $step;\n        $this->percent = match ($this->max) {\n            null => 0,\n            0 => 1,\n            default => (float) $this->step / $this->max,\n        };\n        $timeInterval = microtime(true) - $this->lastWriteTime;\n\n        // Draw regardless of other limits\n        if ($this->max === $step) {\n            $this->display();\n\n            return;\n        }\n\n        // Throttling\n        if ($timeInterval < $this->minSecondsBetweenRedraws) {\n            return;\n        }\n\n        // Draw each step period, but not too late\n        if ($prevPeriod !== $currPeriod || $timeInterval >= $this->maxSecondsBetweenRedraws) {\n            $this->display();\n        }\n    }\n\n    public function setMaxSteps(?int $max): void\n    {\n        if (0 === $max) {\n            $max = null;\n        }\n\n        $this->format = null;\n        if (null === $max) {\n            $this->max = null;\n            $this->stepWidth = 4;\n        } else {\n            $this->max = max(0, $max);\n            $this->stepWidth = Helper::width((string) $this->max);\n        }\n    }\n\n    /**\n     * Finishes the progress output.\n     */\n    public function finish(): void\n    {\n        if (null === $this->max) {\n            $this->max = $this->step;\n        }\n\n        if (($this->step === $this->max || null === $this->max) && !$this->overwrite) {\n            // prevent double 100% output\n            return;\n        }\n\n        $this->setProgress($this->max ?? $this->step);\n    }\n\n    /**\n     * Outputs the current progress string.\n     */\n    public function display(): void\n    {\n        if (OutputInterface::VERBOSITY_QUIET === $this->output->getVerbosity()) {\n            return;\n        }\n\n        if (null === $this->format) {\n            $this->setRealFormat($this->internalFormat ?: $this->determineBestFormat());\n        }\n\n        $this->overwrite($this->buildLine());\n    }\n\n    /**\n     * Removes the progress bar from the current line.\n     *\n     * This is useful if you wish to write some output\n     * while a progress bar is running.\n     * Call display() to show the progress bar again.\n     */\n    public function clear(): void\n    {\n        if (!$this->overwrite) {\n            return;\n        }\n\n        if (null === $this->format) {\n            $this->setRealFormat($this->internalFormat ?: $this->determineBestFormat());\n        }\n\n        $this->overwrite('');\n    }\n\n    private function setRealFormat(string $format): void\n    {\n        // try to use the _nomax variant if available\n        if (!$this->max && null !== self::getFormatDefinition($format.'_nomax')) {\n            $this->format = self::getFormatDefinition($format.'_nomax');\n        } elseif (null !== self::getFormatDefinition($format)) {\n            $this->format = self::getFormatDefinition($format);\n        } else {\n            $this->format = $format;\n        }\n    }\n\n    /**\n     * Overwrites a previous message to the output.\n     */\n    private function overwrite(string $message): void\n    {\n        if ($this->previousMessage === $message) {\n            return;\n        }\n\n        $originalMessage = $message;\n\n        if ($this->overwrite) {\n            if (null !== $this->previousMessage) {\n                if ($this->output instanceof ConsoleSectionOutput) {\n                    $messageLines = explode(\"\\n\", $this->previousMessage);\n                    $lineCount = \\count($messageLines);\n\n                    $lastLineWithoutDecoration = Helper::removeDecoration($this->output->getFormatter(), end($messageLines) ?? '');\n\n                    // When the last previous line is empty (without formatting) it is already cleared by the section output, so we don't need to clear it again\n                    if ('' === $lastLineWithoutDecoration) {\n                        --$lineCount;\n                    }\n\n                    foreach ($messageLines as $messageLine) {\n                        $messageLineLength = Helper::width(Helper::removeDecoration($this->output->getFormatter(), $messageLine));\n                        if ($messageLineLength > $this->terminal->getWidth()) {\n                            $lineCount += floor($messageLineLength / $this->terminal->getWidth());\n                        }\n                    }\n\n                    $this->output->clear($lineCount);\n                } else {\n                    $lineCount = substr_count($this->previousMessage, \"\\n\");\n                    for ($i = 0; $i < $lineCount; ++$i) {\n                        $this->cursor->moveToColumn(1);\n                        $this->cursor->clearLine();\n                        $this->cursor->moveUp();\n                    }\n\n                    $this->cursor->moveToColumn(1);\n                    $this->cursor->clearLine();\n                }\n            }\n        } elseif ($this->step > 0) {\n            $message = \\PHP_EOL.$message;\n        }\n\n        $this->previousMessage = $originalMessage;\n        $this->lastWriteTime = microtime(true);\n\n        $this->output->write($message);\n        ++$this->writeCount;\n    }\n\n    private function determineBestFormat(): string\n    {\n        return match ($this->output->getVerbosity()) {\n            // OutputInterface::VERBOSITY_QUIET: display is disabled anyway\n            OutputInterface::VERBOSITY_VERBOSE => $this->max ? self::FORMAT_VERBOSE : self::FORMAT_VERBOSE_NOMAX,\n            OutputInterface::VERBOSITY_VERY_VERBOSE => $this->max ? self::FORMAT_VERY_VERBOSE : self::FORMAT_VERY_VERBOSE_NOMAX,\n            OutputInterface::VERBOSITY_DEBUG => $this->max ? self::FORMAT_DEBUG : self::FORMAT_DEBUG_NOMAX,\n            default => $this->max ? self::FORMAT_NORMAL : self::FORMAT_NORMAL_NOMAX,\n        };\n    }\n\n    private static function initPlaceholderFormatters(): array\n    {\n        return [\n            'bar' => static function (self $bar, OutputInterface $output) {\n                $completeBars = $bar->getBarOffset();\n                $display = str_repeat($bar->getBarCharacter(), $completeBars);\n                if ($completeBars < $bar->getBarWidth()) {\n                    $emptyBars = $bar->getBarWidth() - $completeBars - Helper::length(Helper::removeDecoration($output->getFormatter(), $bar->getProgressCharacter()));\n                    $display .= $bar->getProgressCharacter().str_repeat($bar->getEmptyBarCharacter(), max(0, $emptyBars));\n                }\n\n                return $display;\n            },\n            'elapsed' => static fn (self $bar) => Helper::formatTime(time() - $bar->getStartTime(), 2),\n            'remaining' => static function (self $bar) {\n                if (null === $bar->max) {\n                    throw new LogicException('Unable to display the remaining time if the maximum number of steps is not set.');\n                }\n\n                return Helper::formatTime($bar->getRemaining(), 2);\n            },\n            'estimated' => static function (self $bar) {\n                if (null === $bar->max) {\n                    throw new LogicException('Unable to display the estimated time if the maximum number of steps is not set.');\n                }\n\n                return Helper::formatTime($bar->getEstimated(), 2);\n            },\n            'memory' => static fn (self $bar) => Helper::formatMemory(memory_get_usage(true)),\n            'current' => static fn (self $bar) => str_pad($bar->getProgress(), $bar->getStepWidth(), ' ', \\STR_PAD_LEFT),\n            'max' => static fn (self $bar) => $bar->getMaxSteps(),\n            'percent' => static fn (self $bar) => floor($bar->getProgressPercent() * 100),\n        ];\n    }\n\n    private static function initFormats(): array\n    {\n        return [\n            self::FORMAT_NORMAL => ' %current%/%max% [%bar%] %percent:3s%%',\n            self::FORMAT_NORMAL_NOMAX => ' %current% [%bar%]',\n\n            self::FORMAT_VERBOSE => ' %current%/%max% [%bar%] %percent:3s%% %elapsed:6s%',\n            self::FORMAT_VERBOSE_NOMAX => ' %current% [%bar%] %elapsed:6s%',\n\n            self::FORMAT_VERY_VERBOSE => ' %current%/%max% [%bar%] %percent:3s%% %elapsed:6s%/%estimated:-6s%',\n            self::FORMAT_VERY_VERBOSE_NOMAX => ' %current% [%bar%] %elapsed:6s%',\n\n            self::FORMAT_DEBUG => ' %current%/%max% [%bar%] %percent:3s%% %elapsed:6s%/%estimated:-6s% %memory:6s%',\n            self::FORMAT_DEBUG_NOMAX => ' %current% [%bar%] %elapsed:6s% %memory:6s%',\n        ];\n    }\n\n    private function buildLine(): string\n    {\n        \\assert(null !== $this->format);\n\n        $regex = '{%([a-z\\-_]+)(?:\\:([^%]+))?%}i';\n        $callback = function ($matches) {\n            if ($formatter = $this->getPlaceholderFormatter($matches[1])) {\n                $text = $formatter($this, $this->output);\n            } elseif (isset($this->messages[$matches[1]])) {\n                $text = $this->messages[$matches[1]];\n            } else {\n                return $matches[0];\n            }\n\n            if (isset($matches[2])) {\n                $text = \\sprintf('%'.$matches[2], $text);\n            }\n\n            return $text;\n        };\n        $line = preg_replace_callback($regex, $callback, $this->format);\n\n        // gets string length for each sub line with multiline format\n        $linesLength = array_map(fn ($subLine) => Helper::width(Helper::removeDecoration($this->output->getFormatter(), rtrim($subLine, \"\\r\"))), explode(\"\\n\", $line));\n\n        $linesWidth = max($linesLength);\n\n        $terminalWidth = $this->terminal->getWidth();\n        if ($linesWidth <= $terminalWidth) {\n            return $line;\n        }\n\n        $this->setBarWidth($this->barWidth - $linesWidth + $terminalWidth);\n\n        return preg_replace_callback($regex, $callback, $this->format);\n    }\n}\n","vendor/symfony/console/Helper/ProgressIndicator.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Helper;\n\nuse Symfony\\Component\\Console\\Exception\\InvalidArgumentException;\nuse Symfony\\Component\\Console\\Exception\\LogicException;\nuse Symfony\\Component\\Console\\Output\\ConsoleSectionOutput;\nuse Symfony\\Component\\Console\\Output\\OutputInterface;\n\n/**\n * @author Kevin Bond <kevinbond@gmail.com>\n */\nclass ProgressIndicator\n{\n    private const FORMATS = [\n        'normal' => ' %indicator% %message%',\n        'normal_no_ansi' => ' %message%',\n\n        'verbose' => ' %indicator% %message% (%elapsed:6s%)',\n        'verbose_no_ansi' => ' %message% (%elapsed:6s%)',\n\n        'very_verbose' => ' %indicator% %message% (%elapsed:6s%, %memory:6s%)',\n        'very_verbose_no_ansi' => ' %message% (%elapsed:6s%, %memory:6s%)',\n    ];\n\n    private int $startTime;\n    private ?string $format = null;\n    private ?string $message = null;\n    private array $indicatorValues;\n    private int $indicatorCurrent;\n    private string $finishedIndicatorValue;\n    private float $indicatorUpdateTime;\n    private bool $started = false;\n    private bool $finished = false;\n\n    /**\n     * @var array<string, callable>\n     */\n    private static array $formatters;\n\n    /**\n     * @param int        $indicatorChangeInterval Change interval in milliseconds\n     * @param array|null $indicatorValues         Animated indicator characters\n     */\n    public function __construct(\n        private OutputInterface $output,\n        ?string $format = null,\n        private int $indicatorChangeInterval = 100,\n        ?array $indicatorValues = null,\n        ?string $finishedIndicatorValue = null,\n    ) {\n        $format ??= $this->determineBestFormat();\n        $indicatorValues ??= ['-', '\\\\', '|', '/'];\n        $indicatorValues = array_values($indicatorValues);\n        $finishedIndicatorValue ??= '✔';\n\n        if (2 > \\count($indicatorValues)) {\n            throw new InvalidArgumentException('Must have at least 2 indicator value characters.');\n        }\n\n        $this->format = self::getFormatDefinition($format);\n        $this->indicatorValues = $indicatorValues;\n        $this->finishedIndicatorValue = $finishedIndicatorValue;\n        $this->startTime = time();\n    }\n\n    /**\n     * Sets the current indicator message.\n     */\n    public function setMessage(?string $message): void\n    {\n        $this->message = $message;\n\n        $this->display();\n    }\n\n    /**\n     * Starts the indicator output.\n     */\n    public function start(string $message): void\n    {\n        if ($this->started) {\n            throw new LogicException('Progress indicator already started.');\n        }\n\n        $this->message = $message;\n        $this->started = true;\n        $this->finished = false;\n        $this->startTime = time();\n        $this->indicatorUpdateTime = $this->getCurrentTimeInMilliseconds() + $this->indicatorChangeInterval;\n        $this->indicatorCurrent = 0;\n\n        $this->display();\n    }\n\n    /**\n     * Advances the indicator.\n     */\n    public function advance(): void\n    {\n        if (!$this->started) {\n            throw new LogicException('Progress indicator has not yet been started.');\n        }\n\n        if (!$this->output->isDecorated()) {\n            return;\n        }\n\n        $currentTime = $this->getCurrentTimeInMilliseconds();\n\n        if ($currentTime < $this->indicatorUpdateTime) {\n            return;\n        }\n\n        $this->indicatorUpdateTime = $currentTime + $this->indicatorChangeInterval;\n        ++$this->indicatorCurrent;\n\n        $this->display();\n    }\n\n    /**\n     * Finish the indicator with message.\n     *\n     * @param ?string $finishedIndicator\n     */\n    public function finish(string $message/* , ?string $finishedIndicator = null */): void\n    {\n        $finishedIndicator = 1 < \\func_num_args() ? func_get_arg(1) : null;\n        if (null !== $finishedIndicator && !\\is_string($finishedIndicator)) {\n            throw new \\TypeError(\\sprintf('Argument 2 passed to \"%s()\" must be of the type string or null, \"%s\" given.', __METHOD__, get_debug_type($finishedIndicator)));\n        }\n\n        if (!$this->started) {\n            throw new LogicException('Progress indicator has not yet been started.');\n        }\n\n        if (null !== $finishedIndicator) {\n            $this->finishedIndicatorValue = $finishedIndicator;\n        }\n\n        $this->finished = true;\n        $this->message = $message;\n        $this->display();\n        if (!$this->output instanceof ConsoleSectionOutput) {\n            $this->output->writeln('');\n        }\n        $this->started = false;\n    }\n\n    /**\n     * Gets the format for a given name.\n     */\n    public static function getFormatDefinition(string $name): ?string\n    {\n        return self::FORMATS[$name] ?? null;\n    }\n\n    /**\n     * Sets a placeholder formatter for a given name.\n     *\n     * This method also allow you to override an existing placeholder.\n     */\n    public static function setPlaceholderFormatterDefinition(string $name, callable $callable): void\n    {\n        self::$formatters ??= self::initPlaceholderFormatters();\n\n        self::$formatters[$name] = $callable;\n    }\n\n    /**\n     * Gets the placeholder formatter for a given name (including the delimiter char like %).\n     */\n    public static function getPlaceholderFormatterDefinition(string $name): ?callable\n    {\n        self::$formatters ??= self::initPlaceholderFormatters();\n\n        return self::$formatters[$name] ?? null;\n    }\n\n    private function display(): void\n    {\n        if (OutputInterface::VERBOSITY_QUIET === $this->output->getVerbosity()) {\n            return;\n        }\n\n        $this->overwrite(preg_replace_callback('{%([a-z\\-_]+)(?:\\:([^%]+))?%}i', function ($matches) {\n            if ($formatter = self::getPlaceholderFormatterDefinition($matches[1])) {\n                return $formatter($this);\n            }\n\n            return $matches[0];\n        }, $this->format ?? ''));\n    }\n\n    private function determineBestFormat(): string\n    {\n        return match ($this->output->getVerbosity()) {\n            // OutputInterface::VERBOSITY_QUIET: display is disabled anyway\n            OutputInterface::VERBOSITY_VERBOSE => $this->output->isDecorated() ? 'verbose' : 'verbose_no_ansi',\n            OutputInterface::VERBOSITY_VERY_VERBOSE,\n            OutputInterface::VERBOSITY_DEBUG => $this->output->isDecorated() ? 'very_verbose' : 'very_verbose_no_ansi',\n            default => $this->output->isDecorated() ? 'normal' : 'normal_no_ansi',\n        };\n    }\n\n    /**\n     * Overwrites a previous message to the output.\n     */\n    private function overwrite(string $message): void\n    {\n        if ($this->output instanceof ConsoleSectionOutput) {\n            $this->output->overwrite($message);\n        } elseif ($this->output->isDecorated()) {\n            $this->output->write(\"\\x0D\\x1B[2K\");\n            $this->output->write($message);\n        } else {\n            $this->output->writeln($message);\n        }\n    }\n\n    private function getCurrentTimeInMilliseconds(): float\n    {\n        return round(microtime(true) * 1000);\n    }\n\n    /**\n     * @return array<string, \\Closure>\n     */\n    private static function initPlaceholderFormatters(): array\n    {\n        return [\n            'indicator' => static fn (self $indicator) => $indicator->finished ? $indicator->finishedIndicatorValue : $indicator->indicatorValues[$indicator->indicatorCurrent % \\count($indicator->indicatorValues)],\n            'message' => static fn (self $indicator) => $indicator->message,\n            'elapsed' => static fn (self $indicator) => Helper::formatTime(time() - $indicator->startTime, 2),\n            'memory' => static fn () => Helper::formatMemory(memory_get_usage(true)),\n        ];\n    }\n}\n","vendor/symfony/console/Helper/QuestionHelper.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Helper;\n\nuse Symfony\\Component\\Console\\Cursor;\nuse Symfony\\Component\\Console\\Exception\\MissingInputException;\nuse Symfony\\Component\\Console\\Exception\\RuntimeException;\nuse Symfony\\Component\\Console\\Formatter\\OutputFormatter;\nuse Symfony\\Component\\Console\\Formatter\\OutputFormatterStyle;\nuse Symfony\\Component\\Console\\Input\\InputInterface;\nuse Symfony\\Component\\Console\\Input\\StreamableInputInterface;\nuse Symfony\\Component\\Console\\Output\\ConsoleOutputInterface;\nuse Symfony\\Component\\Console\\Output\\ConsoleSectionOutput;\nuse Symfony\\Component\\Console\\Output\\OutputInterface;\nuse Symfony\\Component\\Console\\Question\\ChoiceQuestion;\nuse Symfony\\Component\\Console\\Question\\Question;\nuse Symfony\\Component\\Console\\Terminal;\n\nuse function Symfony\\Component\\String\\s;\n\n/**\n * The QuestionHelper class provides helpers to interact with the user.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n */\nclass QuestionHelper extends Helper\n{\n    private static bool $stty = true;\n    private static bool $stdinIsInteractive;\n\n    /**\n     * Asks a question to the user.\n     *\n     * @return mixed The user answer\n     *\n     * @throws RuntimeException If there is no data to read in the input stream\n     */\n    public function ask(InputInterface $input, OutputInterface $output, Question $question): mixed\n    {\n        if ($output instanceof ConsoleOutputInterface) {\n            $output = $output->getErrorOutput();\n        }\n\n        if (!$input->isInteractive()) {\n            return $this->getDefaultAnswer($question);\n        }\n\n        $inputStream = $input instanceof StreamableInputInterface ? $input->getStream() : null;\n        $inputStream ??= \\STDIN;\n\n        try {\n            if (!$question->getValidator()) {\n                return $this->doAsk($inputStream, $output, $question);\n            }\n\n            $interviewer = fn () => $this->doAsk($inputStream, $output, $question);\n\n            return $this->validateAttempts($interviewer, $output, $question);\n        } catch (MissingInputException $exception) {\n            $input->setInteractive(false);\n\n            if (null === $fallbackOutput = $this->getDefaultAnswer($question)) {\n                throw $exception;\n            }\n\n            return $fallbackOutput;\n        }\n    }\n\n    public function getName(): string\n    {\n        return 'question';\n    }\n\n    /**\n     * Prevents usage of stty.\n     */\n    public static function disableStty(): void\n    {\n        self::$stty = false;\n    }\n\n    /**\n     * Asks the question to the user.\n     *\n     * @param resource $inputStream\n     *\n     * @throws RuntimeException In case the fallback is deactivated and the response cannot be hidden\n     */\n    private function doAsk($inputStream, OutputInterface $output, Question $question): mixed\n    {\n        $this->writePrompt($output, $question);\n\n        $autocomplete = $question->getAutocompleterCallback();\n\n        if (null === $autocomplete || !self::$stty || !Terminal::hasSttyAvailable()) {\n            $ret = false;\n            if ($question->isHidden()) {\n                try {\n                    $hiddenResponse = $this->getHiddenResponse($output, $inputStream, $question->isTrimmable());\n                    $ret = $question->isTrimmable() ? trim($hiddenResponse) : $hiddenResponse;\n                } catch (RuntimeException $e) {\n                    if (!$question->isHiddenFallback()) {\n                        throw $e;\n                    }\n                }\n            }\n\n            if (false === $ret) {\n                $isBlocked = stream_get_meta_data($inputStream)['blocked'] ?? true;\n\n                if (!$isBlocked) {\n                    stream_set_blocking($inputStream, true);\n                }\n\n                $ret = $this->readInput($inputStream, $question);\n\n                if (!$isBlocked) {\n                    stream_set_blocking($inputStream, false);\n                }\n\n                if (false === $ret) {\n                    throw new MissingInputException('Aborted.');\n                }\n                if ($question->isTrimmable()) {\n                    $ret = trim($ret);\n                }\n            }\n        } else {\n            $autocomplete = $this->autocomplete($output, $question, $inputStream, $autocomplete);\n            $ret = $question->isTrimmable() ? trim($autocomplete) : $autocomplete;\n        }\n\n        if ($output instanceof ConsoleSectionOutput) {\n            $output->addContent(''); // add EOL to the question\n            $output->addContent($ret);\n        }\n\n        $ret = \\strlen($ret) > 0 ? $ret : $question->getDefault();\n\n        if ($normalizer = $question->getNormalizer()) {\n            return $normalizer($ret);\n        }\n\n        return $ret;\n    }\n\n    private function getDefaultAnswer(Question $question): mixed\n    {\n        $default = $question->getDefault();\n\n        if (null === $default) {\n            return $default;\n        }\n\n        if ($validator = $question->getValidator()) {\n            return \\call_user_func($validator, $default);\n        } elseif ($question instanceof ChoiceQuestion) {\n            $choices = $question->getChoices();\n\n            if (!$question->isMultiselect()) {\n                return $choices[$default] ?? $default;\n            }\n\n            $default = explode(',', $default);\n            foreach ($default as $k => $v) {\n                $v = $question->isTrimmable() ? trim($v) : $v;\n                $default[$k] = $choices[$v] ?? $v;\n            }\n        }\n\n        return $default;\n    }\n\n    /**\n     * Outputs the question prompt.\n     */\n    protected function writePrompt(OutputInterface $output, Question $question): void\n    {\n        $message = $question->getQuestion();\n\n        if ($question instanceof ChoiceQuestion) {\n            $output->writeln(array_merge([\n                $question->getQuestion(),\n            ], $this->formatChoiceQuestionChoices($question, 'info')));\n\n            $message = $question->getPrompt();\n        }\n\n        $output->write($message);\n    }\n\n    /**\n     * @return string[]\n     */\n    protected function formatChoiceQuestionChoices(ChoiceQuestion $question, string $tag): array\n    {\n        $messages = [];\n\n        $maxWidth = max(array_map([__CLASS__, 'width'], array_keys($choices = $question->getChoices())));\n\n        foreach ($choices as $key => $value) {\n            $padding = str_repeat(' ', $maxWidth - self::width($key));\n\n            $messages[] = \\sprintf(\"  [<$tag>%s$padding</$tag>] %s\", $key, $value);\n        }\n\n        return $messages;\n    }\n\n    /**\n     * Outputs an error message.\n     */\n    protected function writeError(OutputInterface $output, \\Exception $error): void\n    {\n        if (null !== $this->getHelperSet() && $this->getHelperSet()->has('formatter')) {\n            $message = $this->getHelperSet()->get('formatter')->formatBlock($error->getMessage(), 'error');\n        } else {\n            $message = '<error>'.$error->getMessage().'</error>';\n        }\n\n        $output->writeln($message);\n    }\n\n    /**\n     * Autocompletes a question.\n     *\n     * @param resource                  $inputStream\n     * @param callable(string):string[] $autocomplete\n     */\n    private function autocomplete(OutputInterface $output, Question $question, $inputStream, callable $autocomplete): string\n    {\n        $cursor = new Cursor($output, $inputStream);\n\n        $fullChoice = '';\n        $ret = '';\n\n        $i = 0;\n        $ofs = -1;\n        $matches = $autocomplete($ret);\n        $numMatches = \\count($matches);\n        $inputHelper = new TerminalInputHelper($inputStream);\n\n        // Disable icanon (so we can fread each keypress) and echo (we'll do echoing here instead)\n        shell_exec('stty -icanon -echo');\n\n        // Add highlighted text style\n        $output->getFormatter()->setStyle('hl', new OutputFormatterStyle('black', 'white'));\n\n        // Read a keypress\n        while (!feof($inputStream)) {\n            $inputHelper->waitForInput();\n            $c = fread($inputStream, 1);\n\n            // as opposed to fgets(), fread() returns an empty string when the stream content is empty, not false.\n            if (false === $c || ('' === $ret && '' === $c && null === $question->getDefault())) {\n                // Restore the terminal so it behaves normally again\n                $inputHelper->finish();\n                throw new MissingInputException('Aborted while asking: '.$question->getQuestion());\n            } elseif (\"\\177\" === $c) { // Backspace Character\n                if (0 === $numMatches && 0 !== $i) {\n                    --$i;\n                    $cursor->moveLeft(s($fullChoice)->slice(-1)->width(false));\n\n                    $fullChoice = self::substr($fullChoice, 0, $i);\n                }\n\n                if (0 === $i) {\n                    $ofs = -1;\n                    $matches = $autocomplete($ret);\n                    $numMatches = \\count($matches);\n                } else {\n                    $numMatches = 0;\n                }\n\n                // Pop the last character off the end of our string\n                $ret = self::substr($ret, 0, $i);\n            } elseif (\"\\033\" === $c) {\n                // Did we read an escape sequence?\n                $c .= fread($inputStream, 2);\n\n                // A CSI sequence ends with a byte in the 0x40-0x7E range, preceded by any number of\n                // parameter and intermediate bytes; consume them all so that none leaks into the answer\n                if ('[' === ($c[1] ?? '')) {\n                    while (($o = \\ord($c[\\strlen($c) - 1])) >= 0x20 && $o <= 0x3F) {\n                        if (!$next = fread($inputStream, 1)) {\n                            break;\n                        }\n\n                        $c .= $next;\n                    }\n                }\n\n                // A = Up Arrow. B = Down Arrow\n                if (isset($c[2]) && ('A' === $c[2] || 'B' === $c[2])) {\n                    if ('A' === $c[2] && -1 === $ofs) {\n                        $ofs = 0;\n                    }\n\n                    if (0 === $numMatches) {\n                        continue;\n                    }\n\n                    $ofs += ('A' === $c[2]) ? -1 : 1;\n                    $ofs = ($numMatches + $ofs) % $numMatches;\n                }\n            } elseif ('' === $c || \\ord($c) < 32) {\n                if (\"\\t\" === $c || \"\\n\" === $c) {\n                    if ($numMatches > 0 && -1 !== $ofs) {\n                        $ret = (string) $matches[$ofs];\n                        // Echo out remaining chars for current match\n                        $remainingCharacters = substr($ret, \\strlen($this->mostRecentlyEnteredValue($fullChoice)));\n                        $output->write($remainingCharacters);\n                        $fullChoice .= $remainingCharacters;\n                        $i = (false === $encoding = mb_detect_encoding($fullChoice, null, true)) ? \\strlen($fullChoice) : mb_strlen($fullChoice, $encoding);\n\n                        $matches = array_filter(\n                            $autocomplete($ret),\n                            static fn ($match) => '' === $ret || str_starts_with($match, $ret)\n                        );\n                        $numMatches = \\count($matches);\n                        $ofs = -1;\n                    }\n\n                    if (\"\\n\" === $c) {\n                        $output->write($c);\n                        break;\n                    }\n\n                    $numMatches = 0;\n                }\n\n                continue;\n            } else {\n                if (\"\\x80\" <= $c) {\n                    $c .= fread($inputStream, [\"\\xC0\" => 1, \"\\xD0\" => 1, \"\\xE0\" => 2, \"\\xF0\" => 3][$c & \"\\xF0\"]);\n                }\n\n                $output->write($c);\n                $ret .= $c;\n                $fullChoice .= $c;\n                ++$i;\n\n                $tempRet = $ret;\n\n                if ($question instanceof ChoiceQuestion && $question->isMultiselect()) {\n                    $tempRet = $this->mostRecentlyEnteredValue($fullChoice);\n                }\n\n                $numMatches = 0;\n                $ofs = 0;\n\n                foreach ($autocomplete($ret) as $value) {\n                    // If typed characters match the beginning chunk of value (e.g. [AcmeDe]moBundle)\n                    if (str_starts_with($value, $tempRet)) {\n                        $matches[$numMatches++] = $value;\n                    }\n                }\n            }\n\n            $cursor->clearLineAfter();\n\n            if ($numMatches > 0 && -1 !== $ofs) {\n                $cursor->savePosition();\n                // Write highlighted text, complete the partially entered response\n                $charactersEntered = \\strlen($this->mostRecentlyEnteredValue($fullChoice));\n                $output->write('<hl>'.OutputFormatter::escapeTrailingBackslash(substr($matches[$ofs], $charactersEntered)).'</hl>');\n                $cursor->restorePosition();\n            }\n        }\n\n        // Restore the terminal so it behaves normally again\n        $inputHelper->finish();\n\n        return $fullChoice;\n    }\n\n    private function mostRecentlyEnteredValue(string $entered): string\n    {\n        // Determine the most recent value that the user entered\n        if (!str_contains($entered, ',')) {\n            return $entered;\n        }\n\n        if (false === $lastCommaPos = strrpos($entered, ',')) {\n            return $entered;\n        }\n\n        $lastChoice = trim(substr($entered, $lastCommaPos + 1));\n\n        return '' !== $lastChoice ? $lastChoice : $entered;\n    }\n\n    /**\n     * Gets a hidden response from user.\n     *\n     * @param resource $inputStream The handler resource\n     * @param bool     $trimmable   Is the answer trimmable\n     *\n     * @throws RuntimeException In case the fallback is deactivated and the response cannot be hidden\n     */\n    private function getHiddenResponse(OutputInterface $output, $inputStream, bool $trimmable = true): string\n    {\n        if ('\\\\' === \\DIRECTORY_SEPARATOR) {\n            $exe = __DIR__.'/../Resources/bin/hiddeninput.exe';\n\n            // handle code running from a phar\n            if (str_starts_with(__FILE__, 'phar:')) {\n                $tmpExe = sys_get_temp_dir().'/hiddeninput.exe';\n                copy($exe, $tmpExe);\n                $exe = $tmpExe;\n            }\n\n            $sExec = shell_exec('\"'.$exe.'\"');\n            $value = $trimmable ? rtrim($sExec) : $sExec;\n            $output->writeln('');\n\n            if (isset($tmpExe)) {\n                unlink($tmpExe);\n            }\n\n            return $value;\n        }\n\n        $inputHelper = null;\n\n        if (self::$stty && Terminal::hasSttyAvailable()) {\n            $inputHelper = new TerminalInputHelper($inputStream);\n            shell_exec('stty -echo');\n        } elseif ($this->isInteractiveInput($inputStream)) {\n            throw new RuntimeException('Unable to hide the response.');\n        }\n\n        $value = $this->doReadInput($inputStream, helper: $inputHelper);\n\n        if (4095 === \\strlen($value)) {\n            $errOutput = $output instanceof ConsoleOutputInterface ? $output->getErrorOutput() : $output;\n            $errOutput->warning('The value was possibly truncated by your shell or terminal emulator');\n        }\n\n        // Restore the terminal so it behaves normally again\n        $inputHelper?->finish();\n\n        if ($trimmable) {\n            $value = trim($value);\n        }\n        $output->writeln('');\n\n        return $value;\n    }\n\n    /**\n     * Validates an attempt.\n     *\n     * @param callable $interviewer A callable that will ask for a question and return the result\n     *\n     * @throws \\Exception In case the max number of attempts has been reached and no valid response has been given\n     */\n    private function validateAttempts(callable $interviewer, OutputInterface $output, Question $question): mixed\n    {\n        $error = null;\n        $attempts = $question->getMaxAttempts();\n\n        while (null === $attempts || $attempts--) {\n            if (null !== $error) {\n                $this->writeError($output, $error);\n            }\n\n            try {\n                return $question->getValidator()($interviewer());\n            } catch (MissingInputException $e) {\n                throw $error ?? $e;\n            } catch (RuntimeException $e) {\n                throw $e;\n            } catch (\\Exception $error) {\n            }\n        }\n\n        throw $error;\n    }\n\n    private function isInteractiveInput($inputStream): bool\n    {\n        if ('php://stdin' !== (stream_get_meta_data($inputStream)['uri'] ?? null)) {\n            return false;\n        }\n\n        if (isset(self::$stdinIsInteractive)) {\n            return self::$stdinIsInteractive;\n        }\n\n        return self::$stdinIsInteractive = @stream_isatty(fopen('php://stdin', 'r'));\n    }\n\n    /**\n     * Reads one or more lines of input and returns what is read.\n     *\n     * @param resource $inputStream The handler resource\n     * @param Question $question    The question being asked\n     */\n    private function readInput($inputStream, Question $question): string|false\n    {\n        if (null !== $question->getTimeout() && $this->isInteractiveInput($inputStream)) {\n            $read = [$inputStream];\n            $write = null;\n            $except = null;\n            $timeoutSeconds = $question->getTimeout();\n            $changedStreams = stream_select($read, $write, $except, $timeoutSeconds);\n\n            if (0 === $changedStreams) {\n                throw new MissingInputException(\\sprintf('Timed out after waiting for input for %d second%s.', $timeoutSeconds, 1 === $timeoutSeconds ? '' : 's'));\n            }\n        }\n\n        if (!$question->isMultiline()) {\n            $cp = $this->setIOCodepage();\n            $ret = $this->doReadInput($inputStream);\n\n            return $this->resetIOCodepage($cp, $ret);\n        }\n\n        $multiLineStreamReader = $this->cloneInputStream($inputStream);\n        if (null === $multiLineStreamReader) {\n            return false;\n        }\n\n        $cp = $this->setIOCodepage();\n        $ret = $this->doReadInput($multiLineStreamReader, \"\\x4\");\n\n        if (stream_get_meta_data($inputStream)['seekable']) {\n            fseek($inputStream, ftell($multiLineStreamReader));\n        }\n\n        return $this->resetIOCodepage($cp, $ret);\n    }\n\n    private function setIOCodepage(): int\n    {\n        if (\\function_exists('sapi_windows_cp_set')) {\n            $cp = sapi_windows_cp_get();\n            sapi_windows_cp_set(sapi_windows_cp_get('oem'));\n\n            return $cp;\n        }\n\n        return 0;\n    }\n\n    /**\n     * Sets console I/O to the specified code page and converts the user input.\n     */\n    private function resetIOCodepage(int $cp, string|false $input): string|false\n    {\n        if (0 !== $cp) {\n            sapi_windows_cp_set($cp);\n\n            if (false !== $input && '' !== $input) {\n                $input = sapi_windows_cp_conv(sapi_windows_cp_get('oem'), $cp, $input);\n            }\n        }\n\n        return $input;\n    }\n\n    /**\n     * Clones an input stream in order to act on one instance of the same\n     * stream without affecting the other instance.\n     *\n     * @param resource $inputStream The handler resource\n     *\n     * @return resource|null The cloned resource, null in case it could not be cloned\n     */\n    private function cloneInputStream($inputStream)\n    {\n        $streamMetaData = stream_get_meta_data($inputStream);\n        $seekable = $streamMetaData['seekable'] ?? false;\n        $mode = $streamMetaData['mode'] ?? 'rb';\n        $uri = $streamMetaData['uri'] ?? null;\n\n        if (null === $uri) {\n            return null;\n        }\n\n        $cloneStream = fopen($uri, $mode);\n\n        // For seekable and writable streams, add all the same data to the\n        // cloned stream and then seek to the same offset.\n        if (true === $seekable && !\\in_array($mode, ['r', 'rb', 'rt'], true)) {\n            $offset = ftell($inputStream);\n            rewind($inputStream);\n            stream_copy_to_stream($inputStream, $cloneStream);\n            fseek($inputStream, $offset);\n            fseek($cloneStream, $offset);\n        }\n\n        return $cloneStream;\n    }\n\n    /**\n     * @param resource $inputStream\n     */\n    private function doReadInput($inputStream, ?string $exitChar = null, ?TerminalInputHelper $helper = null): string\n    {\n        $ret = '';\n        $helper ??= new TerminalInputHelper($inputStream, false);\n\n        while (!feof($inputStream)) {\n            $helper->waitForInput();\n            $char = fread($inputStream, 1);\n\n            // as opposed to fgets(), fread() returns an empty string when the stream content is empty, not false.\n            if (false === $char || ('' === $ret && '' === $char)) {\n                throw new MissingInputException('Aborted.');\n            }\n\n            if (\\PHP_EOL === \"{$ret}{$char}\" || $exitChar === $char) {\n                break;\n            }\n\n            $ret .= $char;\n\n            if (null === $exitChar && \"\\n\" === $char) {\n                break;\n            }\n        }\n\n        return $ret;\n    }\n}\n","vendor/symfony/console/Helper/SymfonyQuestionHelper.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Helper;\n\nuse Symfony\\Component\\Console\\Formatter\\OutputFormatter;\nuse Symfony\\Component\\Console\\Output\\OutputInterface;\nuse Symfony\\Component\\Console\\Question\\ChoiceQuestion;\nuse Symfony\\Component\\Console\\Question\\ConfirmationQuestion;\nuse Symfony\\Component\\Console\\Question\\Question;\nuse Symfony\\Component\\Console\\Style\\SymfonyStyle;\n\n/**\n * Symfony Style Guide compliant question helper.\n *\n * @author Kevin Bond <kevinbond@gmail.com>\n */\nclass SymfonyQuestionHelper extends QuestionHelper\n{\n    protected function writePrompt(OutputInterface $output, Question $question): void\n    {\n        $text = OutputFormatter::escapeTrailingBackslash($question->getQuestion());\n        $default = $question->getDefault();\n\n        if ($question->isMultiline()) {\n            $text .= \\sprintf(' (press %s to continue)', $this->getEofShortcut($output));\n        }\n\n        switch (true) {\n            case null === $default:\n                $text = \\sprintf(' <info>%s</info>:', $text);\n\n                break;\n\n            case $question instanceof ConfirmationQuestion:\n                $text = \\sprintf(' <info>%s (yes/no)</info> [<comment>%s</comment>]:', $text, $default ? 'yes' : 'no');\n\n                break;\n\n            case $question instanceof ChoiceQuestion && $question->isMultiselect():\n                $choices = $question->getChoices();\n                $default = explode(',', $default);\n\n                foreach ($default as $key => $value) {\n                    $default[$key] = $choices[trim($value)];\n                }\n\n                $text = \\sprintf(' <info>%s</info> [<comment>%s</comment>]:', $text, implode(', ', $default));\n\n                break;\n\n            case $question instanceof ChoiceQuestion:\n                $choices = $question->getChoices();\n                $text = \\sprintf(' <info>%s</info> [<comment>%s</comment>]:', $text, $choices[$default] ?? $default);\n\n                break;\n\n            default:\n                $text = \\sprintf(' <info>%s</info> [<comment>%s</comment>]:', $text, OutputFormatter::escape($default));\n        }\n\n        $output->writeln($text);\n\n        $prompt = ' > ';\n\n        if ($question instanceof ChoiceQuestion) {\n            $output->writeln($this->formatChoiceQuestionChoices($question, 'comment'));\n\n            $prompt = $question->getPrompt();\n        }\n\n        $output->write($prompt);\n    }\n\n    protected function writeError(OutputInterface $output, \\Exception $error): void\n    {\n        if ($output instanceof SymfonyStyle) {\n            $output->newLine();\n            $output->error($error->getMessage());\n\n            return;\n        }\n\n        parent::writeError($output, $error);\n    }\n\n    private function getEofShortcut(OutputInterface $output): string\n    {\n        if ('\\\\' === \\DIRECTORY_SEPARATOR && !$output->isDecorated()) {\n            return '<comment>Ctrl+Z</comment> then <comment>Enter</comment>';\n        }\n\n        return '<comment>Ctrl+D</comment>';\n    }\n}\n","vendor/symfony/console/Helper/Table.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Helper;\n\nuse Symfony\\Component\\Console\\Exception\\InvalidArgumentException;\nuse Symfony\\Component\\Console\\Exception\\RuntimeException;\nuse Symfony\\Component\\Console\\Formatter\\OutputFormatter;\nuse Symfony\\Component\\Console\\Formatter\\WrappableOutputFormatterInterface;\nuse Symfony\\Component\\Console\\Output\\ConsoleSectionOutput;\nuse Symfony\\Component\\Console\\Output\\OutputInterface;\n\n/**\n * Provides helpers to display a table.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n * @author Саша Стаменковић <umpirsky@gmail.com>\n * @author Abdellatif Ait boudad <a.aitboudad@gmail.com>\n * @author Max Grigorian <maxakawizard@gmail.com>\n * @author Dany Maillard <danymaillard93b@gmail.com>\n */\nclass Table\n{\n    private const SEPARATOR_TOP = 0;\n    private const SEPARATOR_TOP_BOTTOM = 1;\n    private const SEPARATOR_MID = 2;\n    private const SEPARATOR_BOTTOM = 3;\n    private const BORDER_OUTSIDE = 0;\n    private const BORDER_INSIDE = 1;\n    private const DISPLAY_ORIENTATION_DEFAULT = 'default';\n    private const DISPLAY_ORIENTATION_HORIZONTAL = 'horizontal';\n    private const DISPLAY_ORIENTATION_VERTICAL = 'vertical';\n\n    private ?string $headerTitle = null;\n    private ?string $footerTitle = null;\n    private array $headers = [];\n    private array $rows = [];\n    private array $effectiveColumnWidths = [];\n    private int $numberOfColumns;\n    private TableStyle $style;\n    private array $columnStyles = [];\n    private array $columnWidths = [];\n    private array $configuredColumnWidths = [];\n    private array $columnMaxWidths = [];\n    private bool $rendered = false;\n    private string $displayOrientation = self::DISPLAY_ORIENTATION_DEFAULT;\n\n    private static array $styles;\n\n    public function __construct(\n        private OutputInterface $output,\n    ) {\n        self::$styles ??= self::initStyles();\n\n        $this->setStyle('default');\n    }\n\n    /**\n     * Sets a style definition.\n     */\n    public static function setStyleDefinition(string $name, TableStyle $style): void\n    {\n        self::$styles ??= self::initStyles();\n\n        self::$styles[$name] = $style;\n    }\n\n    /**\n     * Gets a style definition by name.\n     */\n    public static function getStyleDefinition(string $name): TableStyle\n    {\n        self::$styles ??= self::initStyles();\n\n        return self::$styles[$name] ?? throw new InvalidArgumentException(\\sprintf('Style \"%s\" is not defined.', $name));\n    }\n\n    /**\n     * Sets table style.\n     *\n     * @return $this\n     */\n    public function setStyle(TableStyle|string $name): static\n    {\n        $this->style = $this->resolveStyle($name);\n\n        return $this;\n    }\n\n    /**\n     * Gets the current table style.\n     */\n    public function getStyle(): TableStyle\n    {\n        return $this->style;\n    }\n\n    /**\n     * Sets table column style.\n     *\n     * @param TableStyle|string $name The style name or a TableStyle instance\n     *\n     * @return $this\n     */\n    public function setColumnStyle(int $columnIndex, TableStyle|string $name): static\n    {\n        $this->columnStyles[$columnIndex] = $this->resolveStyle($name);\n\n        return $this;\n    }\n\n    /**\n     * Gets the current style for a column.\n     *\n     * If style was not set, it returns the global table style.\n     */\n    public function getColumnStyle(int $columnIndex): TableStyle\n    {\n        return $this->columnStyles[$columnIndex] ?? $this->getStyle();\n    }\n\n    /**\n     * Sets the minimum width of a column.\n     *\n     * @return $this\n     */\n    public function setColumnWidth(int $columnIndex, int $width): static\n    {\n        $this->columnWidths[$columnIndex] = $width;\n        $this->configuredColumnWidths[$columnIndex] = $width;\n\n        return $this;\n    }\n\n    /**\n     * Sets the minimum width of all columns.\n     *\n     * @return $this\n     */\n    public function setColumnWidths(array $widths): static\n    {\n        $this->columnWidths = [];\n        $this->configuredColumnWidths = [];\n        foreach ($widths as $index => $width) {\n            $this->setColumnWidth($index, $width);\n        }\n\n        return $this;\n    }\n\n    /**\n     * Sets the maximum width of a column.\n     *\n     * Any cell within this column which contents exceeds the specified width will be wrapped into multiple lines, while\n     * formatted strings are preserved.\n     *\n     * @return $this\n     */\n    public function setColumnMaxWidth(int $columnIndex, int $width): static\n    {\n        if (!$this->output->getFormatter() instanceof WrappableOutputFormatterInterface) {\n            throw new \\LogicException(\\sprintf('Setting a maximum column width is only supported when using a \"%s\" formatter, got \"%s\".', WrappableOutputFormatterInterface::class, get_debug_type($this->output->getFormatter())));\n        }\n\n        $this->columnMaxWidths[$columnIndex] = $width;\n\n        return $this;\n    }\n\n    /**\n     * @return $this\n     */\n    public function setHeaders(array $headers): static\n    {\n        $headers = array_values($headers);\n        if ($headers && !\\is_array($headers[0])) {\n            $headers = [$headers];\n        }\n\n        $this->headers = $headers;\n\n        return $this;\n    }\n\n    /**\n     * @return $this\n     */\n    public function setRows(array $rows): static\n    {\n        $this->rows = [];\n\n        return $this->addRows($rows);\n    }\n\n    /**\n     * @return $this\n     */\n    public function addRows(array $rows): static\n    {\n        foreach ($rows as $row) {\n            $this->addRow($row);\n        }\n\n        return $this;\n    }\n\n    /**\n     * @return $this\n     */\n    public function addRow(TableSeparator|array $row): static\n    {\n        if ($row instanceof TableSeparator) {\n            $this->rows[] = $row;\n\n            return $this;\n        }\n\n        $this->rows[] = array_values($row);\n\n        return $this;\n    }\n\n    /**\n     * Adds a row to the table, and re-renders the table.\n     *\n     * @return $this\n     */\n    public function appendRow(TableSeparator|array $row): static\n    {\n        if (!$this->output instanceof ConsoleSectionOutput) {\n            throw new RuntimeException(\\sprintf('Output should be an instance of \"%s\" when calling \"%s\".', ConsoleSectionOutput::class, __METHOD__));\n        }\n\n        if ($this->rendered) {\n            $this->output->clear($this->calculateRowCount());\n        }\n\n        $this->addRow($row);\n        $this->render();\n\n        return $this;\n    }\n\n    /**\n     * @return $this\n     */\n    public function setRow(int|string $column, array $row): static\n    {\n        $this->rows[$column] = $row;\n\n        return $this;\n    }\n\n    /**\n     * @return $this\n     */\n    public function setHeaderTitle(?string $title): static\n    {\n        $this->headerTitle = $title;\n\n        return $this;\n    }\n\n    /**\n     * @return $this\n     */\n    public function setFooterTitle(?string $title): static\n    {\n        $this->footerTitle = $title;\n\n        return $this;\n    }\n\n    /**\n     * @return $this\n     */\n    public function setHorizontal(bool $horizontal = true): static\n    {\n        $this->displayOrientation = $horizontal ? self::DISPLAY_ORIENTATION_HORIZONTAL : self::DISPLAY_ORIENTATION_DEFAULT;\n\n        return $this;\n    }\n\n    /**\n     * @return $this\n     */\n    public function setVertical(bool $vertical = true): static\n    {\n        $this->displayOrientation = $vertical ? self::DISPLAY_ORIENTATION_VERTICAL : self::DISPLAY_ORIENTATION_DEFAULT;\n\n        return $this;\n    }\n\n    /**\n     * Renders table to output.\n     *\n     * Example:\n     *\n     *     +---------------+-----------------------+------------------+\n     *     | ISBN          | Title                 | Author           |\n     *     +---------------+-----------------------+------------------+\n     *     | 99921-58-10-7 | Divine Comedy         | Dante Alighieri  |\n     *     | 9971-5-0210-0 | A Tale of Two Cities  | Charles Dickens  |\n     *     | 960-425-059-0 | The Lord of the Rings | J. R. R. Tolkien |\n     *     +---------------+-----------------------+------------------+\n     */\n    public function render(): void\n    {\n        $divider = new TableSeparator();\n        $isCellWithColspan = static fn ($cell) => $cell instanceof TableCell && $cell->getColspan() >= 2;\n\n        $horizontal = self::DISPLAY_ORIENTATION_HORIZONTAL === $this->displayOrientation;\n        $vertical = self::DISPLAY_ORIENTATION_VERTICAL === $this->displayOrientation;\n\n        $rows = [];\n        if ($horizontal) {\n            foreach ($this->headers[0] ?? [] as $i => $header) {\n                $rows[$i] = [$header];\n                foreach ($this->rows as $row) {\n                    if ($row instanceof TableSeparator) {\n                        continue;\n                    }\n                    if (isset($row[$i])) {\n                        $rows[$i][] = $row[$i];\n                    } elseif ($isCellWithColspan($rows[$i][0])) {\n                        // Noop, there is a \"title\"\n                    } else {\n                        $rows[$i][] = null;\n                    }\n                }\n            }\n        } elseif ($vertical) {\n            $formatter = $this->output->getFormatter();\n            $maxHeaderLength = array_reduce($this->headers[0] ?? [], static fn ($max, $header) => max($max, Helper::width(Helper::removeDecoration($formatter, $header))), 0);\n\n            foreach ($this->rows as $row) {\n                if ($row instanceof TableSeparator) {\n                    continue;\n                }\n\n                if ($rows) {\n                    $rows[] = [$divider];\n                }\n\n                $containsColspan = false;\n                foreach ($row as $cell) {\n                    if ($containsColspan = $isCellWithColspan($cell)) {\n                        break;\n                    }\n                }\n\n                $headers = $this->headers[0] ?? [];\n                $maxRows = max(\\count($headers), \\count($row));\n                for ($i = 0; $i < $maxRows; ++$i) {\n                    $cell = (string) ($row[$i] ?? '');\n\n                    $eol = str_contains($cell, \"\\r\\n\") ? \"\\r\\n\" : \"\\n\";\n                    $parts = explode($eol, $cell);\n                    foreach ($parts as $idx => $part) {\n                        if ($headers && !$containsColspan) {\n                            if (0 === $idx) {\n                                $rows[] = [\\sprintf(\n                                    '<comment>%s%s</>: %s',\n                                    str_repeat(' ', $maxHeaderLength - Helper::width(Helper::removeDecoration($formatter, $headers[$i] ?? ''))),\n                                    $headers[$i] ?? '',\n                                    $part\n                                )];\n                            } else {\n                                $rows[] = [\\sprintf(\n                                    '%s  %s',\n                                    str_pad('', $maxHeaderLength, ' ', \\STR_PAD_LEFT),\n                                    $part\n                                )];\n                            }\n                        } elseif ('' !== $cell) {\n                            $rows[] = [$part];\n                        }\n                    }\n                }\n            }\n        } else {\n            $rows = array_merge($this->headers, [$divider], $this->rows);\n        }\n\n        $this->calculateNumberOfColumns($rows);\n\n        $rowGroups = $this->buildTableRows($rows);\n        $this->calculateColumnsWidth($rowGroups);\n\n        $isHeader = !$horizontal;\n        $isFirstRow = $horizontal;\n        $hasTitle = (bool) $this->headerTitle;\n        $previousRow = null;\n        $pendingSeparators = 0;\n\n        foreach ($rowGroups as $rowGroup) {\n            $isHeaderSeparatorRendered = false;\n\n            foreach ($rowGroup as $row) {\n                if ($divider === $row) {\n                    $isHeader = false;\n                    $isFirstRow = true;\n\n                    continue;\n                }\n\n                if ($row instanceof TableSeparator) {\n                    // defer rendering until the row below is known, to align crossings with it\n                    ++$pendingSeparators;\n\n                    continue;\n                }\n\n                if (!$row) {\n                    continue;\n                }\n\n                for (; $pendingSeparators > 0; --$pendingSeparators) {\n                    $this->renderRowSeparator(self::SEPARATOR_MID, null, null, $previousRow, $row);\n                }\n\n                if ($isHeader && !$isHeaderSeparatorRendered && $this->style->displayOutsideBorder()) {\n                    $this->renderRowSeparator(\n                        self::SEPARATOR_TOP,\n                        $hasTitle ? $this->headerTitle : null,\n                        $hasTitle ? $this->style->getHeaderTitleFormat() : null,\n                        null,\n                        $row\n                    );\n                    $hasTitle = false;\n                    $isHeaderSeparatorRendered = true;\n                }\n\n                if ($isFirstRow) {\n                    $this->renderRowSeparator(\n                        $horizontal || !array_filter($this->headers) ? self::SEPARATOR_TOP : self::SEPARATOR_TOP_BOTTOM,\n                        $hasTitle ? $this->headerTitle : null,\n                        $hasTitle ? $this->style->getHeaderTitleFormat() : null,\n                        $previousRow,\n                        $row\n                    );\n                    $isFirstRow = false;\n                    $hasTitle = false;\n                }\n\n                if ($vertical) {\n                    $isHeader = false;\n                    $isFirstRow = false;\n                }\n\n                if ($horizontal) {\n                    $this->renderRow($row, $this->style->getCellRowFormat(), $this->style->getCellHeaderFormat());\n                } else {\n                    $this->renderRow($row, $isHeader ? $this->style->getCellHeaderFormat() : $this->style->getCellRowFormat());\n                }\n\n                $previousRow = $row;\n            }\n        }\n\n        for (; $pendingSeparators > 0; --$pendingSeparators) {\n            $this->renderRowSeparator(self::SEPARATOR_MID, null, null, $previousRow);\n        }\n\n        if ($this->getStyle()->displayOutsideBorder()) {\n            $this->renderRowSeparator(self::SEPARATOR_BOTTOM, $this->footerTitle, $this->style->getFooterTitleFormat(), $previousRow);\n        }\n\n        $this->cleanup();\n        $this->rendered = true;\n    }\n\n    /**\n     * Renders horizontal header separator.\n     *\n     * Example:\n     *\n     *     +-----+-----------+-------+\n     */\n    private function renderRowSeparator(int $type = self::SEPARATOR_MID, ?string $title = null, ?string $titleFormat = null, ?array $rowAbove = null, ?array $rowBelow = null): void\n    {\n        if (!$count = $this->numberOfColumns) {\n            return;\n        }\n\n        $borders = $this->style->getBorderChars();\n        if (!$borders[0] && !$borders[2] && !$this->style->getCrossingChar()) {\n            return;\n        }\n\n        $crossings = $this->style->getCrossingChars();\n        if (self::SEPARATOR_MID === $type) {\n            [$horizontal, $leftChar, $midChar, $rightChar] = [$borders[2], $crossings[8], $crossings[0], $crossings[4]];\n        } elseif (self::SEPARATOR_TOP === $type) {\n            [$horizontal, $leftChar, $midChar, $rightChar] = [$borders[0], $crossings[1], $crossings[2], $crossings[3]];\n        } elseif (self::SEPARATOR_TOP_BOTTOM === $type) {\n            [$horizontal, $leftChar, $midChar, $rightChar] = [$borders[0], $crossings[9], $crossings[10], $crossings[11]];\n        } else {\n            [$horizontal, $leftChar, $midChar, $rightChar] = [$borders[0], $crossings[7], $crossings[6], $crossings[5]];\n        }\n\n        // only draw a crossing where a vertical border meets the separator; a cell\n        // spanning several columns has no border on the columns it covers\n        $hasLineAbove = self::SEPARATOR_TOP !== $type;\n        $hasLineBelow = self::SEPARATOR_BOTTOM !== $type;\n        $columnsAbove = null !== $rowAbove ? $this->getRowColumns($rowAbove) : null;\n        $columnsBelow = null !== $rowBelow ? $this->getRowColumns($rowBelow) : null;\n\n        $markup = $leftChar;\n        for ($column = 0; $column < $count; ++$column) {\n            $markup .= str_repeat($horizontal, $this->effectiveColumnWidths[$column]);\n            if ($column === $count - 1) {\n                $markup .= $rightChar;\n\n                continue;\n            }\n\n            $borderAbove = $hasLineAbove && (null === $columnsAbove || \\in_array($column + 1, $columnsAbove, true));\n            $borderBelow = $hasLineBelow && (null === $columnsBelow || \\in_array($column + 1, $columnsBelow, true));\n            // the one-sided junctions reuse the top/bottom crossing chars; for the \"box-double\"\n            // style these are double-horizontal (╤/╧) while an inner separator is single (─), as\n            // that style has no single-line ┬/┴ to fall back to\n            $markup .= match (true) {\n                $borderAbove && $borderBelow => $midChar,\n                $borderBelow => $crossings[2],\n                $borderAbove => $crossings[6],\n                default => $horizontal,\n            };\n        }\n\n        if (null !== $title) {\n            $titleLength = Helper::width(Helper::removeDecoration($formatter = $this->output->getFormatter(), $formattedTitle = \\sprintf($titleFormat, $title)));\n            $markupLength = Helper::width($markup);\n            if ($titleLength > $limit = $markupLength - 4) {\n                $titleLength = $limit;\n                $formatLength = Helper::width(Helper::removeDecoration($formatter, \\sprintf($titleFormat, '')));\n                $formattedTitle = \\sprintf($titleFormat, Helper::substr($title, 0, $limit - $formatLength - 3).'...');\n            }\n\n            $titleStart = intdiv($markupLength - $titleLength, 2);\n            if (false === mb_detect_encoding($markup, null, true)) {\n                $markup = substr_replace($markup, $formattedTitle, $titleStart, $titleLength);\n            } else {\n                $markup = mb_substr($markup, 0, $titleStart).$formattedTitle.mb_substr($markup, $titleStart + $titleLength);\n            }\n        }\n\n        $this->output->writeln(\\sprintf($this->style->getBorderFormat(), $markup));\n    }\n\n    /**\n     * Renders vertical column separator.\n     */\n    private function renderColumnSeparator(int $type = self::BORDER_OUTSIDE): string\n    {\n        $borders = $this->style->getBorderChars();\n\n        return \\sprintf($this->style->getBorderFormat(), self::BORDER_OUTSIDE === $type ? $borders[1] : $borders[3]);\n    }\n\n    /**\n     * Renders table row.\n     *\n     * Example:\n     *\n     *     | 9971-5-0210-0 | A Tale of Two Cities  | Charles Dickens  |\n     */\n    private function renderRow(array $row, string $cellFormat, ?string $firstCellFormat = null): void\n    {\n        $rowContent = $this->renderColumnSeparator(self::BORDER_OUTSIDE);\n        $columns = $this->getRowColumns($row);\n        $last = array_key_last($columns);\n        foreach ($columns as $i => $column) {\n            if ($firstCellFormat && 0 === $i) {\n                $rowContent .= $this->renderCell($row, $column, $firstCellFormat);\n            } else {\n                $rowContent .= $this->renderCell($row, $column, $cellFormat);\n            }\n            $rowContent .= $this->renderColumnSeparator($last === $i ? self::BORDER_OUTSIDE : self::BORDER_INSIDE);\n        }\n        $this->output->writeln($rowContent);\n    }\n\n    /**\n     * Renders table cell with padding.\n     */\n    private function renderCell(array $row, int $column, string $cellFormat): string\n    {\n        $cell = $row[$column] ?? '';\n        $width = $this->effectiveColumnWidths[$column];\n        if ($cell instanceof TableCell && $cell->getColspan() > 1) {\n            // add the width of the following columns(numbers of colspan).\n            foreach (range($column + 1, $column + $cell->getColspan() - 1) as $nextColumn) {\n                $width += $this->getColumnSeparatorWidth() + $this->effectiveColumnWidths[$nextColumn];\n            }\n        }\n\n        // str_pad won't work properly with multi-byte strings, we need to fix the padding\n        $width += \\strlen($cell) - Helper::width($cell) - substr_count($cell, \"\\0\");\n        $style = $this->getColumnStyle($column);\n\n        if ($cell instanceof TableSeparator) {\n            return \\sprintf($style->getBorderFormat(), str_repeat($style->getBorderChars()[2], $width));\n        }\n\n        $width += Helper::length($cell) - Helper::length(Helper::removeDecoration($this->output->getFormatter(), $cell));\n        $content = \\sprintf($style->getCellRowContentFormat(), $cell);\n\n        $padType = $style->getPadType();\n        if ($cell instanceof TableCell && $cell->getStyle() instanceof TableCellStyle) {\n            $isNotStyledByTag = !preg_match('/^<(\\w+|(\\w+=[\\w,]+;?)*)>.+<\\/(\\w+|(\\w+=\\w+;?)*)?>$/', $cell);\n            if ($isNotStyledByTag) {\n                $cellFormat = $cell->getStyle()->getCellFormat();\n                if (!\\is_string($cellFormat)) {\n                    $tag = http_build_query($cell->getStyle()->getTagOptions(), '', ';');\n                    $cellFormat = '<'.$tag.'>%s</>';\n                }\n\n                if (str_contains($content, '</>')) {\n                    $content = str_replace('</>', '', $content);\n                    $width -= 3;\n                }\n                if (str_contains($content, '<fg=default;bg=default>')) {\n                    $content = str_replace('<fg=default;bg=default>', '', $content);\n                    $width -= \\strlen('<fg=default;bg=default>');\n                }\n            }\n\n            $padType = $cell->getStyle()->getPadByAlign();\n        }\n\n        return \\sprintf($cellFormat, str_pad($content, $width, $style->getPaddingChar(), $padType));\n    }\n\n    /**\n     * Calculate number of columns for this table.\n     */\n    private function calculateNumberOfColumns(array $rows): void\n    {\n        $columns = [0];\n        foreach ($rows as $row) {\n            if ($row instanceof TableSeparator) {\n                continue;\n            }\n\n            $columns[] = $this->getNumberOfColumns($row);\n        }\n\n        $this->numberOfColumns = max($columns);\n    }\n\n    private function buildTableRows(array $rows): TableRows\n    {\n        /** @var WrappableOutputFormatterInterface $formatter */\n        $formatter = $this->output->getFormatter();\n        $unmergedRows = [];\n        for ($rowKey = 0; $rowKey < \\count($rows); ++$rowKey) {\n            $rows = $this->fillNextRows($rows, $rowKey);\n\n            // Remove any new line breaks and replace it with a new line\n            foreach ($rows[$rowKey] as $column => $cell) {\n                $colspan = $cell instanceof TableCell ? $cell->getColspan() : 1;\n\n                $minWrappedWidth = 0;\n                $widthApplied = [];\n                $lengthColumnBorder = $this->getColumnSeparatorWidth() + Helper::width($this->style->getCellRowContentFormat()) - 2;\n                for ($i = $column; $i < ($column + $colspan); ++$i) {\n                    if (isset($this->columnMaxWidths[$i])) {\n                        $minWrappedWidth += $this->columnMaxWidths[$i];\n                        $widthApplied[] = ['type' => 'max', 'column' => $i];\n                    } elseif (($this->columnWidths[$i] ?? 0) > 0 && $colspan > 1) {\n                        $minWrappedWidth += $this->columnWidths[$i];\n                        $widthApplied[] = ['type' => 'min', 'column' => $i];\n                    }\n                }\n                if (1 === \\count($widthApplied)) {\n                    if ($colspan > 1) {\n                        $minWrappedWidth *= $colspan;  // previous logic\n                    }\n                } elseif (\\count($widthApplied) > 1) {\n                    $minWrappedWidth += (\\count($widthApplied) - 1) * $lengthColumnBorder;\n                }\n\n                $cellWidth = Helper::width(Helper::removeDecoration($formatter, $cell));\n                if ($minWrappedWidth && $cellWidth > $minWrappedWidth) {\n                    $cell = $formatter->formatAndWrap($cell, $minWrappedWidth);\n                }\n                // update minimal columnWidths for spanned columns\n                if ($colspan > 1 && $minWrappedWidth > 0) {\n                    $columnsMinWidthProcessed = [];\n                    $cellWidth = min($cellWidth, $minWrappedWidth);\n                    foreach ($widthApplied as $item) {\n                        if ('max' === $item['type'] && $cellWidth >= $this->columnMaxWidths[$item['column']]) {\n                            $minWidthColumn = $this->columnMaxWidths[$item['column']];\n                            $this->columnWidths[$item['column']] = $minWidthColumn;\n                            $columnsMinWidthProcessed[$item['column']] = true;\n                            $cellWidth -= $minWidthColumn + $lengthColumnBorder;\n                        } elseif ('min' === $item['type'] && ($this->configuredColumnWidths[$item['column']] ?? 0) > 0) {\n                            // this column already covers part of the cell, so share only the rest\n                            $columnsMinWidthProcessed[$item['column']] = true;\n                            $cellWidth -= $this->configuredColumnWidths[$item['column']] + $lengthColumnBorder;\n                        }\n                    }\n                    for ($i = $column; $i < ($column + $colspan); ++$i) {\n                        if (isset($columnsMinWidthProcessed[$i])) {\n                            continue;\n                        }\n                        // a width set through setColumnWidth() is a minimum, unlike one computed for an earlier row\n                        $this->columnWidths[$i] = max($this->configuredColumnWidths[$i] ?? 0, $cellWidth + $lengthColumnBorder);\n                    }\n                }\n                if (!str_contains($cell ?? '', \"\\n\")) {\n                    continue;\n                }\n                $eol = str_contains($cell ?? '', \"\\r\\n\") ? \"\\r\\n\" : \"\\n\";\n                $escaped = implode($eol, array_map(OutputFormatter::escapeTrailingBackslash(...), explode($eol, $cell)));\n                $cell = $cell instanceof TableCell ? new TableCell($escaped, ['colspan' => $cell->getColspan()]) : $escaped;\n                $lines = explode($eol, str_replace($eol, '<fg=default;bg=default></>'.$eol, $cell));\n                foreach ($lines as $lineKey => $line) {\n                    if ($colspan > 1) {\n                        $line = new TableCell($line, ['colspan' => $colspan]);\n                    }\n                    if (0 === $lineKey) {\n                        $rows[$rowKey][$column] = $line;\n                    } else {\n                        if (!\\array_key_exists($rowKey, $unmergedRows) || !\\array_key_exists($lineKey, $unmergedRows[$rowKey])) {\n                            $unmergedRows[$rowKey][$lineKey] = $this->copyRow($rows, $rowKey);\n                        }\n                        $unmergedRows[$rowKey][$lineKey][$column] = $line;\n                    }\n                }\n            }\n        }\n\n        return new TableRows(function () use ($rows, $unmergedRows): \\Traversable {\n            foreach ($rows as $rowKey => $row) {\n                $rowGroup = [$row instanceof TableSeparator ? $row : $this->fillCells($row)];\n\n                if (isset($unmergedRows[$rowKey])) {\n                    foreach ($unmergedRows[$rowKey] as $row) {\n                        $rowGroup[] = $row instanceof TableSeparator ? $row : $this->fillCells($row);\n                    }\n                }\n                yield $rowGroup;\n            }\n        });\n    }\n\n    private function calculateRowCount(): int\n    {\n        $numberOfRows = \\count(iterator_to_array($this->buildTableRows(array_merge($this->headers, [new TableSeparator()], $this->rows))));\n\n        if ($this->headers) {\n            ++$numberOfRows; // Add row for header separator\n        }\n\n        if ($this->rows) {\n            ++$numberOfRows; // Add row for footer separator\n        }\n\n        return $numberOfRows;\n    }\n\n    /**\n     * fill rows that contains rowspan > 1.\n     *\n     * @throws InvalidArgumentException\n     */\n    private function fillNextRows(array $rows, int $line): array\n    {\n        $unmergedRows = [];\n        foreach ($rows[$line] as $column => $cell) {\n            if (null !== $cell && !$cell instanceof TableCell && !\\is_scalar($cell) && !$cell instanceof \\Stringable) {\n                throw new InvalidArgumentException(\\sprintf('A cell must be a TableCell, a scalar or an object implementing \"__toString()\", \"%s\" given.', get_debug_type($cell)));\n            }\n            if ($cell instanceof TableCell && $cell->getRowspan() > 1) {\n                $nbLines = $cell->getRowspan() - 1;\n                $lines = [$cell];\n                if (str_contains($cell, \"\\n\")) {\n                    $eol = str_contains($cell, \"\\r\\n\") ? \"\\r\\n\" : \"\\n\";\n                    $lines = explode($eol, str_replace($eol, '<fg=default;bg=default>'.$eol.'</>', $cell));\n                    $nbLines = \\count($lines) > $nbLines ? substr_count($cell, $eol) : $nbLines;\n\n                    $rows[$line][$column] = new TableCell($lines[0], ['colspan' => $cell->getColspan(), 'style' => $cell->getStyle()]);\n                    unset($lines[0]);\n                }\n\n                // create a two dimensional array (rowspan x colspan)\n                $unmergedRows = array_replace_recursive(array_fill($line + 1, $nbLines, []), $unmergedRows);\n                foreach ($unmergedRows as $unmergedRowKey => $unmergedRow) {\n                    $value = $lines[$unmergedRowKey - $line] ?? '';\n                    $unmergedRows[$unmergedRowKey][$column] = new TableCell($value, ['colspan' => $cell->getColspan(), 'style' => $cell->getStyle()]);\n                    if ($nbLines === $unmergedRowKey - $line) {\n                        break;\n                    }\n                }\n            }\n        }\n\n        foreach ($unmergedRows as $unmergedRowKey => $unmergedRow) {\n            // we need to know if $unmergedRow will be merged or inserted into $rows\n            if (isset($rows[$unmergedRowKey]) && \\is_array($rows[$unmergedRowKey]) && ($this->getNumberOfColumns($rows[$unmergedRowKey]) + $this->getNumberOfColumns($unmergedRow) <= $this->numberOfColumns)) {\n                foreach ($unmergedRow as $cellKey => $cell) {\n                    // insert cell into row at cellKey position\n                    array_splice($rows[$unmergedRowKey], $cellKey, 0, [$cell]);\n                }\n            } else {\n                $row = $this->copyRow($rows, $unmergedRowKey - 1);\n                foreach ($unmergedRow as $column => $cell) {\n                    if ($cell) {\n                        $row[$column] = $cell;\n                    }\n                }\n                array_splice($rows, $unmergedRowKey, 0, [$row]);\n            }\n        }\n\n        return $rows;\n    }\n\n    /**\n     * fill cells for a row that contains colspan > 1.\n     */\n    private function fillCells(iterable $row): iterable\n    {\n        $newRow = [];\n\n        foreach ($row as $column => $cell) {\n            $newRow[] = $cell;\n            if ($cell instanceof TableCell && $cell->getColspan() > 1) {\n                foreach (range($column + 1, $column + $cell->getColspan() - 1) as $position) {\n                    // insert empty value at column position\n                    $newRow[] = '';\n                }\n            }\n        }\n\n        return $newRow ?: $row;\n    }\n\n    private function copyRow(array $rows, int $line): array\n    {\n        $row = $rows[$line];\n        foreach ($row as $cellKey => $cellValue) {\n            $row[$cellKey] = '';\n            if ($cellValue instanceof TableCell) {\n                $row[$cellKey] = new TableCell('', ['colspan' => $cellValue->getColspan()]);\n            }\n        }\n\n        return $row;\n    }\n\n    /**\n     * Gets number of columns by row.\n     */\n    private function getNumberOfColumns(array $row): int\n    {\n        $columns = \\count($row);\n        foreach ($row as $column) {\n            $columns += $column instanceof TableCell ? ($column->getColspan() - 1) : 0;\n        }\n\n        return $columns;\n    }\n\n    /**\n     * Gets list of columns for the given row.\n     */\n    private function getRowColumns(array $row): array\n    {\n        $columns = range(0, $this->numberOfColumns - 1);\n        foreach ($row as $cellKey => $cell) {\n            if ($cell instanceof TableCell && $cell->getColspan() > 1) {\n                // exclude grouped columns.\n                $columns = array_diff($columns, range($cellKey + 1, $cellKey + $cell->getColspan() - 1));\n            }\n        }\n\n        return $columns;\n    }\n\n    /**\n     * Calculates columns widths.\n     */\n    private function calculateColumnsWidth(iterable $groups): void\n    {\n        for ($column = 0; $column < $this->numberOfColumns; ++$column) {\n            $lengths = [];\n            foreach ($groups as $group) {\n                foreach ($group as $row) {\n                    if ($row instanceof TableSeparator) {\n                        continue;\n                    }\n\n                    foreach ($row as $i => $cell) {\n                        if ($cell instanceof TableCell) {\n                            $textContent = Helper::removeDecoration($this->output->getFormatter(), $cell);\n                            $textLength = Helper::width($textContent);\n                            if ($textLength > 0) {\n                                $contentColumns = mb_str_split($textContent, ceil($textLength / $cell->getColspan()));\n                                foreach ($contentColumns as $position => $content) {\n                                    $row[$i + $position] = $content;\n                                }\n                            }\n                        }\n                    }\n\n                    $lengths[] = $this->getCellWidth($row, $column);\n                }\n            }\n\n            $this->effectiveColumnWidths[$column] = max($lengths) + Helper::width($this->style->getCellRowContentFormat()) - 2;\n        }\n    }\n\n    private function getColumnSeparatorWidth(): int\n    {\n        return Helper::width(\\sprintf($this->style->getBorderFormat(), $this->style->getBorderChars()[3]));\n    }\n\n    private function getCellWidth(array $row, int $column): int\n    {\n        $cellWidth = 0;\n\n        if (isset($row[$column])) {\n            $cell = $row[$column];\n            $cellWidth = Helper::width(Helper::removeDecoration($this->output->getFormatter(), $cell));\n        }\n\n        $columnWidth = $this->columnWidths[$column] ?? 0;\n        $cellWidth = max($cellWidth, $columnWidth);\n\n        return isset($this->columnMaxWidths[$column]) ? min($this->columnMaxWidths[$column], $cellWidth) : $cellWidth;\n    }\n\n    /**\n     * Called after rendering to cleanup cache data.\n     */\n    private function cleanup(): void\n    {\n        $this->effectiveColumnWidths = [];\n        unset($this->numberOfColumns);\n    }\n\n    /**\n     * @return array<string, TableStyle>\n     */\n    private static function initStyles(): array\n    {\n        $markdown = new TableStyle();\n        $markdown\n            ->setDefaultCrossingChar('|')\n            ->setDisplayOutsideBorder(false)\n        ;\n\n        $borderless = new TableStyle();\n        $borderless\n            ->setHorizontalBorderChars('=')\n            ->setVerticalBorderChars(' ')\n            ->setDefaultCrossingChar(' ')\n        ;\n\n        $compact = new TableStyle();\n        $compact\n            ->setHorizontalBorderChars('')\n            ->setVerticalBorderChars('')\n            ->setDefaultCrossingChar('')\n            ->setCellRowContentFormat('%s ')\n        ;\n\n        $styleGuide = new TableStyle();\n        $styleGuide\n            ->setHorizontalBorderChars('-')\n            ->setVerticalBorderChars(' ')\n            ->setDefaultCrossingChar(' ')\n            ->setCellHeaderFormat('%s')\n        ;\n\n        $box = (new TableStyle())\n            ->setHorizontalBorderChars('─')\n            ->setVerticalBorderChars('│')\n            ->setCrossingChars('┼', '┌', '┬', '┐', '┤', '┘', '┴', '└', '├')\n        ;\n\n        $boxDouble = (new TableStyle())\n            ->setHorizontalBorderChars('═', '─')\n            ->setVerticalBorderChars('║', '│')\n            ->setCrossingChars('┼', '╔', '╤', '╗', '╢', '╝', '╧', '╚', '╟', '╠', '╪', '╣')\n        ;\n\n        return [\n            'default' => new TableStyle(),\n            'markdown' => $markdown,\n            'borderless' => $borderless,\n            'compact' => $compact,\n            'symfony-style-guide' => $styleGuide,\n            'box' => $box,\n            'box-double' => $boxDouble,\n        ];\n    }\n\n    private function resolveStyle(TableStyle|string $name): TableStyle\n    {\n        if ($name instanceof TableStyle) {\n            return $name;\n        }\n\n        return self::$styles[$name] ?? throw new InvalidArgumentException(\\sprintf('Style \"%s\" is not defined.', $name));\n    }\n}\n","vendor/symfony/console/Helper/TableCell.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Helper;\n\nuse Symfony\\Component\\Console\\Exception\\InvalidArgumentException;\n\n/**\n * @author Abdellatif Ait boudad <a.aitboudad@gmail.com>\n */\nclass TableCell\n{\n    private array $options = [\n        'rowspan' => 1,\n        'colspan' => 1,\n        'style' => null,\n    ];\n\n    public function __construct(\n        private string $value = '',\n        array $options = [],\n    ) {\n        // check option names\n        if ($diff = array_diff(array_keys($options), array_keys($this->options))) {\n            throw new InvalidArgumentException(\\sprintf('The TableCell does not support the following options: \\'%s\\'.', implode('\\', \\'', $diff)));\n        }\n\n        if (isset($options['style']) && !$options['style'] instanceof TableCellStyle) {\n            throw new InvalidArgumentException('The style option must be an instance of \"TableCellStyle\".');\n        }\n\n        $this->options = array_merge($this->options, $options);\n    }\n\n    /**\n     * Returns the cell value.\n     */\n    public function __toString(): string\n    {\n        return $this->value;\n    }\n\n    /**\n     * Gets number of colspan.\n     */\n    public function getColspan(): int\n    {\n        return (int) $this->options['colspan'];\n    }\n\n    /**\n     * Gets number of rowspan.\n     */\n    public function getRowspan(): int\n    {\n        return (int) $this->options['rowspan'];\n    }\n\n    public function getStyle(): ?TableCellStyle\n    {\n        return $this->options['style'];\n    }\n}\n","vendor/symfony/console/Helper/TableCellStyle.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Helper;\n\nuse Symfony\\Component\\Console\\Exception\\InvalidArgumentException;\n\n/**\n * @author Yewhen Khoptynskyi <khoptynskyi@gmail.com>\n */\nclass TableCellStyle\n{\n    public const DEFAULT_ALIGN = 'left';\n\n    private const TAG_OPTIONS = [\n        'fg',\n        'bg',\n        'options',\n    ];\n\n    private const ALIGN_MAP = [\n        'left' => \\STR_PAD_RIGHT,\n        'center' => \\STR_PAD_BOTH,\n        'right' => \\STR_PAD_LEFT,\n    ];\n\n    private array $options = [\n        'fg' => 'default',\n        'bg' => 'default',\n        'options' => null,\n        'align' => self::DEFAULT_ALIGN,\n        'cellFormat' => null,\n    ];\n\n    public function __construct(array $options = [])\n    {\n        if ($diff = array_diff(array_keys($options), array_keys($this->options))) {\n            throw new InvalidArgumentException(\\sprintf('The TableCellStyle does not support the following options: \\'%s\\'.', implode('\\', \\'', $diff)));\n        }\n\n        if (isset($options['align']) && !\\array_key_exists($options['align'], self::ALIGN_MAP)) {\n            throw new InvalidArgumentException(\\sprintf('Wrong align value. Value must be following: \\'%s\\'.', implode('\\', \\'', array_keys(self::ALIGN_MAP))));\n        }\n\n        $this->options = array_merge($this->options, $options);\n    }\n\n    public function getOptions(): array\n    {\n        return $this->options;\n    }\n\n    /**\n     * Gets options we need for tag for example fg, bg.\n     *\n     * @return string[]\n     */\n    public function getTagOptions(): array\n    {\n        return array_filter(\n            $this->getOptions(),\n            fn ($key) => \\in_array($key, self::TAG_OPTIONS, true) && isset($this->options[$key]),\n            \\ARRAY_FILTER_USE_KEY\n        );\n    }\n\n    public function getPadByAlign(): int\n    {\n        return self::ALIGN_MAP[$this->getOptions()['align']];\n    }\n\n    public function getCellFormat(): ?string\n    {\n        return $this->getOptions()['cellFormat'];\n    }\n}\n","vendor/symfony/console/Helper/TableRows.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Helper;\n\n/**\n * @internal\n */\nclass TableRows implements \\IteratorAggregate\n{\n    public function __construct(\n        private \\Closure $generator,\n    ) {\n    }\n\n    public function getIterator(): \\Traversable\n    {\n        return ($this->generator)();\n    }\n}\n","vendor/symfony/console/Helper/TableSeparator.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Helper;\n\n/**\n * Marks a row as being a separator.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n */\nclass TableSeparator extends TableCell\n{\n    public function __construct(array $options = [])\n    {\n        parent::__construct('', $options);\n    }\n}\n","vendor/symfony/console/Helper/TableStyle.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Helper;\n\nuse Symfony\\Component\\Console\\Exception\\InvalidArgumentException;\nuse Symfony\\Component\\Console\\Exception\\LogicException;\n\n/**\n * Defines the styles for a Table.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n * @author Саша Стаменковић <umpirsky@gmail.com>\n * @author Dany Maillard <danymaillard93b@gmail.com>\n */\nclass TableStyle\n{\n    private string $paddingChar = ' ';\n    private string $horizontalOutsideBorderChar = '-';\n    private string $horizontalInsideBorderChar = '-';\n    private string $verticalOutsideBorderChar = '|';\n    private string $verticalInsideBorderChar = '|';\n    private string $crossingChar = '+';\n    private string $crossingTopRightChar = '+';\n    private string $crossingTopMidChar = '+';\n    private string $crossingTopLeftChar = '+';\n    private string $crossingMidRightChar = '+';\n    private string $crossingBottomRightChar = '+';\n    private string $crossingBottomMidChar = '+';\n    private string $crossingBottomLeftChar = '+';\n    private string $crossingMidLeftChar = '+';\n    private string $crossingTopLeftBottomChar = '+';\n    private string $crossingTopMidBottomChar = '+';\n    private string $crossingTopRightBottomChar = '+';\n    private string $headerTitleFormat = '<fg=black;bg=white;options=bold> %s </>';\n    private string $footerTitleFormat = '<fg=black;bg=white;options=bold> %s </>';\n    private string $cellHeaderFormat = '<info>%s</info>';\n    private string $cellRowFormat = '%s';\n    private string $cellRowContentFormat = ' %s ';\n    private string $borderFormat = '%s';\n    private bool $displayOutsideBorder = true;\n    private int $padType = \\STR_PAD_RIGHT;\n\n    /**\n     * Sets padding character, used for cell padding.\n     *\n     * @return $this\n     */\n    public function setPaddingChar(string $paddingChar): static\n    {\n        if (!$paddingChar) {\n            throw new LogicException('The padding char must not be empty.');\n        }\n\n        $this->paddingChar = $paddingChar;\n\n        return $this;\n    }\n\n    /**\n     * Gets padding character, used for cell padding.\n     */\n    public function getPaddingChar(): string\n    {\n        return $this->paddingChar;\n    }\n\n    /**\n     * Sets horizontal border characters.\n     *\n     * <code>\n     * ╔═══════════════╤══════════════════════════╤══════════════════╗\n     * ║ ISBN          │ Title                    │ Author           ║\n     * ╠═══════1═══════╪══════════════════════════╪══════════════════╣\n     * ║ 99921-58-10-7 │ Divine Comedy            │ Dante Alighieri  ║\n     * ║ 9971-5-0210-0 │ A Tale of Two Cities     │ Charles Dickens  ║\n     * ╟───────2───────┼──────────────────────────┼──────────────────╢\n     * ║ 960-425-059-0 │ The Lord of the Rings    │ J. R. R. Tolkien ║\n     * ║ 80-902734-1-6 │ And Then There Were None │ Agatha Christie  ║\n     * ╚═══════════════╧══════════════════════════╧══════════════════╝\n     * </code>\n     *\n     * @return $this\n     */\n    public function setHorizontalBorderChars(string $outside, ?string $inside = null): static\n    {\n        $this->horizontalOutsideBorderChar = $outside;\n        $this->horizontalInsideBorderChar = $inside ?? $outside;\n\n        return $this;\n    }\n\n    /**\n     * Sets vertical border characters.\n     *\n     * <code>\n     * ╔═══════════════╤══════════════════════════╤══════════════════╗\n     * 1 ISBN          2 Title                    │ Author           ║\n     * ╠═══════════════╪══════════════════════════╪══════════════════╣\n     * ║ 99921-58-10-7 │ Divine Comedy            │ Dante Alighieri  ║\n     * ║ 9971-5-0210-0 │ A Tale of Two Cities     │ Charles Dickens  ║\n     * ║ 960-425-059-0 │ The Lord of the Rings    │ J. R. R. Tolkien ║\n     * ║ 80-902734-1-6 │ And Then There Were None │ Agatha Christie  ║\n     * ╚═══════════════╧══════════════════════════╧══════════════════╝\n     * </code>\n     *\n     * @return $this\n     */\n    public function setVerticalBorderChars(string $outside, ?string $inside = null): static\n    {\n        $this->verticalOutsideBorderChar = $outside;\n        $this->verticalInsideBorderChar = $inside ?? $outside;\n\n        return $this;\n    }\n\n    /**\n     * Gets border characters.\n     *\n     * @internal\n     */\n    public function getBorderChars(): array\n    {\n        return [\n            $this->horizontalOutsideBorderChar,\n            $this->verticalOutsideBorderChar,\n            $this->horizontalInsideBorderChar,\n            $this->verticalInsideBorderChar,\n        ];\n    }\n\n    /**\n     * Sets crossing characters.\n     *\n     * Example:\n     * <code>\n     * 1═══════════════2══════════════════════════2══════════════════3\n     * ║ ISBN          │ Title                    │ Author           ║\n     * 8'══════════════0'═════════════════════════0'═════════════════4'\n     * ║ 99921-58-10-7 │ Divine Comedy            │ Dante Alighieri  ║\n     * ║ 9971-5-0210-0 │ A Tale of Two Cities     │ Charles Dickens  ║\n     * 8───────────────0──────────────────────────0──────────────────4\n     * ║ 960-425-059-0 │ The Lord of the Rings    │ J. R. R. Tolkien ║\n     * ║ 80-902734-1-6 │ And Then There Were None │ Agatha Christie  ║\n     * 7═══════════════6══════════════════════════6══════════════════5\n     * </code>\n     *\n     * @param string      $cross          Crossing char (see #0 of example)\n     * @param string      $topLeft        Top left char (see #1 of example)\n     * @param string      $topMid         Top mid char (see #2 of example)\n     * @param string      $topRight       Top right char (see #3 of example)\n     * @param string      $midRight       Mid right char (see #4 of example)\n     * @param string      $bottomRight    Bottom right char (see #5 of example)\n     * @param string      $bottomMid      Bottom mid char (see #6 of example)\n     * @param string      $bottomLeft     Bottom left char (see #7 of example)\n     * @param string      $midLeft        Mid left char (see #8 of example)\n     * @param string|null $topLeftBottom  Top left bottom char (see #8' of example), equals to $midLeft if null\n     * @param string|null $topMidBottom   Top mid bottom char (see #0' of example), equals to $cross if null\n     * @param string|null $topRightBottom Top right bottom char (see #4' of example), equals to $midRight if null\n     *\n     * @return $this\n     */\n    public function setCrossingChars(string $cross, string $topLeft, string $topMid, string $topRight, string $midRight, string $bottomRight, string $bottomMid, string $bottomLeft, string $midLeft, ?string $topLeftBottom = null, ?string $topMidBottom = null, ?string $topRightBottom = null): static\n    {\n        $this->crossingChar = $cross;\n        $this->crossingTopLeftChar = $topLeft;\n        $this->crossingTopMidChar = $topMid;\n        $this->crossingTopRightChar = $topRight;\n        $this->crossingMidRightChar = $midRight;\n        $this->crossingBottomRightChar = $bottomRight;\n        $this->crossingBottomMidChar = $bottomMid;\n        $this->crossingBottomLeftChar = $bottomLeft;\n        $this->crossingMidLeftChar = $midLeft;\n        $this->crossingTopLeftBottomChar = $topLeftBottom ?? $midLeft;\n        $this->crossingTopMidBottomChar = $topMidBottom ?? $cross;\n        $this->crossingTopRightBottomChar = $topRightBottom ?? $midRight;\n\n        return $this;\n    }\n\n    /**\n     * Sets default crossing character used for each cross.\n     *\n     * @see {@link setCrossingChars()} for setting each crossing individually.\n     */\n    public function setDefaultCrossingChar(string $char): self\n    {\n        return $this->setCrossingChars($char, $char, $char, $char, $char, $char, $char, $char, $char);\n    }\n\n    /**\n     * Gets crossing character.\n     */\n    public function getCrossingChar(): string\n    {\n        return $this->crossingChar;\n    }\n\n    /**\n     * Gets crossing characters.\n     *\n     * @internal\n     */\n    public function getCrossingChars(): array\n    {\n        return [\n            $this->crossingChar,\n            $this->crossingTopLeftChar,\n            $this->crossingTopMidChar,\n            $this->crossingTopRightChar,\n            $this->crossingMidRightChar,\n            $this->crossingBottomRightChar,\n            $this->crossingBottomMidChar,\n            $this->crossingBottomLeftChar,\n            $this->crossingMidLeftChar,\n            $this->crossingTopLeftBottomChar,\n            $this->crossingTopMidBottomChar,\n            $this->crossingTopRightBottomChar,\n        ];\n    }\n\n    /**\n     * Sets header cell format.\n     *\n     * @return $this\n     */\n    public function setCellHeaderFormat(string $cellHeaderFormat): static\n    {\n        $this->cellHeaderFormat = $cellHeaderFormat;\n\n        return $this;\n    }\n\n    /**\n     * Gets header cell format.\n     */\n    public function getCellHeaderFormat(): string\n    {\n        return $this->cellHeaderFormat;\n    }\n\n    /**\n     * Sets row cell format.\n     *\n     * @return $this\n     */\n    public function setCellRowFormat(string $cellRowFormat): static\n    {\n        $this->cellRowFormat = $cellRowFormat;\n\n        return $this;\n    }\n\n    /**\n     * Gets row cell format.\n     */\n    public function getCellRowFormat(): string\n    {\n        return $this->cellRowFormat;\n    }\n\n    /**\n     * Sets row cell content format.\n     *\n     * @return $this\n     */\n    public function setCellRowContentFormat(string $cellRowContentFormat): static\n    {\n        $this->cellRowContentFormat = $cellRowContentFormat;\n\n        return $this;\n    }\n\n    /**\n     * Gets row cell content format.\n     */\n    public function getCellRowContentFormat(): string\n    {\n        return $this->cellRowContentFormat;\n    }\n\n    /**\n     * Sets table border format.\n     *\n     * @return $this\n     */\n    public function setBorderFormat(string $borderFormat): static\n    {\n        $this->borderFormat = $borderFormat;\n\n        return $this;\n    }\n\n    /**\n     * Gets table border format.\n     */\n    public function getBorderFormat(): string\n    {\n        return $this->borderFormat;\n    }\n\n    /**\n     * Sets cell padding type.\n     *\n     * @return $this\n     */\n    public function setPadType(int $padType): static\n    {\n        if (!\\in_array($padType, [\\STR_PAD_LEFT, \\STR_PAD_RIGHT, \\STR_PAD_BOTH], true)) {\n            throw new InvalidArgumentException('Invalid padding type. Expected one of (STR_PAD_LEFT, STR_PAD_RIGHT, STR_PAD_BOTH).');\n        }\n\n        $this->padType = $padType;\n\n        return $this;\n    }\n\n    /**\n     * Gets cell padding type.\n     */\n    public function getPadType(): int\n    {\n        return $this->padType;\n    }\n\n    public function getHeaderTitleFormat(): string\n    {\n        return $this->headerTitleFormat;\n    }\n\n    /**\n     * @return $this\n     */\n    public function setHeaderTitleFormat(string $format): static\n    {\n        $this->headerTitleFormat = $format;\n\n        return $this;\n    }\n\n    public function getFooterTitleFormat(): string\n    {\n        return $this->footerTitleFormat;\n    }\n\n    /**\n     * @return $this\n     */\n    public function setFooterTitleFormat(string $format): static\n    {\n        $this->footerTitleFormat = $format;\n\n        return $this;\n    }\n\n    public function setDisplayOutsideBorder($displayOutSideBorder): static\n    {\n        $this->displayOutsideBorder = $displayOutSideBorder;\n\n        return $this;\n    }\n\n    public function displayOutsideBorder(): bool\n    {\n        return $this->displayOutsideBorder;\n    }\n}\n","vendor/symfony/console/Helper/TerminalInputHelper.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Helper;\n\n/**\n * TerminalInputHelper stops Ctrl-C and similar signals from leaving the terminal in\n * an unusable state if its settings have been modified when reading user input.\n * This can be an issue on non-Windows platforms.\n *\n * Usage:\n *\n *     $inputHelper = new TerminalInputHelper($inputStream);\n *\n *     ...change terminal settings\n *\n *     // Wait for input before all input reads\n *     $inputHelper->waitForInput();\n *\n *     ...read input\n *\n *     // Call finish to restore terminal settings and signal handlers\n *     $inputHelper->finish()\n *\n * @internal\n */\nfinal class TerminalInputHelper\n{\n    /** @var resource */\n    private $inputStream;\n    private bool $isStdin;\n    private string $initialState = '';\n    private int $signalToKill = 0;\n    private array $signalHandlers = [];\n    private array $targetSignals = [];\n    private bool $withStty;\n\n    /**\n     * @param resource $inputStream\n     *\n     * @throws \\RuntimeException If unable to read terminal settings\n     */\n    public function __construct($inputStream, bool $withStty = true)\n    {\n        $this->inputStream = $inputStream;\n        $this->isStdin = 'php://stdin' === stream_get_meta_data($inputStream)['uri'];\n        $this->withStty = $withStty;\n\n        if ($withStty) {\n            if (!\\is_string($state = shell_exec('stty -g'))) {\n                throw new \\RuntimeException('Unable to read the terminal settings.');\n            }\n\n            $this->initialState = trim($state);\n\n            $this->createSignalHandlers();\n        }\n    }\n\n    /**\n     * Waits for input.\n     */\n    public function waitForInput(): void\n    {\n        if ($this->isStdin) {\n            $r = [$this->inputStream];\n            $w = [];\n\n            // Allow signal handlers to run\n            while (0 === @stream_select($r, $w, $w, 0, 100)) {\n                $r = [$this->inputStream];\n            }\n        }\n\n        if ($this->withStty) {\n            $this->checkForKillSignal();\n        }\n    }\n\n    /**\n     * Restores terminal state and signal handlers.\n     */\n    public function finish(): void\n    {\n        if (!$this->withStty) {\n            return;\n        }\n\n        // Safeguard in case an unhandled kill signal exists\n        $this->checkForKillSignal();\n\n        // The captured \"stty -g\" state is not guaranteed to be accepted back by \"stty\" on every\n        // platform/terminal (e.g. some nested pty implementations reject it with \"invalid argument\"),\n        // and shell_exec() gives no way to detect that failure. Try the exact restore first so\n        // any custom terminal settings survive, but always fall back to \"stty sane\" so the\n        // terminal is left in a usable state even when the exact restore silently fails.\n        shell_exec('stty '.$this->initialState.' 2>/dev/null || stty sane');\n        $this->signalToKill = 0;\n\n        foreach ($this->signalHandlers as $signal => $originalHandler) {\n            pcntl_signal($signal, $originalHandler);\n        }\n        $this->signalHandlers = [];\n        $this->targetSignals = [];\n    }\n\n    private function createSignalHandlers(): void\n    {\n        if (!\\function_exists('pcntl_async_signals') || !\\function_exists('pcntl_signal')) {\n            return;\n        }\n\n        pcntl_async_signals(true);\n        $this->targetSignals = [\\SIGINT, \\SIGQUIT, \\SIGTERM];\n\n        foreach ($this->targetSignals as $signal) {\n            $this->signalHandlers[$signal] = pcntl_signal_get_handler($signal);\n\n            pcntl_signal($signal, function ($signal) {\n                // Save current state, then restore to initial state. The original signal\n                // handler is about to run, so fall back to \"stty sane\" if the exact restore\n                // is rejected by \"stty\" (see the same fallback in finish()), to make sure it\n                // runs with a usable terminal.\n                $currentState = shell_exec('stty -g');\n                shell_exec('stty '.$this->initialState.' 2>/dev/null || stty sane');\n                $originalHandler = $this->signalHandlers[$signal];\n\n                if (\\is_callable($originalHandler)) {\n                    $originalHandler($signal);\n                    // Handler did not exit, so restore to current state\n                    shell_exec('stty '.$currentState);\n\n                    return;\n                }\n\n                // Not a callable, so SIG_DFL or SIG_IGN\n                if (\\SIG_DFL === $originalHandler) {\n                    $this->signalToKill = $signal;\n                }\n            });\n        }\n    }\n\n    private function checkForKillSignal(): void\n    {\n        if (\\in_array($this->signalToKill, $this->targetSignals, true)) {\n            // Try posix_kill\n            if (\\function_exists('posix_kill')) {\n                pcntl_signal($this->signalToKill, \\SIG_DFL);\n                posix_kill(getmypid(), $this->signalToKill);\n            }\n\n            // Best attempt fallback\n            exit(128 + $this->signalToKill);\n        }\n    }\n}\n","vendor/symfony/console/Helper/TreeHelper.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Helper;\n\nuse Symfony\\Component\\Console\\Output\\OutputInterface;\n\n/**\n * The TreeHelper class provides methods to display tree-like structures.\n *\n * @author Simon André <smn.andre@gmail.com>\n *\n * @implements \\RecursiveIterator<int, TreeNode>\n */\nfinal class TreeHelper implements \\RecursiveIterator\n{\n    /**\n     * @var \\Iterator<int, TreeNode>\n     */\n    private \\Iterator $children;\n\n    private function __construct(\n        private readonly OutputInterface $output,\n        private readonly TreeNode $node,\n        private readonly TreeStyle $style,\n    ) {\n        $this->children = new \\IteratorIterator($this->node->getChildren());\n        $this->children->rewind();\n    }\n\n    public static function createTree(OutputInterface $output, string|TreeNode|null $root = null, iterable $values = [], ?TreeStyle $style = null): self\n    {\n        $node = $root instanceof TreeNode ? $root : new TreeNode($root ?? '');\n\n        return new self($output, TreeNode::fromValues($values, $node), $style ?? TreeStyle::default());\n    }\n\n    public function current(): TreeNode\n    {\n        return $this->children->current();\n    }\n\n    public function key(): int\n    {\n        return $this->children->key();\n    }\n\n    public function next(): void\n    {\n        $this->children->next();\n    }\n\n    public function rewind(): void\n    {\n        $this->children->rewind();\n    }\n\n    public function valid(): bool\n    {\n        return $this->children->valid();\n    }\n\n    public function hasChildren(): bool\n    {\n        if (null === $current = $this->current()) {\n            return false;\n        }\n\n        foreach ($current->getChildren() as $child) {\n            return true;\n        }\n\n        return false;\n    }\n\n    public function getChildren(): \\RecursiveIterator\n    {\n        return new self($this->output, $this->current(), $this->style);\n    }\n\n    /**\n     * Recursively renders the tree to the output, applying the tree style.\n     */\n    public function render(): void\n    {\n        $treeIterator = new \\RecursiveTreeIterator($this);\n\n        $this->style->applyPrefixes($treeIterator);\n\n        $this->output->writeln($this->node->getValue());\n\n        $visited = new \\SplObjectStorage();\n        foreach ($treeIterator as $node) {\n            $currentNode = $node instanceof TreeNode ? $node : $treeIterator->getInnerIterator()->current();\n            if (isset($visited[$currentNode])) {\n                throw new \\LogicException(\\sprintf('Cycle detected at node: \"%s\".', $currentNode->getValue()));\n            }\n            $visited[$currentNode] = true;\n\n            $this->output->writeln($node);\n        }\n    }\n}\n","vendor/symfony/console/Helper/TreeNode.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Helper;\n\n/**\n * @implements \\IteratorAggregate<TreeNode>\n *\n * @author Simon André <smn.andre@gmail.com>\n */\nfinal class TreeNode implements \\Countable, \\IteratorAggregate\n{\n    /**\n     * @var array<TreeNode|callable(): \\Generator>\n     */\n    private array $children = [];\n\n    public function __construct(\n        private readonly string $value = '',\n        iterable $children = [],\n    ) {\n        foreach ($children as $child) {\n            $this->addChild($child);\n        }\n    }\n\n    public static function fromValues(iterable $nodes, ?self $node = null): self\n    {\n        $node ??= new self();\n        foreach ($nodes as $key => $value) {\n            if (is_iterable($value)) {\n                $child = new self($key);\n                self::fromValues($value, $child);\n                $node->addChild($child);\n            } elseif ($value instanceof self) {\n                $node->addChild($value);\n            } else {\n                $node->addChild(new self($value));\n            }\n        }\n\n        return $node;\n    }\n\n    public function getValue(): string\n    {\n        return $this->value;\n    }\n\n    public function addChild(self|string|callable $node): self\n    {\n        if (\\is_string($node)) {\n            $node = new self($node);\n        }\n\n        $this->children[] = $node;\n\n        return $this;\n    }\n\n    /**\n     * @return \\Traversable<int, TreeNode>\n     */\n    public function getChildren(): \\Traversable\n    {\n        foreach ($this->children as $child) {\n            if (\\is_callable($child)) {\n                yield from $child();\n            } elseif ($child instanceof self) {\n                yield $child;\n            }\n        }\n    }\n\n    /**\n     * @return \\Traversable<int, TreeNode>\n     */\n    public function getIterator(): \\Traversable\n    {\n        return $this->getChildren();\n    }\n\n    public function count(): int\n    {\n        $count = 0;\n        foreach ($this->getChildren() as $child) {\n            ++$count;\n        }\n\n        return $count;\n    }\n\n    public function __toString(): string\n    {\n        return $this->value;\n    }\n}\n","vendor/symfony/console/Helper/TreeStyle.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Helper;\n\n/**\n * Configures the output of the Tree helper.\n *\n * @author Simon André <smn.andre@gmail.com>\n */\nfinal class TreeStyle\n{\n    public function __construct(\n        private readonly string $prefixEndHasNext,\n        private readonly string $prefixEndLast,\n        private readonly string $prefixLeft,\n        private readonly string $prefixMidHasNext,\n        private readonly string $prefixMidLast,\n        private readonly string $prefixRight,\n    ) {\n    }\n\n    public static function box(): self\n    {\n        return new self('┃╸ ', '┗╸ ', '', '┃  ', '   ', '');\n    }\n\n    public static function boxDouble(): self\n    {\n        return new self('╠═ ', '╚═ ', '', '║  ', '  ', '');\n    }\n\n    public static function compact(): self\n    {\n        return new self('├ ', '└ ', '', '│ ', '  ', '');\n    }\n\n    public static function default(): self\n    {\n        return new self('├── ', '└── ', '', '│   ', '   ', '');\n    }\n\n    public static function light(): self\n    {\n        return new self('|-- ', '`-- ', '', '|   ', '    ', '');\n    }\n\n    public static function minimal(): self\n    {\n        return new self('. ', '. ', '', '. ', '  ', '');\n    }\n\n    public static function rounded(): self\n    {\n        return new self('├─ ', '╰─ ', '', '│  ', '   ', '');\n    }\n\n    /**\n     * @internal\n     */\n    public function applyPrefixes(\\RecursiveTreeIterator $iterator): void\n    {\n        $iterator->setPrefixPart(\\RecursiveTreeIterator::PREFIX_LEFT, $this->prefixLeft);\n        $iterator->setPrefixPart(\\RecursiveTreeIterator::PREFIX_MID_HAS_NEXT, $this->prefixMidHasNext);\n        $iterator->setPrefixPart(\\RecursiveTreeIterator::PREFIX_MID_LAST, $this->prefixMidLast);\n        $iterator->setPrefixPart(\\RecursiveTreeIterator::PREFIX_END_HAS_NEXT, $this->prefixEndHasNext);\n        $iterator->setPrefixPart(\\RecursiveTreeIterator::PREFIX_END_LAST, $this->prefixEndLast);\n        $iterator->setPrefixPart(\\RecursiveTreeIterator::PREFIX_RIGHT, $this->prefixRight);\n    }\n}\n","vendor/symfony/console/Input/ArgvInput.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Input;\n\nuse Symfony\\Component\\Console\\Exception\\RuntimeException;\n\n/**\n * ArgvInput represents an input coming from the CLI arguments.\n *\n * Usage:\n *\n *     $input = new ArgvInput();\n *\n * By default, the `$_SERVER['argv']` array is used for the input values.\n *\n * This can be overridden by explicitly passing the input values in the constructor:\n *\n *     $input = new ArgvInput($_SERVER['argv']);\n *\n * If you pass it yourself, don't forget that the first element of the array\n * is the name of the running application.\n *\n * When passing an argument to the constructor, be sure that it respects\n * the same rules as the argv one. It's almost always better to use the\n * `StringInput` when you want to provide your own input.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n *\n * @see http://www.gnu.org/software/libc/manual/html_node/Argument-Syntax.html\n * @see http://www.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap12.html#tag_12_02\n */\nclass ArgvInput extends Input\n{\n    /** @var list<string> */\n    private array $tokens;\n    private array $parsed;\n\n    /** @param list<string>|null $argv */\n    public function __construct(?array $argv = null, ?InputDefinition $definition = null)\n    {\n        $argv ??= $_SERVER['argv'] ?? [];\n\n        foreach ($argv as $arg) {\n            if (!\\is_scalar($arg) && !$arg instanceof \\Stringable) {\n                throw new RuntimeException(\\sprintf('Argument values expected to be all scalars, got \"%s\".', get_debug_type($arg)));\n            }\n        }\n\n        // strip the application name\n        array_shift($argv);\n\n        $this->tokens = $argv;\n\n        parent::__construct($definition);\n    }\n\n    /** @param list<string> $tokens */\n    protected function setTokens(array $tokens): void\n    {\n        $this->tokens = $tokens;\n    }\n\n    protected function parse(): void\n    {\n        $parseOptions = true;\n        $this->parsed = $this->tokens;\n        while (null !== $token = array_shift($this->parsed)) {\n            $parseOptions = $this->parseToken($token, $parseOptions);\n        }\n    }\n\n    protected function parseToken(string $token, bool $parseOptions): bool\n    {\n        if ($parseOptions && '' == $token) {\n            $this->parseArgument($token);\n        } elseif ($parseOptions && '--' == $token) {\n            return false;\n        } elseif ($parseOptions && str_starts_with($token, '--')) {\n            $this->parseLongOption($token);\n        } elseif ($parseOptions && '-' === $token[0] && '-' !== $token) {\n            $this->parseShortOption($token);\n        } else {\n            $this->parseArgument($token);\n        }\n\n        return $parseOptions;\n    }\n\n    /**\n     * Parses a short option.\n     */\n    private function parseShortOption(string $token): void\n    {\n        $name = substr($token, 1);\n\n        if (\\strlen($name) > 1) {\n            if ($this->definition->hasShortcut($name[0]) && $this->definition->getOptionForShortcut($name[0])->acceptValue()) {\n                // an option with a value (with no space)\n                $this->addShortOption($name[0], substr($name, 1));\n            } else {\n                $this->parseShortOptionSet($name);\n            }\n        } else {\n            $this->addShortOption($name, null);\n        }\n    }\n\n    /**\n     * Parses a short option set.\n     *\n     * @throws RuntimeException When option given doesn't exist\n     */\n    private function parseShortOptionSet(string $name): void\n    {\n        $len = \\strlen($name);\n        for ($i = 0; $i < $len; ++$i) {\n            if (!$this->definition->hasShortcut($name[$i])) {\n                $encoding = mb_detect_encoding($name, null, true);\n                throw new RuntimeException(\\sprintf('The \"-%s\" option does not exist.', false === $encoding ? $name[$i] : mb_substr($name, $i, 1, $encoding)));\n            }\n\n            $option = $this->definition->getOptionForShortcut($name[$i]);\n            if ($option->acceptValue()) {\n                $this->addLongOption($option->getName(), $i === $len - 1 ? null : substr($name, $i + 1));\n\n                break;\n            }\n\n            $this->addLongOption($option->getName(), null);\n        }\n    }\n\n    /**\n     * Parses a long option.\n     */\n    private function parseLongOption(string $token): void\n    {\n        $name = substr($token, 2);\n\n        if (false !== $pos = strpos($name, '=')) {\n            if ('' === $value = substr($name, $pos + 1)) {\n                array_unshift($this->parsed, $value);\n            }\n            $this->addLongOption(substr($name, 0, $pos), $value);\n        } else {\n            $this->addLongOption($name, null);\n        }\n    }\n\n    /**\n     * Parses an argument.\n     *\n     * @throws RuntimeException When too many arguments are given\n     */\n    private function parseArgument(string $token): void\n    {\n        $c = \\count($this->arguments);\n\n        // if input is expecting another argument, add it\n        if ($this->definition->hasArgument($c)) {\n            $arg = $this->definition->getArgument($c);\n            $this->arguments[$arg->getName()] = $arg->isArray() ? [$token] : $token;\n\n        // if last argument isArray(), append token to last argument\n        } elseif ($this->definition->hasArgument($c - 1) && $this->definition->getArgument($c - 1)->isArray()) {\n            $arg = $this->definition->getArgument($c - 1);\n            $this->arguments[$arg->getName()][] = $token;\n\n        // unexpected argument\n        } else {\n            $all = $this->definition->getArguments();\n            $symfonyCommandName = null;\n            if (($inputArgument = $all[$key = array_key_first($all) ?? ''] ?? null) && 'command' === $inputArgument->getName()) {\n                $symfonyCommandName = $this->arguments['command'] ?? null;\n                unset($all[$key]);\n            }\n\n            if ($all) {\n                if ($symfonyCommandName) {\n                    $message = \\sprintf('Too many arguments to \"%s\" command, expected arguments \"%s\".', $symfonyCommandName, implode('\" \"', array_keys($all)));\n                } else {\n                    $message = \\sprintf('Too many arguments, expected arguments \"%s\".', implode('\" \"', array_keys($all)));\n                }\n            } elseif ($symfonyCommandName) {\n                $message = \\sprintf('No arguments expected for \"%s\" command, got \"%s\".', $symfonyCommandName, $token);\n            } else {\n                $message = \\sprintf('No arguments expected, got \"%s\".', $token);\n            }\n\n            throw new RuntimeException($message);\n        }\n    }\n\n    /**\n     * Adds a short option value.\n     *\n     * @throws RuntimeException When option given doesn't exist\n     */\n    private function addShortOption(string $shortcut, mixed $value): void\n    {\n        if (!$this->definition->hasShortcut($shortcut)) {\n            throw new RuntimeException(\\sprintf('The \"-%s\" option does not exist.', $shortcut));\n        }\n\n        $this->addLongOption($this->definition->getOptionForShortcut($shortcut)->getName(), $value);\n    }\n\n    /**\n     * Adds a long option value.\n     *\n     * @throws RuntimeException When option given doesn't exist\n     */\n    private function addLongOption(string $name, mixed $value): void\n    {\n        if (!$this->definition->hasOption($name)) {\n            if (!$this->definition->hasNegation($name)) {\n                throw new RuntimeException(\\sprintf('The \"--%s\" option does not exist.', $name));\n            }\n\n            $optionName = $this->definition->negationToName($name);\n            if (null !== $value) {\n                throw new RuntimeException(\\sprintf('The \"--%s\" option does not accept a value.', $name));\n            }\n            $this->options[$optionName] = false;\n\n            return;\n        }\n\n        $option = $this->definition->getOption($name);\n\n        if (null !== $value && !$option->acceptValue()) {\n            throw new RuntimeException(\\sprintf('The \"--%s\" option does not accept a value.', $name));\n        }\n\n        if (\\in_array($value, ['', null], true) && $option->acceptValue() && $this->parsed) {\n            // if option accepts an optional or mandatory argument\n            // let's see if there is one provided\n            $next = array_shift($this->parsed);\n            if ((isset($next[0]) && '-' !== $next[0]) || \\in_array($next, ['', null], true)) {\n                $value = $next;\n            } else {\n                array_unshift($this->parsed, $next);\n            }\n        }\n\n        if (null === $value) {\n            if ($option->isValueRequired()) {\n                throw new RuntimeException(\\sprintf('The \"--%s\" option requires a value.', $name));\n            }\n\n            if (!$option->isArray() && !$option->isValueOptional()) {\n                $value = true;\n            }\n        }\n\n        if ($option->isArray()) {\n            $this->options[$name][] = $value;\n        } else {\n            $this->options[$name] = $value;\n        }\n    }\n\n    public function getFirstArgument(): ?string\n    {\n        $isOption = false;\n        foreach ($this->tokens as $i => $token) {\n            if ($token && '-' === $token[0]) {\n                if (str_contains($token, '=') || !isset($this->tokens[$i + 1])) {\n                    continue;\n                }\n\n                // If it's a long option, consider that everything after \"--\" is the option name.\n                // Otherwise, use the last char (if it's a short option set, only the last one can take a value with space separator)\n                $name = '-' === $token[1] ? substr($token, 2) : substr($token, -1);\n                if (!isset($this->options[$name]) && !$this->definition->hasShortcut($name)) {\n                    // noop\n                } elseif ((isset($this->options[$name]) || isset($this->options[$name = $this->definition->shortcutToName($name)])) && $this->tokens[$i + 1] === $this->options[$name]) {\n                    $isOption = true;\n                }\n\n                continue;\n            }\n\n            if ($isOption) {\n                $isOption = false;\n                continue;\n            }\n\n            return $token;\n        }\n\n        return null;\n    }\n\n    public function hasParameterOption(string|array $values, bool $onlyParams = false): bool\n    {\n        $values = (array) $values;\n\n        foreach ($this->tokens as $token) {\n            if ($onlyParams && '--' === $token) {\n                return false;\n            }\n            foreach ($values as $value) {\n                // Options with values:\n                //   For long options, test for '--option=' at beginning\n                //   For short options, test for '-o' at beginning\n                $leading = str_starts_with($value, '--') ? $value.'=' : $value;\n                if ($token === $value || '' !== $leading && str_starts_with($token, $leading)) {\n                    return true;\n                }\n            }\n        }\n\n        return false;\n    }\n\n    public function getParameterOption(string|array $values, string|bool|int|float|array|null $default = false, bool $onlyParams = false): mixed\n    {\n        $values = (array) $values;\n        $tokens = $this->tokens;\n\n        while ($tokens) {\n            $token = array_shift($tokens);\n            if ($onlyParams && '--' === $token) {\n                return $default;\n            }\n\n            foreach ($values as $value) {\n                if ($token === $value) {\n                    return array_shift($tokens);\n                }\n                // Options with values:\n                //   For long options, test for '--option=' at beginning\n                //   For short options, test for '-o' at beginning\n                $leading = str_starts_with($value, '--') ? $value.'=' : $value;\n                if ('' !== $leading && str_starts_with($token, $leading)) {\n                    return substr($token, \\strlen($leading));\n                }\n            }\n        }\n\n        return $default;\n    }\n\n    /**\n     * Returns un-parsed and not validated tokens.\n     *\n     * @param bool $strip Whether to return the raw parameters (false) or the values after the command name (true)\n     *\n     * @return list<string>\n     */\n    public function getRawTokens(bool $strip = false): array\n    {\n        if (!$strip) {\n            return $this->tokens;\n        }\n\n        $parameters = [];\n        $keep = false;\n        foreach ($this->tokens as $value) {\n            if (!$keep && $value === $this->getFirstArgument()) {\n                $keep = true;\n\n                continue;\n            }\n            if ($keep) {\n                $parameters[] = $value;\n            }\n        }\n\n        return $parameters;\n    }\n\n    /**\n     * Returns a stringified representation of the args passed to the command.\n     */\n    public function __toString(): string\n    {\n        $tokens = array_map(function ($token) {\n            if (preg_match('{^(-[^=]+=)(.+)}', $token, $match)) {\n                return $match[1].$this->escapeToken($match[2]);\n            }\n\n            if ($token && '-' !== $token[0]) {\n                return $this->escapeToken($token);\n            }\n\n            return $token;\n        }, $this->tokens);\n\n        return implode(' ', $tokens);\n    }\n}\n","vendor/symfony/console/Input/ArrayInput.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Input;\n\nuse Symfony\\Component\\Console\\Exception\\InvalidArgumentException;\nuse Symfony\\Component\\Console\\Exception\\InvalidOptionException;\n\n/**\n * ArrayInput represents an input provided as an array.\n *\n * Usage:\n *\n *     $input = new ArrayInput(['command' => 'foo:bar', 'foo' => 'bar', '--bar' => 'foobar']);\n *\n * @author Fabien Potencier <fabien@symfony.com>\n */\nclass ArrayInput extends Input\n{\n    public function __construct(\n        private array $parameters,\n        ?InputDefinition $definition = null,\n    ) {\n        parent::__construct($definition);\n    }\n\n    public function getFirstArgument(): ?string\n    {\n        foreach ($this->parameters as $param => $value) {\n            if ($param && \\is_string($param) && '-' === $param[0]) {\n                continue;\n            }\n\n            return $value;\n        }\n\n        return null;\n    }\n\n    public function hasParameterOption(string|array $values, bool $onlyParams = false): bool\n    {\n        $values = (array) $values;\n\n        foreach ($this->parameters as $k => $v) {\n            if (!\\is_int($k)) {\n                $v = $k;\n            }\n\n            if ($onlyParams && '--' === $v) {\n                return false;\n            }\n\n            if (\\in_array($v, $values)) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n\n    public function getParameterOption(string|array $values, string|bool|int|float|array|null $default = false, bool $onlyParams = false): mixed\n    {\n        $values = (array) $values;\n\n        foreach ($this->parameters as $k => $v) {\n            if ($onlyParams && ('--' === $k || (\\is_int($k) && '--' === $v))) {\n                return $default;\n            }\n\n            if (\\is_int($k)) {\n                if (\\in_array($v, $values)) {\n                    return true;\n                }\n            } elseif (\\in_array($k, $values)) {\n                return $v;\n            }\n        }\n\n        return $default;\n    }\n\n    /**\n     * Returns a stringified representation of the args passed to the command.\n     */\n    public function __toString(): string\n    {\n        $params = [];\n        foreach ($this->parameters as $param => $val) {\n            if ($param && \\is_string($param) && '-' === $param[0]) {\n                $glue = ('-' === $param[1]) ? '=' : ' ';\n                if (\\is_array($val)) {\n                    foreach ($val as $v) {\n                        $params[] = $param.('' != $v ? $glue.$this->escapeToken($v) : '');\n                    }\n                } else {\n                    $params[] = $param.('' != $val ? $glue.$this->escapeToken($val) : '');\n                }\n            } else {\n                $params[] = \\is_array($val) ? implode(' ', array_map($this->escapeToken(...), $val)) : $this->escapeToken($val);\n            }\n        }\n\n        return implode(' ', $params);\n    }\n\n    protected function parse(): void\n    {\n        foreach ($this->parameters as $key => $value) {\n            if ('--' === $key) {\n                return;\n            }\n            if (str_starts_with($key, '--')) {\n                $this->addLongOption(substr($key, 2), $value);\n            } elseif (str_starts_with($key, '-')) {\n                $this->addShortOption(substr($key, 1), $value);\n            } else {\n                $this->addArgument($key, $value);\n            }\n        }\n    }\n\n    /**\n     * Adds a short option value.\n     *\n     * @throws InvalidOptionException When option given doesn't exist\n     */\n    private function addShortOption(string $shortcut, mixed $value): void\n    {\n        if (!$this->definition->hasShortcut($shortcut)) {\n            throw new InvalidOptionException(\\sprintf('The \"-%s\" option does not exist.', $shortcut));\n        }\n\n        $this->addLongOption($this->definition->getOptionForShortcut($shortcut)->getName(), $value);\n    }\n\n    /**\n     * Adds a long option value.\n     *\n     * @throws InvalidOptionException When option given doesn't exist\n     * @throws InvalidOptionException When a required value is missing\n     */\n    private function addLongOption(string $name, mixed $value): void\n    {\n        if (!$this->definition->hasOption($name)) {\n            if (!$this->definition->hasNegation($name)) {\n                throw new InvalidOptionException(\\sprintf('The \"--%s\" option does not exist.', $name));\n            }\n\n            $optionName = $this->definition->negationToName($name);\n            $this->options[$optionName] = false;\n\n            return;\n        }\n\n        $option = $this->definition->getOption($name);\n\n        if (null === $value) {\n            if ($option->isValueRequired()) {\n                throw new InvalidOptionException(\\sprintf('The \"--%s\" option requires a value.', $name));\n            }\n\n            if (!$option->isValueOptional()) {\n                $value = true;\n            }\n        }\n\n        $this->options[$name] = $value;\n    }\n\n    /**\n     * Adds an argument value.\n     *\n     * @throws InvalidArgumentException When argument given doesn't exist\n     */\n    private function addArgument(string|int $name, mixed $value): void\n    {\n        if (!$this->definition->hasArgument($name)) {\n            throw new InvalidArgumentException(\\sprintf('The \"%s\" argument does not exist.', $name));\n        }\n\n        $this->arguments[$name] = $value;\n    }\n}\n","vendor/symfony/console/Input/Input.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Input;\n\nuse Symfony\\Component\\Console\\Exception\\InvalidArgumentException;\nuse Symfony\\Component\\Console\\Exception\\RuntimeException;\n\n/**\n * Input is the base class for all concrete Input classes.\n *\n * Three concrete classes are provided by default:\n *\n *  * `ArgvInput`: The input comes from the CLI arguments (argv)\n *  * `StringInput`: The input is provided as a string\n *  * `ArrayInput`: The input is provided as an array\n *\n * @author Fabien Potencier <fabien@symfony.com>\n */\nabstract class Input implements InputInterface, StreamableInputInterface\n{\n    protected InputDefinition $definition;\n    /** @var resource */\n    protected $stream;\n    protected array $options = [];\n    protected array $arguments = [];\n    protected bool $interactive = true;\n\n    public function __construct(?InputDefinition $definition = null)\n    {\n        if (null === $definition) {\n            $this->definition = new InputDefinition();\n        } else {\n            $this->bind($definition);\n            $this->validate();\n        }\n    }\n\n    public function bind(InputDefinition $definition): void\n    {\n        $this->arguments = [];\n        $this->options = [];\n        $this->definition = $definition;\n\n        $this->parse();\n    }\n\n    /**\n     * Processes command line arguments.\n     */\n    abstract protected function parse(): void;\n\n    public function validate(): void\n    {\n        $definition = $this->definition;\n        $givenArguments = $this->arguments;\n\n        $missingArguments = array_filter(array_keys($definition->getArguments()), static fn ($argument) => !\\array_key_exists($argument, $givenArguments) && $definition->getArgument($argument)->isRequired());\n\n        if ($missingArguments) {\n            throw new RuntimeException(\\sprintf('Not enough arguments (missing: \"%s\").', implode(', ', $missingArguments)));\n        }\n    }\n\n    public function isInteractive(): bool\n    {\n        return $this->interactive;\n    }\n\n    public function setInteractive(bool $interactive): void\n    {\n        $this->interactive = $interactive;\n    }\n\n    public function getArguments(): array\n    {\n        return array_merge($this->definition->getArgumentDefaults(), $this->arguments);\n    }\n\n    public function getArgument(string $name): mixed\n    {\n        if (!$this->definition->hasArgument($name)) {\n            throw new InvalidArgumentException(\\sprintf('The \"%s\" argument does not exist.', $name));\n        }\n\n        return $this->arguments[$name] ?? $this->definition->getArgument($name)->getDefault();\n    }\n\n    public function setArgument(string $name, mixed $value): void\n    {\n        if (!$this->definition->hasArgument($name)) {\n            throw new InvalidArgumentException(\\sprintf('The \"%s\" argument does not exist.', $name));\n        }\n\n        $this->arguments[$name] = $value;\n    }\n\n    public function hasArgument(string $name): bool\n    {\n        return $this->definition->hasArgument($name);\n    }\n\n    public function getOptions(): array\n    {\n        return array_merge($this->definition->getOptionDefaults(), $this->options);\n    }\n\n    public function getOption(string $name): mixed\n    {\n        if ($this->definition->hasNegation($name)) {\n            if (null === $value = $this->getOption($this->definition->negationToName($name))) {\n                return $value;\n            }\n\n            return !$value;\n        }\n\n        if (!$this->definition->hasOption($name)) {\n            throw new InvalidArgumentException(\\sprintf('The \"%s\" option does not exist.', $name));\n        }\n\n        return \\array_key_exists($name, $this->options) ? $this->options[$name] : $this->definition->getOption($name)->getDefault();\n    }\n\n    public function setOption(string $name, mixed $value): void\n    {\n        if ($this->definition->hasNegation($name)) {\n            $this->options[$this->definition->negationToName($name)] = !$value;\n\n            return;\n        } elseif (!$this->definition->hasOption($name)) {\n            throw new InvalidArgumentException(\\sprintf('The \"%s\" option does not exist.', $name));\n        }\n\n        $this->options[$name] = $value;\n    }\n\n    public function hasOption(string $name): bool\n    {\n        return $this->definition->hasOption($name) || $this->definition->hasNegation($name);\n    }\n\n    /**\n     * Escapes a token through escapeshellarg if it contains unsafe chars.\n     */\n    public function escapeToken(string $token): string\n    {\n        return preg_match('{^[\\w-]+$}', $token) ? $token : escapeshellarg($token);\n    }\n\n    /**\n     * @param resource $stream\n     */\n    public function setStream($stream): void\n    {\n        $this->stream = $stream;\n    }\n\n    /**\n     * @return resource\n     */\n    public function getStream()\n    {\n        return $this->stream;\n    }\n}\n","vendor/symfony/console/Input/InputArgument.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Input;\n\nuse Symfony\\Component\\Console\\Command\\Command;\nuse Symfony\\Component\\Console\\Completion\\CompletionInput;\nuse Symfony\\Component\\Console\\Completion\\CompletionSuggestions;\nuse Symfony\\Component\\Console\\Completion\\Suggestion;\nuse Symfony\\Component\\Console\\Exception\\InvalidArgumentException;\nuse Symfony\\Component\\Console\\Exception\\LogicException;\n\n/**\n * Represents a command line argument.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n */\nclass InputArgument\n{\n    /**\n     * Providing an argument is required (e.g. just 'app:foo' is not allowed).\n     */\n    public const REQUIRED = 1;\n\n    /**\n     * Providing an argument is optional (e.g. 'app:foo' and 'app:foo bar' are both allowed). This is the default behavior of arguments.\n     */\n    public const OPTIONAL = 2;\n\n    /**\n     * The argument accepts multiple values and turn them into an array (e.g. 'app:foo bar baz' will result in value ['bar', 'baz']).\n     */\n    public const IS_ARRAY = 4;\n\n    private int $mode;\n    private string|int|bool|array|float|null $default;\n\n    /**\n     * @param string                                                                        $name            The argument name\n     * @param int-mask-of<InputArgument::*>|null                                            $mode            The argument mode: a bit mask of self::REQUIRED, self::OPTIONAL and self::IS_ARRAY\n     * @param string                                                                        $description     A description text\n     * @param string|bool|int|float|array|null                                              $default         The default value (for self::OPTIONAL mode only)\n     * @param array|\\Closure(CompletionInput,CompletionSuggestions):list<string|Suggestion> $suggestedValues The values used for input completion\n     *\n     * @throws InvalidArgumentException When argument mode is not valid\n     */\n    public function __construct(\n        private string $name,\n        ?int $mode = null,\n        private string $description = '',\n        string|bool|int|float|array|null $default = null,\n        private \\Closure|array $suggestedValues = [],\n    ) {\n        if (null === $mode) {\n            $mode = self::OPTIONAL;\n        } elseif ($mode >= (self::IS_ARRAY << 1) || $mode < 1) {\n            throw new InvalidArgumentException(\\sprintf('Argument mode \"%s\" is not valid.', $mode));\n        }\n\n        $this->mode = $mode;\n\n        $this->setDefault($default);\n    }\n\n    /**\n     * Returns the argument name.\n     */\n    public function getName(): string\n    {\n        return $this->name;\n    }\n\n    /**\n     * Returns true if the argument is required.\n     *\n     * @return bool true if parameter mode is self::REQUIRED, false otherwise\n     */\n    public function isRequired(): bool\n    {\n        return self::REQUIRED === (self::REQUIRED & $this->mode);\n    }\n\n    /**\n     * Returns true if the argument can take multiple values.\n     *\n     * @return bool true if mode is self::IS_ARRAY, false otherwise\n     */\n    public function isArray(): bool\n    {\n        return self::IS_ARRAY === (self::IS_ARRAY & $this->mode);\n    }\n\n    /**\n     * Sets the default value.\n     */\n    public function setDefault(string|bool|int|float|array|null $default): void\n    {\n        if ($this->isRequired() && null !== $default) {\n            throw new LogicException('Cannot set a default value except for InputArgument::OPTIONAL mode.');\n        }\n\n        if ($this->isArray()) {\n            if (null === $default) {\n                $default = [];\n            } elseif (!\\is_array($default)) {\n                throw new LogicException('A default value for an array argument must be an array.');\n            }\n        }\n\n        $this->default = $default;\n    }\n\n    /**\n     * Returns the default value.\n     */\n    public function getDefault(): string|bool|int|float|array|null\n    {\n        return $this->default;\n    }\n\n    /**\n     * Returns true if the argument has values for input completion.\n     */\n    public function hasCompletion(): bool\n    {\n        return [] !== $this->suggestedValues;\n    }\n\n    /**\n     * Supplies suggestions when command resolves possible completion options for input.\n     *\n     * @see Command::complete()\n     */\n    public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void\n    {\n        $values = $this->suggestedValues;\n        if ($values instanceof \\Closure && !\\is_array($values = $values($input))) {\n            throw new LogicException(\\sprintf('Closure for argument \"%s\" must return an array. Got \"%s\".', $this->name, get_debug_type($values)));\n        }\n        if ($values) {\n            $suggestions->suggestValues($values);\n        }\n    }\n\n    /**\n     * Returns the description text.\n     */\n    public function getDescription(): string\n    {\n        return $this->description;\n    }\n}\n","vendor/symfony/console/Input/InputAwareInterface.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Input;\n\n/**\n * InputAwareInterface should be implemented by classes that depends on the\n * Console Input.\n *\n * @author Wouter J <waldio.webdesign@gmail.com>\n */\ninterface InputAwareInterface\n{\n    /**\n     * Sets the Console Input.\n     */\n    public function setInput(InputInterface $input): void;\n}\n","vendor/symfony/console/Input/InputDefinition.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Input;\n\nuse Symfony\\Component\\Console\\Exception\\InvalidArgumentException;\nuse Symfony\\Component\\Console\\Exception\\LogicException;\n\n/**\n * A InputDefinition represents a set of valid command line arguments and options.\n *\n * Usage:\n *\n *     $definition = new InputDefinition([\n *         new InputArgument('name', InputArgument::REQUIRED),\n *         new InputOption('foo', 'f', InputOption::VALUE_REQUIRED),\n *     ]);\n *\n * @author Fabien Potencier <fabien@symfony.com>\n */\nclass InputDefinition\n{\n    private array $arguments = [];\n    private int $requiredCount = 0;\n    private ?InputArgument $lastArrayArgument = null;\n    private ?InputArgument $lastOptionalArgument = null;\n    private array $options = [];\n    private array $negations = [];\n    private array $shortcuts = [];\n\n    /**\n     * @param array $definition An array of InputArgument and InputOption instance\n     */\n    public function __construct(array $definition = [])\n    {\n        $this->setDefinition($definition);\n    }\n\n    /**\n     * Sets the definition of the input.\n     */\n    public function setDefinition(array $definition): void\n    {\n        $arguments = [];\n        $options = [];\n        foreach ($definition as $item) {\n            if ($item instanceof InputOption) {\n                $options[] = $item;\n            } else {\n                $arguments[] = $item;\n            }\n        }\n\n        $this->setArguments($arguments);\n        $this->setOptions($options);\n    }\n\n    /**\n     * Sets the InputArgument objects.\n     *\n     * @param InputArgument[] $arguments An array of InputArgument objects\n     */\n    public function setArguments(array $arguments = []): void\n    {\n        $this->arguments = [];\n        $this->requiredCount = 0;\n        $this->lastOptionalArgument = null;\n        $this->lastArrayArgument = null;\n        $this->addArguments($arguments);\n    }\n\n    /**\n     * Adds an array of InputArgument objects.\n     *\n     * @param InputArgument[] $arguments An array of InputArgument objects\n     */\n    public function addArguments(?array $arguments = []): void\n    {\n        if (null !== $arguments) {\n            foreach ($arguments as $argument) {\n                $this->addArgument($argument);\n            }\n        }\n    }\n\n    /**\n     * @throws LogicException When incorrect argument is given\n     */\n    public function addArgument(InputArgument $argument): void\n    {\n        if (isset($this->arguments[$argument->getName()])) {\n            throw new LogicException(\\sprintf('An argument with name \"%s\" already exists.', $argument->getName()));\n        }\n\n        if (null !== $this->lastArrayArgument) {\n            throw new LogicException(\\sprintf('Cannot add a required argument \"%s\" after an array argument \"%s\".', $argument->getName(), $this->lastArrayArgument->getName()));\n        }\n\n        if ($argument->isRequired() && null !== $this->lastOptionalArgument) {\n            throw new LogicException(\\sprintf('Cannot add a required argument \"%s\" after an optional one \"%s\".', $argument->getName(), $this->lastOptionalArgument->getName()));\n        }\n\n        if ($argument->isArray()) {\n            $this->lastArrayArgument = $argument;\n        }\n\n        if ($argument->isRequired()) {\n            ++$this->requiredCount;\n        } else {\n            $this->lastOptionalArgument = $argument;\n        }\n\n        $this->arguments[$argument->getName()] = $argument;\n    }\n\n    /**\n     * Returns an InputArgument by name or by position.\n     *\n     * @throws InvalidArgumentException When argument given doesn't exist\n     */\n    public function getArgument(string|int $name): InputArgument\n    {\n        if (!$this->hasArgument($name)) {\n            throw new InvalidArgumentException(\\sprintf('The \"%s\" argument does not exist.', $name));\n        }\n\n        $arguments = \\is_int($name) ? array_values($this->arguments) : $this->arguments;\n\n        return $arguments[$name];\n    }\n\n    /**\n     * Returns true if an InputArgument object exists by name or position.\n     */\n    public function hasArgument(string|int $name): bool\n    {\n        $arguments = \\is_int($name) ? array_values($this->arguments) : $this->arguments;\n\n        return isset($arguments[$name]);\n    }\n\n    /**\n     * Gets the array of InputArgument objects.\n     *\n     * @return InputArgument[]\n     */\n    public function getArguments(): array\n    {\n        return $this->arguments;\n    }\n\n    /**\n     * Returns the number of InputArguments.\n     */\n    public function getArgumentCount(): int\n    {\n        return null !== $this->lastArrayArgument ? \\PHP_INT_MAX : \\count($this->arguments);\n    }\n\n    /**\n     * Returns the number of required InputArguments.\n     */\n    public function getArgumentRequiredCount(): int\n    {\n        return $this->requiredCount;\n    }\n\n    /**\n     * @return array<string|bool|int|float|array|null>\n     */\n    public function getArgumentDefaults(): array\n    {\n        $values = [];\n        foreach ($this->arguments as $argument) {\n            $values[$argument->getName()] = $argument->getDefault();\n        }\n\n        return $values;\n    }\n\n    /**\n     * Sets the InputOption objects.\n     *\n     * @param InputOption[] $options An array of InputOption objects\n     */\n    public function setOptions(array $options = []): void\n    {\n        $this->options = [];\n        $this->shortcuts = [];\n        $this->negations = [];\n        $this->addOptions($options);\n    }\n\n    /**\n     * Adds an array of InputOption objects.\n     *\n     * @param InputOption[] $options An array of InputOption objects\n     */\n    public function addOptions(array $options = []): void\n    {\n        foreach ($options as $option) {\n            $this->addOption($option);\n        }\n    }\n\n    /**\n     * @throws LogicException When option given already exist\n     */\n    public function addOption(InputOption $option): void\n    {\n        if (isset($this->options[$option->getName()]) && !$option->equals($this->options[$option->getName()])) {\n            throw new LogicException(\\sprintf('An option named \"%s\" already exists.', $option->getName()));\n        }\n        if (isset($this->negations[$option->getName()])) {\n            throw new LogicException(\\sprintf('An option named \"%s\" already exists.', $option->getName()));\n        }\n\n        if ($option->getShortcut()) {\n            foreach (explode('|', $option->getShortcut()) as $shortcut) {\n                if (isset($this->shortcuts[$shortcut]) && !$option->equals($this->options[$this->shortcuts[$shortcut]])) {\n                    throw new LogicException(\\sprintf('An option with shortcut \"%s\" already exists.', $shortcut));\n                }\n            }\n        }\n\n        $this->options[$option->getName()] = $option;\n        if ($option->getShortcut()) {\n            foreach (explode('|', $option->getShortcut()) as $shortcut) {\n                $this->shortcuts[$shortcut] = $option->getName();\n            }\n        }\n\n        if ($option->isNegatable()) {\n            $negatedName = 'no-'.$option->getName();\n            if (isset($this->options[$negatedName])) {\n                throw new LogicException(\\sprintf('An option named \"%s\" already exists.', $negatedName));\n            }\n            $this->negations[$negatedName] = $option->getName();\n        }\n    }\n\n    /**\n     * Returns an InputOption by name.\n     *\n     * @throws InvalidArgumentException When option given doesn't exist\n     */\n    public function getOption(string $name): InputOption\n    {\n        if (!$this->hasOption($name)) {\n            throw new InvalidArgumentException(\\sprintf('The \"--%s\" option does not exist.', $name));\n        }\n\n        return $this->options[$name];\n    }\n\n    /**\n     * Returns true if an InputOption object exists by name.\n     *\n     * This method can't be used to check if the user included the option when\n     * executing the command (use getOption() instead).\n     */\n    public function hasOption(string $name): bool\n    {\n        return isset($this->options[$name]);\n    }\n\n    /**\n     * Gets the array of InputOption objects.\n     *\n     * @return InputOption[]\n     */\n    public function getOptions(): array\n    {\n        return $this->options;\n    }\n\n    /**\n     * Returns true if an InputOption object exists by shortcut.\n     */\n    public function hasShortcut(string $name): bool\n    {\n        return isset($this->shortcuts[$name]);\n    }\n\n    /**\n     * Returns true if an InputOption object exists by negated name.\n     */\n    public function hasNegation(string $name): bool\n    {\n        return isset($this->negations[$name]);\n    }\n\n    /**\n     * Gets an InputOption by shortcut.\n     */\n    public function getOptionForShortcut(string $shortcut): InputOption\n    {\n        return $this->getOption($this->shortcutToName($shortcut));\n    }\n\n    /**\n     * @return array<string|bool|int|float|array|null>\n     */\n    public function getOptionDefaults(): array\n    {\n        $values = [];\n        foreach ($this->options as $option) {\n            $values[$option->getName()] = $option->getDefault();\n        }\n\n        return $values;\n    }\n\n    /**\n     * Returns the InputOption name given a shortcut.\n     *\n     * @throws InvalidArgumentException When option given does not exist\n     *\n     * @internal\n     */\n    public function shortcutToName(string $shortcut): string\n    {\n        if (!isset($this->shortcuts[$shortcut])) {\n            throw new InvalidArgumentException(\\sprintf('The \"-%s\" option does not exist.', $shortcut));\n        }\n\n        return $this->shortcuts[$shortcut];\n    }\n\n    /**\n     * Returns the InputOption name given a negation.\n     *\n     * @throws InvalidArgumentException When option given does not exist\n     *\n     * @internal\n     */\n    public function negationToName(string $negation): string\n    {\n        if (!isset($this->negations[$negation])) {\n            throw new InvalidArgumentException(\\sprintf('The \"--%s\" option does not exist.', $negation));\n        }\n\n        return $this->negations[$negation];\n    }\n\n    /**\n     * Gets the synopsis.\n     */\n    public function getSynopsis(bool $short = false): string\n    {\n        $elements = [];\n\n        if ($short && $this->getOptions()) {\n            $elements[] = '[options]';\n        } elseif (!$short) {\n            foreach ($this->getOptions() as $option) {\n                $value = '';\n                if ($option->acceptValue()) {\n                    $value = \\sprintf(\n                        ' %s%s%s',\n                        $option->isValueOptional() ? '[' : '',\n                        strtoupper($option->getName()),\n                        $option->isValueOptional() ? ']' : ''\n                    );\n                }\n\n                $shortcut = $option->getShortcut() ? \\sprintf('-%s|', $option->getShortcut()) : '';\n                $negation = $option->isNegatable() ? \\sprintf('|--no-%s', $option->getName()) : '';\n                $elements[] = \\sprintf('[%s--%s%s%s]', $shortcut, $option->getName(), $value, $negation);\n            }\n        }\n\n        if ($elements && $this->getArguments()) {\n            $elements[] = '[--]';\n        }\n\n        $tail = '';\n        foreach ($this->getArguments() as $argument) {\n            $element = '<'.$argument->getName().'>';\n            if ($argument->isArray()) {\n                $element .= '...';\n            }\n\n            if (!$argument->isRequired()) {\n                $element = '['.$element;\n                $tail .= ']';\n            }\n\n            $elements[] = $element;\n        }\n\n        return implode(' ', $elements).$tail;\n    }\n}\n","vendor/symfony/console/Input/InputInterface.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Input;\n\nuse Symfony\\Component\\Console\\Exception\\InvalidArgumentException;\nuse Symfony\\Component\\Console\\Exception\\RuntimeException;\n\n/**\n * InputInterface is the interface implemented by all input classes.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n */\ninterface InputInterface\n{\n    /**\n     * Returns the first argument from the raw parameters (not parsed).\n     */\n    public function getFirstArgument(): ?string;\n\n    /**\n     * Returns true if the raw parameters (not parsed) contain a value.\n     *\n     * This method is to be used to introspect the input parameters\n     * before they have been validated. It must be used carefully.\n     * Does not necessarily return the correct result for short options\n     * when multiple flags are combined in the same option.\n     *\n     * @param string|array $values     The values to look for in the raw parameters (can be an array)\n     * @param bool         $onlyParams Only check real parameters, skip those following an end of options (--) signal\n     */\n    public function hasParameterOption(string|array $values, bool $onlyParams = false): bool;\n\n    /**\n     * Returns the value of a raw option (not parsed).\n     *\n     * This method is to be used to introspect the input parameters\n     * before they have been validated. It must be used carefully.\n     * Does not necessarily return the correct result for short options\n     * when multiple flags are combined in the same option.\n     *\n     * @param string|array                     $values     The value(s) to look for in the raw parameters (can be an array)\n     * @param string|bool|int|float|array|null $default    The default value to return if no result is found\n     * @param bool                             $onlyParams Only check real parameters, skip those following an end of options (--) signal\n     */\n    public function getParameterOption(string|array $values, string|bool|int|float|array|null $default = false, bool $onlyParams = false): mixed;\n\n    /**\n     * Binds the current Input instance with the given arguments and options.\n     *\n     * @throws RuntimeException\n     */\n    public function bind(InputDefinition $definition): void;\n\n    /**\n     * Validates the input.\n     *\n     * @throws RuntimeException When not enough arguments are given\n     */\n    public function validate(): void;\n\n    /**\n     * Returns all the given arguments merged with the default values.\n     *\n     * @return array<string|bool|int|float|array|null>\n     */\n    public function getArguments(): array;\n\n    /**\n     * Returns the argument value for a given argument name.\n     *\n     * @throws InvalidArgumentException When argument given doesn't exist\n     */\n    public function getArgument(string $name): mixed;\n\n    /**\n     * Sets an argument value by name.\n     *\n     * @throws InvalidArgumentException When argument given doesn't exist\n     */\n    public function setArgument(string $name, mixed $value): void;\n\n    /**\n     * Returns true if an InputArgument object exists by name or position.\n     */\n    public function hasArgument(string $name): bool;\n\n    /**\n     * Returns all the given options merged with the default values.\n     *\n     * @return array<string|bool|int|float|array|null>\n     */\n    public function getOptions(): array;\n\n    /**\n     * Returns the option value for a given option name.\n     *\n     * @throws InvalidArgumentException When option given doesn't exist\n     */\n    public function getOption(string $name): mixed;\n\n    /**\n     * Sets an option value by name.\n     *\n     * @throws InvalidArgumentException When option given doesn't exist\n     */\n    public function setOption(string $name, mixed $value): void;\n\n    /**\n     * Returns true if an InputOption object exists by name.\n     */\n    public function hasOption(string $name): bool;\n\n    /**\n     * Is this input means interactive?\n     */\n    public function isInteractive(): bool;\n\n    /**\n     * Sets the input interactivity.\n     */\n    public function setInteractive(bool $interactive): void;\n\n    /**\n     * Returns a stringified representation of the args passed to the command.\n     *\n     * InputArguments MUST be escaped as well as the InputOption values passed to the command.\n     */\n    public function __toString(): string;\n}\n","vendor/symfony/console/Input/InputOption.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Input;\n\nuse Symfony\\Component\\Console\\Command\\Command;\nuse Symfony\\Component\\Console\\Completion\\CompletionInput;\nuse Symfony\\Component\\Console\\Completion\\CompletionSuggestions;\nuse Symfony\\Component\\Console\\Completion\\Suggestion;\nuse Symfony\\Component\\Console\\Exception\\InvalidArgumentException;\nuse Symfony\\Component\\Console\\Exception\\LogicException;\n\n/**\n * Represents a command line option.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n */\nclass InputOption\n{\n    /**\n     * Do not accept input for the option (e.g. --yell). This is the default behavior of options.\n     */\n    public const VALUE_NONE = 1;\n\n    /**\n     * A value must be passed when the option is used (e.g. --iterations=5 or -i5).\n     */\n    public const VALUE_REQUIRED = 2;\n\n    /**\n     * The option may or may not have a value (e.g. --yell or --yell=loud).\n     */\n    public const VALUE_OPTIONAL = 4;\n\n    /**\n     * The option accepts multiple values (e.g. --dir=/foo --dir=/bar).\n     */\n    public const VALUE_IS_ARRAY = 8;\n\n    /**\n     * The option allows passing a negated variant (e.g. --ansi or --no-ansi).\n     */\n    public const VALUE_NEGATABLE = 16;\n\n    private string $name;\n    private ?string $shortcut;\n    private int $mode;\n    private string|int|bool|array|float|null $default;\n\n    /**\n     * @param string|array|null                                                             $shortcut        The shortcuts, can be null, a string of shortcuts delimited by | or an array of shortcuts\n     * @param int-mask-of<InputOption::*>|null                                              $mode            The option mode: One of the VALUE_* constants\n     * @param string|bool|int|float|array|null                                              $default         The default value (must be null for self::VALUE_NONE)\n     * @param array|\\Closure(CompletionInput,CompletionSuggestions):list<string|Suggestion> $suggestedValues The values used for input completion\n     *\n     * @throws InvalidArgumentException If option mode is invalid or incompatible\n     */\n    public function __construct(\n        string $name,\n        string|array|null $shortcut = null,\n        ?int $mode = null,\n        private string $description = '',\n        string|bool|int|float|array|null $default = null,\n        private array|\\Closure $suggestedValues = [],\n    ) {\n        if (str_starts_with($name, '--')) {\n            $name = substr($name, 2);\n        }\n\n        if (!$name) {\n            throw new InvalidArgumentException('An option name cannot be empty.');\n        }\n\n        if ('' === $shortcut || [] === $shortcut) {\n            $shortcut = null;\n        }\n\n        if (null !== $shortcut) {\n            if (\\is_array($shortcut)) {\n                $shortcut = implode('|', $shortcut);\n            }\n            $shortcuts = preg_split('{(\\|)-?}', ltrim($shortcut, '-'));\n            $shortcuts = array_filter($shortcuts, 'strlen');\n            $shortcut = implode('|', $shortcuts);\n\n            if ('' === $shortcut) {\n                throw new InvalidArgumentException('An option shortcut cannot be empty.');\n            }\n        }\n\n        if (null === $mode) {\n            $mode = self::VALUE_NONE;\n        } elseif ($mode >= (self::VALUE_NEGATABLE << 1) || $mode < 1) {\n            throw new InvalidArgumentException(\\sprintf('Option mode \"%s\" is not valid.', $mode));\n        }\n\n        $this->name = $name;\n        $this->shortcut = $shortcut;\n        $this->mode = $mode;\n\n        if ($suggestedValues && !$this->acceptValue()) {\n            throw new LogicException('Cannot set suggested values if the option does not accept a value.');\n        }\n        if ($this->isArray() && !$this->acceptValue()) {\n            throw new InvalidArgumentException('Impossible to have an option mode VALUE_IS_ARRAY if the option does not accept a value.');\n        }\n        if ($this->isNegatable() && $this->acceptValue()) {\n            throw new InvalidArgumentException('Impossible to have an option mode VALUE_NEGATABLE if the option also accepts a value.');\n        }\n\n        $this->setDefault($default);\n    }\n\n    /**\n     * Returns the option shortcut.\n     */\n    public function getShortcut(): ?string\n    {\n        return $this->shortcut;\n    }\n\n    /**\n     * Returns the option name.\n     */\n    public function getName(): string\n    {\n        return $this->name;\n    }\n\n    /**\n     * Returns true if the option accepts a value.\n     *\n     * @return bool true if value mode is not self::VALUE_NONE, false otherwise\n     */\n    public function acceptValue(): bool\n    {\n        return $this->isValueRequired() || $this->isValueOptional();\n    }\n\n    /**\n     * Returns true if the option requires a value.\n     *\n     * @return bool true if value mode is self::VALUE_REQUIRED, false otherwise\n     */\n    public function isValueRequired(): bool\n    {\n        return self::VALUE_REQUIRED === (self::VALUE_REQUIRED & $this->mode);\n    }\n\n    /**\n     * Returns true if the option takes an optional value.\n     *\n     * @return bool true if value mode is self::VALUE_OPTIONAL, false otherwise\n     */\n    public function isValueOptional(): bool\n    {\n        return self::VALUE_OPTIONAL === (self::VALUE_OPTIONAL & $this->mode);\n    }\n\n    /**\n     * Returns true if the option can take multiple values.\n     *\n     * @return bool true if mode is self::VALUE_IS_ARRAY, false otherwise\n     */\n    public function isArray(): bool\n    {\n        return self::VALUE_IS_ARRAY === (self::VALUE_IS_ARRAY & $this->mode);\n    }\n\n    /**\n     * Returns true if the option allows passing a negated variant.\n     *\n     * @return bool true if mode is self::VALUE_NEGATABLE, false otherwise\n     */\n    public function isNegatable(): bool\n    {\n        return self::VALUE_NEGATABLE === (self::VALUE_NEGATABLE & $this->mode);\n    }\n\n    /**\n     * Sets the default value.\n     */\n    public function setDefault(string|bool|int|float|array|null $default): void\n    {\n        if (self::VALUE_NONE === (self::VALUE_NONE & $this->mode) && null !== $default) {\n            throw new LogicException('Cannot set a default value when using InputOption::VALUE_NONE mode.');\n        }\n\n        if ($this->isArray()) {\n            if (null === $default) {\n                $default = [];\n            } elseif (!\\is_array($default)) {\n                throw new LogicException('A default value for an array option must be an array.');\n            }\n        }\n\n        $this->default = $this->acceptValue() || $this->isNegatable() ? $default : false;\n    }\n\n    /**\n     * Returns the default value.\n     */\n    public function getDefault(): string|bool|int|float|array|null\n    {\n        return $this->default;\n    }\n\n    /**\n     * Returns the description text.\n     */\n    public function getDescription(): string\n    {\n        return $this->description;\n    }\n\n    /**\n     * Returns true if the option has values for input completion.\n     */\n    public function hasCompletion(): bool\n    {\n        return [] !== $this->suggestedValues;\n    }\n\n    /**\n     * Supplies suggestions when command resolves possible completion options for input.\n     *\n     * @see Command::complete()\n     */\n    public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void\n    {\n        $values = $this->suggestedValues;\n        if ($values instanceof \\Closure && !\\is_array($values = $values($input))) {\n            throw new LogicException(\\sprintf('Closure for option \"%s\" must return an array. Got \"%s\".', $this->name, get_debug_type($values)));\n        }\n        if ($values) {\n            $suggestions->suggestValues($values);\n        }\n    }\n\n    /**\n     * Checks whether the given option equals this one.\n     */\n    public function equals(self $option): bool\n    {\n        return $option->getName() === $this->getName()\n            && $option->getShortcut() === $this->getShortcut()\n            && $option->getDefault() === $this->getDefault()\n            && $option->isNegatable() === $this->isNegatable()\n            && $option->isArray() === $this->isArray()\n            && $option->isValueRequired() === $this->isValueRequired()\n            && $option->isValueOptional() === $this->isValueOptional()\n        ;\n    }\n}\n","vendor/symfony/console/Input/StreamableInputInterface.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Input;\n\n/**\n * StreamableInputInterface is the interface implemented by all input classes\n * that have an input stream.\n *\n * @author Robin Chalas <robin.chalas@gmail.com>\n */\ninterface StreamableInputInterface extends InputInterface\n{\n    /**\n     * Sets the input stream to read from when interacting with the user.\n     *\n     * This is mainly useful for testing purpose.\n     *\n     * @param resource $stream The input stream\n     */\n    public function setStream($stream): void;\n\n    /**\n     * Returns the input stream.\n     *\n     * @return resource|null\n     */\n    public function getStream();\n}\n","vendor/symfony/console/Input/StringInput.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Input;\n\nuse Symfony\\Component\\Console\\Exception\\InvalidArgumentException;\n\n/**\n * StringInput represents an input provided as a string.\n *\n * Usage:\n *\n *     $input = new StringInput('foo --bar=\"foobar\"');\n *\n * @author Fabien Potencier <fabien@symfony.com>\n */\nclass StringInput extends ArgvInput\n{\n    public const REGEX_UNQUOTED_STRING = '([^\\s\\\\\\\\]+?)';\n    public const REGEX_QUOTED_STRING = '(?:\"([^\"\\\\\\\\]*(?:\\\\\\\\.[^\"\\\\\\\\]*)*)\"|\\'([^\\'\\\\\\\\]*(?:\\\\\\\\.[^\\'\\\\\\\\]*)*)\\')';\n\n    /**\n     * @param string $input A string representing the parameters from the CLI\n     */\n    public function __construct(string $input)\n    {\n        parent::__construct([]);\n\n        $this->setTokens($this->tokenize($input));\n    }\n\n    /**\n     * Tokenizes a string.\n     *\n     * @return list<string>\n     *\n     * @throws InvalidArgumentException When unable to parse input (should never happen)\n     */\n    private function tokenize(string $input): array\n    {\n        $tokens = [];\n        $length = \\strlen($input);\n        $cursor = 0;\n        $token = null;\n        while ($cursor < $length) {\n            if ('\\\\' === $input[$cursor]) {\n                $token .= $input[++$cursor] ?? '';\n                ++$cursor;\n                continue;\n            }\n\n            if (preg_match('/\\s+/A', $input, $match, 0, $cursor)) {\n                if (null !== $token) {\n                    $tokens[] = $token;\n                    $token = null;\n                }\n            } elseif (preg_match('/([^=\"\\'\\s]+?)(=?)('.self::REGEX_QUOTED_STRING.'+)/A', $input, $match, 0, $cursor)) {\n                $token .= $match[1].$match[2].stripcslashes(str_replace(['\"\\'', '\\'\"', '\\'\\'', '\"\"'], '', substr($match[3], 1, -1)));\n            } elseif (preg_match('/'.self::REGEX_QUOTED_STRING.'/A', $input, $match, 0, $cursor)) {\n                $token .= stripcslashes(substr($match[0], 1, -1));\n            } elseif (preg_match('/'.self::REGEX_UNQUOTED_STRING.'/A', $input, $match, 0, $cursor)) {\n                $token .= $match[1];\n            } else {\n                // should never happen\n                throw new InvalidArgumentException(\\sprintf('Unable to parse input near \"... %s ...\".', substr($input, $cursor, 10)));\n            }\n\n            $cursor += \\strlen($match[0]);\n        }\n\n        if (null !== $token) {\n            $tokens[] = $token;\n        }\n\n        return $tokens;\n    }\n}\n","vendor/symfony/console/Interaction/Interaction.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Interaction;\n\nuse Symfony\\Component\\Console\\Attribute\\InteractiveAttributeInterface;\nuse Symfony\\Component\\Console\\Attribute\\MapInput;\nuse Symfony\\Component\\Console\\Input\\InputInterface;\nuse Symfony\\Component\\Console\\Output\\OutputInterface;\n\n/**\n * @internal\n */\nfinal class Interaction\n{\n    public function __construct(\n        private readonly object $owner,\n        private readonly InteractiveAttributeInterface $attribute,\n    ) {\n    }\n\n    /**\n     * @param \\Closure(\\ReflectionFunction $function, InputInterface $input, OutputInterface $output): array $parameterResolver\n     */\n    public function interact(InputInterface $input, OutputInterface $output, \\Closure $parameterResolver): void\n    {\n        if ($this->owner instanceof MapInput) {\n            $function = $this->attribute->getFunction($this->owner->resolveValue($input));\n            $function->invoke(...$parameterResolver($function, $input, $output));\n            $this->owner->setValue($input, $function->getClosureThis());\n\n            return;\n        }\n\n        $function = $this->attribute->getFunction($this->owner);\n        $function->invoke(...$args = $parameterResolver($function, $input, $output));\n        foreach ($function->getParameters() as $i => $parameter) {\n            if (\\is_object($args[$i]) && $spec = MapInput::tryFrom($parameter)) {\n                $spec->setValue($input, $args[$i]);\n            }\n        }\n    }\n}\n","vendor/symfony/console/LICENSE":"Copyright (c) 2004-present Fabien Potencier\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is furnished\nto do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n","vendor/symfony/console/Logger/ConsoleLogger.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Logger;\n\nuse Psr\\Log\\AbstractLogger;\nuse Psr\\Log\\InvalidArgumentException;\nuse Psr\\Log\\LogLevel;\nuse Symfony\\Component\\Console\\Output\\ConsoleOutputInterface;\nuse Symfony\\Component\\Console\\Output\\OutputInterface;\n\n/**\n * PSR-3 compliant console logger.\n *\n * @author Kévin Dunglas <dunglas@gmail.com>\n *\n * @see https://www.php-fig.org/psr/psr-3/\n */\nclass ConsoleLogger extends AbstractLogger\n{\n    public const INFO = 'info';\n    public const ERROR = 'error';\n\n    private array $verbosityLevelMap = [\n        LogLevel::EMERGENCY => OutputInterface::VERBOSITY_NORMAL,\n        LogLevel::ALERT => OutputInterface::VERBOSITY_NORMAL,\n        LogLevel::CRITICAL => OutputInterface::VERBOSITY_NORMAL,\n        LogLevel::ERROR => OutputInterface::VERBOSITY_NORMAL,\n        LogLevel::WARNING => OutputInterface::VERBOSITY_NORMAL,\n        LogLevel::NOTICE => OutputInterface::VERBOSITY_VERBOSE,\n        LogLevel::INFO => OutputInterface::VERBOSITY_VERY_VERBOSE,\n        LogLevel::DEBUG => OutputInterface::VERBOSITY_DEBUG,\n    ];\n    private array $formatLevelMap = [\n        LogLevel::EMERGENCY => self::ERROR,\n        LogLevel::ALERT => self::ERROR,\n        LogLevel::CRITICAL => self::ERROR,\n        LogLevel::ERROR => self::ERROR,\n        LogLevel::WARNING => self::INFO,\n        LogLevel::NOTICE => self::INFO,\n        LogLevel::INFO => self::INFO,\n        LogLevel::DEBUG => self::INFO,\n    ];\n    private bool $errored = false;\n\n    public function __construct(\n        private OutputInterface $output,\n        array $verbosityLevelMap = [],\n        array $formatLevelMap = [],\n    ) {\n        $this->verbosityLevelMap = $verbosityLevelMap + $this->verbosityLevelMap;\n        $this->formatLevelMap = $formatLevelMap + $this->formatLevelMap;\n    }\n\n    public function log($level, $message, array $context = []): void\n    {\n        if (!isset($this->verbosityLevelMap[$level])) {\n            throw new InvalidArgumentException(\\sprintf('The log level \"%s\" does not exist.', $level));\n        }\n\n        $output = $this->output;\n\n        // Write to the error output if necessary and available\n        if (self::ERROR === $this->formatLevelMap[$level]) {\n            if ($this->output instanceof ConsoleOutputInterface) {\n                $output = $output->getErrorOutput();\n            }\n            $this->errored = true;\n        }\n\n        // the if condition check isn't necessary -- it's the same one that $output will do internally anyway.\n        // We only do it for efficiency here as the message formatting is relatively expensive.\n        if ($output->getVerbosity() >= $this->verbosityLevelMap[$level]) {\n            $output->writeln(\\sprintf('<%1$s>[%2$s] %3$s</%1$s>', $this->formatLevelMap[$level], $level, $this->interpolate($message, $context)), $this->verbosityLevelMap[$level]);\n        }\n    }\n\n    /**\n     * Returns true when any messages have been logged at error levels.\n     */\n    public function hasErrored(): bool\n    {\n        return $this->errored;\n    }\n\n    /**\n     * Interpolates context values into the message placeholders.\n     *\n     * @author PHP Framework Interoperability Group\n     */\n    private function interpolate(string $message, array $context): string\n    {\n        if (!str_contains($message, '{')) {\n            return $message;\n        }\n\n        $replacements = [];\n        foreach ($context as $key => $val) {\n            if (null === $val || \\is_scalar($val) || $val instanceof \\Stringable) {\n                $replacements[\"{{$key}}\"] = $val;\n            } elseif ($val instanceof \\DateTimeInterface) {\n                $replacements[\"{{$key}}\"] = $val->format(\\DateTimeInterface::RFC3339);\n            } elseif (\\is_object($val)) {\n                $replacements[\"{{$key}}\"] = '[object '.$val::class.']';\n            } else {\n                $replacements[\"{{$key}}\"] = '['.\\gettype($val).']';\n            }\n        }\n\n        return strtr($message, $replacements);\n    }\n}\n","vendor/symfony/console/Messenger/RunCommandContext.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Messenger;\n\n/**\n * @author Kevin Bond <kevinbond@gmail.com>\n */\nfinal class RunCommandContext\n{\n    public function __construct(\n        public readonly RunCommandMessage $message,\n        public readonly int $exitCode,\n        public readonly string $output,\n    ) {\n    }\n}\n","vendor/symfony/console/Messenger/RunCommandMessage.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Messenger;\n\nuse Symfony\\Component\\Console\\Exception\\RunCommandFailedException;\n\n/**\n * @author Kevin Bond <kevinbond@gmail.com>\n */\nclass RunCommandMessage implements \\Stringable\n{\n    /**\n     * @param bool $throwOnFailure  If the command has a non-zero exit code, throw {@see RunCommandFailedException}\n     * @param bool $catchExceptions @see Application::setCatchExceptions()\n     */\n    public function __construct(\n        public readonly string $input,\n        public readonly bool $throwOnFailure = true,\n        public readonly bool $catchExceptions = false,\n    ) {\n    }\n\n    public function __toString(): string\n    {\n        return $this->input;\n    }\n}\n","vendor/symfony/console/Messenger/RunCommandMessageHandler.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Messenger;\n\nuse Symfony\\Component\\Console\\Application;\nuse Symfony\\Component\\Console\\Command\\Command;\nuse Symfony\\Component\\Console\\Exception\\RunCommandFailedException;\nuse Symfony\\Component\\Console\\Input\\StringInput;\nuse Symfony\\Component\\Console\\Output\\BufferedOutput;\nuse Symfony\\Component\\Messenger\\Exception\\RecoverableExceptionInterface;\nuse Symfony\\Component\\Messenger\\Exception\\UnrecoverableExceptionInterface;\n\n/**\n * @author Kevin Bond <kevinbond@gmail.com>\n */\nfinal class RunCommandMessageHandler\n{\n    public function __construct(\n        private readonly Application $application,\n    ) {\n    }\n\n    public function __invoke(RunCommandMessage $message): RunCommandContext\n    {\n        $input = new StringInput($message->input);\n        $output = new BufferedOutput();\n\n        $originalCatchExceptions = $this->application->areExceptionsCaught();\n        $this->application->setCatchExceptions($message->catchExceptions);\n\n        try {\n            $exitCode = $this->application->run($input, $output);\n        } catch (UnrecoverableExceptionInterface|RecoverableExceptionInterface $e) {\n            throw $e;\n        } catch (\\Throwable $e) {\n            throw new RunCommandFailedException($e, new RunCommandContext($message, Command::FAILURE, $output->fetch()));\n        } finally {\n            $this->application->setCatchExceptions($originalCatchExceptions);\n        }\n\n        if ($message->throwOnFailure && Command::SUCCESS !== $exitCode) {\n            throw new RunCommandFailedException(\\sprintf('Command \"%s\" exited with code \"%s\".', $message->input, $exitCode), new RunCommandContext($message, $exitCode, $output->fetch()));\n        }\n\n        return new RunCommandContext($message, $exitCode, $output->fetch());\n    }\n}\n","vendor/symfony/console/Output/AnsiColorMode.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Output;\n\nuse Symfony\\Component\\Console\\Exception\\InvalidArgumentException;\n\n/**\n * @author Fabien Potencier <fabien@symfony.com>\n * @author Julien Boudry <julien@condorcet.vote>\n */\nenum AnsiColorMode\n{\n    /*\n     * Classical 4-bit Ansi colors, including 8 classical colors and 8 bright color. Output syntax is \"ESC[${foreGroundColorcode};${backGroundColorcode}m\"\n     * Must be compatible with all terminals and it's the minimal version supported.\n     */\n    case Ansi4;\n\n    /*\n     * 8-bit Ansi colors (240 different colors + 16 duplicate color codes, ensuring backward compatibility).\n     * Output syntax is: \"ESC[38;5;${foreGroundColorcode};48;5;${backGroundColorcode}m\"\n     * Should be compatible with most terminals.\n     */\n    case Ansi8;\n\n    /*\n     * 24-bit Ansi colors (RGB).\n     * Output syntax is: \"ESC[38;2;${foreGroundColorcodeRed};${foreGroundColorcodeGreen};${foreGroundColorcodeBlue};48;2;${backGroundColorcodeRed};${backGroundColorcodeGreen};${backGroundColorcodeBlue}m\"\n     * May be compatible with many modern terminals.\n     */\n    case Ansi24;\n\n    /**\n     * Converts an RGB hexadecimal color to the corresponding Ansi code.\n     */\n    public function convertFromHexToAnsiColorCode(string $hexColor): string\n    {\n        $hexColor = str_replace('#', '', $hexColor);\n\n        if (3 === \\strlen($hexColor)) {\n            $hexColor = $hexColor[0].$hexColor[0].$hexColor[1].$hexColor[1].$hexColor[2].$hexColor[2];\n        }\n\n        if (6 !== \\strlen($hexColor)) {\n            throw new InvalidArgumentException(\\sprintf('Invalid \"#%s\" color.', $hexColor));\n        }\n\n        $color = hexdec($hexColor);\n\n        $r = ($color >> 16) & 255;\n        $g = ($color >> 8) & 255;\n        $b = $color & 255;\n\n        return match ($this) {\n            self::Ansi4 => (string) $this->convertFromRGB($r, $g, $b),\n            self::Ansi8 => '8;5;'.$this->convertFromRGB($r, $g, $b),\n            self::Ansi24 => \\sprintf('8;2;%d;%d;%d', $r, $g, $b),\n        };\n    }\n\n    private function convertFromRGB(int $r, int $g, int $b): int\n    {\n        return match ($this) {\n            self::Ansi4 => $this->degradeHexColorToAnsi4($r, $g, $b),\n            self::Ansi8 => $this->degradeHexColorToAnsi8($r, $g, $b),\n            default => throw new InvalidArgumentException(\"RGB cannot be converted to {$this->name}.\"),\n        };\n    }\n\n    private function degradeHexColorToAnsi4(int $r, int $g, int $b): int\n    {\n        return round($b / 255) << 2 | (round($g / 255) << 1) | round($r / 255);\n    }\n\n    /**\n     * Inspired from https://github.com/ajalt/colormath/blob/e464e0da1b014976736cf97250063248fc77b8e7/colormath/src/commonMain/kotlin/com/github/ajalt/colormath/model/Ansi256.kt code (MIT license).\n     */\n    private function degradeHexColorToAnsi8(int $r, int $g, int $b): int\n    {\n        if ($r === $g && $g === $b) {\n            if ($r < 8) {\n                return 16;\n            }\n\n            if ($r > 248) {\n                return 231;\n            }\n\n            return (int) round(($r - 8) / 247 * 24) + 232;\n        }\n\n        return 16 +\n            (36 * (int) round($r / 255 * 5)) +\n            (6 * (int) round($g / 255 * 5)) +\n            (int) round($b / 255 * 5);\n    }\n}\n","vendor/symfony/console/Output/BufferedOutput.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Output;\n\n/**\n * @author Jean-François Simon <contact@jfsimon.fr>\n */\nclass BufferedOutput extends Output\n{\n    private string $buffer = '';\n\n    /**\n     * Empties buffer and returns its content.\n     */\n    public function fetch(): string\n    {\n        $content = $this->buffer;\n        $this->buffer = '';\n\n        return $content;\n    }\n\n    protected function doWrite(string $message, bool $newline): void\n    {\n        $this->buffer .= $message;\n\n        if ($newline) {\n            $this->buffer .= \\PHP_EOL;\n        }\n    }\n}\n","vendor/symfony/console/Output/ConsoleOutput.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Output;\n\nuse Symfony\\Component\\Console\\Formatter\\OutputFormatterInterface;\n\n/**\n * ConsoleOutput is the default class for all CLI output. It uses STDOUT and STDERR.\n *\n * This class is a convenient wrapper around `StreamOutput` for both STDOUT and STDERR.\n *\n *     $output = new ConsoleOutput();\n *\n * This is equivalent to:\n *\n *     $output = new StreamOutput(fopen('php://stdout', 'w'));\n *     $stdErr = new StreamOutput(fopen('php://stderr', 'w'));\n *\n * @author Fabien Potencier <fabien@symfony.com>\n */\nclass ConsoleOutput extends StreamOutput implements ConsoleOutputInterface\n{\n    private OutputInterface $stderr;\n    private array $consoleSectionOutputs = [];\n\n    /**\n     * @param int                           $verbosity The verbosity level (one of the VERBOSITY constants in OutputInterface)\n     * @param bool|null                     $decorated Whether to decorate messages (null for auto-guessing)\n     * @param OutputFormatterInterface|null $formatter Output formatter instance (null to use default OutputFormatter)\n     */\n    public function __construct(int $verbosity = self::VERBOSITY_NORMAL, ?bool $decorated = null, ?OutputFormatterInterface $formatter = null)\n    {\n        parent::__construct($this->openOutputStream(), $verbosity, $decorated, $formatter);\n\n        // stderr gets its own formatter: decoration is held by the formatter, so a shared one\n        // would force both streams to the same state instead of detecting each independently\n        $this->stderr = new StreamOutput($this->openErrorStream(), $verbosity, $decorated, $formatter ? clone $formatter : null);\n    }\n\n    /**\n     * Creates a new output section.\n     */\n    public function section(): ConsoleSectionOutput\n    {\n        return new ConsoleSectionOutput($this->getStream(), $this->consoleSectionOutputs, $this->getVerbosity(), $this->isDecorated(), $this->getFormatter());\n    }\n\n    public function setDecorated(bool $decorated): void\n    {\n        parent::setDecorated($decorated);\n        $this->stderr->setDecorated($decorated);\n    }\n\n    public function setFormatter(OutputFormatterInterface $formatter): void\n    {\n        parent::setFormatter($formatter);\n        $this->stderr->setFormatter($formatter);\n    }\n\n    public function setVerbosity(int $level): void\n    {\n        parent::setVerbosity($level);\n        $this->stderr->setVerbosity($level);\n    }\n\n    public function getErrorOutput(): OutputInterface\n    {\n        return $this->stderr;\n    }\n\n    public function setErrorOutput(OutputInterface $error): void\n    {\n        $this->stderr = $error;\n    }\n\n    /**\n     * Returns true if current environment supports writing console output to\n     * STDOUT.\n     */\n    protected function hasStdoutSupport(): bool\n    {\n        return !$this->isRunningOS400();\n    }\n\n    /**\n     * Returns true if current environment supports writing console output to\n     * STDERR.\n     */\n    protected function hasStderrSupport(): bool\n    {\n        return !$this->isRunningOS400();\n    }\n\n    /**\n     * Checks if current executing environment is IBM iSeries (OS400), which\n     * doesn't properly convert character-encodings between ASCII to EBCDIC.\n     */\n    private function isRunningOS400(): bool\n    {\n        $checks = [\n            \\function_exists('php_uname') ? php_uname('s') : '',\n            getenv('OSTYPE'),\n            \\PHP_OS,\n        ];\n\n        return false !== stripos(implode(';', $checks), 'OS400');\n    }\n\n    /**\n     * @return resource\n     */\n    private function openOutputStream()\n    {\n        static $stdout;\n\n        if ($stdout) {\n            return $stdout;\n        }\n\n        if (!$this->hasStdoutSupport()) {\n            return $stdout = fopen('php://output', 'w');\n        }\n\n        // Use STDOUT when possible to prevent from opening too many file descriptors\n        if (!\\defined('STDOUT')) {\n            return $stdout = @fopen('php://stdout', 'w') ?: fopen('php://output', 'w');\n        }\n\n        // On Windows, STDOUT is opened in text mode; reopen in binary mode to prevent \\n to \\r\\n conversion\n        if ('\\\\' === \\DIRECTORY_SEPARATOR) {\n            return $stdout = @fopen('php://stdout', 'w') ?: \\STDOUT;\n        }\n\n        return $stdout = \\STDOUT;\n    }\n\n    /**\n     * @return resource\n     */\n    private function openErrorStream()\n    {\n        static $stderr;\n\n        if ($stderr) {\n            return $stderr;\n        }\n\n        if (!$this->hasStderrSupport()) {\n            return $stderr = fopen('php://output', 'w');\n        }\n\n        // Use STDERR when possible to prevent from opening too many file descriptors\n        if (!\\defined('STDERR')) {\n            return $stderr = @fopen('php://stderr', 'w') ?: fopen('php://output', 'w');\n        }\n\n        // On Windows, STDERR is opened in text mode; reopen in binary mode to prevent \\n → \\r\\n conversion\n        if ('\\\\' === \\DIRECTORY_SEPARATOR) {\n            return $stderr = @fopen('php://stderr', 'w') ?: \\STDERR;\n        }\n\n        return $stderr ??= \\STDERR;\n    }\n}\n","vendor/symfony/console/Output/ConsoleOutputInterface.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Output;\n\n/**\n * ConsoleOutputInterface is the interface implemented by ConsoleOutput class.\n * This adds information about stderr and section output stream.\n *\n * @author Dariusz Górecki <darek.krk@gmail.com>\n */\ninterface ConsoleOutputInterface extends OutputInterface\n{\n    /**\n     * Gets the OutputInterface for errors.\n     */\n    public function getErrorOutput(): OutputInterface;\n\n    public function setErrorOutput(OutputInterface $error): void;\n\n    public function section(): ConsoleSectionOutput;\n}\n","vendor/symfony/console/Output/ConsoleSectionOutput.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Output;\n\nuse Symfony\\Component\\Console\\Formatter\\OutputFormatterInterface;\nuse Symfony\\Component\\Console\\Helper\\Helper;\nuse Symfony\\Component\\Console\\Terminal;\n\n/**\n * @author Pierre du Plessis <pdples@gmail.com>\n * @author Gabriel Ostrolucký <gabriel.ostrolucky@gmail.com>\n */\nclass ConsoleSectionOutput extends StreamOutput\n{\n    private array $content = [];\n    private int $lines = 0;\n    private array $sections;\n    private Terminal $terminal;\n    private int $maxHeight = 0;\n\n    /**\n     * @param resource               $stream\n     * @param ConsoleSectionOutput[] $sections\n     */\n    public function __construct($stream, array &$sections, int $verbosity, bool $decorated, OutputFormatterInterface $formatter)\n    {\n        parent::__construct($stream, $verbosity, $decorated, $formatter);\n        array_unshift($sections, $this);\n        $this->sections = &$sections;\n        $this->terminal = new Terminal();\n    }\n\n    /**\n     * Defines a maximum number of lines for this section.\n     *\n     * When more lines are added, the section will automatically scroll to the\n     * end (i.e. remove the first lines to comply with the max height).\n     */\n    public function setMaxHeight(int $maxHeight): void\n    {\n        // when changing max height, clear output of current section and redraw again with the new height\n        $previousMaxHeight = $this->maxHeight;\n        $this->maxHeight = $maxHeight;\n        $existingContent = $this->popStreamContentUntilCurrentSection($previousMaxHeight ? min($previousMaxHeight, $this->lines) : $this->lines);\n\n        parent::doWrite($this->getVisibleContent(), false);\n        parent::doWrite($existingContent, false);\n    }\n\n    /**\n     * Clears previous output for this section.\n     *\n     * @param int $lines Number of lines to clear. If null, then the entire output of this section is cleared\n     */\n    public function clear(?int $lines = null): void\n    {\n        if (!$this->content || !$this->isDecorated()) {\n            return;\n        }\n\n        if ($lines) {\n            array_splice($this->content, -$lines);\n        } else {\n            $lines = $this->lines;\n            $this->content = [];\n        }\n\n        // callers may ask to clear more lines than this section tracks (e.g. ProgressBar\n        // counts \"\\n\"-separated lines while addContent() splits on PHP_EOL), so keep the\n        // counter from going negative, which would break the max-height bookkeeping\n        $this->lines = max(0, $this->lines - $lines);\n\n        parent::doWrite($this->popStreamContentUntilCurrentSection($this->maxHeight ? min($this->maxHeight, $lines) : $lines), false);\n    }\n\n    /**\n     * Overwrites the previous output with a new message.\n     */\n    public function overwrite(string|iterable $message): void\n    {\n        if (!$this->content || !$this->isDecorated()) {\n            $this->writeln($message);\n\n            return;\n        }\n\n        // Replace own content and write everything in a single cursor-up + erase\n        // pass, to avoid the flicker (and the line-eating artifacts on some\n        // terminals) caused by calling clear() then writeln() back-to-back.\n        $linesCleared = $this->lines;\n        $this->content = [];\n        $this->lines = 0;\n\n        if (!is_iterable($message)) {\n            $message = [$message];\n        }\n\n        foreach ($message as $line) {\n            $this->addContent($this->getFormatter()->format($line) ?? '', true);\n        }\n\n        $erasedContent = $this->popStreamContentUntilCurrentSection($this->maxHeight ? min($this->maxHeight, $linesCleared) : $linesCleared);\n\n        parent::doWrite($this->getVisibleContent(), false);\n        parent::doWrite($erasedContent, false);\n    }\n\n    public function getContent(): string\n    {\n        return implode('', $this->content);\n    }\n\n    public function getVisibleContent(): string\n    {\n        if (0 === $this->maxHeight) {\n            return $this->getContent();\n        }\n\n        return implode('', \\array_slice($this->content, -$this->maxHeight));\n    }\n\n    /**\n     * @internal\n     */\n    public function addContent(string $input, bool $newline = true): int\n    {\n        $width = $this->terminal->getWidth();\n        $lines = explode(\\PHP_EOL, $input);\n        $linesAdded = 0;\n        $count = \\count($lines) - 1;\n        foreach ($lines as $i => $lineContent) {\n            // re-add the line break (that has been removed in the above `explode()` for\n            // - every line that is not the last line\n            // - if $newline is required, also add it to the last line\n            if ($i < $count || $newline) {\n                $lineContent .= \\PHP_EOL;\n            }\n\n            // skip line if there is no text (or newline for that matter)\n            if ('' === $lineContent) {\n                continue;\n            }\n\n            // For the first line, check if the previous line (last entry of `$this->content`)\n            // needs to be continued (i.e. does not end with a line break).\n            if (0 === $i\n                && (false !== $lastLine = end($this->content))\n                && !str_ends_with($lastLine, \\PHP_EOL)\n            ) {\n                // deduct the line count of the previous line\n                $this->lines -= (int) ceil($this->getDisplayLength($lastLine) / $width) ?: 1;\n                // concatenate previous and new line\n                $lineContent = $lastLine.$lineContent;\n                // replace last entry of `$this->content` with the new expanded line\n                array_splice($this->content, -1, 1, $lineContent);\n            } else {\n                // otherwise just add the new content\n                $this->content[] = $lineContent;\n            }\n\n            $linesAdded += (int) ceil($this->getDisplayLength($lineContent) / $width) ?: 1;\n        }\n\n        $this->lines += $linesAdded;\n\n        return $linesAdded;\n    }\n\n    /**\n     * @internal\n     */\n    public function addNewLineOfInputSubmit(): void\n    {\n        $this->content[] = \\PHP_EOL;\n        ++$this->lines;\n    }\n\n    protected function doWrite(string $message, bool $newline): void\n    {\n        // Simulate newline behavior for consistent output formatting, avoiding extra logic\n        if (!$newline && str_ends_with($message, \\PHP_EOL)) {\n            $message = substr($message, 0, -\\strlen(\\PHP_EOL));\n            $newline = true;\n        }\n\n        if (!$this->isDecorated()) {\n            parent::doWrite($message, $newline);\n\n            return;\n        }\n\n        // Check if the previous line (last entry of `$this->content`) needs to be continued\n        // (i.e. does not end with a line break). In which case, it needs to be erased first.\n        $linesToClear = $deleteLastLine = ($lastLine = end($this->content) ?: '') && !str_ends_with($lastLine, \\PHP_EOL) ? 1 : 0;\n\n        $linesAdded = $this->addContent($message, $newline);\n\n        if ($lineOverflow = $this->maxHeight > 0 && $this->lines > $this->maxHeight) {\n            // on overflow, clear the whole section and redraw again (to remove the first lines)\n            $linesToClear = $this->maxHeight;\n        }\n\n        $erasedContent = $this->popStreamContentUntilCurrentSection($linesToClear);\n\n        if ($lineOverflow) {\n            // redraw existing lines of the section\n            $previousLinesOfSection = \\array_slice($this->content, $this->lines - $this->maxHeight, $this->maxHeight - $linesAdded);\n            parent::doWrite(implode('', $previousLinesOfSection), false);\n        }\n\n        // if the last line was removed, re-print its content together with the new content.\n        // otherwise, just print the new content.\n        parent::doWrite($deleteLastLine ? $lastLine.$message : $message, true);\n        parent::doWrite($erasedContent, false);\n    }\n\n    /**\n     * At initial stage, cursor is at the end of stream output. This method makes cursor crawl upwards until it hits\n     * current section. Then it erases content it crawled through. Optionally, it erases part of current section too.\n     */\n    private function popStreamContentUntilCurrentSection(int $numberOfLinesToClearFromCurrentSection = 0): string\n    {\n        $numberOfLinesToClear = $numberOfLinesToClearFromCurrentSection;\n        $erasedContent = [];\n\n        foreach ($this->sections as $section) {\n            if ($section === $this) {\n                break;\n            }\n\n            $numberOfLinesToClear += $section->maxHeight ? min($section->lines, $section->maxHeight) : $section->lines;\n            if ('' !== $sectionContent = $section->getVisibleContent()) {\n                if (!str_ends_with($sectionContent, \\PHP_EOL)) {\n                    $sectionContent .= \\PHP_EOL;\n                }\n                $erasedContent[] = $sectionContent;\n            }\n        }\n\n        if ($numberOfLinesToClear > 0) {\n            // move cursor up n lines\n            parent::doWrite(\\sprintf(\"\\x1b[%dA\", $numberOfLinesToClear), false);\n            // erase to end of screen\n            parent::doWrite(\"\\x1b[0J\", false);\n        }\n\n        return implode('', array_reverse($erasedContent));\n    }\n\n    private function getDisplayLength(string $text): int\n    {\n        return Helper::width(Helper::removeDecoration($this->getFormatter(), str_replace(\"\\t\", '        ', $text)));\n    }\n}\n","vendor/symfony/console/Output/NullOutput.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Output;\n\nuse Symfony\\Component\\Console\\Formatter\\NullOutputFormatter;\nuse Symfony\\Component\\Console\\Formatter\\OutputFormatterInterface;\n\n/**\n * NullOutput suppresses all output.\n *\n *     $output = new NullOutput();\n *\n * @author Fabien Potencier <fabien@symfony.com>\n * @author Tobias Schultze <http://tobion.de>\n */\nclass NullOutput implements OutputInterface\n{\n    private NullOutputFormatter $formatter;\n\n    public function setFormatter(OutputFormatterInterface $formatter): void\n    {\n        // do nothing\n    }\n\n    public function getFormatter(): OutputFormatterInterface\n    {\n        // to comply with the interface we must return a OutputFormatterInterface\n        return $this->formatter ??= new NullOutputFormatter();\n    }\n\n    public function setDecorated(bool $decorated): void\n    {\n        // do nothing\n    }\n\n    public function isDecorated(): bool\n    {\n        return false;\n    }\n\n    public function setVerbosity(int $level): void\n    {\n        // do nothing\n    }\n\n    public function getVerbosity(): int\n    {\n        return self::VERBOSITY_SILENT;\n    }\n\n    public function isSilent(): bool\n    {\n        return true;\n    }\n\n    public function isQuiet(): bool\n    {\n        return false;\n    }\n\n    public function isVerbose(): bool\n    {\n        return false;\n    }\n\n    public function isVeryVerbose(): bool\n    {\n        return false;\n    }\n\n    public function isDebug(): bool\n    {\n        return false;\n    }\n\n    public function writeln(string|iterable $messages, int $options = self::OUTPUT_NORMAL): void\n    {\n        // do nothing\n    }\n\n    public function write(string|iterable $messages, bool $newline = false, int $options = self::OUTPUT_NORMAL): void\n    {\n        // do nothing\n    }\n}\n","vendor/symfony/console/Output/Output.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Output;\n\nuse Symfony\\Component\\Console\\Formatter\\OutputFormatter;\nuse Symfony\\Component\\Console\\Formatter\\OutputFormatterInterface;\n\n/**\n * Base class for output classes.\n *\n * There are six levels of verbosity:\n *\n *  * normal: no option passed (normal output)\n *  * verbose: -v (more output)\n *  * very verbose: -vv (highly extended output)\n *  * debug: -vvv (all debug output)\n *  * quiet: -q (only output errors)\n *  * silent: --silent (no output)\n *\n * @author Fabien Potencier <fabien@symfony.com>\n */\nabstract class Output implements OutputInterface\n{\n    private int $verbosity;\n    private OutputFormatterInterface $formatter;\n\n    /**\n     * @param int|null                      $verbosity The verbosity level (one of the VERBOSITY constants in OutputInterface)\n     * @param bool                          $decorated Whether to decorate messages\n     * @param OutputFormatterInterface|null $formatter Output formatter instance (null to use default OutputFormatter)\n     */\n    public function __construct(?int $verbosity = self::VERBOSITY_NORMAL, bool $decorated = false, ?OutputFormatterInterface $formatter = null)\n    {\n        $this->verbosity = $verbosity ?? self::VERBOSITY_NORMAL;\n        $this->formatter = $formatter ?? new OutputFormatter();\n        $this->formatter->setDecorated($decorated);\n    }\n\n    public function setFormatter(OutputFormatterInterface $formatter): void\n    {\n        $this->formatter = $formatter;\n    }\n\n    public function getFormatter(): OutputFormatterInterface\n    {\n        return $this->formatter;\n    }\n\n    public function setDecorated(bool $decorated): void\n    {\n        $this->formatter->setDecorated($decorated);\n    }\n\n    public function isDecorated(): bool\n    {\n        return $this->formatter->isDecorated();\n    }\n\n    public function setVerbosity(int $level): void\n    {\n        $this->verbosity = $level;\n    }\n\n    public function getVerbosity(): int\n    {\n        return $this->verbosity;\n    }\n\n    public function isSilent(): bool\n    {\n        return self::VERBOSITY_SILENT === $this->verbosity;\n    }\n\n    public function isQuiet(): bool\n    {\n        return self::VERBOSITY_QUIET === $this->verbosity;\n    }\n\n    public function isVerbose(): bool\n    {\n        return self::VERBOSITY_VERBOSE <= $this->verbosity;\n    }\n\n    public function isVeryVerbose(): bool\n    {\n        return self::VERBOSITY_VERY_VERBOSE <= $this->verbosity;\n    }\n\n    public function isDebug(): bool\n    {\n        return self::VERBOSITY_DEBUG <= $this->verbosity;\n    }\n\n    public function writeln(string|iterable $messages, int $options = self::OUTPUT_NORMAL): void\n    {\n        $this->write($messages, true, $options);\n    }\n\n    public function write(string|iterable $messages, bool $newline = false, int $options = self::OUTPUT_NORMAL): void\n    {\n        if (!is_iterable($messages)) {\n            $messages = [$messages];\n        }\n\n        $types = self::OUTPUT_NORMAL | self::OUTPUT_RAW | self::OUTPUT_PLAIN;\n        $type = $types & $options ?: self::OUTPUT_NORMAL;\n\n        $verbosities = self::VERBOSITY_QUIET | self::VERBOSITY_NORMAL | self::VERBOSITY_VERBOSE | self::VERBOSITY_VERY_VERBOSE | self::VERBOSITY_DEBUG;\n        $verbosity = $verbosities & $options ?: self::VERBOSITY_NORMAL;\n\n        if ($verbosity > $this->getVerbosity()) {\n            return;\n        }\n\n        foreach ($messages as $message) {\n            switch ($type) {\n                case OutputInterface::OUTPUT_NORMAL:\n                    $message = $this->formatter->format($message);\n                    break;\n                case OutputInterface::OUTPUT_RAW:\n                    break;\n                case OutputInterface::OUTPUT_PLAIN:\n                    $message = strip_tags($this->formatter->format($message));\n                    break;\n            }\n\n            $this->doWrite($message ?? '', $newline);\n        }\n    }\n\n    /**\n     * Writes a message to the output.\n     */\n    abstract protected function doWrite(string $message, bool $newline): void;\n}\n","vendor/symfony/console/Output/OutputInterface.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Output;\n\nuse Symfony\\Component\\Console\\Formatter\\OutputFormatterInterface;\n\n/**\n * OutputInterface is the interface implemented by all Output classes.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n *\n * @method bool isSilent()\n */\ninterface OutputInterface\n{\n    public const VERBOSITY_SILENT = 8;\n    public const VERBOSITY_QUIET = 16;\n    public const VERBOSITY_NORMAL = 32;\n    public const VERBOSITY_VERBOSE = 64;\n    public const VERBOSITY_VERY_VERBOSE = 128;\n    public const VERBOSITY_DEBUG = 256;\n\n    public const OUTPUT_NORMAL = 1;\n    public const OUTPUT_RAW = 2;\n    public const OUTPUT_PLAIN = 4;\n\n    /**\n     * Writes a message to the output.\n     *\n     * @param bool $newline Whether to add a newline\n     * @param int  $options A bitmask of options (one of the OUTPUT or VERBOSITY constants),\n     *                      0 is considered the same as self::OUTPUT_NORMAL | self::VERBOSITY_NORMAL\n     */\n    public function write(string|iterable $messages, bool $newline = false, int $options = 0): void;\n\n    /**\n     * Writes a message to the output and adds a newline at the end.\n     *\n     * @param int $options A bitmask of options (one of the OUTPUT or VERBOSITY constants),\n     *                     0 is considered the same as self::OUTPUT_NORMAL | self::VERBOSITY_NORMAL\n     */\n    public function writeln(string|iterable $messages, int $options = 0): void;\n\n    /**\n     * Sets the verbosity of the output.\n     *\n     * @param self::VERBOSITY_* $level\n     */\n    public function setVerbosity(int $level): void;\n\n    /**\n     * Gets the current verbosity of the output.\n     *\n     * @return self::VERBOSITY_*\n     */\n    public function getVerbosity(): int;\n\n    /**\n     * Returns whether verbosity is quiet (-q).\n     */\n    public function isQuiet(): bool;\n\n    /**\n     * Returns whether verbosity is verbose (-v).\n     */\n    public function isVerbose(): bool;\n\n    /**\n     * Returns whether verbosity is very verbose (-vv).\n     */\n    public function isVeryVerbose(): bool;\n\n    /**\n     * Returns whether verbosity is debug (-vvv).\n     */\n    public function isDebug(): bool;\n\n    /**\n     * Sets the decorated flag.\n     */\n    public function setDecorated(bool $decorated): void;\n\n    /**\n     * Gets the decorated flag.\n     */\n    public function isDecorated(): bool;\n\n    public function setFormatter(OutputFormatterInterface $formatter): void;\n\n    /**\n     * Returns current output formatter instance.\n     */\n    public function getFormatter(): OutputFormatterInterface;\n}\n","vendor/symfony/console/Output/StreamOutput.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Output;\n\nuse Symfony\\Component\\Console\\Exception\\InvalidArgumentException;\nuse Symfony\\Component\\Console\\Formatter\\OutputFormatterInterface;\n\n/**\n * StreamOutput writes the output to a given stream.\n *\n * Usage:\n *\n *     $output = new StreamOutput(fopen('php://stdout', 'w'));\n *\n * As `StreamOutput` can use any stream, you can also use a file:\n *\n *     $output = new StreamOutput(fopen('/path/to/output.log', 'a', false));\n *\n * @author Fabien Potencier <fabien@symfony.com>\n */\nclass StreamOutput extends Output\n{\n    /** @var resource */\n    private $stream;\n\n    /**\n     * @param resource                      $stream    A stream resource\n     * @param int                           $verbosity The verbosity level (one of the VERBOSITY constants in OutputInterface)\n     * @param bool|null                     $decorated Whether to decorate messages (null for auto-guessing)\n     * @param OutputFormatterInterface|null $formatter Output formatter instance (null to use default OutputFormatter)\n     *\n     * @throws InvalidArgumentException When first argument is not a real stream\n     */\n    public function __construct($stream, int $verbosity = self::VERBOSITY_NORMAL, ?bool $decorated = null, ?OutputFormatterInterface $formatter = null)\n    {\n        if (!\\is_resource($stream) || 'stream' !== get_resource_type($stream)) {\n            throw new InvalidArgumentException('The StreamOutput class needs a stream as its first argument.');\n        }\n\n        $this->stream = $stream;\n\n        $decorated ??= $this->hasColorSupport();\n\n        parent::__construct($verbosity, $decorated, $formatter);\n    }\n\n    /**\n     * Gets the stream attached to this StreamOutput instance.\n     *\n     * @return resource\n     */\n    public function getStream()\n    {\n        return $this->stream;\n    }\n\n    protected function doWrite(string $message, bool $newline): void\n    {\n        if ($newline) {\n            $message .= \\PHP_EOL;\n        }\n\n        @fwrite($this->stream, $message);\n\n        fflush($this->stream);\n    }\n\n    /**\n     * Returns true if the stream supports colorization.\n     *\n     * Colorization is disabled if not supported by the stream:\n     *\n     * This is tricky on Windows, because Cygwin, Msys2 etc emulate pseudo\n     * terminals via named pipes, so we can only check the environment.\n     *\n     * Reference: Composer\\XdebugHandler\\Process::supportsColor\n     * https://github.com/composer/xdebug-handler\n     *\n     * @return bool true if the stream supports colorization, false otherwise\n     */\n    protected function hasColorSupport(): bool\n    {\n        // Follow https://no-color.org/\n        if ('' !== (($_SERVER['NO_COLOR'] ?? getenv('NO_COLOR'))[0] ?? '')) {\n            return false;\n        }\n\n        // Follow https://force-color.org/\n        if ('' !== (($_SERVER['FORCE_COLOR'] ?? getenv('FORCE_COLOR'))[0] ?? '')) {\n            return true;\n        }\n\n        // Detect msysgit/mingw and assume this is a tty because detection\n        // does not work correctly, see https://github.com/composer/composer/issues/9690\n        if (!@stream_isatty($this->stream) && !\\in_array(strtoupper((string) getenv('MSYSTEM')), ['MINGW32', 'MINGW64'], true)) {\n            return false;\n        }\n\n        if ('\\\\' === \\DIRECTORY_SEPARATOR && @sapi_windows_vt100_support($this->stream)) {\n            return true;\n        }\n\n        if ('Hyper' === getenv('TERM_PROGRAM')\n            || false !== getenv('COLORTERM')\n            || false !== getenv('ANSICON')\n            || 'ON' === getenv('ConEmuANSI')\n        ) {\n            return true;\n        }\n\n        if ('dumb' === $term = (string) getenv('TERM')) {\n            return false;\n        }\n\n        // See https://github.com/chalk/supports-color/blob/d4f413efaf8da045c5ab440ed418ef02dbb28bf1/index.js#L157\n        return preg_match('/^((screen|xterm|vt100|vt220|putty|rxvt|ansi|cygwin|linux).*)|(.*-256(color)?(-bce)?)$/', $term);\n    }\n}\n","vendor/symfony/console/Output/TrimmedBufferOutput.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Output;\n\nuse Symfony\\Component\\Console\\Exception\\InvalidArgumentException;\nuse Symfony\\Component\\Console\\Formatter\\OutputFormatterInterface;\n\n/**\n * A BufferedOutput that keeps only the last N chars.\n *\n * @author Jérémy Derussé <jeremy@derusse.com>\n */\nclass TrimmedBufferOutput extends Output\n{\n    private int $maxLength;\n    private string $buffer = '';\n\n    public function __construct(int $maxLength, ?int $verbosity = self::VERBOSITY_NORMAL, bool $decorated = false, ?OutputFormatterInterface $formatter = null)\n    {\n        if ($maxLength <= 0) {\n            throw new InvalidArgumentException(\\sprintf('\"%s()\" expects a strictly positive maxLength. Got %d.', __METHOD__, $maxLength));\n        }\n\n        parent::__construct($verbosity, $decorated, $formatter);\n        $this->maxLength = $maxLength;\n    }\n\n    /**\n     * Empties buffer and returns its content.\n     */\n    public function fetch(): string\n    {\n        $content = $this->buffer;\n        $this->buffer = '';\n\n        return $content;\n    }\n\n    protected function doWrite(string $message, bool $newline): void\n    {\n        $this->buffer .= $message;\n\n        if ($newline) {\n            $this->buffer .= \\PHP_EOL;\n        }\n\n        $this->buffer = substr($this->buffer, -$this->maxLength);\n    }\n}\n","vendor/symfony/console/Question/ChoiceQuestion.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Question;\n\nuse Symfony\\Component\\Console\\Exception\\InvalidArgumentException;\n\n/**\n * Represents a choice question.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n */\nclass ChoiceQuestion extends Question\n{\n    private bool $multiselect = false;\n    private string $prompt = ' > ';\n    private string $errorMessage = 'Value \"%s\" is invalid';\n\n    /**\n     * @param string                                   $question The question to ask to the user\n     * @param array<string|bool|int|float|\\Stringable> $choices  The list of available choices\n     * @param string|bool|int|float|null               $default  The default answer to return\n     */\n    public function __construct(\n        string $question,\n        private array $choices,\n        string|bool|int|float|null $default = null,\n    ) {\n        if (!$choices) {\n            throw new \\LogicException('Choice question must have at least 1 choice available.');\n        }\n\n        parent::__construct($question, $default);\n\n        $this->setValidator($this->getDefaultValidator());\n        $this->setAutocompleterValues($choices);\n    }\n\n    /**\n     * @return array<string|bool|int|float|\\Stringable>\n     */\n    public function getChoices(): array\n    {\n        return $this->choices;\n    }\n\n    /**\n     * Sets multiselect option.\n     *\n     * When multiselect is set to true, multiple choices can be answered.\n     *\n     * @return $this\n     */\n    public function setMultiselect(bool $multiselect): static\n    {\n        $this->multiselect = $multiselect;\n        $this->setValidator($this->getDefaultValidator());\n\n        return $this;\n    }\n\n    /**\n     * Returns whether the choices are multiselect.\n     */\n    public function isMultiselect(): bool\n    {\n        return $this->multiselect;\n    }\n\n    /**\n     * Gets the prompt for choices.\n     */\n    public function getPrompt(): string\n    {\n        return $this->prompt;\n    }\n\n    /**\n     * Sets the prompt for choices.\n     *\n     * @return $this\n     */\n    public function setPrompt(string $prompt): static\n    {\n        $this->prompt = $prompt;\n\n        return $this;\n    }\n\n    /**\n     * Sets the error message for invalid values.\n     *\n     * The error message has a string placeholder (%s) for the invalid value.\n     *\n     * @return $this\n     */\n    public function setErrorMessage(string $errorMessage): static\n    {\n        $this->errorMessage = $errorMessage;\n        $this->setValidator($this->getDefaultValidator());\n\n        return $this;\n    }\n\n    private function getDefaultValidator(): callable\n    {\n        $choices = $this->choices;\n        $errorMessage = $this->errorMessage;\n        $multiselect = $this->multiselect;\n        $isAssoc = $this->isAssoc($choices);\n\n        return function ($selected) use ($choices, $errorMessage, $multiselect, $isAssoc) {\n            if ($multiselect) {\n                // Check for a separated comma values\n                if (!preg_match('/^[^,]+(?:,[^,]+)*$/', (string) $selected, $matches)) {\n                    throw new InvalidArgumentException(\\sprintf($errorMessage, $selected));\n                }\n\n                $selectedChoices = explode(',', (string) $selected);\n            } else {\n                $selectedChoices = [$selected];\n            }\n\n            if ($this->isTrimmable()) {\n                foreach ($selectedChoices as $k => $v) {\n                    $selectedChoices[$k] = trim((string) $v);\n                }\n            }\n\n            $multiselectChoices = [];\n            foreach ($selectedChoices as $value) {\n                $results = [];\n                foreach ($choices as $key => $choice) {\n                    if ($choice === $value) {\n                        $results[] = $key;\n                    }\n                }\n\n                if (\\count($results) > 1) {\n                    throw new InvalidArgumentException(\\sprintf('The provided answer is ambiguous. Value should be one of \"%s\".', implode('\" or \"', $results)));\n                }\n\n                $result = array_search($value, $choices);\n\n                if (!$isAssoc) {\n                    if (false !== $result) {\n                        $result = $choices[$result];\n                    } elseif (isset($choices[$value])) {\n                        $result = $choices[$value];\n                    }\n                } elseif (false === $result && isset($choices[$value])) {\n                    $result = $value;\n                }\n\n                if (false === $result) {\n                    throw new InvalidArgumentException(\\sprintf($errorMessage, $value));\n                }\n\n                // For associative choices, consistently return the key as string:\n                $multiselectChoices[] = $isAssoc ? (string) $result : $result;\n            }\n\n            if ($multiselect) {\n                return $multiselectChoices;\n            }\n\n            return current($multiselectChoices);\n        };\n    }\n}\n","vendor/symfony/console/Question/ConfirmationQuestion.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Question;\n\n/**\n * Represents a yes/no question.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n */\nclass ConfirmationQuestion extends Question\n{\n    /**\n     * @param string $question        The question to ask to the user\n     * @param bool   $default         The default answer to return, true or false\n     * @param string $trueAnswerRegex A regex to match the \"yes\" answer\n     */\n    public function __construct(\n        string $question,\n        bool $default = true,\n        private string $trueAnswerRegex = '/^y/i',\n    ) {\n        parent::__construct($question, $default);\n\n        $this->setNormalizer($this->getDefaultNormalizer());\n    }\n\n    /**\n     * Returns the default answer normalizer.\n     */\n    private function getDefaultNormalizer(): callable\n    {\n        $default = $this->getDefault();\n        $regex = $this->trueAnswerRegex;\n\n        return static function ($answer) use ($default, $regex) {\n            if (\\is_bool($answer)) {\n                return $answer;\n            }\n\n            $answerIsTrue = (bool) preg_match($regex, $answer);\n            if (false === $default) {\n                return $answer && $answerIsTrue;\n            }\n\n            return '' === $answer || $answerIsTrue;\n        };\n    }\n}\n","vendor/symfony/console/Question/Question.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Question;\n\nuse Symfony\\Component\\Console\\Exception\\InvalidArgumentException;\nuse Symfony\\Component\\Console\\Exception\\LogicException;\n\n/**\n * Represents a Question.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n */\nclass Question\n{\n    private ?int $attempts = null;\n    private bool $hidden = false;\n    private bool $hiddenFallback = true;\n    /**\n     * @var (\\Closure(string):string[])|null\n     */\n    private ?\\Closure $autocompleterCallback = null;\n    /**\n     * @var (\\Closure(mixed):mixed)|null\n     */\n    private ?\\Closure $validator = null;\n    /**\n     * @var (\\Closure(mixed):mixed)|null\n     */\n    private ?\\Closure $normalizer = null;\n    private bool $trimmable = true;\n    private bool $multiline = false;\n    private ?int $timeout = null;\n\n    /**\n     * @param string                     $question The question to ask to the user\n     * @param string|bool|int|float|null $default  The default answer to return if the user enters nothing\n     */\n    public function __construct(\n        private string $question,\n        private string|bool|int|float|null $default = null,\n    ) {\n    }\n\n    /**\n     * Returns the question.\n     */\n    public function getQuestion(): string\n    {\n        return $this->question;\n    }\n\n    /**\n     * Returns the default answer.\n     */\n    public function getDefault(): string|bool|int|float|null\n    {\n        return $this->default;\n    }\n\n    /**\n     * Returns whether the user response accepts newline characters.\n     */\n    public function isMultiline(): bool\n    {\n        return $this->multiline;\n    }\n\n    /**\n     * Sets whether the user response should accept newline characters.\n     *\n     * @return $this\n     */\n    public function setMultiline(bool $multiline): static\n    {\n        $this->multiline = $multiline;\n\n        return $this;\n    }\n\n    /**\n     * Returns the timeout in seconds.\n     */\n    public function getTimeout(): ?int\n    {\n        return $this->timeout;\n    }\n\n    /**\n     * Sets the maximum time the user has to answer the question.\n     * If the user does not answer within this time, an exception will be thrown.\n     *\n     * @return $this\n     */\n    public function setTimeout(?int $seconds): static\n    {\n        $this->timeout = $seconds;\n\n        return $this;\n    }\n\n    /**\n     * Returns whether the user response must be hidden.\n     */\n    public function isHidden(): bool\n    {\n        return $this->hidden;\n    }\n\n    /**\n     * Sets whether the user response must be hidden or not.\n     *\n     * @return $this\n     *\n     * @throws LogicException In case the autocompleter is also used\n     */\n    public function setHidden(bool $hidden): static\n    {\n        if ($this->autocompleterCallback) {\n            throw new LogicException('A hidden question cannot use the autocompleter.');\n        }\n\n        $this->hidden = $hidden;\n\n        return $this;\n    }\n\n    /**\n     * In case the response cannot be hidden, whether to fallback on non-hidden question or not.\n     */\n    public function isHiddenFallback(): bool\n    {\n        return $this->hiddenFallback;\n    }\n\n    /**\n     * Sets whether to fallback on non-hidden question if the response cannot be hidden.\n     *\n     * @return $this\n     */\n    public function setHiddenFallback(bool $fallback): static\n    {\n        $this->hiddenFallback = $fallback;\n\n        return $this;\n    }\n\n    /**\n     * Gets values for the autocompleter.\n     */\n    public function getAutocompleterValues(): ?iterable\n    {\n        $callback = $this->getAutocompleterCallback();\n\n        return $callback ? $callback('') : null;\n    }\n\n    /**\n     * Sets values for the autocompleter.\n     *\n     * @return $this\n     *\n     * @throws LogicException\n     */\n    public function setAutocompleterValues(?iterable $values): static\n    {\n        if (\\is_array($values)) {\n            $values = $this->isAssoc($values) ? array_merge(array_keys($values), array_values($values)) : array_values($values);\n\n            $callback = static fn () => $values;\n        } elseif ($values instanceof \\Traversable) {\n            $callback = static function () use ($values) {\n                static $valueCache;\n\n                return $valueCache ??= iterator_to_array($values, false);\n            };\n        } else {\n            $callback = null;\n        }\n\n        return $this->setAutocompleterCallback($callback);\n    }\n\n    /**\n     * Gets the callback function used for the autocompleter.\n     *\n     * @return (callable(string):string[])|null\n     */\n    public function getAutocompleterCallback(): ?callable\n    {\n        return $this->autocompleterCallback;\n    }\n\n    /**\n     * Sets the callback function used for the autocompleter.\n     *\n     * The callback is passed the user input as argument and should return an iterable of corresponding suggestions.\n     *\n     * @param (callable(string):string[])|null $callback\n     *\n     * @return $this\n     */\n    public function setAutocompleterCallback(?callable $callback): static\n    {\n        if ($this->hidden && null !== $callback) {\n            throw new LogicException('A hidden question cannot use the autocompleter.');\n        }\n\n        $this->autocompleterCallback = null === $callback ? null : $callback(...);\n\n        return $this;\n    }\n\n    /**\n     * Sets a validator for the question.\n     *\n     * @param (callable(mixed):mixed)|null $validator\n     *\n     * @return $this\n     */\n    public function setValidator(?callable $validator): static\n    {\n        $this->validator = null === $validator ? null : $validator(...);\n\n        return $this;\n    }\n\n    /**\n     * Gets the validator for the question.\n     *\n     * @return (callable(mixed):mixed)|null\n     */\n    public function getValidator(): ?callable\n    {\n        return $this->validator;\n    }\n\n    /**\n     * Sets the maximum number of attempts.\n     *\n     * Null means an unlimited number of attempts.\n     *\n     * @return $this\n     *\n     * @throws InvalidArgumentException in case the number of attempts is invalid\n     */\n    public function setMaxAttempts(?int $attempts): static\n    {\n        if (null !== $attempts && $attempts < 1) {\n            throw new InvalidArgumentException('Maximum number of attempts must be a positive value.');\n        }\n\n        $this->attempts = $attempts;\n\n        return $this;\n    }\n\n    /**\n     * Gets the maximum number of attempts.\n     *\n     * Null means an unlimited number of attempts.\n     */\n    public function getMaxAttempts(): ?int\n    {\n        return $this->attempts;\n    }\n\n    /**\n     * Sets a normalizer for the response.\n     *\n     * @param callable(mixed):mixed $normalizer\n     *\n     * @return $this\n     */\n    public function setNormalizer(callable $normalizer): static\n    {\n        $this->normalizer = $normalizer(...);\n\n        return $this;\n    }\n\n    /**\n     * Gets the normalizer for the response.\n     *\n     * @return (callable(mixed):mixed)|null\n     */\n    public function getNormalizer(): ?callable\n    {\n        return $this->normalizer;\n    }\n\n    protected function isAssoc(array $array): bool\n    {\n        return (bool) \\count(array_filter(array_keys($array), 'is_string'));\n    }\n\n    public function isTrimmable(): bool\n    {\n        return $this->trimmable;\n    }\n\n    /**\n     * @return $this\n     */\n    public function setTrimmable(bool $trimmable): static\n    {\n        $this->trimmable = $trimmable;\n\n        return $this;\n    }\n}\n","vendor/symfony/console/README.md":"Console Component\n=================\n\nThe Console component eases the creation of beautiful and testable command line\ninterfaces.\n\nSponsor\n-------\n\nHelp Symfony by [sponsoring][1] its development!\n\nResources\n---------\n\n * [Documentation](https://symfony.com/doc/current/components/console.html)\n * [Contributing](https://symfony.com/doc/current/contributing/index.html)\n * [Report issues](https://github.com/symfony/symfony/issues) and\n   [send Pull Requests](https://github.com/symfony/symfony/pulls)\n   in the [main Symfony repository](https://github.com/symfony/symfony)\n\nCredits\n-------\n\n`Resources/bin/hiddeninput.exe` is a third party binary provided within this\ncomponent. Find sources and license at https://github.com/Seldaek/hidden-input.\n\n[1]: https://symfony.com/sponsor\n","vendor/symfony/console/Resources/bin/hiddeninput.exe":"MZ�\u0000\u0003\u0000\u0000\u0000\u0004\u0000\u0000\u0000��\u0000\u0000�\u0000\u0000\u0000\u0000\u0000\u0000\u0000@\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000�\u0000\u0000\u0000\u000e\u001f�\u000e\u0000�\t�!�\u0001L�!This program cannot be run in DOS mode.\r\r\n$\u0000\u0000\u0000\u0000\u0000\u0000\u0000�,�;�B�;�B�;�B�2�מ:�B�2���-�B�2�ƞ9�B�2�ў?�B�\u001ca9�8�B�;�C�\b�B�2�Ȟ:�B�2�֞:�B�2�Ӟ:�B�Rich;�B�\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000PE\u0000\u0000L\u0001\u0005\u0000�MoO\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000�\u0000\u0002\u0001\u000b\u0001\t\u0000\u0000\n\u0000\u0000\u0000\u0016\u0000\u0000\u0000\u0000\u0000\u00008\u0013\u0000\u0000\u0000\u0010\u0000\u0000\u0000 \u0000\u0000\u0000\u0000@\u0000\u0000\u0010\u0000\u0000\u0000\u0002\u0000\u0000\u0005\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0005\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000`\u0000\u0000\u0000\u0004\u0000\u0000?�\u0000\u0000\u0003\u0000@�\u0000\u0000\u0010\u0000\u0000\u0010\u0000\u0000\u0000\u0000\u0010\u0000\u0000\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000�\"\u0000\u0000P\u0000\u0000\u0000\u0000@\u0000\u0000 \u0006\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000P\u0000\u0000p\u0001\u0000\u0000\u0000!\u0000\u0000\u001c\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u00008!\u0000\u0000@\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000 \u0000\u0000�\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000.text\u0000\u0000\u0000\u000b\t\u0000\u0000\u0000\u0010\u0000\u0000\u0000\n\u0000\u0000\u0000\u0004\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000 \u0000\u0000`.rdata\u0000\u0000�\t\u0000\u0000\u0000 \u0000\u0000\u0000\n\u0000\u0000\u0000\u000e\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000@\u0000\u0000@.data\u0000\u0000\u0000�\u0003\u0000\u0000\u00000\u0000\u0000\u0000\u0002\u0000\u0000\u0000\u0018\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000@\u0000\u0000�.rsrc\u0000\u0000\u0000 \u0006\u0000\u0000\u0000@\u0000\u0000\u0000\b\u0000\u0000\u0000\u001a\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000@\u0000\u0000@.reloc\u0000\u0000�\u0001\u0000\u0000\u0000P\u0000\u0000\u0000\u0002\u0000\u0000\u0000\"\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000@\u0000\u0000B\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000j$��\u0018@\u0000�x\b\u0000\u0000j��\u0015\b @\u0000�e�\u0000���E�PV�\u0015\u0000 @\u0000�EЃ��PV�\u0015\u0004 @\u0000�M��\u0015X @\u0000�e�\u0000�E�P�5H @\u0000�\u0015L @\u0000YY�5\\ @\u0000�E�P�5` @\u0000�\u0015D @\u0000YY���\u0015P @\u0000�M���M��\u0015T @\u00003��H\b\u0000\u0000�;\r\u00000@\u0000u\u0002���\u0002\u0000\u0000h�\u0015@\u0000�\u0004\u0000\u0000�l3@\u0000�\u0004$40@\u0000�5h3@\u0000�40@\u0000h$0@\u0000h(0@\u0000h 0@\u0000�\u0015� @\u0000��\u0014�00@\u0000��}\bj\b�\u0003\u0000\u0000Y�j\u0010h\b\"@\u0000�\u001f\u0006\u0000\u00003ۉ]�d�\u0018\u0000\u0000\u0000�p\u0004�]俀3@\u0000SVW�\u00150 @\u0000;�t\u0019;�u\b3�F�u��\u0010h�\u0003\u0000\u0000�\u00154 @\u0000��3�F�|3@\u0000;�u\nj\u001f�\\\u0003\u0000\u0000Y�;�|3@\u0000��u,�5|3@\u0000h� @\u0000h� @\u0000�\u0005\u0000\u0000YY��t\u0017�E�������\u0000\u0000\u0000��\u0000\u0000\u0000�5<0@\u0000�|3@\u0000;�u\u001bh� @\u0000h� @\u0000�l\u0005\u0000\u0000YY�\u0005|3@\u0000\u0002\u0000\u0000\u00009]�u\bSW�\u00158 @\u00009\u001d�3@\u0000t\u0019h�3@\u0000�\u0004\u0000\u0000Y��t\nSj\u0002S�\u0015�3@\u0000�$0@\u0000�\r� @\u0000�\u0001�5$0@\u0000�5(0@\u0000�5 0@\u0000�\u0010�����\f�80@\u00009\u001d,0@\u0000u7P�\u0015� @\u0000�E�\b�\t�M�PQ�\u0003\u0000\u0000YYËe�E�80@\u00003�9\u001d,0@\u0000u\u0007P�\u0015h @\u00009\u001d<0@\u0000u\u0006�\u0015� @\u0000�E������80@\u0000��\u0004\u0000\u0000øMZ\u0000\u0000f9\u0005\u0000\u0000@\u0000t\u00043��M�<\u0000@\u0000��\u0000\u0000@\u0000�8PE\u0000\u0000u�\u000f�H\u0018��\u000b\u0001\u0000\u0000t\u001b��\u000b\u0002\u0000\u0000uՃ��\u0000\u0000\u0000\u000ev�3�9��\u0000\u0000\u0000�\u000e�xt\u000ev�3�9��\u0000\u0000\u0000\u000f����j\u0001�,0@\u0000�\u0015p @\u0000j��\u0015l @\u0000YY��3@\u0000��3@\u0000�\u0015� @\u0000�\rt3@\u0000�\b�\u0015� @\u0000�\rp3@\u0000�\b�� @\u0000�\u0000�x3@\u0000�V\u0002\u0000\u0000�\u0004\u0000\u0000�=\u00140@\u0000\u0000u\fh�\u0017@\u0000�\u0015� @\u0000Y�g\u0004\u0000\u0000�=\u00100@\u0000�u\tj��\u0015� @\u0000Y3���{\u0004\u0000\u0000������U���(\u0003\u0000\u0000�H1@\u0000�\rD1@\u0000�\u0015@1@\u0000�\u001d<1@\u0000�581@\u0000�=41@\u0000f�\u0015`1@\u0000f�\rT1@\u0000f�\u001d01@\u0000f�\u0005,1@\u0000f�%(1@\u0000f�-$1@\u0000��\u0005X1@\u0000�E\u0000�L1@\u0000�E\u0004�P1@\u0000�E\b�\\1@\u0000�������\u0005�0@\u0000\u0001\u0000\u0001\u0000�P1@\u0000�L0@\u0000�\u0005@0@\u0000\t\u0004\u0000��\u0005D0@\u0000\u0001\u0000\u0000\u0000�\u00000@\u0000�������\u00040@\u0000�������\u0015\u001c @\u0000��0@\u0000j\u0001�?\u0004\u0000\u0000Yj\u0000�\u0015  @\u0000h\u001c!@\u0000�\u0015$ @\u0000�=�0@\u0000\u0000u\bj\u0001�\u001b\u0004\u0000\u0000Yh\t\u0004\u0000��\u0015( @\u0000P�\u0015, @\u0000�Ë�U��E\b�\u0000�8csm�u*�x\u0010\u0003u$�@\u0014= \u0005�\u0019t\u0015=!\u0005�\u0019t\u000e=\"\u0005�\u0019t\u0007=\u0000@�\u0001u\u0005��\u0003\u0000\u00003�]�\u0004\u0000hH\u0014@\u0000�\u0015  @\u00003���%� @\u0000j\u0014h(\"@\u0000�b\u0002\u0000\u0000�5�3@\u0000�5� @\u0000��Y�E���u\f�u\b�\u0015� @\u0000Y�gj\b�\u0003\u0000\u0000Y�e�\u0000�5�3@\u0000�։E��5�3@\u0000��YY�E��E�P�E�P�u\b�5l @\u0000��YP�U\u0003\u0000\u0000�E��u��֣�3@\u0000�u��փ�\u0014��3@\u0000�E������\t\u0000\u0000\u0000�E��\u0018\u0002\u0000\u0000�j\b�\u0019\u0003\u0000\u0000YË�U���u\b�N�����\u001b���YH]Ë�V��!@\u0000��!@\u0000W��;�s\u000f�\u0007��t\u0002�Ѓ�\u0004;�r�_^Ë�V�\u0004\"@\u0000�\u0004\"@\u0000W��;�s\u000f�\u0007��t\u0002�Ѓ�\u0004;�r�_^��%� @\u0000���̋�U��M\b�MZ\u0000\u0000f9\u0001t\u00043�]ËA<\u0003��8PE\u0000\u0000u�3ҹ\u000b\u0001\u0000\u0000f9H\u0018\u000f��]�����������̋�U��E\b�H<\u0003�\u000f�A\u0014SV\u000f�q\u00063�W�D\b\u0018��v\u001b�}\f�H\f;�r\t�X\b\u0003�;�r\nB��(;�r�3�_^[]������������̋�U��j�hH\"@\u0000he\u0017@\u0000d�\u0000\u0000\u0000\u0000P��\bSVW�\u00000@\u00001E�3�P�E�d�\u0000\u0000\u0000\u0000�e��E�\u0000\u0000\u0000\u0000h\u0000\u0000@\u0000�*�����\u0004��tU�E\b-\u0000\u0000@\u0000Ph\u0000\u0000@\u0000�P�����\b��t;�@$��\u001f�Ѓ�\u0001�E������M�d�\r\u0000\u0000\u0000\u0000Y_^[��]ËE�\b�\u00013�=\u0005\u0000\u0000�\u000f��Ëe��E�����3��M�d�\r\u0000\u0000\u0000\u0000Y_^[��]���%� @\u0000�%� @\u0000��he\u0017@\u0000d�5\u0000\u0000\u0000\u0000�D$\u0010�l$\u0010�l$\u0010+�SVW�\u00000@\u00001E�3�P�e��u��E��E������E��E�d�\u0000\u0000\u0000\u0000ËM�d�\r\u0000\u0000\u0000\u0000Y__^[��]QË�U���u\u0014�u\u0010�u\f�u\bh�\u0010@\u0000h\u00000@\u0000��\u0000\u0000\u0000��\u0018]Ë�Vh\u0000\u0000\u0003\u0000h\u0000\u0000\u0001\u00003�V��\u0000\u0000\u0000��\f��t\rVVVVV��\u0000\u0000\u0000��\u0014^�3�Ë�U���\u0010�\u00000@\u0000�e�\u0000�e�\u0000SW�N�@��\u0000\u0000��;�t\r��t\t�У\u00040@\u0000�`V�E�P�\u0015< @\u0000�u�3u��\u0015\f @\u00003��\u0015\u0010 @\u00003��\u0015\u0014 @\u00003��E�P�\u0015\u0018 @\u0000�E�3E�3�;�u\u0007�O�@��\u000b��u\u0007����\u0010\u000b��5\u00000@\u0000�։5\u00040@\u0000^_[���%t @\u0000�%x @\u0000�%| @\u0000�%� @\u0000�%� @\u0000�%� @\u0000�%� @\u0000�%� @\u0000�%� @\u0000Pd�5\u0000\u0000\u0000\u0000�D$\f+d$\fSVW�(��\u00000@\u00003�P�E��u��E������E�d�\u0000\u0000\u0000\u0000ËM�d�\r\u0000\u0000\u0000\u0000Y__^[��]QËM�3�����������M��%T @\u0000�T$\b�B\f�J�3������J�3������l\"@\u0000�s���\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000�#\u0000\u0000�#\u0000\u0000�#\u0000\u0000�)\u0000\u0000r)\u0000\u0000b)\u0000\u0000H)\u0000\u00004)\u0000\u0000\u0016)\u0000\u0000�(\u0000\u0000�(\u0000\u0000�(\u0000\u0000�(\u0000\u0000�(\u0000\u0000�(\u0000\u0000�)\u0000\u0000\u0000\u0000\u0000\u0000�#\u0000\u0000�$\u0000\u0000\u001a%\u0000\u0000�%\u0000\u0000\u001a&\u0000\u0000d&\u0000\u0000�&\u0000\u0000�$\u0000\u0000\u0000\u0000\u0000\u0000('\u0000\u0000�'\u0000\u0000�'\u0000\u0000�'\u0000\u0000�'\u0000\u0000\u001e(\u0000\u0000((\u0000\u00006(\u0000\u0000�'\u0000\u0000H(\u0000\u0000Z(\u0000\u0000t(\u0000\u0000�(\u0000\u0000\u001e'\u0000\u0000\u000e'\u0000\u0000\u0000'\u0000\u0000�'\u0000\u0000�'\u0000\u0000l'\u0000\u0000^'\u0000\u0000R'\u0000\u0000F'\u0000\u0000>'\u0000\u0000>(\u0000\u00000'\u0000\u0000�'\u0000\u0000�)\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000�\u0010@\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000W\u0012@\u0000�\u0014@\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000�MoO\u0000\u0000\u0000\u0000\u0002\u0000\u0000\u0000l\u0000\u0000\u0000�!\u0000\u0000�\u000f\u0000\u0000@0@\u0000�0@\u0000bad allocation\u0000\u0000\u0000\u0000\u0000\u0000H\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u00000@\u0000�!@\u0000\u0002\u0000\u0000\u0000RSDSь�\u0010��\u0001J�!���LZ\u0000\u0001\u0000\u0000\u0000c:\\users\\seld\\documents\\visual studio 2010\\Projects\\hiddeninp\\Release\\hiddeninp.pdb\u0000\u0000\u0000\u0000\u0000e\u0017\u0000\u0000�\u0018\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000����\u0000\u0000\u0000\u0000����\u0000\u0000\u0000\u0000����\u0007\u0012@\u0000\u001b\u0012@\u0000\u0000\u0000\u0000\u0000����\u0000\u0000\u0000\u0000����\u0000\u0000\u0000\u0000����\u0000\u0000\u0000\u0000:\u0015@\u0000\u0000\u0000\u0000\u0000����\u0000\u0000\u0000\u0000����\u0000\u0000\u0000\u0000�����\u0016@\u0000�\u0016@\u0000�����\u0018@\u0000\"\u0005�\u0019\u0001\u0000\u0000\u0000d\"@\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000�\"\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000�#\u0000\u0000\u0000 \u0000\u0000$#\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000�&\u0000\u0000D \u0000\u0000H#\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0012(\u0000\u0000h \u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000�#\u0000\u0000�#\u0000\u0000�#\u0000\u0000�)\u0000\u0000r)\u0000\u0000b)\u0000\u0000H)\u0000\u00004)\u0000\u0000\u0016)\u0000\u0000�(\u0000\u0000�(\u0000\u0000�(\u0000\u0000�(\u0000\u0000�(\u0000\u0000�(\u0000\u0000�)\u0000\u0000\u0000\u0000\u0000\u0000�#\u0000\u0000�$\u0000\u0000\u001a%\u0000\u0000�%\u0000\u0000\u001a&\u0000\u0000d&\u0000\u0000�&\u0000\u0000�$\u0000\u0000\u0000\u0000\u0000\u0000('\u0000\u0000�'\u0000\u0000�'\u0000\u0000�'\u0000\u0000�'\u0000\u0000\u001e(\u0000\u0000((\u0000\u00006(\u0000\u0000�'\u0000\u0000H(\u0000\u0000Z(\u0000\u0000t(\u0000\u0000�(\u0000\u0000\u001e'\u0000\u0000\u000e'\u0000\u0000\u0000'\u0000\u0000�'\u0000\u0000�'\u0000\u0000l'\u0000\u0000^'\u0000\u0000R'\u0000\u0000F'\u0000\u0000>'\u0000\u0000>(\u0000\u00000'\u0000\u0000�'\u0000\u0000�)\u0000\u0000\u0000\u0000\u0000\u0000�\u0001GetConsoleMode\u0000\u0000�\u0003SetConsoleMode\u0000\u0000;\u0002GetStdHandle\u0000\u0000KERNEL32.dll\u0000\u0000\u0016\u0000??$?6DU?$char_traits@D@std@@V?$allocator@D@1@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@0@@Z\u0000�\u0006?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A\u0000\u0000J\u0006?cin@std@@3V?$basic_istream@DU?$char_traits@D@std@@@1@A\u0000�\u0000??$getline@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@YAAAV?$basic_istream@DU?$char_traits@D@std@@@0@AAV10@AAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@0@@Z\u0000\u001d\u0003??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAV01@AAV01@@Z@Z\u0000\u0000_\u0002??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ\u0000\u0000{\u0001??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ\u0000\u0000�\u0007?endl@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@1@AAV21@@Z\u0000\u0000MSVCP90.dll\u0000\u0015\u0001_amsg_exit\u0000\u0000�\u0000__getmainargs\u0000,\u0001_cexit\u0000\u0000|\u0001_exit\u0000f\u0000_XcptFilter\u0000�\u0004exit\u0000\u0000�\u0000__initenv\u0000\u0004\u0002_initterm\u0000\u0005\u0002_initterm_e\u0000<\u0001_configthreadlocale\u0000�\u0000__setusermatherr\u0000\u0000\u000b\u0001_adjust_fdiv\u0000\u0000�\u0000__p__commode\u0000\u0000�\u0000__p__fmode\u0000\u0000j\u0001_encode_pointer\u0000�\u0000__set_app_type\u0000\u0000K\u0001_crt_debugger_hook\u0000\u0000C\u0000?terminate@@YAXXZ\u0000MSVCR90.dll\u0000�\u0003_unlock\u0000�\u0000__dllonexit\u0000v\u0002_lock\u0000\u001c\u0003_onexit\u0000`\u0001_decode_pointer\u0000s\u0001_except_handler4_common\u0000\u000b\u0002_invoke_watson\u0000\u0000?\u0001_controlfp_s\u0000\u0000�\u0002InterlockedExchange\u0000!\u0004Sleep\u0000�\u0002InterlockedCompareExchange\u0000\u0000-\u0004TerminateProcess\u0000\u0000�\u0001GetCurrentProcess\u0000>\u0004UnhandledExceptionFilter\u0000\u0000\u0015\u0004SetUnhandledExceptionFilter\u0000�\u0002IsDebuggerPresent\u0000T\u0003QueryPerformanceCounter\u0000f\u0002GetTickCount\u0000\u0000�\u0001GetCurrentThreadId\u0000\u0000�\u0001GetCurrentProcessId\u0000O\u0002GetSystemTimeAsFileTime\u0000s\u0000__CxxFrameHandler3\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000N�@��\u0019�D������������\u0001\u0000\u0000\u0000$!@\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0004\u0000\u0000\u0000\u0000\u0000\u0002\u0000\u0010\u0000\u0000\u0000 \u0000\u0000�\u0018\u0000\u0000\u00008\u0000\u0000�\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0004\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0001\u0000\u0000\u0000P\u0000\u0000�\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0004\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0001\u0000\u0000\u0000h\u0000\u0000�\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0004\u0000\u0000\u0000\u0000\u0000\u0001\u0000\t\u0004\u0000\u0000�\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0004\u0000\u0000\u0000\u0000\u0000\u0001\u0000\t\u0004\u0000\u0000�\u0000\u0000\u0000�@\u0000\u0000(\u0003\u0000\u0000�\u0004\u0000\u0000\u0000\u0000\u0000\u0000�C\u0000\u0000V\u0002\u0000\u0000�\u0004\u0000\u0000\u0000\u0000\u0000\u0000(\u00034\u0000\u0000\u0000V\u0000S\u0000_\u0000V\u0000E\u0000R\u0000S\u0000I\u0000O\u0000N\u0000_\u0000I\u0000N\u0000F\u0000O\u0000\u0000\u0000\u0000\u0000�\u0004��\u0000\u0000\u0001\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0017\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0004\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000�\u0002\u0000\u0000\u0001\u0000S\u0000t\u0000r\u0000i\u0000n\u0000g\u0000F\u0000i\u0000l\u0000e\u0000I\u0000n\u0000f\u0000o\u0000\u0000\u0000b\u0002\u0000\u0000\u0001\u00000\u00004\u00000\u00009\u00000\u00004\u0000b\u00000\u0000\u0000\u0000�\u0000Q\u0000\u0001\u0000F\u0000i\u0000l\u0000e\u0000D\u0000e\u0000s\u0000c\u0000r\u0000i\u0000p\u0000t\u0000i\u0000o\u0000n\u0000\u0000\u0000\u0000\u0000R\u0000e\u0000a\u0000d\u0000s\u0000 \u0000f\u0000r\u0000o\u0000m\u0000 \u0000s\u0000t\u0000d\u0000i\u0000n\u0000 \u0000w\u0000i\u0000t\u0000h\u0000o\u0000u\u0000t\u0000 \u0000l\u0000e\u0000a\u0000k\u0000i\u0000n\u0000g\u0000 \u0000i\u0000n\u0000f\u0000o\u0000 \u0000t\u0000o\u0000 \u0000t\u0000h\u0000e\u0000 \u0000t\u0000e\u0000r\u0000m\u0000i\u0000n\u0000a\u0000l\u0000 \u0000a\u0000n\u0000d\u0000 \u0000o\u0000u\u0000t\u0000p\u0000u\u0000t\u0000s\u0000 \u0000b\u0000a\u0000c\u0000k\u0000 \u0000t\u0000o\u0000 \u0000s\u0000t\u0000d\u0000o\u0000u\u0000t\u0000\u0000\u0000\u0000\u00006\u0000\u000b\u0000\u0001\u0000F\u0000i\u0000l\u0000e\u0000V\u0000e\u0000r\u0000s\u0000i\u0000o\u0000n\u0000\u0000\u0000\u0000\u00001\u0000,\u0000 \u00000\u0000,\u0000 \u00000\u0000,\u0000 \u00000\u0000\u0000\u0000\u0000\u00008\u0000\f\u0000\u0001\u0000I\u0000n\u0000t\u0000e\u0000r\u0000n\u0000a\u0000l\u0000N\u0000a\u0000m\u0000e\u0000\u0000\u0000h\u0000i\u0000d\u0000d\u0000e\u0000n\u0000i\u0000n\u0000p\u0000u\u0000t\u0000\u0000\u0000P\u0000\u0016\u0000\u0001\u0000L\u0000e\u0000g\u0000a\u0000l\u0000C\u0000o\u0000p\u0000y\u0000r\u0000i\u0000g\u0000h\u0000t\u0000\u0000\u0000J\u0000o\u0000r\u0000d\u0000i\u0000 \u0000B\u0000o\u0000g\u0000g\u0000i\u0000a\u0000n\u0000o\u0000 \u0000-\u0000 \u00002\u00000\u00001\u00002\u0000\u0000\u0000H\u0000\u0010\u0000\u0001\u0000O\u0000r\u0000i\u0000g\u0000i\u0000n\u0000a\u0000l\u0000F\u0000i\u0000l\u0000e\u0000n\u0000a\u0000m\u0000e\u0000\u0000\u0000h\u0000i\u0000d\u0000d\u0000e\u0000n\u0000i\u0000n\u0000p\u0000u\u0000t\u0000.\u0000e\u0000x\u0000e\u0000\u0000\u0000:\u0000\r\u0000\u0001\u0000P\u0000r\u0000o\u0000d\u0000u\u0000c\u0000t\u0000N\u0000a\u0000m\u0000e\u0000\u0000\u0000\u0000\u0000H\u0000i\u0000d\u0000d\u0000e\u0000n\u0000 \u0000I\u0000n\u0000p\u0000u\u0000t\u0000\u0000\u0000\u0000\u0000:\u0000\u000b\u0000\u0001\u0000P\u0000r\u0000o\u0000d\u0000u\u0000c\u0000t\u0000V\u0000e\u0000r\u0000s\u0000i\u0000o\u0000n\u0000\u0000\u00001\u0000,\u0000 \u00000\u0000,\u0000 \u00000\u0000,\u0000 \u00000\u0000\u0000\u0000\u0000\u0000D\u0000\u0000\u0000\u0001\u0000V\u0000a\u0000r\u0000F\u0000i\u0000l\u0000e\u0000I\u0000n\u0000f\u0000o\u0000\u0000\u0000\u0000\u0000$\u0000\u0004\u0000\u0000\u0000T\u0000r\u0000a\u0000n\u0000s\u0000l\u0000a\u0000t\u0000i\u0000o\u0000n\u0000\u0000\u0000\u0000\u0000\t\u0004�\u0004<assembly xmlns=\"urn:schemas-microsoft-com:asm.v1\" manifestVersion=\"1.0\">\r\n  <trustInfo xmlns=\"urn:schemas-microsoft-com:asm.v3\">\r\n    <security>\r\n      <requestedPrivileges>\r\n        <requestedExecutionLevel level=\"asInvoker\" uiAccess=\"false\"></requestedExecutionLevel>\r\n      </requestedPrivileges>\r\n    </security>\r\n  </trustInfo>\r\n  <dependency>\r\n    <dependentAssembly>\r\n      <assemblyIdentity type=\"win32\" name=\"Microsoft.VC90.CRT\" version=\"9.0.21022.8\" processorArchitecture=\"x86\" publicKeyToken=\"1fc8b3b9a1e18e3b\"></assemblyIdentity>\r\n    </dependentAssembly>\r\n  </dependency>\r\n</assembly>PAPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDING\u0000\u0010\u0000\u0000@\u0001\u0000\u0000\u00030\u00100!0/080F0L0T0^0d0n0{0�0�0�0�0�0�0�0�0�0�0�0�0�0\b1#1-1@1J1O1T1v1{1�1�1�1�1�1�1�1�1�1�1�1�1�1�1\u00032\"2*23292A2M2_2j2p2�2�2�2�2�2�2�2�2�2�2�2\u000b3\u00133\u00193%303N3T3Z3`3f3l3s3z3�3�3�3�3�3�3�3�3�3�3�3�3�3�3�3�3\u00044\u00144\u00194\u001f4%4;4B4�4�4�4�4�4�4�4�4�4�4\u00145!5^5c5�5�5�5H6M6_6}6�6�6\u00007\u00067\r7*7w7|7�7�7�7�7\u00058\r8\u00198=8E8P8V8\\8b8h8n8t8z8�8�8�8\u00029\u0000\u0000\u0000 \u0000\u0000$\u0000\u0000\u0000�0�0�0\u001c1 1t1x1\u001c2 2@2\\2`2h2t2\u00000\u0000\u0000\f\u0000\u0000\u0000\u00180\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000","vendor/symfony/console/Resources/completion.bash":"# This file is part of the Symfony package.\n#\n# (c) Fabien Potencier <fabien@symfony.com>\n#\n# For the full copyright and license information, please view\n# https://symfony.com/doc/current/contributing/code/license.html\n\n_sf_{{ COMMAND_NAME }}() {\n\n    # Use the default completion for shell redirect operators.\n    for w in '>' '>>' '&>' '<'; do\n        if [[ $w = \"${COMP_WORDS[COMP_CWORD-1]}\" ]]; then\n            compopt -o filenames\n            COMPREPLY=($(compgen -f -- \"${COMP_WORDS[COMP_CWORD]}\"))\n            return 0\n        fi\n    done\n\n    # Use newline as only separator to allow space in completion values\n    local IFS=$'\\n'\n    local sf_cmd=\"${COMP_WORDS[0]}\"\n\n    # for an alias, get the real script behind it\n    sf_cmd_type=$(type -t $sf_cmd)\n    if [[ $sf_cmd_type == \"alias\" ]]; then\n        sf_cmd=$(alias $sf_cmd | sed -E \"s/alias $sf_cmd='(.*)'/\\1/\")\n    elif [[ $sf_cmd_type == \"file\" ]]; then\n        sf_cmd=$(type -p $sf_cmd)\n    fi\n\n    if [[ $sf_cmd_type != \"function\" && ! -x $sf_cmd ]]; then\n        return 1\n    fi\n\n    local cur prev words cword\n    _get_comp_words_by_ref -n := cur prev words cword\n\n    local completecmd=(\"$sf_cmd\" \"_complete\" \"--no-interaction\" \"-sbash\" \"-c$cword\" \"-a{{ VERSION }}\")\n    for w in ${words[@]}; do\n        w=\"${w//\\\\\\\\/\\\\}\"\n        # remove quotes from typed values\n        quote=\"${w:0:1}\"\n        if [ \"$quote\" == \\' ]; then\n            w=\"${w%\\'}\"\n            w=\"${w#\\'}\"\n        elif [ \"$quote\" == \\\" ]; then\n            w=\"${w%\\\"}\"\n            w=\"${w#\\\"}\"\n        fi\n        # empty values are ignored\n        if [ ! -z \"$w\" ]; then\n            completecmd+=(\"-i$w\")\n        fi\n    done\n\n    local sfcomplete\n    if sfcomplete=$(SHELL_VERBOSITY=0 ${completecmd[@]} 2>&1); then\n        local quote suggestions\n        quote=${cur:0:1}\n\n        # Use single quotes by default if suggestions contains backslash (FQCN)\n        if [ \"$quote\" == '' ] && [[ \"$sfcomplete\" =~ \\\\ ]]; then\n            quote=\\'\n        fi\n\n        if [ \"$quote\" == \\' ]; then\n            # single quotes: no additional escaping (does not accept ' in values)\n            suggestions=$(for s in $sfcomplete; do printf $'%q%q%q\\n' \"$quote\" \"$s\" \"$quote\"; done)\n        elif [ \"$quote\" == \\\" ]; then\n            # double quotes: double escaping for \\ $ ` \"\n            suggestions=$(for s in $sfcomplete; do\n                s=${s//\\\\/\\\\\\\\}\n                s=${s//\\$/\\\\\\$}\n                s=${s//\\`/\\\\\\`}\n                s=${s//\\\"/\\\\\\\"}\n                printf $'%q%q%q\\n' \"$quote\" \"$s\" \"$quote\";\n            done)\n        else\n            # no quotes: double escaping\n            suggestions=$(for s in $sfcomplete; do printf $'%q\\n' $(printf '%q' \"$s\"); done)\n        fi\n        COMPREPLY=($(IFS=$'\\n' compgen -W \"$suggestions\" -- $(printf -- \"%q\" \"$cur\")))\n        __ltrim_colon_completions \"$cur\"\n    else\n        if [[ \"$sfcomplete\" != *\"Command \\\"_complete\\\" is not defined.\"* ]]; then\n            >&2 echo\n            >&2 echo $sfcomplete\n        fi\n\n        return 1\n    fi\n}\n\ncomplete -F _sf_{{ COMMAND_NAME }} {{ COMMAND_NAME }}\n","vendor/symfony/console/Resources/completion.fish":"# This file is part of the Symfony package.\n#\n# (c) Fabien Potencier <fabien@symfony.com>\n#\n# For the full copyright and license information, please view\n# https://symfony.com/doc/current/contributing/code/license.html\n\nfunction _sf_{{ COMMAND_NAME }}\n    set sf_cmd (commandline -o)\n    set c (count (commandline -oc))\n\n    set completecmd \"$sf_cmd[1]\" \"_complete\" \"--no-interaction\" \"-sfish\" \"-a{{ VERSION }}\"\n\n    for i in $sf_cmd\n        if [ $i != \"\" ]\n            set completecmd $completecmd \"-i$i\"\n        end\n    end\n\n    set completecmd $completecmd \"-c$c\"\n\n    set sfcomplete (env SHELL_VERBOSITY=0 $completecmd)\n\n    for i in $sfcomplete\n        echo $i\n    end\nend\n\ncomplete -c '{{ COMMAND_NAME }}' -a '(_sf_{{ COMMAND_NAME }})' -f\n","vendor/symfony/console/Resources/completion.zsh":"#compdef {{ COMMAND_NAME }}\n\n# This file is part of the Symfony package.\n#\n# (c) Fabien Potencier <fabien@symfony.com>\n#\n# For the full copyright and license information, please view\n# https://symfony.com/doc/current/contributing/code/license.html\n\n#\n# zsh completions for {{ COMMAND_NAME }}\n#\n# References:\n#   - https://github.com/spf13/cobra/blob/master/zsh_completions.go\n#   - https://github.com/symfony/symfony/blob/5.4/src/Symfony/Component/Console/Resources/completion.bash\n#\n_sf_{{ COMMAND_NAME }}() {\n    local lastParam flagPrefix requestComp out comp\n    local -a completions\n\n    # The user could have moved the cursor backwards on the command-line.\n    # We need to trigger completion from the $CURRENT location, so we need\n    # to truncate the command-line ($words) up to the $CURRENT location.\n    # (We cannot use $CURSOR as its value does not work when a command is an alias.)\n    words=(\"${=words[1,CURRENT]}\") lastParam=${words[-1]}\n\n    # For zsh, when completing a flag with an = (e.g., {{ COMMAND_NAME }} -n=<TAB>)\n    # completions must be prefixed with the flag\n    setopt local_options BASH_REMATCH\n    if [[ \"${lastParam}\" =~ '-.*=' ]]; then\n        # We are dealing with a flag with an =\n        flagPrefix=\"-P ${BASH_REMATCH}\"\n    fi\n\n    # Prepare the command to obtain completions\n    requestComp=\"${words[0]} ${words[1]} _complete --no-interaction -szsh -a{{ VERSION }} -c$((CURRENT-1))\" i=\"\"\n    for w in ${words[@]}; do\n        w=$(printf -- '%b' \"$w\")\n        # remove quotes from typed values\n        quote=\"${w:0:1}\"\n        if [ \"$quote\" = \\' ]; then\n            w=\"${w%\\'}\"\n            w=\"${w#\\'}\"\n        elif [ \"$quote\" = \\\" ]; then\n            w=\"${w%\\\"}\"\n            w=\"${w#\\\"}\"\n        fi\n        # empty values are ignored\n        if [ ! -z \"$w\" ]; then\n            i=\"${i}-i${w} \"\n        fi\n    done\n\n    # Ensure at least 1 input\n    if [ \"${i}\" = \"\" ]; then\n        requestComp=\"${requestComp} -i\\\" \\\"\"\n    else\n        requestComp=\"${requestComp} ${i}\"\n    fi\n\n    # Use eval to handle any environment variables and such\n    out=$(eval SHELL_VERBOSITY=0 ${requestComp} 2>/dev/null)\n\n    while IFS='\\n' read -r comp; do\n        if [ -n \"$comp\" ]; then\n            # If requested, completions are returned with a description.\n            # The description is preceded by a TAB character.\n            # For zsh's _describe, we need to use a : instead of a TAB.\n            # We first need to escape any : as part of the completion itself.\n            comp=${comp//:/\\\\:}\n            local tab=$(printf '\\t')\n            comp=${comp//$tab/:}\n            completions+=${comp}\n        fi\n    done < <(printf \"%s\\n\" \"${out[@]}\")\n\n    # Let inbuilt _describe handle completions\n    eval _describe \"completions\" completions $flagPrefix\n    return $?\n}\n\ncompdef _sf_{{ COMMAND_NAME }} {{ COMMAND_NAME }}\n","vendor/symfony/console/SignalRegistry/SignalMap.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\SignalRegistry;\n\n/**\n * @author Grégoire Pineau <lyrixx@lyrixx.info>\n */\nclass SignalMap\n{\n    private static array $map;\n\n    public static function getSignalName(int $signal): ?string\n    {\n        if (!\\extension_loaded('pcntl')) {\n            return null;\n        }\n\n        if (!isset(self::$map)) {\n            $r = new \\ReflectionExtension('pcntl');\n            $c = $r->getConstants();\n            $map = array_filter($c, static fn ($k) => str_starts_with($k, 'SIG') && !str_starts_with($k, 'SIG_') && 'SIGBABY' !== $k, \\ARRAY_FILTER_USE_KEY);\n            self::$map = array_flip($map);\n        }\n\n        return self::$map[$signal] ?? null;\n    }\n}\n","vendor/symfony/console/SignalRegistry/SignalRegistry.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\SignalRegistry;\n\nfinal class SignalRegistry\n{\n    /**\n     * @var array<int, array<callable>>\n     */\n    private array $signalHandlers = [];\n\n    /**\n     * @var array<array<int, array<callable>>>\n     */\n    private array $stack = [];\n\n    /**\n     * @var array<int, callable|int|string>\n     */\n    private array $originalHandlers = [];\n\n    public function __construct()\n    {\n        if (\\function_exists('pcntl_async_signals')) {\n            pcntl_async_signals(true);\n        }\n    }\n\n    public function register(int $signal, callable $signalHandler): void\n    {\n        $previous = pcntl_signal_get_handler($signal);\n\n        if (!isset($this->originalHandlers[$signal])) {\n            $this->originalHandlers[$signal] = $previous;\n        }\n\n        if (!isset($this->signalHandlers[$signal])) {\n            if (\\is_callable($previous) && [$this, 'handle'] !== $previous) {\n                $this->signalHandlers[$signal][] = $previous;\n            }\n        }\n\n        $this->signalHandlers[$signal][] = $signalHandler;\n\n        pcntl_signal($signal, [$this, 'handle']);\n    }\n\n    public static function isSupported(): bool\n    {\n        return \\function_exists('pcntl_signal');\n    }\n\n    /**\n     * @internal\n     */\n    public function handle(int $signal): void\n    {\n        $count = \\count($this->signalHandlers[$signal]);\n\n        foreach ($this->signalHandlers[$signal] as $i => $signalHandler) {\n            $hasNext = $i !== $count - 1;\n            $signalHandler($signal, $hasNext);\n        }\n    }\n\n    /**\n     * Pushes the current active handlers onto the stack and clears the active list.\n     *\n     * This prepares the registry for a new set of handlers within a specific scope.\n     *\n     * @internal\n     */\n    public function pushCurrentHandlers(): void\n    {\n        // Restore the original OS-level disposition while the active map is empty,\n        // so signals are not routed through handle() without a registered handler.\n        foreach ($this->signalHandlers as $signal => $handlers) {\n            if (isset($this->originalHandlers[$signal])) {\n                pcntl_signal($signal, $this->originalHandlers[$signal]);\n            }\n        }\n\n        $this->stack[] = $this->signalHandlers;\n        $this->signalHandlers = [];\n    }\n\n    /**\n     * Restores the previous handlers from the stack, making them active.\n     *\n     * This also restores the original OS-level signal handler if no\n     * more handlers are registered for a signal that was just popped.\n     *\n     * @internal\n     */\n    public function popPreviousHandlers(): void\n    {\n        $popped = $this->signalHandlers;\n        $previous = array_pop($this->stack) ?? [];\n\n        // Expose a transitional superset so handle() never reads a missing key\n        // if a signal lands while the OS-level handlers below are being swapped.\n        $this->signalHandlers = $previous + $popped;\n\n        // Reinstall the registry handler for signals owned by the restored scope.\n        foreach ($previous as $signal => $handlers) {\n            pcntl_signal($signal, [$this, 'handle']);\n        }\n\n        // Restore the original OS-level handler for signals no scope owns anymore.\n        foreach ($popped as $signal => $handlers) {\n            if (!isset($previous[$signal]) && isset($this->originalHandlers[$signal])) {\n                pcntl_signal($signal, $this->originalHandlers[$signal]);\n            }\n        }\n\n        $this->signalHandlers = $previous;\n    }\n\n    /**\n     * @internal\n     */\n    public function scheduleAlarm(int $seconds): void\n    {\n        pcntl_alarm($seconds);\n    }\n}\n","vendor/symfony/console/SingleCommandApplication.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console;\n\nuse Symfony\\Component\\Console\\Command\\Command;\nuse Symfony\\Component\\Console\\Input\\InputInterface;\nuse Symfony\\Component\\Console\\Output\\OutputInterface;\n\n/**\n * @author Grégoire Pineau <lyrixx@lyrixx.info>\n */\nclass SingleCommandApplication extends Command\n{\n    private string $version = 'UNKNOWN';\n    private bool $autoExit = true;\n    private bool $running = false;\n\n    /**\n     * @return $this\n     */\n    public function setVersion(string $version): static\n    {\n        $this->version = $version;\n\n        return $this;\n    }\n\n    /**\n     * @final\n     *\n     * @return $this\n     */\n    public function setAutoExit(bool $autoExit): static\n    {\n        $this->autoExit = $autoExit;\n\n        return $this;\n    }\n\n    public function run(?InputInterface $input = null, ?OutputInterface $output = null): int\n    {\n        if ($this->running) {\n            return parent::run($input, $output);\n        }\n\n        // We use the command name as the application name\n        $application = new Application($this->getName() ?: 'UNKNOWN', $this->version);\n        $application->setAutoExit($this->autoExit);\n        // Fix the usage of the command displayed with \"--help\"\n        $this->setName($_SERVER['argv'][0]);\n        $application->addCommand($this);\n        $application->setDefaultCommand($this->getName(), true);\n\n        $this->running = true;\n        try {\n            $ret = $application->run($input, $output);\n        } finally {\n            $this->running = false;\n        }\n\n        return $ret;\n    }\n}\n","vendor/symfony/console/Style/OutputStyle.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Style;\n\nuse Symfony\\Component\\Console\\Formatter\\OutputFormatterInterface;\nuse Symfony\\Component\\Console\\Helper\\ProgressBar;\nuse Symfony\\Component\\Console\\Output\\ConsoleOutputInterface;\nuse Symfony\\Component\\Console\\Output\\OutputInterface;\n\n/**\n * Decorates output to add console style guide helpers.\n *\n * @author Kevin Bond <kevinbond@gmail.com>\n */\nabstract class OutputStyle implements OutputInterface, StyleInterface\n{\n    public function __construct(\n        private OutputInterface $output,\n    ) {\n    }\n\n    public function newLine(int $count = 1): void\n    {\n        $this->output->write(str_repeat(\\PHP_EOL, $count));\n    }\n\n    public function createProgressBar(int $max = 0): ProgressBar\n    {\n        return new ProgressBar($this->output, $max);\n    }\n\n    public function write(string|iterable $messages, bool $newline = false, int $type = self::OUTPUT_NORMAL): void\n    {\n        $this->output->write($messages, $newline, $type);\n    }\n\n    public function writeln(string|iterable $messages, int $type = self::OUTPUT_NORMAL): void\n    {\n        $this->output->writeln($messages, $type);\n    }\n\n    public function setVerbosity(int $level): void\n    {\n        $this->output->setVerbosity($level);\n    }\n\n    public function getVerbosity(): int\n    {\n        return $this->output->getVerbosity();\n    }\n\n    public function setDecorated(bool $decorated): void\n    {\n        $this->output->setDecorated($decorated);\n    }\n\n    public function isDecorated(): bool\n    {\n        return $this->output->isDecorated();\n    }\n\n    public function setFormatter(OutputFormatterInterface $formatter): void\n    {\n        $this->output->setFormatter($formatter);\n    }\n\n    public function getFormatter(): OutputFormatterInterface\n    {\n        return $this->output->getFormatter();\n    }\n\n    public function isSilent(): bool\n    {\n        // @deprecated since Symfony 7.2, change to $this->output->isSilent() in 8.0\n        return method_exists($this->output, 'isSilent') ? $this->output->isSilent() : self::VERBOSITY_SILENT === $this->output->getVerbosity();\n    }\n\n    public function isQuiet(): bool\n    {\n        return $this->output->isQuiet();\n    }\n\n    public function isVerbose(): bool\n    {\n        return $this->output->isVerbose();\n    }\n\n    public function isVeryVerbose(): bool\n    {\n        return $this->output->isVeryVerbose();\n    }\n\n    public function isDebug(): bool\n    {\n        return $this->output->isDebug();\n    }\n\n    protected function getErrorOutput(): OutputInterface\n    {\n        if (!$this->output instanceof ConsoleOutputInterface) {\n            return $this->output;\n        }\n\n        return $this->output->getErrorOutput();\n    }\n}\n","vendor/symfony/console/Style/StyleInterface.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Style;\n\n/**\n * Output style helpers.\n *\n * @author Kevin Bond <kevinbond@gmail.com>\n */\ninterface StyleInterface\n{\n    /**\n     * Formats a command title.\n     */\n    public function title(string $message): void;\n\n    /**\n     * Formats a section title.\n     */\n    public function section(string $message): void;\n\n    /**\n     * Formats a list.\n     */\n    public function listing(array $elements): void;\n\n    /**\n     * Formats informational text.\n     */\n    public function text(string|array $message): void;\n\n    /**\n     * Formats a success result bar.\n     */\n    public function success(string|array $message): void;\n\n    /**\n     * Formats an error result bar.\n     */\n    public function error(string|array $message): void;\n\n    /**\n     * Formats an warning result bar.\n     */\n    public function warning(string|array $message): void;\n\n    /**\n     * Formats a note admonition.\n     */\n    public function note(string|array $message): void;\n\n    /**\n     * Formats a caution admonition.\n     */\n    public function caution(string|array $message): void;\n\n    /**\n     * Formats a table.\n     */\n    public function table(array $headers, array $rows): void;\n\n    /**\n     * Asks a question.\n     *\n     * @param (callable(mixed):mixed)|null $validator\n     */\n    public function ask(string $question, ?string $default = null, ?callable $validator = null): mixed;\n\n    /**\n     * Asks a question with the user input hidden.\n     *\n     * @param (callable(mixed):mixed)|null $validator\n     */\n    public function askHidden(string $question, ?callable $validator = null): mixed;\n\n    /**\n     * Asks for confirmation.\n     */\n    public function confirm(string $question, bool $default = true): bool;\n\n    /**\n     * Asks a choice question.\n     */\n    public function choice(string $question, array $choices, mixed $default = null): mixed;\n\n    /**\n     * Add newline(s).\n     */\n    public function newLine(int $count = 1): void;\n\n    /**\n     * Starts the progress output.\n     */\n    public function progressStart(int $max = 0): void;\n\n    /**\n     * Advances the progress output X steps.\n     */\n    public function progressAdvance(int $step = 1): void;\n\n    /**\n     * Finishes the progress output.\n     */\n    public function progressFinish(): void;\n}\n","vendor/symfony/console/Style/SymfonyStyle.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Style;\n\nuse Symfony\\Component\\Console\\Exception\\InvalidArgumentException;\nuse Symfony\\Component\\Console\\Exception\\RuntimeException;\nuse Symfony\\Component\\Console\\Formatter\\OutputFormatter;\nuse Symfony\\Component\\Console\\Helper\\Helper;\nuse Symfony\\Component\\Console\\Helper\\OutputWrapper;\nuse Symfony\\Component\\Console\\Helper\\ProgressBar;\nuse Symfony\\Component\\Console\\Helper\\SymfonyQuestionHelper;\nuse Symfony\\Component\\Console\\Helper\\Table;\nuse Symfony\\Component\\Console\\Helper\\TableCell;\nuse Symfony\\Component\\Console\\Helper\\TableSeparator;\nuse Symfony\\Component\\Console\\Helper\\TreeHelper;\nuse Symfony\\Component\\Console\\Helper\\TreeNode;\nuse Symfony\\Component\\Console\\Helper\\TreeStyle;\nuse Symfony\\Component\\Console\\Input\\InputInterface;\nuse Symfony\\Component\\Console\\Output\\ConsoleOutputInterface;\nuse Symfony\\Component\\Console\\Output\\ConsoleSectionOutput;\nuse Symfony\\Component\\Console\\Output\\OutputInterface;\nuse Symfony\\Component\\Console\\Output\\TrimmedBufferOutput;\nuse Symfony\\Component\\Console\\Question\\ChoiceQuestion;\nuse Symfony\\Component\\Console\\Question\\ConfirmationQuestion;\nuse Symfony\\Component\\Console\\Question\\Question;\nuse Symfony\\Component\\Console\\Terminal;\n\n/**\n * Output decorator helpers for the Symfony Style Guide.\n *\n * @author Kevin Bond <kevinbond@gmail.com>\n */\nclass SymfonyStyle extends OutputStyle\n{\n    public const MAX_LINE_LENGTH = 120;\n\n    private SymfonyQuestionHelper $questionHelper;\n    private ProgressBar $progressBar;\n    private int $lineLength;\n    private TrimmedBufferOutput $bufferedOutput;\n\n    public function __construct(\n        private InputInterface $input,\n        private OutputInterface $output,\n    ) {\n        $this->bufferedOutput = new TrimmedBufferOutput(\\DIRECTORY_SEPARATOR === '\\\\' ? 4 : 2, $output->getVerbosity(), false, clone $output->getFormatter());\n        // Windows cmd wraps lines as soon as the terminal width is reached, whether there are following chars or not.\n        $width = (new Terminal())->getWidth() ?: self::MAX_LINE_LENGTH;\n        $this->lineLength = min($width - (int) (\\DIRECTORY_SEPARATOR === '\\\\'), self::MAX_LINE_LENGTH);\n\n        parent::__construct($output);\n    }\n\n    /**\n     * Formats a message as a block of text.\n     */\n    public function block(string|array $messages, ?string $type = null, ?string $style = null, string $prefix = ' ', bool $padding = false, bool $escape = true): void\n    {\n        $messages = \\is_array($messages) ? array_values($messages) : [$messages];\n\n        $this->autoPrependBlock();\n        $this->writeln($this->createBlock($messages, $type, $style, $prefix, $padding, $escape));\n        $this->newLine();\n    }\n\n    public function title(string $message): void\n    {\n        $this->autoPrependBlock();\n        $this->writeln([\n            \\sprintf('<comment>%s</>', OutputFormatter::escapeTrailingBackslash($message)),\n            \\sprintf('<comment>%s</>', str_repeat('=', Helper::width(Helper::removeDecoration($this->getFormatter(), $message)))),\n        ]);\n        $this->newLine();\n    }\n\n    public function section(string $message): void\n    {\n        $this->autoPrependBlock();\n        $this->writeln([\n            \\sprintf('<comment>%s</>', OutputFormatter::escapeTrailingBackslash($message)),\n            \\sprintf('<comment>%s</>', str_repeat('-', Helper::width(Helper::removeDecoration($this->getFormatter(), $message)))),\n        ]);\n        $this->newLine();\n    }\n\n    public function listing(array $elements): void\n    {\n        $this->autoPrependText();\n        $elements = array_map(static fn ($element) => \\sprintf(' * %s', $element), $elements);\n\n        $this->writeln($elements);\n        $this->newLine();\n    }\n\n    public function text(string|array $message): void\n    {\n        $this->autoPrependText();\n\n        $messages = \\is_array($message) ? array_values($message) : [$message];\n        foreach ($messages as $message) {\n            $this->writeln(\\sprintf(' %s', $message));\n        }\n    }\n\n    /**\n     * Formats a command comment.\n     */\n    public function comment(string|array $message): void\n    {\n        $this->block($message, null, null, '<fg=default;bg=default> // </>', false, false);\n    }\n\n    public function success(string|array $message): void\n    {\n        $this->block($message, 'OK', 'fg=black;bg=green', ' ', true);\n    }\n\n    public function error(string|array $message): void\n    {\n        $this->block($message, 'ERROR', 'fg=white;bg=red', ' ', true);\n    }\n\n    public function warning(string|array $message): void\n    {\n        $this->block($message, 'WARNING', 'fg=black;bg=yellow', ' ', true);\n    }\n\n    public function note(string|array $message): void\n    {\n        $this->block($message, 'NOTE', 'fg=yellow', ' ! ');\n    }\n\n    /**\n     * Formats an info message.\n     */\n    public function info(string|array $message): void\n    {\n        $this->block($message, 'INFO', 'fg=green', ' ', true);\n    }\n\n    public function caution(string|array $message): void\n    {\n        $this->block($message, 'CAUTION', 'fg=white;bg=red', ' ! ', true);\n    }\n\n    public function table(array $headers, array $rows): void\n    {\n        $this->createTable()\n            ->setHeaders($headers)\n            ->setRows($rows)\n            ->render()\n        ;\n\n        $this->newLine();\n    }\n\n    /**\n     * Formats a horizontal table.\n     */\n    public function horizontalTable(array $headers, array $rows): void\n    {\n        $this->createTable()\n            ->setHorizontal(true)\n            ->setHeaders($headers)\n            ->setRows($rows)\n            ->render()\n        ;\n\n        $this->newLine();\n    }\n\n    /**\n     * Formats a list of key/value horizontally.\n     *\n     * Each row can be one of:\n     * * 'A title'\n     * * ['key' => 'value']\n     * * new TableSeparator()\n     */\n    public function definitionList(string|array|TableSeparator ...$list): void\n    {\n        $headers = [];\n        $row = [];\n        foreach ($list as $value) {\n            if ($value instanceof TableSeparator) {\n                $headers[] = $value;\n                $row[] = $value;\n                continue;\n            }\n            if (\\is_string($value)) {\n                $headers[] = new TableCell($value, ['colspan' => 2]);\n                $row[] = null;\n                continue;\n            }\n            if (!\\is_array($value)) {\n                throw new InvalidArgumentException('Value should be an array, string, or an instance of TableSeparator.');\n            }\n            $headers[] = key($value);\n            $row[] = current($value);\n        }\n\n        $this->horizontalTable($headers, [$row]);\n    }\n\n    public function ask(string $question, ?string $default = null, ?callable $validator = null): mixed\n    {\n        $question = new Question($question, $default);\n        $question->setValidator($validator);\n\n        return $this->askQuestion($question);\n    }\n\n    public function askHidden(string $question, ?callable $validator = null): mixed\n    {\n        $question = new Question($question);\n\n        $question->setHidden(true);\n        $question->setValidator($validator);\n\n        return $this->askQuestion($question);\n    }\n\n    public function confirm(string $question, bool $default = true): bool\n    {\n        return $this->askQuestion(new ConfirmationQuestion($question, $default));\n    }\n\n    public function choice(string $question, array $choices, mixed $default = null, bool $multiSelect = false): mixed\n    {\n        if (null !== $default) {\n            $values = array_flip($choices);\n            $default = $values[$default] ?? $default;\n        }\n\n        $questionChoice = new ChoiceQuestion($question, $choices, $default);\n        $questionChoice->setMultiselect($multiSelect);\n\n        return $this->askQuestion($questionChoice);\n    }\n\n    public function progressStart(int $max = 0): void\n    {\n        $this->progressBar = $this->createProgressBar($max);\n        $this->progressBar->start();\n    }\n\n    public function progressAdvance(int $step = 1): void\n    {\n        $this->getProgressBar()->advance($step);\n    }\n\n    public function progressFinish(): void\n    {\n        $this->getProgressBar()->finish();\n        $this->newLine(2);\n        unset($this->progressBar);\n    }\n\n    public function createProgressBar(int $max = 0): ProgressBar\n    {\n        $progressBar = parent::createProgressBar($max);\n\n        if ('\\\\' !== \\DIRECTORY_SEPARATOR || 'Hyper' === getenv('TERM_PROGRAM')) {\n            $progressBar->setEmptyBarCharacter('░'); // light shade character \\u2591\n            $progressBar->setProgressCharacter('');\n            $progressBar->setBarCharacter('▓'); // dark shade character \\u2593\n        }\n\n        return $progressBar;\n    }\n\n    /**\n     * @see ProgressBar::iterate()\n     *\n     * @template TKey\n     * @template TValue\n     *\n     * @param iterable<TKey, TValue> $iterable\n     * @param int|null               $max      Number of steps to complete the bar (0 if indeterminate), if null it will be inferred from $iterable\n     *\n     * @return iterable<TKey, TValue>\n     */\n    public function progressIterate(iterable $iterable, ?int $max = null): iterable\n    {\n        yield from $this->createProgressBar()->iterate($iterable, $max);\n\n        $this->newLine(2);\n    }\n\n    public function askQuestion(Question $question): mixed\n    {\n        if ($this->input->isInteractive()) {\n            $this->autoPrependBlock();\n        }\n\n        $this->questionHelper ??= new SymfonyQuestionHelper();\n\n        $answer = $this->questionHelper->ask($this->input, $this, $question);\n\n        if ($this->input->isInteractive()) {\n            if ($this->output instanceof ConsoleSectionOutput) {\n                // add the new line of the `return` to submit the input to ConsoleSectionOutput, because ConsoleSectionOutput is holding all it's lines.\n                // this is relevant when a `ConsoleSectionOutput::clear` is called.\n                // the section already renders the prompt as a whole line, so an extra\n                // newLine() here would leave a doubled blank line below the answer; only\n                // keep the buffer in sync so autoPrependBlock() spaces the next block.\n                $this->output->addNewLineOfInputSubmit();\n                $this->bufferedOutput->write(\"\\n\\n\");\n            } else {\n                $this->newLine();\n                $this->bufferedOutput->write(\"\\n\");\n            }\n        }\n\n        return $answer;\n    }\n\n    public function writeln(string|iterable $messages, int $type = self::OUTPUT_NORMAL): void\n    {\n        if (!is_iterable($messages)) {\n            $messages = [$messages];\n        }\n\n        foreach ($messages as $message) {\n            parent::writeln($message, $type);\n            $this->writeBuffer($message, true, $type);\n        }\n    }\n\n    public function write(string|iterable $messages, bool $newline = false, int $type = self::OUTPUT_NORMAL): void\n    {\n        if (!is_iterable($messages)) {\n            $messages = [$messages];\n        }\n\n        foreach ($messages as $message) {\n            parent::write($message, $newline, $type);\n            $this->writeBuffer($message, $newline, $type);\n        }\n    }\n\n    public function newLine(int $count = 1): void\n    {\n        parent::newLine($count);\n        $this->bufferedOutput->write(str_repeat(\"\\n\", $count));\n    }\n\n    /**\n     * Returns a new instance which makes use of stderr if available.\n     */\n    public function getErrorStyle(): self\n    {\n        return new self($this->input, $this->getErrorOutput());\n    }\n\n    public function createTable(): Table\n    {\n        $output = $this->output instanceof ConsoleOutputInterface ? $this->output->section() : $this->output;\n        $style = clone Table::getStyleDefinition('symfony-style-guide');\n        $style->setCellHeaderFormat('<info>%s</info>');\n\n        return (new Table($output))->setStyle($style);\n    }\n\n    private function getProgressBar(): ProgressBar\n    {\n        return $this->progressBar\n            ?? throw new RuntimeException('The ProgressBar is not started.');\n    }\n\n    /**\n     * @param iterable<string, iterable|string|TreeNode> $nodes\n     */\n    public function tree(iterable $nodes, string $root = ''): void\n    {\n        $this->createTree($nodes, $root)->render();\n    }\n\n    /**\n     * @param iterable<string, iterable|string|TreeNode> $nodes\n     */\n    public function createTree(iterable $nodes, string $root = ''): TreeHelper\n    {\n        $output = $this->output instanceof ConsoleOutputInterface ? $this->output->section() : $this->output;\n\n        return TreeHelper::createTree($output, $root, $nodes, TreeStyle::default());\n    }\n\n    private function autoPrependBlock(): void\n    {\n        $chars = substr(str_replace(\\PHP_EOL, \"\\n\", $this->bufferedOutput->fetch()), -2);\n\n        if (!isset($chars[0])) {\n            $this->newLine(); // empty history, so we should start with a new line.\n\n            return;\n        }\n        // Prepend new line for each non LF chars (This means no blank line was output before)\n        $this->newLine(2 - substr_count($chars, \"\\n\"));\n    }\n\n    private function autoPrependText(): void\n    {\n        $fetched = $this->bufferedOutput->fetch();\n        // Prepend new line if last char isn't EOL:\n        if ($fetched && !str_ends_with($fetched, \"\\n\")) {\n            $this->newLine();\n        }\n    }\n\n    private function writeBuffer(string $message, bool $newLine, int $type): void\n    {\n        // We need to know if the last chars are PHP_EOL\n        $this->bufferedOutput->write($message, $newLine, $type);\n    }\n\n    private function createBlock(iterable $messages, ?string $type = null, ?string $style = null, string $prefix = ' ', bool $padding = false, bool $escape = false): array\n    {\n        $indentLength = 0;\n        $prefixLength = Helper::width(Helper::removeDecoration($this->getFormatter(), $prefix));\n        $lines = [];\n\n        if (null !== $type) {\n            $type = \\sprintf('[%s] ', $type);\n            $indentLength = Helper::width($type);\n            $lineIndentation = str_repeat(' ', $indentLength);\n        }\n\n        // wrap and add newlines for each element\n        $outputWrapper = new OutputWrapper();\n        foreach ($messages as $key => $message) {\n            if ($escape) {\n                $message = OutputFormatter::escape($message);\n            }\n\n            $message = str_replace(\"\\r\\n\", \"\\n\", $message);\n\n            $lines = array_merge(\n                $lines,\n                explode(\"\\n\", $outputWrapper->wrap(\n                    $message,\n                    $this->lineLength - $prefixLength - $indentLength,\n                    \"\\n\"\n                ))\n            );\n\n            if (\\count($messages) > 1 && $key < \\count($messages) - 1) {\n                $lines[] = '';\n            }\n        }\n\n        $firstLineIndex = 0;\n        if ($padding && $this->isDecorated()) {\n            $firstLineIndex = 1;\n            array_unshift($lines, '');\n            $lines[] = '';\n        }\n\n        foreach ($lines as $i => &$line) {\n            if (null !== $type) {\n                $line = $firstLineIndex === $i ? $type.$line : $lineIndentation.$line;\n            }\n\n            $line = $prefix.$line;\n            $line .= str_repeat(' ', max($this->lineLength - Helper::width(Helper::removeDecoration($this->getFormatter(), $line)), 0));\n\n            if ($style) {\n                $line = \\sprintf('<%s>%s</>', $style, $line);\n            }\n        }\n\n        return $lines;\n    }\n}\n","vendor/symfony/console/Terminal.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console;\n\nuse Symfony\\Component\\Console\\Output\\AnsiColorMode;\n\nclass Terminal\n{\n    public const DEFAULT_COLOR_MODE = AnsiColorMode::Ansi4;\n\n    private static ?AnsiColorMode $colorMode = null;\n    private static ?int $width = null;\n    private static ?int $height = null;\n    private static ?bool $stty = null;\n\n    /**\n     * About Ansi color types: https://en.wikipedia.org/wiki/ANSI_escape_code#Colors\n     * For more information about true color support with terminals https://github.com/termstandard/colors/.\n     */\n    public static function getColorMode(): AnsiColorMode\n    {\n        // Use Cache from previous run (or user forced mode)\n        if (null !== self::$colorMode) {\n            return self::$colorMode;\n        }\n\n        // Try with $COLORTERM first\n        if (\\is_string($colorterm = getenv('COLORTERM'))) {\n            $colorterm = strtolower($colorterm);\n\n            if (str_contains($colorterm, 'truecolor')) {\n                self::setColorMode(AnsiColorMode::Ansi24);\n\n                return self::$colorMode;\n            }\n\n            if (str_contains($colorterm, '256color')) {\n                self::setColorMode(AnsiColorMode::Ansi8);\n\n                return self::$colorMode;\n            }\n        }\n\n        // Try with $TERM\n        if (\\is_string($term = getenv('TERM'))) {\n            $term = strtolower($term);\n\n            if (str_contains($term, 'truecolor')) {\n                self::setColorMode(AnsiColorMode::Ansi24);\n\n                return self::$colorMode;\n            }\n\n            if (str_contains($term, '256color')) {\n                self::setColorMode(AnsiColorMode::Ansi8);\n\n                return self::$colorMode;\n            }\n        }\n\n        self::setColorMode(self::DEFAULT_COLOR_MODE);\n\n        return self::$colorMode;\n    }\n\n    /**\n     * Force a terminal color mode rendering.\n     */\n    public static function setColorMode(?AnsiColorMode $colorMode): void\n    {\n        self::$colorMode = $colorMode;\n    }\n\n    /**\n     * Gets the terminal width.\n     */\n    public function getWidth(): int\n    {\n        $width = getenv('COLUMNS');\n        if (false !== $width) {\n            return (int) trim($width);\n        }\n\n        if (null === self::$width) {\n            self::initDimensions();\n        }\n\n        return self::$width ?: 80;\n    }\n\n    /**\n     * Gets the terminal height.\n     */\n    public function getHeight(): int\n    {\n        $height = getenv('LINES');\n        if (false !== $height) {\n            return (int) trim($height);\n        }\n\n        if (null === self::$height) {\n            self::initDimensions();\n        }\n\n        return self::$height ?: 50;\n    }\n\n    /**\n     * @internal\n     */\n    public static function hasSttyAvailable(): bool\n    {\n        if (null !== self::$stty) {\n            return self::$stty;\n        }\n\n        // skip check if shell_exec function is disabled\n        if (!\\function_exists('shell_exec')) {\n            return false;\n        }\n\n        return self::$stty = (bool) @shell_exec('stty 2> '.('\\\\' === \\DIRECTORY_SEPARATOR ? 'NUL' : '/dev/null'));\n    }\n\n    private static function initDimensions(): void\n    {\n        if ('\\\\' === \\DIRECTORY_SEPARATOR) {\n            $ansicon = getenv('ANSICON');\n            if (false !== $ansicon && preg_match('/^(\\d+)x(\\d+)(?: \\((\\d+)x(\\d+)\\))?$/', trim($ansicon), $matches)) {\n                // extract [w, H] from \"wxh (WxH)\"\n                // or [w, h] from \"wxh\"\n                self::$width = (int) $matches[1];\n                self::$height = isset($matches[4]) ? (int) $matches[4] : (int) $matches[2];\n            } elseif (!sapi_windows_vt100_support(fopen('php://stdout', 'w')) && self::hasSttyAvailable()) {\n                // only use stty on Windows if the terminal does not support vt100 (e.g. Windows 7 + git-bash)\n                // testing for stty in a Windows 10 vt100-enabled console will implicitly disable vt100 support on STDOUT\n                self::initDimensionsUsingStty();\n            } elseif (null !== $dimensions = self::getConsoleMode()) {\n                // extract [w, h] from \"wxh\"\n                self::$width = (int) $dimensions[0];\n                self::$height = (int) $dimensions[1];\n            }\n        } else {\n            self::initDimensionsUsingStty();\n        }\n    }\n\n    /**\n     * Initializes dimensions using the output of an stty columns line.\n     */\n    private static function initDimensionsUsingStty(): void\n    {\n        if ($sttyString = self::getSttyColumns()) {\n            if (preg_match('/rows.(\\d+);.columns.(\\d+);/is', $sttyString, $matches)) {\n                // extract [w, h] from \"rows h; columns w;\"\n                self::$width = (int) $matches[2];\n                self::$height = (int) $matches[1];\n            } elseif (preg_match('/;.(\\d+).rows;.(\\d+).columns/is', $sttyString, $matches)) {\n                // extract [w, h] from \"; h rows; w columns\"\n                self::$width = (int) $matches[2];\n                self::$height = (int) $matches[1];\n            }\n        }\n    }\n\n    /**\n     * Runs and parses mode CON if it's available, suppressing any error output.\n     *\n     * @return int[]|null An array composed of the width and the height or null if it could not be parsed\n     */\n    private static function getConsoleMode(): ?array\n    {\n        $info = self::readFromProcess('mode CON');\n\n        if (null === $info || !preg_match('/--------+\\r?\\n.+?(\\d+)\\r?\\n.+?(\\d+)\\r?\\n/', $info, $matches)) {\n            return null;\n        }\n\n        return [(int) $matches[2], (int) $matches[1]];\n    }\n\n    /**\n     * Runs and parses stty -a if it's available, suppressing any error output.\n     */\n    private static function getSttyColumns(): ?string\n    {\n        return self::readFromProcess(['stty', '-a']);\n    }\n\n    private static function readFromProcess(string|array $command): ?string\n    {\n        if (!\\function_exists('proc_open')) {\n            return null;\n        }\n\n        $descriptorspec = [\n            1 => ['pipe', 'w'],\n            2 => ['pipe', 'w'],\n        ];\n\n        $cp = \\function_exists('sapi_windows_cp_set') ? sapi_windows_cp_get() : 0;\n\n        if (!$process = @proc_open($command, $descriptorspec, $pipes, null, null, ['suppress_errors' => true])) {\n            return null;\n        }\n\n        $info = stream_get_contents($pipes[1]);\n        fclose($pipes[1]);\n        fclose($pipes[2]);\n        proc_close($process);\n\n        if ($cp) {\n            sapi_windows_cp_set($cp);\n        }\n\n        return $info;\n    }\n}\n","vendor/symfony/console/Tester/ApplicationTester.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Tester;\n\nuse Symfony\\Component\\Console\\Application;\nuse Symfony\\Component\\Console\\Input\\ArrayInput;\n\n/**\n * Eases the testing of console applications.\n *\n * When testing an application, don't forget to disable the auto exit flag:\n *\n *     $application = new Application();\n *     $application->setAutoExit(false);\n *\n * @author Fabien Potencier <fabien@symfony.com>\n */\nclass ApplicationTester\n{\n    use TesterTrait;\n\n    public function __construct(\n        private Application $application,\n    ) {\n    }\n\n    /**\n     * Executes the application.\n     *\n     * Available options:\n     *\n     *  * interactive:               Sets the input interactive flag\n     *  * decorated:                 Sets the output decorated flag\n     *  * verbosity:                 Sets the output verbosity flag\n     *  * capture_stderr_separately: Make output of stdOut and stdErr separately available\n     *\n     * @return int The command exit code\n     */\n    public function run(array $input, array $options = []): int\n    {\n        $this->input = new ArrayInput($input);\n        if (isset($options['interactive'])) {\n            $this->input->setInteractive($options['interactive']);\n        }\n\n        if ($this->inputs) {\n            $this->input->setStream(self::createStream($this->inputs));\n        }\n\n        $this->initOutput($options);\n\n        // Temporarily clear SHELL_VERBOSITY to prevent Application::configureIO\n        // from overriding the interactive and verbosity settings set above\n        $prevShellVerbosity = [getenv('SHELL_VERBOSITY'), $_ENV['SHELL_VERBOSITY'] ?? false, $_SERVER['SHELL_VERBOSITY'] ?? false];\n        if (\\function_exists('putenv')) {\n            @putenv('SHELL_VERBOSITY');\n        }\n        unset($_ENV['SHELL_VERBOSITY'], $_SERVER['SHELL_VERBOSITY']);\n\n        try {\n            return $this->statusCode = $this->application->run($this->input, $this->output);\n        } finally {\n            if (false !== $prevShellVerbosity[0]) {\n                if (\\function_exists('putenv')) {\n                    @putenv('SHELL_VERBOSITY='.$prevShellVerbosity[0]);\n                }\n            }\n            if (false !== $prevShellVerbosity[1]) {\n                $_ENV['SHELL_VERBOSITY'] = $prevShellVerbosity[1];\n            }\n            if (false !== $prevShellVerbosity[2]) {\n                $_SERVER['SHELL_VERBOSITY'] = $prevShellVerbosity[2];\n            }\n        }\n    }\n}\n","vendor/symfony/console/Tester/CommandCompletionTester.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Tester;\n\nuse Symfony\\Component\\Console\\Command\\Command;\nuse Symfony\\Component\\Console\\Completion\\CompletionInput;\nuse Symfony\\Component\\Console\\Completion\\CompletionSuggestions;\n\n/**\n * Eases the testing of command completion.\n *\n * @author Jérôme Tamarelle <jerome@tamarelle.net>\n */\nclass CommandCompletionTester\n{\n    public function __construct(\n        private Command $command,\n    ) {\n    }\n\n    /**\n     * Create completion suggestions from input tokens.\n     */\n    public function complete(array $input): array\n    {\n        $currentIndex = \\count($input);\n        if ('' === end($input)) {\n            array_pop($input);\n        }\n        array_unshift($input, $this->command->getName());\n\n        $completionInput = CompletionInput::fromTokens($input, $currentIndex);\n        $completionInput->bind($this->command->getDefinition());\n        $suggestions = new CompletionSuggestions();\n\n        $this->command->complete($completionInput, $suggestions);\n\n        $options = [];\n        foreach ($suggestions->getOptionSuggestions() as $option) {\n            $options[] = '--'.$option->getName();\n        }\n\n        return array_map('strval', array_merge($options, $suggestions->getValueSuggestions()));\n    }\n}\n","vendor/symfony/console/Tester/CommandTester.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Tester;\n\nuse Symfony\\Component\\Console\\Command\\Command;\nuse Symfony\\Component\\Console\\Input\\ArrayInput;\n\n/**\n * Eases the testing of console commands.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n * @author Robin Chalas <robin.chalas@gmail.com>\n */\nclass CommandTester\n{\n    use TesterTrait;\n\n    private Command $command;\n\n    public function __construct(\n        callable|Command $command,\n    ) {\n        $this->command = $command instanceof Command ? $command : new Command(null, $command);\n    }\n\n    /**\n     * Executes the command.\n     *\n     * Available execution options:\n     *\n     *  * interactive:               Sets the input interactive flag\n     *  * decorated:                 Sets the output decorated flag\n     *  * verbosity:                 Sets the output verbosity flag\n     *  * capture_stderr_separately: Make output of stdOut and stdErr separately available\n     *\n     * @param array $input   An array of command arguments and options\n     * @param array $options An array of execution options\n     *\n     * @return int The command exit code\n     */\n    public function execute(array $input, array $options = []): int\n    {\n        // set the command name automatically if the application requires\n        // this argument and no command name was passed\n        if (!isset($input['command'])\n            && (null !== $application = $this->command->getApplication())\n            && $application->getDefinition()->hasArgument('command')\n        ) {\n            $input = array_merge(['command' => $this->command->getName()], $input);\n        }\n\n        $this->input = new ArrayInput($input);\n        // Use an in-memory input stream even if no inputs are set so that QuestionHelper::ask() does not rely on the blocking STDIN.\n        $this->input->setStream(self::createStream($this->inputs));\n\n        if (isset($options['interactive'])) {\n            $this->input->setInteractive($options['interactive']);\n        }\n\n        if (!isset($options['decorated'])) {\n            $options['decorated'] = false;\n        }\n\n        $this->initOutput($options);\n\n        return $this->statusCode = $this->command->run($this->input, $this->output);\n    }\n}\n","vendor/symfony/console/Tester/Constraint/CommandIsSuccessful.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Tester\\Constraint;\n\nuse PHPUnit\\Framework\\Constraint\\Constraint;\nuse Symfony\\Component\\Console\\Command\\Command;\n\nfinal class CommandIsSuccessful extends Constraint\n{\n    public function toString(): string\n    {\n        return 'is successful';\n    }\n\n    protected function matches($other): bool\n    {\n        return Command::SUCCESS === $other;\n    }\n\n    protected function failureDescription($other): string\n    {\n        return 'the command '.$this->toString();\n    }\n\n    protected function additionalFailureDescription($other): string\n    {\n        $mapping = [\n            Command::FAILURE => 'Command failed.',\n            Command::INVALID => 'Command was invalid.',\n        ];\n\n        return $mapping[$other] ?? \\sprintf('Command returned exit status %d.', $other);\n    }\n}\n","vendor/symfony/console/Tester/TesterTrait.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Console\\Tester;\n\nuse PHPUnit\\Framework\\Assert;\nuse Symfony\\Component\\Console\\Input\\InputInterface;\nuse Symfony\\Component\\Console\\Output\\ConsoleOutput;\nuse Symfony\\Component\\Console\\Output\\OutputInterface;\nuse Symfony\\Component\\Console\\Output\\StreamOutput;\nuse Symfony\\Component\\Console\\Tester\\Constraint\\CommandIsSuccessful;\n\n/**\n * @author Amrouche Hamza <hamza.simperfit@gmail.com>\n */\ntrait TesterTrait\n{\n    private StreamOutput $output;\n\n    /**\n     * @var list<string>\n     */\n    private array $inputs = [];\n    private bool $captureStreamsIndependently = false;\n    private InputInterface $input;\n    private int $statusCode;\n\n    /**\n     * Gets the display returned by the last execution of the command or application.\n     *\n     * @throws \\RuntimeException If it's called before the execute method\n     */\n    public function getDisplay(bool $normalize = false): string\n    {\n        if (!isset($this->output)) {\n            throw new \\RuntimeException('Output not initialized, did you execute the command before requesting the display?');\n        }\n\n        rewind($this->output->getStream());\n\n        $display = stream_get_contents($this->output->getStream());\n\n        if ($normalize) {\n            $display = str_replace(\\PHP_EOL, \"\\n\", $display);\n        }\n\n        return $display;\n    }\n\n    /**\n     * Gets the output written to STDERR by the application.\n     *\n     * @param bool $normalize Whether to normalize end of lines to \\n or not\n     */\n    public function getErrorOutput(bool $normalize = false): string\n    {\n        if (!$this->captureStreamsIndependently) {\n            throw new \\LogicException('The error output is not available when the tester is run without \"capture_stderr_separately\" option set.');\n        }\n\n        rewind($this->output->getErrorOutput()->getStream());\n\n        $display = stream_get_contents($this->output->getErrorOutput()->getStream());\n\n        if ($normalize) {\n            $display = str_replace(\\PHP_EOL, \"\\n\", $display);\n        }\n\n        return $display;\n    }\n\n    /**\n     * Gets the input instance used by the last execution of the command or application.\n     */\n    public function getInput(): InputInterface\n    {\n        return $this->input;\n    }\n\n    /**\n     * Gets the output instance used by the last execution of the command or application.\n     */\n    public function getOutput(): OutputInterface\n    {\n        return $this->output;\n    }\n\n    /**\n     * Gets the status code returned by the last execution of the command or application.\n     *\n     * @throws \\RuntimeException If it's called before the execute method\n     */\n    public function getStatusCode(): int\n    {\n        return $this->statusCode ?? throw new \\RuntimeException('Status code not initialized, did you execute the command before requesting the status code?');\n    }\n\n    public function assertCommandIsSuccessful(string $message = ''): void\n    {\n        Assert::assertThat($this->statusCode, new CommandIsSuccessful(), $message);\n    }\n\n    /**\n     * Sets the user inputs.\n     *\n     * @param list<string> $inputs An array of strings representing each input\n     *                             passed to the command input stream\n     *\n     * @return $this\n     */\n    public function setInputs(array $inputs): static\n    {\n        $this->inputs = $inputs;\n\n        return $this;\n    }\n\n    /**\n     * Initializes the output property.\n     *\n     * Available options:\n     *\n     *  * decorated:                 Sets the output decorated flag\n     *  * verbosity:                 Sets the output verbosity flag\n     *  * capture_stderr_separately: Make output of stdOut and stdErr separately available\n     */\n    private function initOutput(array $options): void\n    {\n        $this->captureStreamsIndependently = $options['capture_stderr_separately'] ?? false;\n        if (!$this->captureStreamsIndependently) {\n            $this->output = new StreamOutput(fopen('php://memory', 'w', false));\n            if (isset($options['decorated'])) {\n                $this->output->setDecorated($options['decorated']);\n            }\n            if (isset($options['verbosity'])) {\n                $this->output->setVerbosity($options['verbosity']);\n            }\n        } else {\n            $this->output = new ConsoleOutput(\n                $options['verbosity'] ?? ConsoleOutput::VERBOSITY_NORMAL,\n                $options['decorated'] ?? null\n            );\n\n            $errorOutput = new StreamOutput(fopen('php://memory', 'w', false));\n            $errorOutput->setFormatter($this->output->getFormatter());\n            $errorOutput->setVerbosity($this->output->getVerbosity());\n            $errorOutput->setDecorated($this->output->isDecorated());\n\n            $reflectedOutput = new \\ReflectionObject($this->output);\n            $strErrProperty = $reflectedOutput->getProperty('stderr');\n            $strErrProperty->setValue($this->output, $errorOutput);\n\n            $reflectedParent = $reflectedOutput->getParentClass();\n            $streamProperty = $reflectedParent->getProperty('stream');\n            $streamProperty->setValue($this->output, fopen('php://memory', 'w', false));\n        }\n    }\n\n    /**\n     * @param list<string> $inputs\n     *\n     * @return resource\n     */\n    private static function createStream(array $inputs)\n    {\n        $stream = fopen('php://memory', 'r+', false);\n\n        foreach ($inputs as $input) {\n            fwrite($stream, $input);\n\n            if (!str_ends_with($input, \"\\x4\")) {\n                fwrite($stream, \\PHP_EOL);\n            }\n        }\n\n        rewind($stream);\n\n        return $stream;\n    }\n}\n","vendor/symfony/console/composer.json":"{\n    \"name\": \"symfony/console\",\n    \"type\": \"library\",\n    \"description\": \"Eases the creation of beautiful and testable command line interfaces\",\n    \"keywords\": [\"console\", \"cli\", \"command-line\", \"terminal\"],\n    \"homepage\": \"https://symfony.com\",\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"Fabien Potencier\",\n            \"email\": \"fabien@symfony.com\"\n        },\n        {\n            \"name\": \"Symfony Community\",\n            \"homepage\": \"https://symfony.com/contributors\"\n        }\n    ],\n    \"require\": {\n        \"php\": \">=8.2\",\n        \"symfony/deprecation-contracts\": \"^2.5|^3\",\n        \"symfony/polyfill-mbstring\": \"~1.0\",\n        \"symfony/service-contracts\": \"^2.5|^3\",\n        \"symfony/string\": \"^7.2|^8.0\"\n    },\n    \"require-dev\": {\n        \"symfony/config\": \"^6.4|^7.0|^8.0\",\n        \"symfony/event-dispatcher\": \"^6.4|^7.0|^8.0\",\n        \"symfony/http-foundation\": \"^6.4|^7.0|^8.0\",\n        \"symfony/http-kernel\": \"^6.4|^7.0|^8.0\",\n        \"symfony/dependency-injection\": \"^6.4|^7.0|^8.0\",\n        \"symfony/lock\": \"^6.4|^7.0|^8.0\",\n        \"symfony/messenger\": \"^6.4|^7.0|^8.0\",\n        \"symfony/process\": \"^6.4|^7.0|^8.0\",\n        \"symfony/stopwatch\": \"^6.4|^7.0|^8.0\",\n        \"symfony/var-dumper\": \"^6.4|^7.0|^8.0\",\n        \"psr/log\": \"^1|^2|^3\"\n    },\n    \"provide\": {\n        \"psr/log-implementation\": \"1.0|2.0|3.0\"\n    },\n    \"conflict\": {\n        \"symfony/dependency-injection\": \"<6.4\",\n        \"symfony/dotenv\": \"<6.4\",\n        \"symfony/event-dispatcher\": \"<6.4\",\n        \"symfony/lock\": \"<6.4\",\n        \"symfony/process\": \"<6.4\"\n    },\n    \"autoload\": {\n        \"psr-4\": { \"Symfony\\\\Component\\\\Console\\\\\": \"\" },\n        \"exclude-from-classmap\": [\n            \"/Tests/\"\n        ]\n    },\n    \"minimum-stability\": \"dev\"\n}\n","vendor/symfony/deprecation-contracts/CHANGELOG.md":"CHANGELOG\n=========\n\nThe changelog is maintained for all Symfony contracts at the following URL:\nhttps://github.com/symfony/contracts/blob/main/CHANGELOG.md\n","vendor/symfony/deprecation-contracts/LICENSE":"Copyright (c) 2020-present Fabien Potencier\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is furnished\nto do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n","vendor/symfony/deprecation-contracts/README.md":"Symfony Deprecation Contracts\n=============================\n\nA generic function and convention to trigger deprecation notices.\n\nThis package provides a single global function named `trigger_deprecation()` that triggers silenced deprecation notices.\n\nBy using a custom PHP error handler such as the one provided by the Symfony ErrorHandler component,\nthe triggered deprecations can be caught and logged for later discovery, both on dev and prod environments.\n\nThe function requires at least 3 arguments:\n - the name of the Composer package that is triggering the deprecation\n - the version of the package that introduced the deprecation\n - the message of the deprecation\n - more arguments can be provided: they will be inserted in the message using `printf()` formatting\n\nExample:\n```php\ntrigger_deprecation('symfony/blockchain', '8.9', 'Using \"%s\" is deprecated, use \"%s\" instead.', 'bitcoin', 'fabcoin');\n```\n\nThis will generate the following message:\n`Since symfony/blockchain 8.9: Using \"bitcoin\" is deprecated, use \"fabcoin\" instead.`\n\nWhile not recommended, the deprecation notices can be completely ignored by declaring an empty\n`function trigger_deprecation() {}` in your application.\n","vendor/symfony/deprecation-contracts/composer.json":"{\n    \"name\": \"symfony/deprecation-contracts\",\n    \"type\": \"library\",\n    \"description\": \"A generic function and convention to trigger deprecation notices\",\n    \"homepage\": \"https://symfony.com\",\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"Nicolas Grekas\",\n            \"email\": \"p@tchwork.com\"\n        },\n        {\n            \"name\": \"Symfony Community\",\n            \"homepage\": \"https://symfony.com/contributors\"\n        }\n    ],\n    \"require\": {\n        \"php\": \">=8.1\"\n    },\n    \"autoload\": {\n        \"files\": [\n            \"function.php\"\n        ]\n    },\n    \"minimum-stability\": \"dev\",\n    \"extra\": {\n        \"branch-alias\": {\n            \"dev-main\": \"3.7-dev\"\n        },\n        \"thanks\": {\n            \"name\": \"symfony/contracts\",\n            \"url\": \"https://github.com/symfony/contracts\"\n        }\n    }\n}\n","vendor/symfony/deprecation-contracts/function.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nif (!function_exists('trigger_deprecation')) {\n    /**\n     * Triggers a silenced deprecation notice.\n     *\n     * @param string $package The name of the Composer package that is triggering the deprecation\n     * @param string $version The version of the package that introduced the deprecation\n     * @param string $message The message of the deprecation\n     * @param mixed  ...$args Values to insert in the message using printf() formatting\n     *\n     * @author Nicolas Grekas <p@tchwork.com>\n     */\n    function trigger_deprecation(string $package, string $version, string $message, mixed ...$args): void\n    {\n        @trigger_error(($package || $version ? \"Since $package $version: \" : '').($args ? vsprintf($message, $args) : $message), \\E_USER_DEPRECATED);\n    }\n}\n","vendor/symfony/polyfill-ctype/Ctype.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Polyfill\\Ctype;\n\n/**\n * Ctype implementation through regex.\n *\n * @internal\n *\n * @author Gert de Pagter <BackEndTea@gmail.com>\n */\nfinal class Ctype\n{\n    /**\n     * Returns TRUE if every character in text is either a letter or a digit, FALSE otherwise.\n     *\n     * @see https://php.net/ctype-alnum\n     *\n     * @param mixed $text\n     *\n     * @return bool\n     */\n    public static function ctype_alnum($text)\n    {\n        $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__);\n\n        return \\is_string($text) && '' !== $text && !preg_match('/[^A-Za-z0-9]/', $text);\n    }\n\n    /**\n     * Returns TRUE if every character in text is a letter, FALSE otherwise.\n     *\n     * @see https://php.net/ctype-alpha\n     *\n     * @param mixed $text\n     *\n     * @return bool\n     */\n    public static function ctype_alpha($text)\n    {\n        $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__);\n\n        return \\is_string($text) && '' !== $text && !preg_match('/[^A-Za-z]/', $text);\n    }\n\n    /**\n     * Returns TRUE if every character in text is a control character from the current locale, FALSE otherwise.\n     *\n     * @see https://php.net/ctype-cntrl\n     *\n     * @param mixed $text\n     *\n     * @return bool\n     */\n    public static function ctype_cntrl($text)\n    {\n        $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__);\n\n        return \\is_string($text) && '' !== $text && !preg_match('/[^\\x00-\\x1f\\x7f]/', $text);\n    }\n\n    /**\n     * Returns TRUE if every character in the string text is a decimal digit, FALSE otherwise.\n     *\n     * @see https://php.net/ctype-digit\n     *\n     * @param mixed $text\n     *\n     * @return bool\n     */\n    public static function ctype_digit($text)\n    {\n        $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__);\n\n        return \\is_string($text) && '' !== $text && !preg_match('/[^0-9]/', $text);\n    }\n\n    /**\n     * Returns TRUE if every character in text is printable and actually creates visible output (no white space), FALSE otherwise.\n     *\n     * @see https://php.net/ctype-graph\n     *\n     * @param mixed $text\n     *\n     * @return bool\n     */\n    public static function ctype_graph($text)\n    {\n        $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__);\n\n        return \\is_string($text) && '' !== $text && !preg_match('/[^!-~]/', $text);\n    }\n\n    /**\n     * Returns TRUE if every character in text is a lowercase letter.\n     *\n     * @see https://php.net/ctype-lower\n     *\n     * @param mixed $text\n     *\n     * @return bool\n     */\n    public static function ctype_lower($text)\n    {\n        $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__);\n\n        return \\is_string($text) && '' !== $text && !preg_match('/[^a-z]/', $text);\n    }\n\n    /**\n     * Returns TRUE if every character in text will actually create output (including blanks). Returns FALSE if text contains control characters or characters that do not have any output or control function at all.\n     *\n     * @see https://php.net/ctype-print\n     *\n     * @param mixed $text\n     *\n     * @return bool\n     */\n    public static function ctype_print($text)\n    {\n        $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__);\n\n        return \\is_string($text) && '' !== $text && !preg_match('/[^ -~]/', $text);\n    }\n\n    /**\n     * Returns TRUE if every character in text is printable, but neither letter, digit or blank, FALSE otherwise.\n     *\n     * @see https://php.net/ctype-punct\n     *\n     * @param mixed $text\n     *\n     * @return bool\n     */\n    public static function ctype_punct($text)\n    {\n        $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__);\n\n        return \\is_string($text) && '' !== $text && !preg_match('/[^!-\\/\\:-@\\[-`\\{-~]/', $text);\n    }\n\n    /**\n     * Returns TRUE if every character in text creates some sort of white space, FALSE otherwise. Besides the blank character this also includes tab, vertical tab, line feed, carriage return and form feed characters.\n     *\n     * @see https://php.net/ctype-space\n     *\n     * @param mixed $text\n     *\n     * @return bool\n     */\n    public static function ctype_space($text)\n    {\n        $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__);\n\n        return \\is_string($text) && '' !== $text && !preg_match('/[^\\s]/', $text);\n    }\n\n    /**\n     * Returns TRUE if every character in text is an uppercase letter.\n     *\n     * @see https://php.net/ctype-upper\n     *\n     * @param mixed $text\n     *\n     * @return bool\n     */\n    public static function ctype_upper($text)\n    {\n        $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__);\n\n        return \\is_string($text) && '' !== $text && !preg_match('/[^A-Z]/', $text);\n    }\n\n    /**\n     * Returns TRUE if every character in text is a hexadecimal 'digit', that is a decimal digit or a character from [A-Fa-f] , FALSE otherwise.\n     *\n     * @see https://php.net/ctype-xdigit\n     *\n     * @param mixed $text\n     *\n     * @return bool\n     */\n    public static function ctype_xdigit($text)\n    {\n        $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__);\n\n        return \\is_string($text) && '' !== $text && !preg_match('/[^A-Fa-f0-9]/', $text);\n    }\n\n    /**\n     * Converts integers to their char versions according to normal ctype behaviour, if needed.\n     *\n     * If an integer between -128 and 255 inclusive is provided,\n     * it is interpreted as the ASCII value of a single character\n     * (negative values have 256 added in order to allow characters in the Extended ASCII range).\n     * Any other integer is interpreted as a string containing the decimal digits of the integer.\n     *\n     * @param mixed  $int\n     * @param string $function\n     *\n     * @return mixed\n     */\n    private static function convert_int_to_char_for_ctype($int, $function)\n    {\n        if (\\PHP_VERSION_ID >= 80100 && !\\is_string($int)) {\n            @trigger_error($function.'(): Argument of type '.get_debug_type($int).' will be interpreted as string in the future', \\E_USER_DEPRECATED);\n        }\n\n        if (!\\is_int($int)) {\n            return $int;\n        }\n\n        if ($int < -128 || $int > 255) {\n            return (string) $int;\n        }\n\n        if ($int < 0) {\n            $int += 256;\n        }\n\n        return \\chr($int);\n    }\n}\n","vendor/symfony/polyfill-ctype/LICENSE":"Copyright (c) 2018-present Fabien Potencier\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is furnished\nto do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n","vendor/symfony/polyfill-ctype/README.md":"Symfony Polyfill / Ctype\n========================\n\nThis component provides `ctype_*` functions to users who run php versions without the ctype extension.\n\nMore information can be found in the\n[main Polyfill README](https://github.com/symfony/polyfill/blob/main/README.md).\n\nLicense\n=======\n\nThis library is released under the [MIT license](LICENSE).\n","vendor/symfony/polyfill-ctype/bootstrap.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nuse Symfony\\Polyfill\\Ctype as p;\n\nif (\\PHP_VERSION_ID >= 80000) {\n    return require __DIR__.'/bootstrap80.php';\n}\n\nif (!function_exists('ctype_alnum')) {\n    function ctype_alnum($text) { return p\\Ctype::ctype_alnum($text); }\n}\nif (!function_exists('ctype_alpha')) {\n    function ctype_alpha($text) { return p\\Ctype::ctype_alpha($text); }\n}\nif (!function_exists('ctype_cntrl')) {\n    function ctype_cntrl($text) { return p\\Ctype::ctype_cntrl($text); }\n}\nif (!function_exists('ctype_digit')) {\n    function ctype_digit($text) { return p\\Ctype::ctype_digit($text); }\n}\nif (!function_exists('ctype_graph')) {\n    function ctype_graph($text) { return p\\Ctype::ctype_graph($text); }\n}\nif (!function_exists('ctype_lower')) {\n    function ctype_lower($text) { return p\\Ctype::ctype_lower($text); }\n}\nif (!function_exists('ctype_print')) {\n    function ctype_print($text) { return p\\Ctype::ctype_print($text); }\n}\nif (!function_exists('ctype_punct')) {\n    function ctype_punct($text) { return p\\Ctype::ctype_punct($text); }\n}\nif (!function_exists('ctype_space')) {\n    function ctype_space($text) { return p\\Ctype::ctype_space($text); }\n}\nif (!function_exists('ctype_upper')) {\n    function ctype_upper($text) { return p\\Ctype::ctype_upper($text); }\n}\nif (!function_exists('ctype_xdigit')) {\n    function ctype_xdigit($text) { return p\\Ctype::ctype_xdigit($text); }\n}\n","vendor/symfony/polyfill-ctype/bootstrap80.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nuse Symfony\\Polyfill\\Ctype as p;\n\nif (!function_exists('ctype_alnum')) {\n    function ctype_alnum(mixed $text): bool { return p\\Ctype::ctype_alnum($text); }\n}\nif (!function_exists('ctype_alpha')) {\n    function ctype_alpha(mixed $text): bool { return p\\Ctype::ctype_alpha($text); }\n}\nif (!function_exists('ctype_cntrl')) {\n    function ctype_cntrl(mixed $text): bool { return p\\Ctype::ctype_cntrl($text); }\n}\nif (!function_exists('ctype_digit')) {\n    function ctype_digit(mixed $text): bool { return p\\Ctype::ctype_digit($text); }\n}\nif (!function_exists('ctype_graph')) {\n    function ctype_graph(mixed $text): bool { return p\\Ctype::ctype_graph($text); }\n}\nif (!function_exists('ctype_lower')) {\n    function ctype_lower(mixed $text): bool { return p\\Ctype::ctype_lower($text); }\n}\nif (!function_exists('ctype_print')) {\n    function ctype_print(mixed $text): bool { return p\\Ctype::ctype_print($text); }\n}\nif (!function_exists('ctype_punct')) {\n    function ctype_punct(mixed $text): bool { return p\\Ctype::ctype_punct($text); }\n}\nif (!function_exists('ctype_space')) {\n    function ctype_space(mixed $text): bool { return p\\Ctype::ctype_space($text); }\n}\nif (!function_exists('ctype_upper')) {\n    function ctype_upper(mixed $text): bool { return p\\Ctype::ctype_upper($text); }\n}\nif (!function_exists('ctype_xdigit')) {\n    function ctype_xdigit(mixed $text): bool { return p\\Ctype::ctype_xdigit($text); }\n}\n","vendor/symfony/polyfill-ctype/composer.json":"{\n    \"name\": \"symfony/polyfill-ctype\",\n    \"type\": \"library\",\n    \"description\": \"Symfony polyfill for ctype functions\",\n    \"keywords\": [\"polyfill\", \"compatibility\", \"portable\", \"ctype\"],\n    \"homepage\": \"https://symfony.com\",\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"Gert de Pagter\",\n            \"email\": \"BackEndTea@gmail.com\"\n        },\n        {\n            \"name\": \"Symfony Community\",\n            \"homepage\": \"https://symfony.com/contributors\"\n        }\n    ],\n    \"require\": {\n        \"php\": \">=7.2\"\n    },\n    \"provide\": {\n        \"ext-ctype\": \"*\"\n    },\n    \"autoload\": {\n        \"psr-4\": { \"Symfony\\\\Polyfill\\\\Ctype\\\\\": \"\" },\n        \"files\": [ \"bootstrap.php\" ]\n    },\n    \"suggest\": {\n        \"ext-ctype\": \"For best performance\"\n    },\n    \"minimum-stability\": \"dev\",\n    \"extra\": {\n        \"thanks\": {\n            \"name\": \"symfony/polyfill\",\n            \"url\": \"https://github.com/symfony/polyfill\"\n        }\n    }\n}\n","vendor/symfony/polyfill-intl-grapheme/Grapheme.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Polyfill\\Intl\\Grapheme;\n\n\\define('SYMFONY_GRAPHEME_CLUSTER_RX', ((float) \\PCRE_VERSION >= 10.44) ? '\\X' : Grapheme::GRAPHEME_CLUSTER_RX);\n\n/**\n * Partial intl implementation in pure PHP.\n *\n * Implemented:\n * - grapheme_extract  - Extract a sequence of grapheme clusters from a text buffer, which must be encoded in UTF-8\n * - grapheme_stripos  - Find position (in grapheme units) of first occurrence of a case-insensitive string\n * - grapheme_stristr  - Returns part of haystack string from the first occurrence of case-insensitive needle to the end of haystack\n * - grapheme_strlen   - Get string length in grapheme units\n * - grapheme_strpos   - Find position (in grapheme units) of first occurrence of a string\n * - grapheme_strripos - Find position (in grapheme units) of last occurrence of a case-insensitive string\n * - grapheme_strrpos  - Find position (in grapheme units) of last occurrence of a string\n * - grapheme_strstr   - Returns part of haystack string from the first occurrence of needle to the end of haystack\n * - grapheme_substr   - Return part of a string\n * - grapheme_str_split - Splits a string into an array of individual or chunks of graphemes\n * - grapheme_levenshtein - Calculate the grapheme-unit Levenshtein distance between two strings\n * - grapheme_strrev - Reverse a string by grapheme clusters\n *\n * @author Nicolas Grekas <p@tchwork.com>\n *\n * @internal\n */\nfinal class Grapheme\n{\n    // (CRLF|RI RI?|(([ZWNJ-ZWJ]|T+|L*(LV?V+|LV|LVT)T*|L+|[^Control])[Extend]*)(ZWJ([ZWNJ-ZWJ]|T+|L*(LV?V+|LV|LVT)T*|L+|[^Control])[Extend]*)*|[Control])\n    // This regular expression is a work around for http://bugs.exim.org/1279\n    public const GRAPHEME_CLUSTER_RX = '(?:\\r\\n|[\\x{1F1E6}-\\x{1F1FF}][\\x{1F1E6}-\\x{1F1FF}]?|(?:[ -~\\x{200C}\\x{200D}]|[ᆨ-ᇹ]+|[ᄀ-ᅟ]*(?:[가개갸걔거게겨계고과괘괴교구궈궤귀규그긔기까깨꺄꺠꺼께껴꼐꼬꽈꽤꾀꾜꾸꿔꿰뀌뀨끄끠끼나내냐냬너네녀녜노놔놰뇌뇨누눠눼뉘뉴느늬니다대댜댸더데뎌뎨도돠돼되됴두둬뒈뒤듀드듸디따때땨떄떠떼뗘뗴또똬뙈뙤뚀뚜뚸뛔뛰뜌뜨띄띠라래랴럐러레려례로롸뢔뢰료루뤄뤠뤼류르릐리마매먀먜머메며몌모뫄뫠뫼묘무뭐뭬뮈뮤므믜미바배뱌뱨버베벼볘보봐봬뵈뵤부붜붸뷔뷰브븨비빠빼뺘뺴뻐뻬뼈뼤뽀뽜뽸뾔뾰뿌뿨쀄쀠쀼쁘쁴삐사새샤섀서세셔셰소솨쇄쇠쇼수숴쉐쉬슈스싀시싸쌔쌰썌써쎄쎠쎼쏘쏴쐐쐬쑈쑤쒀쒜쒸쓔쓰씌씨아애야얘어에여예오와왜외요우워웨위유으의이자재쟈쟤저제져졔조좌좨죄죠주줘줴쥐쥬즈즤지짜째쨔쨰쩌쩨쪄쪠쪼쫘쫴쬐쬬쭈쭤쮀쮜쮸쯔쯰찌차채챠챼처체쳐쳬초촤쵀최쵸추춰췌취츄츠츼치카캐캬컈커케켜켸코콰쾌쾨쿄쿠쿼퀘퀴큐크킈키타태탸턔터테텨톄토톼퇘퇴툐투퉈퉤튀튜트틔티파패퍄퍠퍼페펴폐포퐈퐤푀표푸풔풰퓌퓨프픠피하해햐햬허헤혀혜호화홰회효후훠훼휘휴흐희히]?[ᅠ-ᆢ]+|[가-힣])[ᆨ-ᇹ]*|[ᄀ-ᅟ]+|[^\\p{Cc}\\p{Cf}\\p{Zl}\\p{Zp}])[\\p{Mn}\\p{Mc}\\p{Me}\\x{09BE}\\x{09D7}\\x{0B3E}\\x{0B57}\\x{0BBE}\\x{0BD7}\\x{0CC2}\\x{0CD5}\\x{0CD6}\\x{0D3E}\\x{0D57}\\x{0DCF}\\x{0DDF}\\x{200C}\\x{1D165}\\x{1D16E}-\\x{1D172}\\x{1F3FB}-\\x{1F3FF}\\x{FE0E}-\\x{FE0F}\\x{E0020}-\\x{E007F}]*(?:\\x{200D}(?:[\\x{1F1E6}-\\x{1F1FF}]|[ -~\\x{200C}\\x{200D}]|[ᆨ-ᇹ]+|[ᄀ-ᅟ]*(?:[가-힣]?[ᅠ-ᆢ]+|[가-힣])[ᆨ-ᇹ]*|[ᄀ-ᅟ]+|[^\\p{Cc}\\p{Cf}\\p{Zl}\\p{Zp}])[\\p{Mn}\\p{Mc}\\p{Me}\\x{09BE}\\x{09D7}\\x{0B3E}\\x{0B57}\\x{0BBE}\\x{0BD7}\\x{0CC2}\\x{0CD5}\\x{0CD6}\\x{0D3E}\\x{0D57}\\x{0DCF}\\x{0DDF}\\x{200C}\\x{1D165}\\x{1D16E}-\\x{1D172}\\x{1F3FB}-\\x{1F3FF}\\x{FE0E}-\\x{FE0F}\\x{E0020}-\\x{E007F}]*)*|[\\p{Cc}\\p{Cf}\\p{Zl}\\p{Zp}])';\n\n    private const CASE_FOLD = [\n        ['µ', 'ſ', \"\\xCD\\x85\", 'ς', \"\\xCF\\x90\", \"\\xCF\\x91\", \"\\xCF\\x95\", \"\\xCF\\x96\", \"\\xCF\\xB0\", \"\\xCF\\xB1\", \"\\xCF\\xB5\", \"\\xE1\\xBA\\x9B\", \"\\xE1\\xBE\\xBE\"],\n        ['μ', 's', 'ι',        'σ', 'β',        'θ',        'φ',        'π',        'κ',        'ρ',        'ε',        \"\\xE1\\xB9\\xA1\", 'ι'],\n    ];\n\n    // indexed by the $mode argument of grapheme_position()\n    private const POSITION_FUNCTIONS = ['grapheme_strpos', 'grapheme_stripos', 'grapheme_strrpos', 'grapheme_strripos'];\n\n    public static function grapheme_extract($s, $size, $type = \\GRAPHEME_EXTR_COUNT, $start = 0, &$next = 0)\n    {\n        if (0 > $start) {\n            $start = \\strlen($s) + $start;\n        }\n\n        if (!\\is_scalar($s)) {\n            $hasError = false;\n            set_error_handler(static function () use (&$hasError) { $hasError = true; });\n            $next = substr($s, $start);\n            restore_error_handler();\n            if ($hasError) {\n                substr($s, $start);\n                $s = '';\n            } else {\n                $s = $next;\n            }\n        } else {\n            $s = substr($s, $start);\n        }\n        $size = (int) $size;\n        $type = (int) $type;\n        $start = (int) $start;\n\n        if (\\GRAPHEME_EXTR_COUNT !== $type && \\GRAPHEME_EXTR_MAXBYTES !== $type && \\GRAPHEME_EXTR_MAXCHARS !== $type) {\n            if (80000 > \\PHP_VERSION_ID) {\n                return false;\n            }\n\n            throw new \\ValueError('grapheme_extract(): Argument #3 ($type) must be one of GRAPHEME_EXTR_COUNT, GRAPHEME_EXTR_MAXBYTES, or GRAPHEME_EXTR_MAXCHARS');\n        }\n\n        if (!isset($s[0]) || 0 > $size || 0 > $start) {\n            return false;\n        }\n        if (0 === $size) {\n            return '';\n        }\n\n        $next = $start;\n\n        $s = preg_split('/('.SYMFONY_GRAPHEME_CLUSTER_RX.')/u', \"\\r\\n\".$s, $size + 1, \\PREG_SPLIT_NO_EMPTY | \\PREG_SPLIT_DELIM_CAPTURE);\n\n        if (!isset($s[1])) {\n            return false;\n        }\n\n        $i = 1;\n        $ret = '';\n\n        do {\n            if (\\GRAPHEME_EXTR_COUNT === $type) {\n                --$size;\n            } elseif (\\GRAPHEME_EXTR_MAXBYTES === $type) {\n                $size -= \\strlen($s[$i]);\n            } else {\n                $size -= iconv_strlen($s[$i], 'UTF-8//IGNORE');\n            }\n\n            if ($size >= 0) {\n                $ret .= $s[$i];\n            }\n        } while (isset($s[++$i]) && $size > 0);\n\n        $next += \\strlen($ret);\n\n        return $ret;\n    }\n\n    public static function grapheme_strlen($s)\n    {\n        preg_replace('/'.SYMFONY_GRAPHEME_CLUSTER_RX.'/u', '', $s, -1, $len);\n\n        return 0 === $len && '' !== $s ? null : $len;\n    }\n\n    public static function grapheme_substr($s, $start, $len = null)\n    {\n        if (null === $len) {\n            $len = 2147483647;\n        }\n\n        preg_match_all('/'.SYMFONY_GRAPHEME_CLUSTER_RX.'/u', $s, $s);\n\n        $slen = \\count($s[0]);\n        $start = (int) $start;\n\n        if (0 > $start) {\n            $start += $slen;\n        }\n        if (0 > $start) {\n            if (\\PHP_VERSION_ID < 80000) {\n                return false;\n            }\n\n            $start = 0;\n        }\n        if ($start >= $slen) {\n            return \\PHP_VERSION_ID >= 80000 ? '' : false;\n        }\n\n        $rem = $slen - $start;\n\n        if (0 > $len) {\n            $len += $rem;\n        }\n        if (0 === $len) {\n            return '';\n        }\n        if (0 > $len) {\n            return \\PHP_VERSION_ID >= 80000 ? '' : false;\n        }\n        if ($len > $rem) {\n            $len = $rem;\n        }\n\n        return implode('', \\array_slice($s[0], $start, $len));\n    }\n\n    public static function grapheme_strpos($s, $needle, $offset = 0)\n    {\n        return self::grapheme_position($s, $needle, $offset, 0);\n    }\n\n    public static function grapheme_stripos($s, $needle, $offset = 0)\n    {\n        return self::grapheme_position($s, $needle, $offset, 1);\n    }\n\n    public static function grapheme_strrpos($s, $needle, $offset = 0)\n    {\n        return self::grapheme_position($s, $needle, $offset, 2);\n    }\n\n    public static function grapheme_strripos($s, $needle, $offset = 0)\n    {\n        return self::grapheme_position($s, $needle, $offset, 3);\n    }\n\n    public static function grapheme_stristr($s, $needle, $beforeNeedle = false)\n    {\n        return mb_stristr($s, $needle, $beforeNeedle, 'UTF-8');\n    }\n\n    public static function grapheme_strstr($s, $needle, $beforeNeedle = false)\n    {\n        return mb_strstr($s, $needle, $beforeNeedle, 'UTF-8');\n    }\n\n    public static function grapheme_str_split($s, $len = 1)\n    {\n        if (0 > $len || 1073741823 < $len) {\n            throw new \\ValueError('grapheme_str_split(): Argument #2 ($length) must be greater than 0 and less than or equal to 1073741823.');\n        }\n\n        if ('' === $s) {\n            return [];\n        }\n\n        if (!preg_match_all('/('.SYMFONY_GRAPHEME_CLUSTER_RX.')/u', $s, $matches)) {\n            return false;\n        }\n\n        if (1 === $len) {\n            return $matches[0];\n        }\n\n        $chunks = array_chunk($matches[0], $len);\n\n        foreach ($chunks as &$chunk) {\n            $chunk = implode('', $chunk);\n        }\n\n        return $chunks;\n    }\n\n    public static function grapheme_levenshtein($s1, $s2, $insertion_cost = 1, $replacement_cost = 1, $deletion_cost = 1)\n    {\n        if (!preg_match('//u', $s1) || !preg_match('//u', $s2)) {\n            return false;\n        }\n\n        if (0 > $insertion_cost || 0 > $replacement_cost || 0 > $deletion_cost) {\n            throw new \\ValueError('grapheme_levenshtein(): Argument #3 ($insertion_cost), #4 ($replacement_cost), and #5 ($deletion_cost) must be greater than or equal to 0');\n        }\n\n        preg_match_all('/'.SYMFONY_GRAPHEME_CLUSTER_RX.'/u', $s1, $s1);\n        preg_match_all('/'.SYMFONY_GRAPHEME_CLUSTER_RX.'/u', $s2, $s2);\n\n        $s1 = $s1[0];\n        $s2 = $s2[0];\n        $l1 = \\count($s1);\n        $l2 = \\count($s2);\n\n        if (0 === $l1) {\n            return $l2 * $insertion_cost;\n        }\n        if (0 === $l2) {\n            return $l1 * $deletion_cost;\n        }\n\n        $dp = array_fill(0, $l1 + 1, array_fill(0, $l2 + 1, 0));\n\n        for ($i = 1; $i <= $l1; ++$i) {\n            $dp[$i][0] = $dp[$i - 1][0] + $deletion_cost;\n        }\n        for ($j = 1; $j <= $l2; ++$j) {\n            $dp[0][$j] = $dp[0][$j - 1] + $insertion_cost;\n        }\n\n        for ($i = 1; $i <= $l1; ++$i) {\n            for ($j = 1; $j <= $l2; ++$j) {\n                $cost = ($s1[$i - 1] === $s2[$j - 1]) ? 0 : $replacement_cost;\n                $dp[$i][$j] = min($dp[$i - 1][$j] + $deletion_cost, $dp[$i][$j - 1] + $insertion_cost, $dp[$i - 1][$j - 1] + $cost);\n            }\n        }\n\n        return $dp[$l1][$l2];\n    }\n\n    private static function grapheme_position($s, $needle, $offset, $mode)\n    {\n        $needle = (string) $needle;\n        if (80000 > \\PHP_VERSION_ID && !preg_match('/./us', $needle)) {\n            return false;\n        }\n        $s = (string) $s;\n        // let the empty string through: it accepts no offset but 0, which is checked below\n        if ('' !== $s && !preg_match('/./us', $s)) {\n            return false;\n        }\n        if ($offset && ($offset > ($len = self::grapheme_strlen($s)) || $offset < -$len)) {\n            if (80000 > \\PHP_VERSION_ID) {\n                return false;\n            }\n\n            throw new \\ValueError(self::POSITION_FUNCTIONS[$mode].'(): Argument #3 ($offset) must be contained in argument #1 ($haystack)');\n        }\n        if ('' === $s) {\n            return false;\n        }\n        if ($offset > 0) {\n            $s = self::grapheme_substr($s, $offset);\n        } elseif ($offset < 0) {\n            if (2 > $mode) {\n                $offset += $len;\n                $s = self::grapheme_substr($s, $offset);\n                if (0 > $offset) {\n                    $offset = 0;\n                }\n            } elseif (0 > $offset += self::grapheme_strlen($needle)) {\n                $s = self::grapheme_substr($s, 0, $offset);\n                $offset = 0;\n            } else {\n                $offset = 0;\n            }\n        }\n\n        // As UTF-8 is self-synchronizing, and we have ensured the strings are valid UTF-8,\n        // we can use normal binary string functions here. For case-insensitive searches,\n        // case fold the strings first.\n        $caseInsensitive = $mode & 1;\n        $reverse = $mode & 2;\n        if ($caseInsensitive) {\n            // Use the same case folding mode as mbstring does for mb_stripos().\n            // Stick to SIMPLE case folding to avoid changing the length of the string, which\n            // might result in offsets being shifted.\n            $mode = \\defined('MB_CASE_FOLD_SIMPLE') ? \\MB_CASE_FOLD_SIMPLE : \\MB_CASE_LOWER;\n            $s = mb_convert_case($s, $mode, 'UTF-8');\n            $needle = mb_convert_case($needle, $mode, 'UTF-8');\n\n            if (!\\defined('MB_CASE_FOLD_SIMPLE')) {\n                $s = str_replace(self::CASE_FOLD[0], self::CASE_FOLD[1], $s);\n                $needle = str_replace(self::CASE_FOLD[0], self::CASE_FOLD[1], $needle);\n            }\n        }\n        if ($reverse) {\n            $needlePos = strrpos($s, $needle);\n        } else {\n            $needlePos = strpos($s, $needle);\n        }\n\n        return false !== $needlePos ? self::grapheme_strlen(substr($s, 0, $needlePos)) + $offset : false;\n    }\n\n    public static function grapheme_strrev(string $string)\n    {\n        if (!preg_match('//u', $string)) {\n            return false;\n        }\n\n        $units = grapheme_str_split($string);\n\n        if (false === $units) {\n            return false;\n        }\n\n        return implode('', array_reverse($units));\n    }\n}\n","vendor/symfony/polyfill-intl-grapheme/LICENSE":"Copyright (c) 2015-present Fabien Potencier\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is furnished\nto do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n","vendor/symfony/polyfill-intl-grapheme/README.md":"Symfony Polyfill / Intl: Grapheme\n=================================\n\nThis component provides a partial, native PHP implementation of the\n[Grapheme functions](https://php.net/intl.grapheme) from the\n[Intl](https://php.net/intl) extension.\n\n- [`grapheme_extract`](https://php.net/grapheme_extract): Extract a sequence of grapheme\n  clusters from a text buffer, which must be encoded in UTF-8\n- [`grapheme_stripos`](https://php.net/grapheme_stripos): Find position (in grapheme units)\n  of first occurrence of a case-insensitive string\n- [`grapheme_stristr`](https://php.net/grapheme_stristr): Returns part of haystack string\n  from the first occurrence of case-insensitive needle to the end of haystack\n- [`grapheme_strlen`](https://php.net/grapheme_strlen): Get string length in grapheme units\n- [`grapheme_strpos`](https://php.net/grapheme_strpos): Find position (in grapheme units)\n  of first occurrence of a string\n- [`grapheme_strripos`](https://php.net/grapheme_strripos): Find position (in grapheme units)\n  of last occurrence of a case-insensitive string\n- [`grapheme_strrpos`](https://php.net/grapheme_strrpos): Find position (in grapheme units)\n  of last occurrence of a string\n- [`grapheme_strstr`](https://php.net/grapheme_strstr): Returns part of haystack string from\n  the first occurrence of needle to the end of haystack\n- [`grapheme_substr`](https://php.net/grapheme_substr): Return part of a string\n- [`grapheme_str_split`](https://php.net/grapheme_str_split): Splits a string into an array of individual or chunks of graphemes\n\nMore information can be found in the\n[main Polyfill README](https://github.com/symfony/polyfill/blob/main/README.md).\n\nLicense\n=======\n\nThis library is released under the [MIT license](LICENSE).\n","vendor/symfony/polyfill-intl-grapheme/bootstrap.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nuse Symfony\\Polyfill\\Intl\\Grapheme as p;\n\nif (\\PHP_VERSION_ID >= 80000) {\n    return require __DIR__.'/bootstrap80.php';\n}\n\nif (!class_exists('ValueError', false)) {\n    class ValueError extends Error\n    {\n    }\n}\n\nif (!defined('GRAPHEME_EXTR_COUNT')) {\n    define('GRAPHEME_EXTR_COUNT', 0);\n}\nif (!defined('GRAPHEME_EXTR_MAXBYTES')) {\n    define('GRAPHEME_EXTR_MAXBYTES', 1);\n}\nif (!defined('GRAPHEME_EXTR_MAXCHARS')) {\n    define('GRAPHEME_EXTR_MAXCHARS', 2);\n}\n\nif (!function_exists('grapheme_extract')) {\n    function grapheme_extract($haystack, $size, $type = 0, $start = 0, &$next = 0) { return p\\Grapheme::grapheme_extract($haystack, $size, $type, $start, $next); }\n}\nif (!function_exists('grapheme_stripos')) {\n    function grapheme_stripos($haystack, $needle, $offset = 0) { return p\\Grapheme::grapheme_stripos($haystack, $needle, $offset); }\n}\nif (!function_exists('grapheme_stristr')) {\n    function grapheme_stristr($haystack, $needle, $beforeNeedle = false) { return p\\Grapheme::grapheme_stristr($haystack, $needle, $beforeNeedle); }\n}\nif (!function_exists('grapheme_strlen')) {\n    function grapheme_strlen($input) { return p\\Grapheme::grapheme_strlen($input); }\n}\nif (!function_exists('grapheme_strpos')) {\n    function grapheme_strpos($haystack, $needle, $offset = 0) { return p\\Grapheme::grapheme_strpos($haystack, $needle, $offset); }\n}\nif (!function_exists('grapheme_strripos')) {\n    function grapheme_strripos($haystack, $needle, $offset = 0) { return p\\Grapheme::grapheme_strripos($haystack, $needle, $offset); }\n}\nif (!function_exists('grapheme_strrpos')) {\n    function grapheme_strrpos($haystack, $needle, $offset = 0) { return p\\Grapheme::grapheme_strrpos($haystack, $needle, $offset); }\n}\nif (!function_exists('grapheme_strstr')) {\n    function grapheme_strstr($haystack, $needle, $beforeNeedle = false) { return p\\Grapheme::grapheme_strstr($haystack, $needle, $beforeNeedle); }\n}\nif (!function_exists('grapheme_substr')) {\n    function grapheme_substr($string, $offset, $length = null) { return p\\Grapheme::grapheme_substr($string, $offset, $length); }\n}\nif (!function_exists('grapheme_str_split')) {\n    function grapheme_str_split(string $string, int $length = 1) { return p\\Grapheme::grapheme_str_split($string, $length); }\n}\nif (!function_exists('grapheme_levenshtein')) {\n    function grapheme_levenshtein(string $string1, string $string2, int $insertion_cost = 1, int $replacement_cost = 1, int $deletion_cost = 1, string $locale = '') { return p\\Grapheme::grapheme_levenshtein($string1, $string2, $insertion_cost, $replacement_cost, $deletion_cost); }\n}\nif (!function_exists('grapheme_strrev')) {\n    function grapheme_strrev(string $string) { return p\\Grapheme::grapheme_strrev($string); }\n}\n","vendor/symfony/polyfill-intl-grapheme/bootstrap80.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nuse Symfony\\Polyfill\\Intl\\Grapheme as p;\n\nif (!function_exists('grapheme_str_split')) {\n    function grapheme_str_split(string $string, int $length = 1): array|false { return p\\Grapheme::grapheme_str_split($string, $length); }\n}\nif (!function_exists('grapheme_levenshtein')) {\n    function grapheme_levenshtein(string $string1, string $string2, int $insertion_cost = 1, int $replacement_cost = 1, int $deletion_cost = 1, string $locale = ''): int|false { return p\\Grapheme::grapheme_levenshtein($string1, $string2, $insertion_cost, $replacement_cost, $deletion_cost); }\n}\nif (!function_exists('grapheme_strrev')) {\n    function grapheme_strrev(string $string): string|false { return p\\Grapheme::grapheme_strrev($string); }\n}\n\nif (extension_loaded('intl')) {\n    return;\n}\n\nif (!defined('GRAPHEME_EXTR_COUNT')) {\n    define('GRAPHEME_EXTR_COUNT', 0);\n}\nif (!defined('GRAPHEME_EXTR_MAXBYTES')) {\n    define('GRAPHEME_EXTR_MAXBYTES', 1);\n}\nif (!defined('GRAPHEME_EXTR_MAXCHARS')) {\n    define('GRAPHEME_EXTR_MAXCHARS', 2);\n}\n\nif (!function_exists('grapheme_extract')) {\n    function grapheme_extract(?string $haystack, ?int $size, ?int $type = GRAPHEME_EXTR_COUNT, ?int $offset = 0, &$next = null): string|false { return p\\Grapheme::grapheme_extract((string) $haystack, (int) $size, (int) $type, (int) $offset, $next); }\n}\nif (\\PHP_VERSION_ID >= 80500) {\n    return require __DIR__.'/bootstrap85.php';\n}\n\nif (!function_exists('grapheme_stripos')) {\n    function grapheme_stripos(?string $haystack, ?string $needle, ?int $offset = 0): int|false { return p\\Grapheme::grapheme_stripos((string) $haystack, (string) $needle, (int) $offset); }\n}\nif (!function_exists('grapheme_stristr')) {\n    function grapheme_stristr(?string $haystack, ?string $needle, ?bool $beforeNeedle = false): string|false { return p\\Grapheme::grapheme_stristr((string) $haystack, (string) $needle, (bool) $beforeNeedle); }\n}\nif (!function_exists('grapheme_strlen')) {\n    function grapheme_strlen(?string $string): int|false|null { return p\\Grapheme::grapheme_strlen((string) $string); }\n}\nif (!function_exists('grapheme_strpos')) {\n    function grapheme_strpos(?string $haystack, ?string $needle, ?int $offset = 0): int|false { return p\\Grapheme::grapheme_strpos((string) $haystack, (string) $needle, (int) $offset); }\n}\nif (!function_exists('grapheme_strripos')) {\n    function grapheme_strripos(?string $haystack, ?string $needle, ?int $offset = 0): int|false { return p\\Grapheme::grapheme_strripos((string) $haystack, (string) $needle, (int) $offset); }\n}\nif (!function_exists('grapheme_strrpos')) {\n    function grapheme_strrpos(?string $haystack, ?string $needle, ?int $offset = 0): int|false { return p\\Grapheme::grapheme_strrpos((string) $haystack, (string) $needle, (int) $offset); }\n}\nif (!function_exists('grapheme_strstr')) {\n    function grapheme_strstr(?string $haystack, ?string $needle, ?bool $beforeNeedle = false): string|false { return p\\Grapheme::grapheme_strstr((string) $haystack, (string) $needle, (bool) $beforeNeedle); }\n}\nif (!function_exists('grapheme_substr')) {\n    function grapheme_substr(?string $string, ?int $offset, ?int $length = null): string|false { return p\\Grapheme::grapheme_substr((string) $string, (int) $offset, $length); }\n}\n","vendor/symfony/polyfill-intl-grapheme/bootstrap85.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\n// The $locale argument added to grapheme_*() in PHP 8.5 / ICU 74 is accepted\n// for native-signature compatibility but ignored by the polyfill, which only\n// performs UTF-8 case folding.\n\nuse Symfony\\Polyfill\\Intl\\Grapheme as p;\n\nif (!function_exists('grapheme_stripos')) {\n    function grapheme_stripos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $locale = ''): int|false { return p\\Grapheme::grapheme_stripos((string) $haystack, (string) $needle, (int) $offset); }\n}\nif (!function_exists('grapheme_stristr')) {\n    function grapheme_stristr(?string $haystack, ?string $needle, ?bool $beforeNeedle = false, ?string $locale = ''): string|false { return p\\Grapheme::grapheme_stristr((string) $haystack, (string) $needle, (bool) $beforeNeedle); }\n}\nif (!function_exists('grapheme_strlen')) {\n    function grapheme_strlen(?string $string): int|false|null { return p\\Grapheme::grapheme_strlen((string) $string); }\n}\nif (!function_exists('grapheme_strpos')) {\n    function grapheme_strpos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $locale = ''): int|false { return p\\Grapheme::grapheme_strpos((string) $haystack, (string) $needle, (int) $offset); }\n}\nif (!function_exists('grapheme_strripos')) {\n    function grapheme_strripos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $locale = ''): int|false { return p\\Grapheme::grapheme_strripos((string) $haystack, (string) $needle, (int) $offset); }\n}\nif (!function_exists('grapheme_strrpos')) {\n    function grapheme_strrpos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $locale = ''): int|false { return p\\Grapheme::grapheme_strrpos((string) $haystack, (string) $needle, (int) $offset); }\n}\nif (!function_exists('grapheme_strstr')) {\n    function grapheme_strstr(?string $haystack, ?string $needle, ?bool $beforeNeedle = false, ?string $locale = ''): string|false { return p\\Grapheme::grapheme_strstr((string) $haystack, (string) $needle, (bool) $beforeNeedle); }\n}\nif (!function_exists('grapheme_substr')) {\n    function grapheme_substr(?string $string, ?int $offset, ?int $length = null, ?string $locale = ''): string|false { return p\\Grapheme::grapheme_substr((string) $string, (int) $offset, $length); }\n}\n","vendor/symfony/polyfill-intl-grapheme/composer.json":"{\n    \"name\": \"symfony/polyfill-intl-grapheme\",\n    \"type\": \"library\",\n    \"description\": \"Symfony polyfill for intl's grapheme_* functions\",\n    \"keywords\": [\"polyfill\", \"shim\", \"compatibility\", \"portable\", \"intl\", \"grapheme\"],\n    \"homepage\": \"https://symfony.com\",\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"Nicolas Grekas\",\n            \"email\": \"p@tchwork.com\"\n        },\n        {\n            \"name\": \"Symfony Community\",\n            \"homepage\": \"https://symfony.com/contributors\"\n        }\n    ],\n    \"require\": {\n        \"php\": \">=7.2\"\n    },\n    \"autoload\": {\n        \"psr-4\": { \"Symfony\\\\Polyfill\\\\Intl\\\\Grapheme\\\\\": \"\" },\n        \"files\": [ \"bootstrap.php\" ]\n    },\n    \"suggest\": {\n        \"ext-intl\": \"For best performance\"\n    },\n    \"minimum-stability\": \"dev\",\n    \"extra\": {\n        \"thanks\": {\n            \"name\": \"symfony/polyfill\",\n            \"url\": \"https://github.com/symfony/polyfill\"\n        }\n    }\n}\n","vendor/symfony/polyfill-intl-normalizer/LICENSE":"Copyright (c) 2015-present Fabien Potencier\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is furnished\nto do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n","vendor/symfony/polyfill-intl-normalizer/Normalizer.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Polyfill\\Intl\\Normalizer;\n\n/**\n * Normalizer is a PHP fallback implementation of the Normalizer class provided by the intl extension.\n *\n * It has been validated with Unicode 6.3 Normalization Conformance Test.\n * See http://www.unicode.org/reports/tr15/ for detailed info about Unicode normalizations.\n *\n * @author Nicolas Grekas <p@tchwork.com>\n *\n * @internal\n */\nclass Normalizer\n{\n    public const FORM_D = \\Normalizer::FORM_D;\n    public const FORM_KD = \\Normalizer::FORM_KD;\n    public const FORM_C = \\Normalizer::FORM_C;\n    public const FORM_KC = \\Normalizer::FORM_KC;\n    public const NFD = \\Normalizer::NFD;\n    public const NFKD = \\Normalizer::NFKD;\n    public const NFC = \\Normalizer::NFC;\n    public const NFKC = \\Normalizer::NFKC;\n\n    private static $C;\n    private static $D;\n    private static $KD;\n    private static $cC;\n    private static $rawD;\n    private static $rawKD;\n    private static $ulenMask = [\"\\xC0\" => 2, \"\\xD0\" => 2, \"\\xE0\" => 3, \"\\xF0\" => 4];\n    private static $ASCII = \"\\x20\\x65\\x69\\x61\\x73\\x6E\\x74\\x72\\x6F\\x6C\\x75\\x64\\x5D\\x5B\\x63\\x6D\\x70\\x27\\x0A\\x67\\x7C\\x68\\x76\\x2E\\x66\\x62\\x2C\\x3A\\x3D\\x2D\\x71\\x31\\x30\\x43\\x32\\x2A\\x79\\x78\\x29\\x28\\x4C\\x39\\x41\\x53\\x2F\\x50\\x22\\x45\\x6A\\x4D\\x49\\x6B\\x33\\x3E\\x35\\x54\\x3C\\x44\\x34\\x7D\\x42\\x7B\\x38\\x46\\x77\\x52\\x36\\x37\\x55\\x47\\x4E\\x3B\\x4A\\x7A\\x56\\x23\\x48\\x4F\\x57\\x5F\\x26\\x21\\x4B\\x3F\\x58\\x51\\x25\\x59\\x5C\\x09\\x5A\\x2B\\x7E\\x5E\\x24\\x40\\x60\\x7F\\x00\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\x08\\x0B\\x0C\\x0D\\x0E\\x0F\\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17\\x18\\x19\\x1A\\x1B\\x1C\\x1D\\x1E\\x1F\";\n\n    public static function isNormalized(string $s, int $form = self::FORM_C)\n    {\n        if (!\\in_array($form, [self::NFD, self::NFKD, self::NFC, self::NFKC])) {\n            return false;\n        }\n        if (!isset($s[strspn($s, self::$ASCII)])) {\n            return true;\n        }\n        if (self::NFC == $form && preg_match('//u', $s) && !preg_match('/[^\\x00-\\x{2FF}]/u', $s)) {\n            return true;\n        }\n\n        return self::normalize($s, $form) === $s;\n    }\n\n    public static function getRawDecomposition(string $s, int $form = self::FORM_C)\n    {\n        if ('' === $s || !preg_match('//u', $s)) {\n            return null;\n        }\n\n        $ulen = $s[0] < \"\\x80\" ? 1 : (self::$ulenMask[$s[0] & \"\\xF0\"] ?? 0);\n        if (!$ulen || \\strlen($s) !== $ulen) {\n            return null;\n        }\n\n        if (self::NFC !== $form && self::NFD !== $form && self::NFKC !== $form && self::NFKD !== $form) {\n            return '';\n        }\n\n        if ($s >= \"\\xEA\\xB0\\x80\" && $s <= \"\\xED\\x9E\\xA3\") {\n            $u = unpack('C*', $s);\n            $j = (($u[1] - 224) << 12) + (($u[2] - 128) << 6) + $u[3] - 0xAC80;\n\n            if ($t = $j % 28) {\n                $j -= $t;\n                $lv = 0xAC00 + $j;\n                $r = \\chr(0xE0 | $lv >> 12).\\chr(0x80 | $lv >> 6 & 0x3F).\\chr(0x80 | $lv & 0x3F);\n                $r .= $t < 25\n                    ? (\"\\xE1\\x86\".\\chr(0xA7 + $t))\n                    : (\"\\xE1\\x87\".\\chr(0x67 + $t));\n\n                return $r;\n            }\n\n            return \"\\xE1\\x84\".\\chr(0x80 + (int) ($j / 588))\n                  .\"\\xE1\\x85\".\\chr(0xA1 + (int) (($j % 588) / 28));\n        }\n\n        if (null === self::$rawD) {\n            self::$rawD = self::getData('rawCanonicalDecomposition');\n        }\n\n        if (isset(self::$rawD[$s])) {\n            return self::$rawD[$s];\n        }\n\n        if (self::NFKC === $form || self::NFKD === $form) {\n            if (null === self::$rawKD) {\n                self::$rawKD = self::getData('rawCompatibilityDecomposition');\n            }\n\n            return self::$rawKD[$s] ?? null;\n        }\n\n        return null;\n    }\n\n    public static function normalize(string $s, int $form = self::FORM_C)\n    {\n        if (!preg_match('//u', $s)) {\n            return false;\n        }\n\n        switch ($form) {\n            case self::NFC: $C = true; $K = false; break;\n            case self::NFD: $C = false; $K = false; break;\n            case self::NFKC: $C = true; $K = true; break;\n            case self::NFKD: $C = false; $K = true; break;\n            default:\n                if (\\defined('Normalizer::NONE') && \\Normalizer::NONE == $form) {\n                    return $s;\n                }\n\n                if (80000 > \\PHP_VERSION_ID) {\n                    return false;\n                }\n\n                // the doubled article was fixed in PHP 8.6\n                throw new \\ValueError('normalizer_normalize(): Argument #2 ($form) must be a '.(80600 > \\PHP_VERSION_ID ? 'a ' : '').'valid normalization form');\n        }\n\n        if ('' === $s) {\n            return '';\n        }\n\n        if ($K && null === self::$KD) {\n            self::$KD = self::getData('compatibilityDecomposition');\n        }\n\n        if (null === self::$D) {\n            self::$D = self::getData('canonicalDecomposition');\n            self::$cC = self::getData('combiningClass');\n        }\n\n        if (null !== $mbEncoding = (2 /* MB_OVERLOAD_STRING */ & (int) \\ini_get('mbstring.func_overload')) ? mb_internal_encoding() : null) {\n            mb_internal_encoding('8bit');\n        }\n\n        $r = self::decompose($s, $K);\n\n        if ($C) {\n            if (null === self::$C) {\n                self::$C = self::getData('canonicalComposition');\n            }\n\n            $r = self::recompose($r);\n        }\n        if (null !== $mbEncoding) {\n            mb_internal_encoding($mbEncoding);\n        }\n\n        return $r;\n    }\n\n    private static function recompose($s)\n    {\n        $ASCII = self::$ASCII;\n        $compMap = self::$C;\n        $combClass = self::$cC;\n        $ulenMask = self::$ulenMask;\n\n        $result = $tail = '';\n\n        $i = $s[0] < \"\\x80\" ? 1 : $ulenMask[$s[0] & \"\\xF0\"];\n        $len = \\strlen($s);\n\n        $lastUchr = substr($s, 0, $i);\n        $lastUcls = isset($combClass[$lastUchr]) ? 256 : 0;\n\n        while ($i < $len) {\n            if ($s[$i] < \"\\x80\") {\n                // ASCII chars\n\n                if ($tail) {\n                    $lastUchr .= $tail;\n                    $tail = '';\n                }\n\n                if ($j = strspn($s, $ASCII, $i + 1)) {\n                    $lastUchr .= substr($s, $i, $j);\n                    $i += $j;\n                }\n\n                $result .= $lastUchr;\n                $lastUchr = $s[$i];\n                $lastUcls = 0;\n                ++$i;\n                continue;\n            }\n\n            $ulen = $ulenMask[$s[$i] & \"\\xF0\"];\n            $uchr = substr($s, $i, $ulen);\n\n            if ($lastUchr < \"\\xE1\\x84\\x80\" || \"\\xE1\\x84\\x92\" < $lastUchr\n                || $uchr < \"\\xE1\\x85\\xA1\" || \"\\xE1\\x85\\xB5\" < $uchr\n                || $lastUcls) {\n                // Table lookup and combining chars composition\n\n                $ucls = $combClass[$uchr] ?? 0;\n\n                if (isset($compMap[$lastUchr.$uchr]) && (!$lastUcls || $lastUcls < $ucls)) {\n                    $lastUchr = $compMap[$lastUchr.$uchr];\n                } elseif ($lastUcls = $ucls) {\n                    $tail .= $uchr;\n                } else {\n                    if ($tail) {\n                        $lastUchr .= $tail;\n                        $tail = '';\n                    }\n\n                    $result .= $lastUchr;\n                    $lastUchr = $uchr;\n                }\n            } else {\n                // Hangul chars\n\n                $L = \\ord($lastUchr[2]) - 0x80;\n                $V = \\ord($uchr[2]) - 0xA1;\n                $T = 0;\n\n                $uchr = substr($s, $i + $ulen, 3);\n\n                if (\"\\xE1\\x86\\xA7\" <= $uchr && $uchr <= \"\\xE1\\x87\\x82\") {\n                    $T = \\ord($uchr[2]) - 0xA7;\n                    0 > $T && $T += 0x40;\n                    $ulen += 3;\n                }\n\n                $L = 0xAC00 + ($L * 21 + $V) * 28 + $T;\n                $lastUchr = \\chr(0xE0 | $L >> 12).\\chr(0x80 | $L >> 6 & 0x3F).\\chr(0x80 | $L & 0x3F);\n            }\n\n            $i += $ulen;\n        }\n\n        return $result.$lastUchr.$tail;\n    }\n\n    private static function decompose($s, $c)\n    {\n        $result = '';\n\n        $ASCII = self::$ASCII;\n        $decompMap = self::$D;\n        $combClass = self::$cC;\n        $ulenMask = self::$ulenMask;\n        if ($c) {\n            $compatMap = self::$KD;\n        }\n\n        $c = [];\n        $i = 0;\n        $len = \\strlen($s);\n\n        while ($i < $len) {\n            if ($s[$i] < \"\\x80\") {\n                // ASCII chars\n\n                if ($c) {\n                    ksort($c);\n                    $result .= implode('', $c);\n                    $c = [];\n                }\n\n                $j = 1 + strspn($s, $ASCII, $i + 1);\n                $result .= substr($s, $i, $j);\n                $i += $j;\n                continue;\n            }\n\n            $ulen = $ulenMask[$s[$i] & \"\\xF0\"];\n            $uchr = substr($s, $i, $ulen);\n            $i += $ulen;\n\n            if ($uchr < \"\\xEA\\xB0\\x80\" || \"\\xED\\x9E\\xA3\" < $uchr) {\n                // Table lookup\n\n                if ($uchr !== $j = $compatMap[$uchr] ?? ($decompMap[$uchr] ?? $uchr)) {\n                    $uchr = $j;\n\n                    $j = \\strlen($uchr);\n                    $ulen = $uchr[0] < \"\\x80\" ? 1 : $ulenMask[$uchr[0] & \"\\xF0\"];\n\n                    if ($ulen != $j) {\n                        // Put trailing chars in $s\n\n                        $j -= $ulen;\n                        $i -= $j;\n\n                        if (0 > $i) {\n                            $s = str_repeat(' ', -$i).$s;\n                            $len -= $i;\n                            $i = 0;\n                        }\n\n                        while ($j--) {\n                            $s[$i + $j] = $uchr[$ulen + $j];\n                        }\n\n                        $uchr = substr($uchr, 0, $ulen);\n                    }\n                }\n                if (isset($combClass[$uchr])) {\n                    // Combining chars, for sorting\n\n                    if (!isset($c[$combClass[$uchr]])) {\n                        $c[$combClass[$uchr]] = '';\n                    }\n                    $c[$combClass[$uchr]] .= $uchr;\n                    continue;\n                }\n            } else {\n                // Hangul chars\n\n                $uchr = unpack('C*', $uchr);\n                $j = (($uchr[1] - 224) << 12) + (($uchr[2] - 128) << 6) + $uchr[3] - 0xAC80;\n\n                $uchr = \"\\xE1\\x84\".\\chr(0x80 + (int) ($j / 588))\n                       .\"\\xE1\\x85\".\\chr(0xA1 + (int) (($j % 588) / 28));\n\n                if ($j %= 28) {\n                    $uchr .= $j < 25\n                        ? (\"\\xE1\\x86\".\\chr(0xA7 + $j))\n                        : (\"\\xE1\\x87\".\\chr(0x67 + $j));\n                }\n            }\n            if ($c) {\n                ksort($c);\n                $result .= implode('', $c);\n                $c = [];\n            }\n\n            $result .= $uchr;\n        }\n\n        if ($c) {\n            ksort($c);\n            $result .= implode('', $c);\n        }\n\n        return $result;\n    }\n\n    private static function getData($file)\n    {\n        if (file_exists($file = __DIR__.'/Resources/unidata/'.$file.'.php')) {\n            return require $file;\n        }\n\n        return false;\n    }\n}\n","vendor/symfony/polyfill-intl-normalizer/README.md":"Symfony Polyfill / Intl: Normalizer\n===================================\n\nThis component provides a fallback implementation for the\n[`Normalizer`](https://php.net/Normalizer) class provided\nby the [Intl](https://php.net/intl) extension.\n\nMore information can be found in the\n[main Polyfill README](https://github.com/symfony/polyfill/blob/main/README.md).\n\nLicense\n=======\n\nThis library is released under the [MIT license](LICENSE).\n","vendor/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php":"<?php\n\nclass Normalizer extends Symfony\\Polyfill\\Intl\\Normalizer\\Normalizer\n{\n    /**\n     * @deprecated since ICU 56 and removed in PHP 8\n     */\n    public const NONE = 2;\n    public const FORM_D = 4;\n    public const FORM_KD = 8;\n    public const FORM_C = 16;\n    public const FORM_KC = 32;\n    public const NFD = 4;\n    public const NFKD = 8;\n    public const NFC = 16;\n    public const NFKC = 32;\n}\n","vendor/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalComposition.php":"<?php\n\nreturn array (\n  'À' => 'À',\n  'Á' => 'Á',\n  'Â' => 'Â',\n  'Ã' => 'Ã',\n  'Ä' => 'Ä',\n  'Å' => 'Å',\n  'Ç' => 'Ç',\n  'È' => 'È',\n  'É' => 'É',\n  'Ê' => 'Ê',\n  'Ë' => 'Ë',\n  'Ì' => 'Ì',\n  'Í' => 'Í',\n  'Î' => 'Î',\n  'Ï' => 'Ï',\n  'Ñ' => 'Ñ',\n  'Ò' => 'Ò',\n  'Ó' => 'Ó',\n  'Ô' => 'Ô',\n  'Õ' => 'Õ',\n  'Ö' => 'Ö',\n  'Ù' => 'Ù',\n  'Ú' => 'Ú',\n  'Û' => 'Û',\n  'Ü' => 'Ü',\n  'Ý' => 'Ý',\n  'à' => 'à',\n  'á' => 'á',\n  'â' => 'â',\n  'ã' => 'ã',\n  'ä' => 'ä',\n  'å' => 'å',\n  'ç' => 'ç',\n  'è' => 'è',\n  'é' => 'é',\n  'ê' => 'ê',\n  'ë' => 'ë',\n  'ì' => 'ì',\n  'í' => 'í',\n  'î' => 'î',\n  'ï' => 'ï',\n  'ñ' => 'ñ',\n  'ò' => 'ò',\n  'ó' => 'ó',\n  'ô' => 'ô',\n  'õ' => 'õ',\n  'ö' => 'ö',\n  'ù' => 'ù',\n  'ú' => 'ú',\n  'û' => 'û',\n  'ü' => 'ü',\n  'ý' => 'ý',\n  'ÿ' => 'ÿ',\n  'Ā' => 'Ā',\n  'ā' => 'ā',\n  'Ă' => 'Ă',\n  'ă' => 'ă',\n  'Ą' => 'Ą',\n  'ą' => 'ą',\n  'Ć' => 'Ć',\n  'ć' => 'ć',\n  'Ĉ' => 'Ĉ',\n  'ĉ' => 'ĉ',\n  'Ċ' => 'Ċ',\n  'ċ' => 'ċ',\n  'Č' => 'Č',\n  'č' => 'č',\n  'Ď' => 'Ď',\n  'ď' => 'ď',\n  'Ē' => 'Ē',\n  'ē' => 'ē',\n  'Ĕ' => 'Ĕ',\n  'ĕ' => 'ĕ',\n  'Ė' => 'Ė',\n  'ė' => 'ė',\n  'Ę' => 'Ę',\n  'ę' => 'ę',\n  'Ě' => 'Ě',\n  'ě' => 'ě',\n  'Ĝ' => 'Ĝ',\n  'ĝ' => 'ĝ',\n  'Ğ' => 'Ğ',\n  'ğ' => 'ğ',\n  'Ġ' => 'Ġ',\n  'ġ' => 'ġ',\n  'Ģ' => 'Ģ',\n  'ģ' => 'ģ',\n  'Ĥ' => 'Ĥ',\n  'ĥ' => 'ĥ',\n  'Ĩ' => 'Ĩ',\n  'ĩ' => 'ĩ',\n  'Ī' => 'Ī',\n  'ī' => 'ī',\n  'Ĭ' => 'Ĭ',\n  'ĭ' => 'ĭ',\n  'Į' => 'Į',\n  'į' => 'į',\n  'İ' => 'İ',\n  'Ĵ' => 'Ĵ',\n  'ĵ' => 'ĵ',\n  'Ķ' => 'Ķ',\n  'ķ' => 'ķ',\n  'Ĺ' => 'Ĺ',\n  'ĺ' => 'ĺ',\n  'Ļ' => 'Ļ',\n  'ļ' => 'ļ',\n  'Ľ' => 'Ľ',\n  'ľ' => 'ľ',\n  'Ń' => 'Ń',\n  'ń' => 'ń',\n  'Ņ' => 'Ņ',\n  'ņ' => 'ņ',\n  'Ň' => 'Ň',\n  'ň' => 'ň',\n  'Ō' => 'Ō',\n  'ō' => 'ō',\n  'Ŏ' => 'Ŏ',\n  'ŏ' => 'ŏ',\n  'Ő' => 'Ő',\n  'ő' => 'ő',\n  'Ŕ' => 'Ŕ',\n  'ŕ' => 'ŕ',\n  'Ŗ' => 'Ŗ',\n  'ŗ' => 'ŗ',\n  'Ř' => 'Ř',\n  'ř' => 'ř',\n  'Ś' => 'Ś',\n  'ś' => 'ś',\n  'Ŝ' => 'Ŝ',\n  'ŝ' => 'ŝ',\n  'Ş' => 'Ş',\n  'ş' => 'ş',\n  'Š' => 'Š',\n  'š' => 'š',\n  'Ţ' => 'Ţ',\n  'ţ' => 'ţ',\n  'Ť' => 'Ť',\n  'ť' => 'ť',\n  'Ũ' => 'Ũ',\n  'ũ' => 'ũ',\n  'Ū' => 'Ū',\n  'ū' => 'ū',\n  'Ŭ' => 'Ŭ',\n  'ŭ' => 'ŭ',\n  'Ů' => 'Ů',\n  'ů' => 'ů',\n  'Ű' => 'Ű',\n  'ű' => 'ű',\n  'Ų' => 'Ų',\n  'ų' => 'ų',\n  'Ŵ' => 'Ŵ',\n  'ŵ' => 'ŵ',\n  'Ŷ' => 'Ŷ',\n  'ŷ' => 'ŷ',\n  'Ÿ' => 'Ÿ',\n  'Ź' => 'Ź',\n  'ź' => 'ź',\n  'Ż' => 'Ż',\n  'ż' => 'ż',\n  'Ž' => 'Ž',\n  'ž' => 'ž',\n  'Ơ' => 'Ơ',\n  'ơ' => 'ơ',\n  'Ư' => 'Ư',\n  'ư' => 'ư',\n  'Ǎ' => 'Ǎ',\n  'ǎ' => 'ǎ',\n  'Ǐ' => 'Ǐ',\n  'ǐ' => 'ǐ',\n  'Ǒ' => 'Ǒ',\n  'ǒ' => 'ǒ',\n  'Ǔ' => 'Ǔ',\n  'ǔ' => 'ǔ',\n  'Ǖ' => 'Ǖ',\n  'ǖ' => 'ǖ',\n  'Ǘ' => 'Ǘ',\n  'ǘ' => 'ǘ',\n  'Ǚ' => 'Ǚ',\n  'ǚ' => 'ǚ',\n  'Ǜ' => 'Ǜ',\n  'ǜ' => 'ǜ',\n  'Ǟ' => 'Ǟ',\n  'ǟ' => 'ǟ',\n  'Ǡ' => 'Ǡ',\n  'ǡ' => 'ǡ',\n  'Ǣ' => 'Ǣ',\n  'ǣ' => 'ǣ',\n  'Ǧ' => 'Ǧ',\n  'ǧ' => 'ǧ',\n  'Ǩ' => 'Ǩ',\n  'ǩ' => 'ǩ',\n  'Ǫ' => 'Ǫ',\n  'ǫ' => 'ǫ',\n  'Ǭ' => 'Ǭ',\n  'ǭ' => 'ǭ',\n  'Ǯ' => 'Ǯ',\n  'ǯ' => 'ǯ',\n  'ǰ' => 'ǰ',\n  'Ǵ' => 'Ǵ',\n  'ǵ' => 'ǵ',\n  'Ǹ' => 'Ǹ',\n  'ǹ' => 'ǹ',\n  'Ǻ' => 'Ǻ',\n  'ǻ' => 'ǻ',\n  'Ǽ' => 'Ǽ',\n  'ǽ' => 'ǽ',\n  'Ǿ' => 'Ǿ',\n  'ǿ' => 'ǿ',\n  'Ȁ' => 'Ȁ',\n  'ȁ' => 'ȁ',\n  'Ȃ' => 'Ȃ',\n  'ȃ' => 'ȃ',\n  'Ȅ' => 'Ȅ',\n  'ȅ' => 'ȅ',\n  'Ȇ' => 'Ȇ',\n  'ȇ' => 'ȇ',\n  'Ȉ' => 'Ȉ',\n  'ȉ' => 'ȉ',\n  'Ȋ' => 'Ȋ',\n  'ȋ' => 'ȋ',\n  'Ȍ' => 'Ȍ',\n  'ȍ' => 'ȍ',\n  'Ȏ' => 'Ȏ',\n  'ȏ' => 'ȏ',\n  'Ȑ' => 'Ȑ',\n  'ȑ' => 'ȑ',\n  'Ȓ' => 'Ȓ',\n  'ȓ' => 'ȓ',\n  'Ȕ' => 'Ȕ',\n  'ȕ' => 'ȕ',\n  'Ȗ' => 'Ȗ',\n  'ȗ' => 'ȗ',\n  'Ș' => 'Ș',\n  'ș' => 'ș',\n  'Ț' => 'Ț',\n  'ț' => 'ț',\n  'Ȟ' => 'Ȟ',\n  'ȟ' => 'ȟ',\n  'Ȧ' => 'Ȧ',\n  'ȧ' => 'ȧ',\n  'Ȩ' => 'Ȩ',\n  'ȩ' => 'ȩ',\n  'Ȫ' => 'Ȫ',\n  'ȫ' => 'ȫ',\n  'Ȭ' => 'Ȭ',\n  'ȭ' => 'ȭ',\n  'Ȯ' => 'Ȯ',\n  'ȯ' => 'ȯ',\n  'Ȱ' => 'Ȱ',\n  'ȱ' => 'ȱ',\n  'Ȳ' => 'Ȳ',\n  'ȳ' => 'ȳ',\n  '΅' => '΅',\n  'Ά' => 'Ά',\n  'Έ' => 'Έ',\n  'Ή' => 'Ή',\n  'Ί' => 'Ί',\n  'Ό' => 'Ό',\n  'Ύ' => 'Ύ',\n  'Ώ' => 'Ώ',\n  'ΐ' => 'ΐ',\n  'Ϊ' => 'Ϊ',\n  'Ϋ' => 'Ϋ',\n  'ά' => 'ά',\n  'έ' => 'έ',\n  'ή' => 'ή',\n  'ί' => 'ί',\n  'ΰ' => 'ΰ',\n  'ϊ' => 'ϊ',\n  'ϋ' => 'ϋ',\n  'ό' => 'ό',\n  'ύ' => 'ύ',\n  'ώ' => 'ώ',\n  'ϓ' => 'ϓ',\n  'ϔ' => 'ϔ',\n  'Ѐ' => 'Ѐ',\n  'Ё' => 'Ё',\n  'Ѓ' => 'Ѓ',\n  'Ї' => 'Ї',\n  'Ќ' => 'Ќ',\n  'Ѝ' => 'Ѝ',\n  'Ў' => 'Ў',\n  'Й' => 'Й',\n  'й' => 'й',\n  'ѐ' => 'ѐ',\n  'ё' => 'ё',\n  'ѓ' => 'ѓ',\n  'ї' => 'ї',\n  'ќ' => 'ќ',\n  'ѝ' => 'ѝ',\n  'ў' => 'ў',\n  'Ѷ' => 'Ѷ',\n  'ѷ' => 'ѷ',\n  'Ӂ' => 'Ӂ',\n  'ӂ' => 'ӂ',\n  'Ӑ' => 'Ӑ',\n  'ӑ' => 'ӑ',\n  'Ӓ' => 'Ӓ',\n  'ӓ' => 'ӓ',\n  'Ӗ' => 'Ӗ',\n  'ӗ' => 'ӗ',\n  'Ӛ' => 'Ӛ',\n  'ӛ' => 'ӛ',\n  'Ӝ' => 'Ӝ',\n  'ӝ' => 'ӝ',\n  'Ӟ' => 'Ӟ',\n  'ӟ' => 'ӟ',\n  'Ӣ' => 'Ӣ',\n  'ӣ' => 'ӣ',\n  'Ӥ' => 'Ӥ',\n  'ӥ' => 'ӥ',\n  'Ӧ' => 'Ӧ',\n  'ӧ' => 'ӧ',\n  'Ӫ' => 'Ӫ',\n  'ӫ' => 'ӫ',\n  'Ӭ' => 'Ӭ',\n  'ӭ' => 'ӭ',\n  'Ӯ' => 'Ӯ',\n  'ӯ' => 'ӯ',\n  'Ӱ' => 'Ӱ',\n  'ӱ' => 'ӱ',\n  'Ӳ' => 'Ӳ',\n  'ӳ' => 'ӳ',\n  'Ӵ' => 'Ӵ',\n  'ӵ' => 'ӵ',\n  'Ӹ' => 'Ӹ',\n  'ӹ' => 'ӹ',\n  'آ' => 'آ',\n  'أ' => 'أ',\n  'ؤ' => 'ؤ',\n  'إ' => 'إ',\n  'ئ' => 'ئ',\n  'ۀ' => 'ۀ',\n  'ۂ' => 'ۂ',\n  'ۓ' => 'ۓ',\n  'ऩ' => 'ऩ',\n  'ऱ' => 'ऱ',\n  'ऴ' => 'ऴ',\n  'ো' => 'ো',\n  'ৌ' => 'ৌ',\n  'ୈ' => 'ୈ',\n  'ୋ' => 'ୋ',\n  'ୌ' => 'ୌ',\n  'ஔ' => 'ஔ',\n  'ொ' => 'ொ',\n  'ோ' => 'ோ',\n  'ௌ' => 'ௌ',\n  'ై' => 'ై',\n  'ೀ' => 'ೀ',\n  'ೇ' => 'ೇ',\n  'ೈ' => 'ೈ',\n  'ೊ' => 'ೊ',\n  'ೋ' => 'ೋ',\n  'ൊ' => 'ൊ',\n  'ോ' => 'ോ',\n  'ൌ' => 'ൌ',\n  'ේ' => 'ේ',\n  'ො' => 'ො',\n  'ෝ' => 'ෝ',\n  'ෞ' => 'ෞ',\n  'ဦ' => 'ဦ',\n  'ᬆ' => 'ᬆ',\n  'ᬈ' => 'ᬈ',\n  'ᬊ' => 'ᬊ',\n  'ᬌ' => 'ᬌ',\n  'ᬎ' => 'ᬎ',\n  'ᬒ' => 'ᬒ',\n  'ᬻ' => 'ᬻ',\n  'ᬽ' => 'ᬽ',\n  'ᭀ' => 'ᭀ',\n  'ᭁ' => 'ᭁ',\n  'ᭃ' => 'ᭃ',\n  'Ḁ' => 'Ḁ',\n  'ḁ' => 'ḁ',\n  'Ḃ' => 'Ḃ',\n  'ḃ' => 'ḃ',\n  'Ḅ' => 'Ḅ',\n  'ḅ' => 'ḅ',\n  'Ḇ' => 'Ḇ',\n  'ḇ' => 'ḇ',\n  'Ḉ' => 'Ḉ',\n  'ḉ' => 'ḉ',\n  'Ḋ' => 'Ḋ',\n  'ḋ' => 'ḋ',\n  'Ḍ' => 'Ḍ',\n  'ḍ' => 'ḍ',\n  'Ḏ' => 'Ḏ',\n  'ḏ' => 'ḏ',\n  'Ḑ' => 'Ḑ',\n  'ḑ' => 'ḑ',\n  'Ḓ' => 'Ḓ',\n  'ḓ' => 'ḓ',\n  'Ḕ' => 'Ḕ',\n  'ḕ' => 'ḕ',\n  'Ḗ' => 'Ḗ',\n  'ḗ' => 'ḗ',\n  'Ḙ' => 'Ḙ',\n  'ḙ' => 'ḙ',\n  'Ḛ' => 'Ḛ',\n  'ḛ' => 'ḛ',\n  'Ḝ' => 'Ḝ',\n  'ḝ' => 'ḝ',\n  'Ḟ' => 'Ḟ',\n  'ḟ' => 'ḟ',\n  'Ḡ' => 'Ḡ',\n  'ḡ' => 'ḡ',\n  'Ḣ' => 'Ḣ',\n  'ḣ' => 'ḣ',\n  'Ḥ' => 'Ḥ',\n  'ḥ' => 'ḥ',\n  'Ḧ' => 'Ḧ',\n  'ḧ' => 'ḧ',\n  'Ḩ' => 'Ḩ',\n  'ḩ' => 'ḩ',\n  'Ḫ' => 'Ḫ',\n  'ḫ' => 'ḫ',\n  'Ḭ' => 'Ḭ',\n  'ḭ' => 'ḭ',\n  'Ḯ' => 'Ḯ',\n  'ḯ' => 'ḯ',\n  'Ḱ' => 'Ḱ',\n  'ḱ' => 'ḱ',\n  'Ḳ' => 'Ḳ',\n  'ḳ' => 'ḳ',\n  'Ḵ' => 'Ḵ',\n  'ḵ' => 'ḵ',\n  'Ḷ' => 'Ḷ',\n  'ḷ' => 'ḷ',\n  'Ḹ' => 'Ḹ',\n  'ḹ' => 'ḹ',\n  'Ḻ' => 'Ḻ',\n  'ḻ' => 'ḻ',\n  'Ḽ' => 'Ḽ',\n  'ḽ' => 'ḽ',\n  'Ḿ' => 'Ḿ',\n  'ḿ' => 'ḿ',\n  'Ṁ' => 'Ṁ',\n  'ṁ' => 'ṁ',\n  'Ṃ' => 'Ṃ',\n  'ṃ' => 'ṃ',\n  'Ṅ' => 'Ṅ',\n  'ṅ' => 'ṅ',\n  'Ṇ' => 'Ṇ',\n  'ṇ' => 'ṇ',\n  'Ṉ' => 'Ṉ',\n  'ṉ' => 'ṉ',\n  'Ṋ' => 'Ṋ',\n  'ṋ' => 'ṋ',\n  'Ṍ' => 'Ṍ',\n  'ṍ' => 'ṍ',\n  'Ṏ' => 'Ṏ',\n  'ṏ' => 'ṏ',\n  'Ṑ' => 'Ṑ',\n  'ṑ' => 'ṑ',\n  'Ṓ' => 'Ṓ',\n  'ṓ' => 'ṓ',\n  'Ṕ' => 'Ṕ',\n  'ṕ' => 'ṕ',\n  'Ṗ' => 'Ṗ',\n  'ṗ' => 'ṗ',\n  'Ṙ' => 'Ṙ',\n  'ṙ' => 'ṙ',\n  'Ṛ' => 'Ṛ',\n  'ṛ' => 'ṛ',\n  'Ṝ' => 'Ṝ',\n  'ṝ' => 'ṝ',\n  'Ṟ' => 'Ṟ',\n  'ṟ' => 'ṟ',\n  'Ṡ' => 'Ṡ',\n  'ṡ' => 'ṡ',\n  'Ṣ' => 'Ṣ',\n  'ṣ' => 'ṣ',\n  'Ṥ' => 'Ṥ',\n  'ṥ' => 'ṥ',\n  'Ṧ' => 'Ṧ',\n  'ṧ' => 'ṧ',\n  'Ṩ' => 'Ṩ',\n  'ṩ' => 'ṩ',\n  'Ṫ' => 'Ṫ',\n  'ṫ' => 'ṫ',\n  'Ṭ' => 'Ṭ',\n  'ṭ' => 'ṭ',\n  'Ṯ' => 'Ṯ',\n  'ṯ' => 'ṯ',\n  'Ṱ' => 'Ṱ',\n  'ṱ' => 'ṱ',\n  'Ṳ' => 'Ṳ',\n  'ṳ' => 'ṳ',\n  'Ṵ' => 'Ṵ',\n  'ṵ' => 'ṵ',\n  'Ṷ' => 'Ṷ',\n  'ṷ' => 'ṷ',\n  'Ṹ' => 'Ṹ',\n  'ṹ' => 'ṹ',\n  'Ṻ' => 'Ṻ',\n  'ṻ' => 'ṻ',\n  'Ṽ' => 'Ṽ',\n  'ṽ' => 'ṽ',\n  'Ṿ' => 'Ṿ',\n  'ṿ' => 'ṿ',\n  'Ẁ' => 'Ẁ',\n  'ẁ' => 'ẁ',\n  'Ẃ' => 'Ẃ',\n  'ẃ' => 'ẃ',\n  'Ẅ' => 'Ẅ',\n  'ẅ' => 'ẅ',\n  'Ẇ' => 'Ẇ',\n  'ẇ' => 'ẇ',\n  'Ẉ' => 'Ẉ',\n  'ẉ' => 'ẉ',\n  'Ẋ' => 'Ẋ',\n  'ẋ' => 'ẋ',\n  'Ẍ' => 'Ẍ',\n  'ẍ' => 'ẍ',\n  'Ẏ' => 'Ẏ',\n  'ẏ' => 'ẏ',\n  'Ẑ' => 'Ẑ',\n  'ẑ' => 'ẑ',\n  'Ẓ' => 'Ẓ',\n  'ẓ' => 'ẓ',\n  'Ẕ' => 'Ẕ',\n  'ẕ' => 'ẕ',\n  'ẖ' => 'ẖ',\n  'ẗ' => 'ẗ',\n  'ẘ' => 'ẘ',\n  'ẙ' => 'ẙ',\n  'ẛ' => 'ẛ',\n  'Ạ' => 'Ạ',\n  'ạ' => 'ạ',\n  'Ả' => 'Ả',\n  'ả' => 'ả',\n  'Ấ' => 'Ấ',\n  'ấ' => 'ấ',\n  'Ầ' => 'Ầ',\n  'ầ' => 'ầ',\n  'Ẩ' => 'Ẩ',\n  'ẩ' => 'ẩ',\n  'Ẫ' => 'Ẫ',\n  'ẫ' => 'ẫ',\n  'Ậ' => 'Ậ',\n  'ậ' => 'ậ',\n  'Ắ' => 'Ắ',\n  'ắ' => 'ắ',\n  'Ằ' => 'Ằ',\n  'ằ' => 'ằ',\n  'Ẳ' => 'Ẳ',\n  'ẳ' => 'ẳ',\n  'Ẵ' => 'Ẵ',\n  'ẵ' => 'ẵ',\n  'Ặ' => 'Ặ',\n  'ặ' => 'ặ',\n  'Ẹ' => 'Ẹ',\n  'ẹ' => 'ẹ',\n  'Ẻ' => 'Ẻ',\n  'ẻ' => 'ẻ',\n  'Ẽ' => 'Ẽ',\n  'ẽ' => 'ẽ',\n  'Ế' => 'Ế',\n  'ế' => 'ế',\n  'Ề' => 'Ề',\n  'ề' => 'ề',\n  'Ể' => 'Ể',\n  'ể' => 'ể',\n  'Ễ' => 'Ễ',\n  'ễ' => 'ễ',\n  'Ệ' => 'Ệ',\n  'ệ' => 'ệ',\n  'Ỉ' => 'Ỉ',\n  'ỉ' => 'ỉ',\n  'Ị' => 'Ị',\n  'ị' => 'ị',\n  'Ọ' => 'Ọ',\n  'ọ' => 'ọ',\n  'Ỏ' => 'Ỏ',\n  'ỏ' => 'ỏ',\n  'Ố' => 'Ố',\n  'ố' => 'ố',\n  'Ồ' => 'Ồ',\n  'ồ' => 'ồ',\n  'Ổ' => 'Ổ',\n  'ổ' => 'ổ',\n  'Ỗ' => 'Ỗ',\n  'ỗ' => 'ỗ',\n  'Ộ' => 'Ộ',\n  'ộ' => 'ộ',\n  'Ớ' => 'Ớ',\n  'ớ' => 'ớ',\n  'Ờ' => 'Ờ',\n  'ờ' => 'ờ',\n  'Ở' => 'Ở',\n  'ở' => 'ở',\n  'Ỡ' => 'Ỡ',\n  'ỡ' => 'ỡ',\n  'Ợ' => 'Ợ',\n  'ợ' => 'ợ',\n  'Ụ' => 'Ụ',\n  'ụ' => 'ụ',\n  'Ủ' => 'Ủ',\n  'ủ' => 'ủ',\n  'Ứ' => 'Ứ',\n  'ứ' => 'ứ',\n  'Ừ' => 'Ừ',\n  'ừ' => 'ừ',\n  'Ử' => 'Ử',\n  'ử' => 'ử',\n  'Ữ' => 'Ữ',\n  'ữ' => 'ữ',\n  'Ự' => 'Ự',\n  'ự' => 'ự',\n  'Ỳ' => 'Ỳ',\n  'ỳ' => 'ỳ',\n  'Ỵ' => 'Ỵ',\n  'ỵ' => 'ỵ',\n  'Ỷ' => 'Ỷ',\n  'ỷ' => 'ỷ',\n  'Ỹ' => 'Ỹ',\n  'ỹ' => 'ỹ',\n  'ἀ' => 'ἀ',\n  'ἁ' => 'ἁ',\n  'ἂ' => 'ἂ',\n  'ἃ' => 'ἃ',\n  'ἄ' => 'ἄ',\n  'ἅ' => 'ἅ',\n  'ἆ' => 'ἆ',\n  'ἇ' => 'ἇ',\n  'Ἀ' => 'Ἀ',\n  'Ἁ' => 'Ἁ',\n  'Ἂ' => 'Ἂ',\n  'Ἃ' => 'Ἃ',\n  'Ἄ' => 'Ἄ',\n  'Ἅ' => 'Ἅ',\n  'Ἆ' => 'Ἆ',\n  'Ἇ' => 'Ἇ',\n  'ἐ' => 'ἐ',\n  'ἑ' => 'ἑ',\n  'ἒ' => 'ἒ',\n  'ἓ' => 'ἓ',\n  'ἔ' => 'ἔ',\n  'ἕ' => 'ἕ',\n  'Ἐ' => 'Ἐ',\n  'Ἑ' => 'Ἑ',\n  'Ἒ' => 'Ἒ',\n  'Ἓ' => 'Ἓ',\n  'Ἔ' => 'Ἔ',\n  'Ἕ' => 'Ἕ',\n  'ἠ' => 'ἠ',\n  'ἡ' => 'ἡ',\n  'ἢ' => 'ἢ',\n  'ἣ' => 'ἣ',\n  'ἤ' => 'ἤ',\n  'ἥ' => 'ἥ',\n  'ἦ' => 'ἦ',\n  'ἧ' => 'ἧ',\n  'Ἠ' => 'Ἠ',\n  'Ἡ' => 'Ἡ',\n  'Ἢ' => 'Ἢ',\n  'Ἣ' => 'Ἣ',\n  'Ἤ' => 'Ἤ',\n  'Ἥ' => 'Ἥ',\n  'Ἦ' => 'Ἦ',\n  'Ἧ' => 'Ἧ',\n  'ἰ' => 'ἰ',\n  'ἱ' => 'ἱ',\n  'ἲ' => 'ἲ',\n  'ἳ' => 'ἳ',\n  'ἴ' => 'ἴ',\n  'ἵ' => 'ἵ',\n  'ἶ' => 'ἶ',\n  'ἷ' => 'ἷ',\n  'Ἰ' => 'Ἰ',\n  'Ἱ' => 'Ἱ',\n  'Ἲ' => 'Ἲ',\n  'Ἳ' => 'Ἳ',\n  'Ἴ' => 'Ἴ',\n  'Ἵ' => 'Ἵ',\n  'Ἶ' => 'Ἶ',\n  'Ἷ' => 'Ἷ',\n  'ὀ' => 'ὀ',\n  'ὁ' => 'ὁ',\n  'ὂ' => 'ὂ',\n  'ὃ' => 'ὃ',\n  'ὄ' => 'ὄ',\n  'ὅ' => 'ὅ',\n  'Ὀ' => 'Ὀ',\n  'Ὁ' => 'Ὁ',\n  'Ὂ' => 'Ὂ',\n  'Ὃ' => 'Ὃ',\n  'Ὄ' => 'Ὄ',\n  'Ὅ' => 'Ὅ',\n  'ὐ' => 'ὐ',\n  'ὑ' => 'ὑ',\n  'ὒ' => 'ὒ',\n  'ὓ' => 'ὓ',\n  'ὔ' => 'ὔ',\n  'ὕ' => 'ὕ',\n  'ὖ' => 'ὖ',\n  'ὗ' => 'ὗ',\n  'Ὑ' => 'Ὑ',\n  'Ὓ' => 'Ὓ',\n  'Ὕ' => 'Ὕ',\n  'Ὗ' => 'Ὗ',\n  'ὠ' => 'ὠ',\n  'ὡ' => 'ὡ',\n  'ὢ' => 'ὢ',\n  'ὣ' => 'ὣ',\n  'ὤ' => 'ὤ',\n  'ὥ' => 'ὥ',\n  'ὦ' => 'ὦ',\n  'ὧ' => 'ὧ',\n  'Ὠ' => 'Ὠ',\n  'Ὡ' => 'Ὡ',\n  'Ὢ' => 'Ὢ',\n  'Ὣ' => 'Ὣ',\n  'Ὤ' => 'Ὤ',\n  'Ὥ' => 'Ὥ',\n  'Ὦ' => 'Ὦ',\n  'Ὧ' => 'Ὧ',\n  'ὰ' => 'ὰ',\n  'ὲ' => 'ὲ',\n  'ὴ' => 'ὴ',\n  'ὶ' => 'ὶ',\n  'ὸ' => 'ὸ',\n  'ὺ' => 'ὺ',\n  'ὼ' => 'ὼ',\n  'ᾀ' => 'ᾀ',\n  'ᾁ' => 'ᾁ',\n  'ᾂ' => 'ᾂ',\n  'ᾃ' => 'ᾃ',\n  'ᾄ' => 'ᾄ',\n  'ᾅ' => 'ᾅ',\n  'ᾆ' => 'ᾆ',\n  'ᾇ' => 'ᾇ',\n  'ᾈ' => 'ᾈ',\n  'ᾉ' => 'ᾉ',\n  'ᾊ' => 'ᾊ',\n  'ᾋ' => 'ᾋ',\n  'ᾌ' => 'ᾌ',\n  'ᾍ' => 'ᾍ',\n  'ᾎ' => 'ᾎ',\n  'ᾏ' => 'ᾏ',\n  'ᾐ' => 'ᾐ',\n  'ᾑ' => 'ᾑ',\n  'ᾒ' => 'ᾒ',\n  'ᾓ' => 'ᾓ',\n  'ᾔ' => 'ᾔ',\n  'ᾕ' => 'ᾕ',\n  'ᾖ' => 'ᾖ',\n  'ᾗ' => 'ᾗ',\n  'ᾘ' => 'ᾘ',\n  'ᾙ' => 'ᾙ',\n  'ᾚ' => 'ᾚ',\n  'ᾛ' => 'ᾛ',\n  'ᾜ' => 'ᾜ',\n  'ᾝ' => 'ᾝ',\n  'ᾞ' => 'ᾞ',\n  'ᾟ' => 'ᾟ',\n  'ᾠ' => 'ᾠ',\n  'ᾡ' => 'ᾡ',\n  'ᾢ' => 'ᾢ',\n  'ᾣ' => 'ᾣ',\n  'ᾤ' => 'ᾤ',\n  'ᾥ' => 'ᾥ',\n  'ᾦ' => 'ᾦ',\n  'ᾧ' => 'ᾧ',\n  'ᾨ' => 'ᾨ',\n  'ᾩ' => 'ᾩ',\n  'ᾪ' => 'ᾪ',\n  'ᾫ' => 'ᾫ',\n  'ᾬ' => 'ᾬ',\n  'ᾭ' => 'ᾭ',\n  'ᾮ' => 'ᾮ',\n  'ᾯ' => 'ᾯ',\n  'ᾰ' => 'ᾰ',\n  'ᾱ' => 'ᾱ',\n  'ᾲ' => 'ᾲ',\n  'ᾳ' => 'ᾳ',\n  'ᾴ' => 'ᾴ',\n  'ᾶ' => 'ᾶ',\n  'ᾷ' => 'ᾷ',\n  'Ᾰ' => 'Ᾰ',\n  'Ᾱ' => 'Ᾱ',\n  'Ὰ' => 'Ὰ',\n  'ᾼ' => 'ᾼ',\n  '῁' => '῁',\n  'ῂ' => 'ῂ',\n  'ῃ' => 'ῃ',\n  'ῄ' => 'ῄ',\n  'ῆ' => 'ῆ',\n  'ῇ' => 'ῇ',\n  'Ὲ' => 'Ὲ',\n  'Ὴ' => 'Ὴ',\n  'ῌ' => 'ῌ',\n  '῍' => '῍',\n  '῎' => '῎',\n  '῏' => '῏',\n  'ῐ' => 'ῐ',\n  'ῑ' => 'ῑ',\n  'ῒ' => 'ῒ',\n  'ῖ' => 'ῖ',\n  'ῗ' => 'ῗ',\n  'Ῐ' => 'Ῐ',\n  'Ῑ' => 'Ῑ',\n  'Ὶ' => 'Ὶ',\n  '῝' => '῝',\n  '῞' => '῞',\n  '῟' => '῟',\n  'ῠ' => 'ῠ',\n  'ῡ' => 'ῡ',\n  'ῢ' => 'ῢ',\n  'ῤ' => 'ῤ',\n  'ῥ' => 'ῥ',\n  'ῦ' => 'ῦ',\n  'ῧ' => 'ῧ',\n  'Ῠ' => 'Ῠ',\n  'Ῡ' => 'Ῡ',\n  'Ὺ' => 'Ὺ',\n  'Ῥ' => 'Ῥ',\n  '῭' => '῭',\n  'ῲ' => 'ῲ',\n  'ῳ' => 'ῳ',\n  'ῴ' => 'ῴ',\n  'ῶ' => 'ῶ',\n  'ῷ' => 'ῷ',\n  'Ὸ' => 'Ὸ',\n  'Ὼ' => 'Ὼ',\n  'ῼ' => 'ῼ',\n  '↚' => '↚',\n  '↛' => '↛',\n  '↮' => '↮',\n  '⇍' => '⇍',\n  '⇎' => '⇎',\n  '⇏' => '⇏',\n  '∄' => '∄',\n  '∉' => '∉',\n  '∌' => '∌',\n  '∤' => '∤',\n  '∦' => '∦',\n  '≁' => '≁',\n  '≄' => '≄',\n  '≇' => '≇',\n  '≉' => '≉',\n  '≠' => '≠',\n  '≢' => '≢',\n  '≭' => '≭',\n  '≮' => '≮',\n  '≯' => '≯',\n  '≰' => '≰',\n  '≱' => '≱',\n  '≴' => '≴',\n  '≵' => '≵',\n  '≸' => '≸',\n  '≹' => '≹',\n  '⊀' => '⊀',\n  '⊁' => '⊁',\n  '⊄' => '⊄',\n  '⊅' => '⊅',\n  '⊈' => '⊈',\n  '⊉' => '⊉',\n  '⊬' => '⊬',\n  '⊭' => '⊭',\n  '⊮' => '⊮',\n  '⊯' => '⊯',\n  '⋠' => '⋠',\n  '⋡' => '⋡',\n  '⋢' => '⋢',\n  '⋣' => '⋣',\n  '⋪' => '⋪',\n  '⋫' => '⋫',\n  '⋬' => '⋬',\n  '⋭' => '⋭',\n  'が' => 'が',\n  'ぎ' => 'ぎ',\n  'ぐ' => 'ぐ',\n  'げ' => 'げ',\n  'ご' => 'ご',\n  'ざ' => 'ざ',\n  'じ' => 'じ',\n  'ず' => 'ず',\n  'ぜ' => 'ぜ',\n  'ぞ' => 'ぞ',\n  'だ' => 'だ',\n  'ぢ' => 'ぢ',\n  'づ' => 'づ',\n  'で' => 'で',\n  'ど' => 'ど',\n  'ば' => 'ば',\n  'ぱ' => 'ぱ',\n  'び' => 'び',\n  'ぴ' => 'ぴ',\n  'ぶ' => 'ぶ',\n  'ぷ' => 'ぷ',\n  'べ' => 'べ',\n  'ぺ' => 'ぺ',\n  'ぼ' => 'ぼ',\n  'ぽ' => 'ぽ',\n  'ゔ' => 'ゔ',\n  'ゞ' => 'ゞ',\n  'ガ' => 'ガ',\n  'ギ' => 'ギ',\n  'グ' => 'グ',\n  'ゲ' => 'ゲ',\n  'ゴ' => 'ゴ',\n  'ザ' => 'ザ',\n  'ジ' => 'ジ',\n  'ズ' => 'ズ',\n  'ゼ' => 'ゼ',\n  'ゾ' => 'ゾ',\n  'ダ' => 'ダ',\n  'ヂ' => 'ヂ',\n  'ヅ' => 'ヅ',\n  'デ' => 'デ',\n  'ド' => 'ド',\n  'バ' => 'バ',\n  'パ' => 'パ',\n  'ビ' => 'ビ',\n  'ピ' => 'ピ',\n  'ブ' => 'ブ',\n  'プ' => 'プ',\n  'ベ' => 'ベ',\n  'ペ' => 'ペ',\n  'ボ' => 'ボ',\n  'ポ' => 'ポ',\n  'ヴ' => 'ヴ',\n  'ヷ' => 'ヷ',\n  'ヸ' => 'ヸ',\n  'ヹ' => 'ヹ',\n  'ヺ' => 'ヺ',\n  'ヾ' => 'ヾ',\n  '𑂚' => '𑂚',\n  '𑂜' => '𑂜',\n  '𑂫' => '𑂫',\n  '𑄮' => '𑄮',\n  '𑄯' => '𑄯',\n  '𑍋' => '𑍋',\n  '𑍌' => '𑍌',\n  '𑒻' => '𑒻',\n  '𑒼' => '𑒼',\n  '𑒾' => '𑒾',\n  '𑖺' => '𑖺',\n  '𑖻' => '𑖻',\n  '𑤸' => '𑤸',\n);\n","vendor/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalDecomposition.php":"<?php\n\nreturn array (\n  'À' => 'À',\n  'Á' => 'Á',\n  'Â' => 'Â',\n  'Ã' => 'Ã',\n  'Ä' => 'Ä',\n  'Å' => 'Å',\n  'Ç' => 'Ç',\n  'È' => 'È',\n  'É' => 'É',\n  'Ê' => 'Ê',\n  'Ë' => 'Ë',\n  'Ì' => 'Ì',\n  'Í' => 'Í',\n  'Î' => 'Î',\n  'Ï' => 'Ï',\n  'Ñ' => 'Ñ',\n  'Ò' => 'Ò',\n  'Ó' => 'Ó',\n  'Ô' => 'Ô',\n  'Õ' => 'Õ',\n  'Ö' => 'Ö',\n  'Ù' => 'Ù',\n  'Ú' => 'Ú',\n  'Û' => 'Û',\n  'Ü' => 'Ü',\n  'Ý' => 'Ý',\n  'à' => 'à',\n  'á' => 'á',\n  'â' => 'â',\n  'ã' => 'ã',\n  'ä' => 'ä',\n  'å' => 'å',\n  'ç' => 'ç',\n  'è' => 'è',\n  'é' => 'é',\n  'ê' => 'ê',\n  'ë' => 'ë',\n  'ì' => 'ì',\n  'í' => 'í',\n  'î' => 'î',\n  'ï' => 'ï',\n  'ñ' => 'ñ',\n  'ò' => 'ò',\n  'ó' => 'ó',\n  'ô' => 'ô',\n  'õ' => 'õ',\n  'ö' => 'ö',\n  'ù' => 'ù',\n  'ú' => 'ú',\n  'û' => 'û',\n  'ü' => 'ü',\n  'ý' => 'ý',\n  'ÿ' => 'ÿ',\n  'Ā' => 'Ā',\n  'ā' => 'ā',\n  'Ă' => 'Ă',\n  'ă' => 'ă',\n  'Ą' => 'Ą',\n  'ą' => 'ą',\n  'Ć' => 'Ć',\n  'ć' => 'ć',\n  'Ĉ' => 'Ĉ',\n  'ĉ' => 'ĉ',\n  'Ċ' => 'Ċ',\n  'ċ' => 'ċ',\n  'Č' => 'Č',\n  'č' => 'č',\n  'Ď' => 'Ď',\n  'ď' => 'ď',\n  'Ē' => 'Ē',\n  'ē' => 'ē',\n  'Ĕ' => 'Ĕ',\n  'ĕ' => 'ĕ',\n  'Ė' => 'Ė',\n  'ė' => 'ė',\n  'Ę' => 'Ę',\n  'ę' => 'ę',\n  'Ě' => 'Ě',\n  'ě' => 'ě',\n  'Ĝ' => 'Ĝ',\n  'ĝ' => 'ĝ',\n  'Ğ' => 'Ğ',\n  'ğ' => 'ğ',\n  'Ġ' => 'Ġ',\n  'ġ' => 'ġ',\n  'Ģ' => 'Ģ',\n  'ģ' => 'ģ',\n  'Ĥ' => 'Ĥ',\n  'ĥ' => 'ĥ',\n  'Ĩ' => 'Ĩ',\n  'ĩ' => 'ĩ',\n  'Ī' => 'Ī',\n  'ī' => 'ī',\n  'Ĭ' => 'Ĭ',\n  'ĭ' => 'ĭ',\n  'Į' => 'Į',\n  'į' => 'į',\n  'İ' => 'İ',\n  'Ĵ' => 'Ĵ',\n  'ĵ' => 'ĵ',\n  'Ķ' => 'Ķ',\n  'ķ' => 'ķ',\n  'Ĺ' => 'Ĺ',\n  'ĺ' => 'ĺ',\n  'Ļ' => 'Ļ',\n  'ļ' => 'ļ',\n  'Ľ' => 'Ľ',\n  'ľ' => 'ľ',\n  'Ń' => 'Ń',\n  'ń' => 'ń',\n  'Ņ' => 'Ņ',\n  'ņ' => 'ņ',\n  'Ň' => 'Ň',\n  'ň' => 'ň',\n  'Ō' => 'Ō',\n  'ō' => 'ō',\n  'Ŏ' => 'Ŏ',\n  'ŏ' => 'ŏ',\n  'Ő' => 'Ő',\n  'ő' => 'ő',\n  'Ŕ' => 'Ŕ',\n  'ŕ' => 'ŕ',\n  'Ŗ' => 'Ŗ',\n  'ŗ' => 'ŗ',\n  'Ř' => 'Ř',\n  'ř' => 'ř',\n  'Ś' => 'Ś',\n  'ś' => 'ś',\n  'Ŝ' => 'Ŝ',\n  'ŝ' => 'ŝ',\n  'Ş' => 'Ş',\n  'ş' => 'ş',\n  'Š' => 'Š',\n  'š' => 'š',\n  'Ţ' => 'Ţ',\n  'ţ' => 'ţ',\n  'Ť' => 'Ť',\n  'ť' => 'ť',\n  'Ũ' => 'Ũ',\n  'ũ' => 'ũ',\n  'Ū' => 'Ū',\n  'ū' => 'ū',\n  'Ŭ' => 'Ŭ',\n  'ŭ' => 'ŭ',\n  'Ů' => 'Ů',\n  'ů' => 'ů',\n  'Ű' => 'Ű',\n  'ű' => 'ű',\n  'Ų' => 'Ų',\n  'ų' => 'ų',\n  'Ŵ' => 'Ŵ',\n  'ŵ' => 'ŵ',\n  'Ŷ' => 'Ŷ',\n  'ŷ' => 'ŷ',\n  'Ÿ' => 'Ÿ',\n  'Ź' => 'Ź',\n  'ź' => 'ź',\n  'Ż' => 'Ż',\n  'ż' => 'ż',\n  'Ž' => 'Ž',\n  'ž' => 'ž',\n  'Ơ' => 'Ơ',\n  'ơ' => 'ơ',\n  'Ư' => 'Ư',\n  'ư' => 'ư',\n  'Ǎ' => 'Ǎ',\n  'ǎ' => 'ǎ',\n  'Ǐ' => 'Ǐ',\n  'ǐ' => 'ǐ',\n  'Ǒ' => 'Ǒ',\n  'ǒ' => 'ǒ',\n  'Ǔ' => 'Ǔ',\n  'ǔ' => 'ǔ',\n  'Ǖ' => 'Ǖ',\n  'ǖ' => 'ǖ',\n  'Ǘ' => 'Ǘ',\n  'ǘ' => 'ǘ',\n  'Ǚ' => 'Ǚ',\n  'ǚ' => 'ǚ',\n  'Ǜ' => 'Ǜ',\n  'ǜ' => 'ǜ',\n  'Ǟ' => 'Ǟ',\n  'ǟ' => 'ǟ',\n  'Ǡ' => 'Ǡ',\n  'ǡ' => 'ǡ',\n  'Ǣ' => 'Ǣ',\n  'ǣ' => 'ǣ',\n  'Ǧ' => 'Ǧ',\n  'ǧ' => 'ǧ',\n  'Ǩ' => 'Ǩ',\n  'ǩ' => 'ǩ',\n  'Ǫ' => 'Ǫ',\n  'ǫ' => 'ǫ',\n  'Ǭ' => 'Ǭ',\n  'ǭ' => 'ǭ',\n  'Ǯ' => 'Ǯ',\n  'ǯ' => 'ǯ',\n  'ǰ' => 'ǰ',\n  'Ǵ' => 'Ǵ',\n  'ǵ' => 'ǵ',\n  'Ǹ' => 'Ǹ',\n  'ǹ' => 'ǹ',\n  'Ǻ' => 'Ǻ',\n  'ǻ' => 'ǻ',\n  'Ǽ' => 'Ǽ',\n  'ǽ' => 'ǽ',\n  'Ǿ' => 'Ǿ',\n  'ǿ' => 'ǿ',\n  'Ȁ' => 'Ȁ',\n  'ȁ' => 'ȁ',\n  'Ȃ' => 'Ȃ',\n  'ȃ' => 'ȃ',\n  'Ȅ' => 'Ȅ',\n  'ȅ' => 'ȅ',\n  'Ȇ' => 'Ȇ',\n  'ȇ' => 'ȇ',\n  'Ȉ' => 'Ȉ',\n  'ȉ' => 'ȉ',\n  'Ȋ' => 'Ȋ',\n  'ȋ' => 'ȋ',\n  'Ȍ' => 'Ȍ',\n  'ȍ' => 'ȍ',\n  'Ȏ' => 'Ȏ',\n  'ȏ' => 'ȏ',\n  'Ȑ' => 'Ȑ',\n  'ȑ' => 'ȑ',\n  'Ȓ' => 'Ȓ',\n  'ȓ' => 'ȓ',\n  'Ȕ' => 'Ȕ',\n  'ȕ' => 'ȕ',\n  'Ȗ' => 'Ȗ',\n  'ȗ' => 'ȗ',\n  'Ș' => 'Ș',\n  'ș' => 'ș',\n  'Ț' => 'Ț',\n  'ț' => 'ț',\n  'Ȟ' => 'Ȟ',\n  'ȟ' => 'ȟ',\n  'Ȧ' => 'Ȧ',\n  'ȧ' => 'ȧ',\n  'Ȩ' => 'Ȩ',\n  'ȩ' => 'ȩ',\n  'Ȫ' => 'Ȫ',\n  'ȫ' => 'ȫ',\n  'Ȭ' => 'Ȭ',\n  'ȭ' => 'ȭ',\n  'Ȯ' => 'Ȯ',\n  'ȯ' => 'ȯ',\n  'Ȱ' => 'Ȱ',\n  'ȱ' => 'ȱ',\n  'Ȳ' => 'Ȳ',\n  'ȳ' => 'ȳ',\n  '̀' => '̀',\n  '́' => '́',\n  '̓' => '̓',\n  '̈́' => '̈́',\n  'ʹ' => 'ʹ',\n  ';' => ';',\n  '΅' => '΅',\n  'Ά' => 'Ά',\n  '·' => '·',\n  'Έ' => 'Έ',\n  'Ή' => 'Ή',\n  'Ί' => 'Ί',\n  'Ό' => 'Ό',\n  'Ύ' => 'Ύ',\n  'Ώ' => 'Ώ',\n  'ΐ' => 'ΐ',\n  'Ϊ' => 'Ϊ',\n  'Ϋ' => 'Ϋ',\n  'ά' => 'ά',\n  'έ' => 'έ',\n  'ή' => 'ή',\n  'ί' => 'ί',\n  'ΰ' => 'ΰ',\n  'ϊ' => 'ϊ',\n  'ϋ' => 'ϋ',\n  'ό' => 'ό',\n  'ύ' => 'ύ',\n  'ώ' => 'ώ',\n  'ϓ' => 'ϓ',\n  'ϔ' => 'ϔ',\n  'Ѐ' => 'Ѐ',\n  'Ё' => 'Ё',\n  'Ѓ' => 'Ѓ',\n  'Ї' => 'Ї',\n  'Ќ' => 'Ќ',\n  'Ѝ' => 'Ѝ',\n  'Ў' => 'Ў',\n  'Й' => 'Й',\n  'й' => 'й',\n  'ѐ' => 'ѐ',\n  'ё' => 'ё',\n  'ѓ' => 'ѓ',\n  'ї' => 'ї',\n  'ќ' => 'ќ',\n  'ѝ' => 'ѝ',\n  'ў' => 'ў',\n  'Ѷ' => 'Ѷ',\n  'ѷ' => 'ѷ',\n  'Ӂ' => 'Ӂ',\n  'ӂ' => 'ӂ',\n  'Ӑ' => 'Ӑ',\n  'ӑ' => 'ӑ',\n  'Ӓ' => 'Ӓ',\n  'ӓ' => 'ӓ',\n  'Ӗ' => 'Ӗ',\n  'ӗ' => 'ӗ',\n  'Ӛ' => 'Ӛ',\n  'ӛ' => 'ӛ',\n  'Ӝ' => 'Ӝ',\n  'ӝ' => 'ӝ',\n  'Ӟ' => 'Ӟ',\n  'ӟ' => 'ӟ',\n  'Ӣ' => 'Ӣ',\n  'ӣ' => 'ӣ',\n  'Ӥ' => 'Ӥ',\n  'ӥ' => 'ӥ',\n  'Ӧ' => 'Ӧ',\n  'ӧ' => 'ӧ',\n  'Ӫ' => 'Ӫ',\n  'ӫ' => 'ӫ',\n  'Ӭ' => 'Ӭ',\n  'ӭ' => 'ӭ',\n  'Ӯ' => 'Ӯ',\n  'ӯ' => 'ӯ',\n  'Ӱ' => 'Ӱ',\n  'ӱ' => 'ӱ',\n  'Ӳ' => 'Ӳ',\n  'ӳ' => 'ӳ',\n  'Ӵ' => 'Ӵ',\n  'ӵ' => 'ӵ',\n  'Ӹ' => 'Ӹ',\n  'ӹ' => 'ӹ',\n  'آ' => 'آ',\n  'أ' => 'أ',\n  'ؤ' => 'ؤ',\n  'إ' => 'إ',\n  'ئ' => 'ئ',\n  'ۀ' => 'ۀ',\n  'ۂ' => 'ۂ',\n  'ۓ' => 'ۓ',\n  'ऩ' => 'ऩ',\n  'ऱ' => 'ऱ',\n  'ऴ' => 'ऴ',\n  'क़' => 'क़',\n  'ख़' => 'ख़',\n  'ग़' => 'ग़',\n  'ज़' => 'ज़',\n  'ड़' => 'ड़',\n  'ढ़' => 'ढ़',\n  'फ़' => 'फ़',\n  'य़' => 'य़',\n  'ো' => 'ো',\n  'ৌ' => 'ৌ',\n  'ড়' => 'ড়',\n  'ঢ়' => 'ঢ়',\n  'য়' => 'য়',\n  'ਲ਼' => 'ਲ਼',\n  'ਸ਼' => 'ਸ਼',\n  'ਖ਼' => 'ਖ਼',\n  'ਗ਼' => 'ਗ਼',\n  'ਜ਼' => 'ਜ਼',\n  'ਫ਼' => 'ਫ਼',\n  'ୈ' => 'ୈ',\n  'ୋ' => 'ୋ',\n  'ୌ' => 'ୌ',\n  'ଡ଼' => 'ଡ଼',\n  'ଢ଼' => 'ଢ଼',\n  'ஔ' => 'ஔ',\n  'ொ' => 'ொ',\n  'ோ' => 'ோ',\n  'ௌ' => 'ௌ',\n  'ై' => 'ై',\n  'ೀ' => 'ೀ',\n  'ೇ' => 'ೇ',\n  'ೈ' => 'ೈ',\n  'ೊ' => 'ೊ',\n  'ೋ' => 'ೋ',\n  'ൊ' => 'ൊ',\n  'ോ' => 'ോ',\n  'ൌ' => 'ൌ',\n  'ේ' => 'ේ',\n  'ො' => 'ො',\n  'ෝ' => 'ෝ',\n  'ෞ' => 'ෞ',\n  'གྷ' => 'གྷ',\n  'ཌྷ' => 'ཌྷ',\n  'དྷ' => 'དྷ',\n  'བྷ' => 'བྷ',\n  'ཛྷ' => 'ཛྷ',\n  'ཀྵ' => 'ཀྵ',\n  'ཱི' => 'ཱི',\n  'ཱུ' => 'ཱུ',\n  'ྲྀ' => 'ྲྀ',\n  'ླྀ' => 'ླྀ',\n  'ཱྀ' => 'ཱྀ',\n  'ྒྷ' => 'ྒྷ',\n  'ྜྷ' => 'ྜྷ',\n  'ྡྷ' => 'ྡྷ',\n  'ྦྷ' => 'ྦྷ',\n  'ྫྷ' => 'ྫྷ',\n  'ྐྵ' => 'ྐྵ',\n  'ဦ' => 'ဦ',\n  'ᬆ' => 'ᬆ',\n  'ᬈ' => 'ᬈ',\n  'ᬊ' => 'ᬊ',\n  'ᬌ' => 'ᬌ',\n  'ᬎ' => 'ᬎ',\n  'ᬒ' => 'ᬒ',\n  'ᬻ' => 'ᬻ',\n  'ᬽ' => 'ᬽ',\n  'ᭀ' => 'ᭀ',\n  'ᭁ' => 'ᭁ',\n  'ᭃ' => 'ᭃ',\n  'Ḁ' => 'Ḁ',\n  'ḁ' => 'ḁ',\n  'Ḃ' => 'Ḃ',\n  'ḃ' => 'ḃ',\n  'Ḅ' => 'Ḅ',\n  'ḅ' => 'ḅ',\n  'Ḇ' => 'Ḇ',\n  'ḇ' => 'ḇ',\n  'Ḉ' => 'Ḉ',\n  'ḉ' => 'ḉ',\n  'Ḋ' => 'Ḋ',\n  'ḋ' => 'ḋ',\n  'Ḍ' => 'Ḍ',\n  'ḍ' => 'ḍ',\n  'Ḏ' => 'Ḏ',\n  'ḏ' => 'ḏ',\n  'Ḑ' => 'Ḑ',\n  'ḑ' => 'ḑ',\n  'Ḓ' => 'Ḓ',\n  'ḓ' => 'ḓ',\n  'Ḕ' => 'Ḕ',\n  'ḕ' => 'ḕ',\n  'Ḗ' => 'Ḗ',\n  'ḗ' => 'ḗ',\n  'Ḙ' => 'Ḙ',\n  'ḙ' => 'ḙ',\n  'Ḛ' => 'Ḛ',\n  'ḛ' => 'ḛ',\n  'Ḝ' => 'Ḝ',\n  'ḝ' => 'ḝ',\n  'Ḟ' => 'Ḟ',\n  'ḟ' => 'ḟ',\n  'Ḡ' => 'Ḡ',\n  'ḡ' => 'ḡ',\n  'Ḣ' => 'Ḣ',\n  'ḣ' => 'ḣ',\n  'Ḥ' => 'Ḥ',\n  'ḥ' => 'ḥ',\n  'Ḧ' => 'Ḧ',\n  'ḧ' => 'ḧ',\n  'Ḩ' => 'Ḩ',\n  'ḩ' => 'ḩ',\n  'Ḫ' => 'Ḫ',\n  'ḫ' => 'ḫ',\n  'Ḭ' => 'Ḭ',\n  'ḭ' => 'ḭ',\n  'Ḯ' => 'Ḯ',\n  'ḯ' => 'ḯ',\n  'Ḱ' => 'Ḱ',\n  'ḱ' => 'ḱ',\n  'Ḳ' => 'Ḳ',\n  'ḳ' => 'ḳ',\n  'Ḵ' => 'Ḵ',\n  'ḵ' => 'ḵ',\n  'Ḷ' => 'Ḷ',\n  'ḷ' => 'ḷ',\n  'Ḹ' => 'Ḹ',\n  'ḹ' => 'ḹ',\n  'Ḻ' => 'Ḻ',\n  'ḻ' => 'ḻ',\n  'Ḽ' => 'Ḽ',\n  'ḽ' => 'ḽ',\n  'Ḿ' => 'Ḿ',\n  'ḿ' => 'ḿ',\n  'Ṁ' => 'Ṁ',\n  'ṁ' => 'ṁ',\n  'Ṃ' => 'Ṃ',\n  'ṃ' => 'ṃ',\n  'Ṅ' => 'Ṅ',\n  'ṅ' => 'ṅ',\n  'Ṇ' => 'Ṇ',\n  'ṇ' => 'ṇ',\n  'Ṉ' => 'Ṉ',\n  'ṉ' => 'ṉ',\n  'Ṋ' => 'Ṋ',\n  'ṋ' => 'ṋ',\n  'Ṍ' => 'Ṍ',\n  'ṍ' => 'ṍ',\n  'Ṏ' => 'Ṏ',\n  'ṏ' => 'ṏ',\n  'Ṑ' => 'Ṑ',\n  'ṑ' => 'ṑ',\n  'Ṓ' => 'Ṓ',\n  'ṓ' => 'ṓ',\n  'Ṕ' => 'Ṕ',\n  'ṕ' => 'ṕ',\n  'Ṗ' => 'Ṗ',\n  'ṗ' => 'ṗ',\n  'Ṙ' => 'Ṙ',\n  'ṙ' => 'ṙ',\n  'Ṛ' => 'Ṛ',\n  'ṛ' => 'ṛ',\n  'Ṝ' => 'Ṝ',\n  'ṝ' => 'ṝ',\n  'Ṟ' => 'Ṟ',\n  'ṟ' => 'ṟ',\n  'Ṡ' => 'Ṡ',\n  'ṡ' => 'ṡ',\n  'Ṣ' => 'Ṣ',\n  'ṣ' => 'ṣ',\n  'Ṥ' => 'Ṥ',\n  'ṥ' => 'ṥ',\n  'Ṧ' => 'Ṧ',\n  'ṧ' => 'ṧ',\n  'Ṩ' => 'Ṩ',\n  'ṩ' => 'ṩ',\n  'Ṫ' => 'Ṫ',\n  'ṫ' => 'ṫ',\n  'Ṭ' => 'Ṭ',\n  'ṭ' => 'ṭ',\n  'Ṯ' => 'Ṯ',\n  'ṯ' => 'ṯ',\n  'Ṱ' => 'Ṱ',\n  'ṱ' => 'ṱ',\n  'Ṳ' => 'Ṳ',\n  'ṳ' => 'ṳ',\n  'Ṵ' => 'Ṵ',\n  'ṵ' => 'ṵ',\n  'Ṷ' => 'Ṷ',\n  'ṷ' => 'ṷ',\n  'Ṹ' => 'Ṹ',\n  'ṹ' => 'ṹ',\n  'Ṻ' => 'Ṻ',\n  'ṻ' => 'ṻ',\n  'Ṽ' => 'Ṽ',\n  'ṽ' => 'ṽ',\n  'Ṿ' => 'Ṿ',\n  'ṿ' => 'ṿ',\n  'Ẁ' => 'Ẁ',\n  'ẁ' => 'ẁ',\n  'Ẃ' => 'Ẃ',\n  'ẃ' => 'ẃ',\n  'Ẅ' => 'Ẅ',\n  'ẅ' => 'ẅ',\n  'Ẇ' => 'Ẇ',\n  'ẇ' => 'ẇ',\n  'Ẉ' => 'Ẉ',\n  'ẉ' => 'ẉ',\n  'Ẋ' => 'Ẋ',\n  'ẋ' => 'ẋ',\n  'Ẍ' => 'Ẍ',\n  'ẍ' => 'ẍ',\n  'Ẏ' => 'Ẏ',\n  'ẏ' => 'ẏ',\n  'Ẑ' => 'Ẑ',\n  'ẑ' => 'ẑ',\n  'Ẓ' => 'Ẓ',\n  'ẓ' => 'ẓ',\n  'Ẕ' => 'Ẕ',\n  'ẕ' => 'ẕ',\n  'ẖ' => 'ẖ',\n  'ẗ' => 'ẗ',\n  'ẘ' => 'ẘ',\n  'ẙ' => 'ẙ',\n  'ẛ' => 'ẛ',\n  'Ạ' => 'Ạ',\n  'ạ' => 'ạ',\n  'Ả' => 'Ả',\n  'ả' => 'ả',\n  'Ấ' => 'Ấ',\n  'ấ' => 'ấ',\n  'Ầ' => 'Ầ',\n  'ầ' => 'ầ',\n  'Ẩ' => 'Ẩ',\n  'ẩ' => 'ẩ',\n  'Ẫ' => 'Ẫ',\n  'ẫ' => 'ẫ',\n  'Ậ' => 'Ậ',\n  'ậ' => 'ậ',\n  'Ắ' => 'Ắ',\n  'ắ' => 'ắ',\n  'Ằ' => 'Ằ',\n  'ằ' => 'ằ',\n  'Ẳ' => 'Ẳ',\n  'ẳ' => 'ẳ',\n  'Ẵ' => 'Ẵ',\n  'ẵ' => 'ẵ',\n  'Ặ' => 'Ặ',\n  'ặ' => 'ặ',\n  'Ẹ' => 'Ẹ',\n  'ẹ' => 'ẹ',\n  'Ẻ' => 'Ẻ',\n  'ẻ' => 'ẻ',\n  'Ẽ' => 'Ẽ',\n  'ẽ' => 'ẽ',\n  'Ế' => 'Ế',\n  'ế' => 'ế',\n  'Ề' => 'Ề',\n  'ề' => 'ề',\n  'Ể' => 'Ể',\n  'ể' => 'ể',\n  'Ễ' => 'Ễ',\n  'ễ' => 'ễ',\n  'Ệ' => 'Ệ',\n  'ệ' => 'ệ',\n  'Ỉ' => 'Ỉ',\n  'ỉ' => 'ỉ',\n  'Ị' => 'Ị',\n  'ị' => 'ị',\n  'Ọ' => 'Ọ',\n  'ọ' => 'ọ',\n  'Ỏ' => 'Ỏ',\n  'ỏ' => 'ỏ',\n  'Ố' => 'Ố',\n  'ố' => 'ố',\n  'Ồ' => 'Ồ',\n  'ồ' => 'ồ',\n  'Ổ' => 'Ổ',\n  'ổ' => 'ổ',\n  'Ỗ' => 'Ỗ',\n  'ỗ' => 'ỗ',\n  'Ộ' => 'Ộ',\n  'ộ' => 'ộ',\n  'Ớ' => 'Ớ',\n  'ớ' => 'ớ',\n  'Ờ' => 'Ờ',\n  'ờ' => 'ờ',\n  'Ở' => 'Ở',\n  'ở' => 'ở',\n  'Ỡ' => 'Ỡ',\n  'ỡ' => 'ỡ',\n  'Ợ' => 'Ợ',\n  'ợ' => 'ợ',\n  'Ụ' => 'Ụ',\n  'ụ' => 'ụ',\n  'Ủ' => 'Ủ',\n  'ủ' => 'ủ',\n  'Ứ' => 'Ứ',\n  'ứ' => 'ứ',\n  'Ừ' => 'Ừ',\n  'ừ' => 'ừ',\n  'Ử' => 'Ử',\n  'ử' => 'ử',\n  'Ữ' => 'Ữ',\n  'ữ' => 'ữ',\n  'Ự' => 'Ự',\n  'ự' => 'ự',\n  'Ỳ' => 'Ỳ',\n  'ỳ' => 'ỳ',\n  'Ỵ' => 'Ỵ',\n  'ỵ' => 'ỵ',\n  'Ỷ' => 'Ỷ',\n  'ỷ' => 'ỷ',\n  'Ỹ' => 'Ỹ',\n  'ỹ' => 'ỹ',\n  'ἀ' => 'ἀ',\n  'ἁ' => 'ἁ',\n  'ἂ' => 'ἂ',\n  'ἃ' => 'ἃ',\n  'ἄ' => 'ἄ',\n  'ἅ' => 'ἅ',\n  'ἆ' => 'ἆ',\n  'ἇ' => 'ἇ',\n  'Ἀ' => 'Ἀ',\n  'Ἁ' => 'Ἁ',\n  'Ἂ' => 'Ἂ',\n  'Ἃ' => 'Ἃ',\n  'Ἄ' => 'Ἄ',\n  'Ἅ' => 'Ἅ',\n  'Ἆ' => 'Ἆ',\n  'Ἇ' => 'Ἇ',\n  'ἐ' => 'ἐ',\n  'ἑ' => 'ἑ',\n  'ἒ' => 'ἒ',\n  'ἓ' => 'ἓ',\n  'ἔ' => 'ἔ',\n  'ἕ' => 'ἕ',\n  'Ἐ' => 'Ἐ',\n  'Ἑ' => 'Ἑ',\n  'Ἒ' => 'Ἒ',\n  'Ἓ' => 'Ἓ',\n  'Ἔ' => 'Ἔ',\n  'Ἕ' => 'Ἕ',\n  'ἠ' => 'ἠ',\n  'ἡ' => 'ἡ',\n  'ἢ' => 'ἢ',\n  'ἣ' => 'ἣ',\n  'ἤ' => 'ἤ',\n  'ἥ' => 'ἥ',\n  'ἦ' => 'ἦ',\n  'ἧ' => 'ἧ',\n  'Ἠ' => 'Ἠ',\n  'Ἡ' => 'Ἡ',\n  'Ἢ' => 'Ἢ',\n  'Ἣ' => 'Ἣ',\n  'Ἤ' => 'Ἤ',\n  'Ἥ' => 'Ἥ',\n  'Ἦ' => 'Ἦ',\n  'Ἧ' => 'Ἧ',\n  'ἰ' => 'ἰ',\n  'ἱ' => 'ἱ',\n  'ἲ' => 'ἲ',\n  'ἳ' => 'ἳ',\n  'ἴ' => 'ἴ',\n  'ἵ' => 'ἵ',\n  'ἶ' => 'ἶ',\n  'ἷ' => 'ἷ',\n  'Ἰ' => 'Ἰ',\n  'Ἱ' => 'Ἱ',\n  'Ἲ' => 'Ἲ',\n  'Ἳ' => 'Ἳ',\n  'Ἴ' => 'Ἴ',\n  'Ἵ' => 'Ἵ',\n  'Ἶ' => 'Ἶ',\n  'Ἷ' => 'Ἷ',\n  'ὀ' => 'ὀ',\n  'ὁ' => 'ὁ',\n  'ὂ' => 'ὂ',\n  'ὃ' => 'ὃ',\n  'ὄ' => 'ὄ',\n  'ὅ' => 'ὅ',\n  'Ὀ' => 'Ὀ',\n  'Ὁ' => 'Ὁ',\n  'Ὂ' => 'Ὂ',\n  'Ὃ' => 'Ὃ',\n  'Ὄ' => 'Ὄ',\n  'Ὅ' => 'Ὅ',\n  'ὐ' => 'ὐ',\n  'ὑ' => 'ὑ',\n  'ὒ' => 'ὒ',\n  'ὓ' => 'ὓ',\n  'ὔ' => 'ὔ',\n  'ὕ' => 'ὕ',\n  'ὖ' => 'ὖ',\n  'ὗ' => 'ὗ',\n  'Ὑ' => 'Ὑ',\n  'Ὓ' => 'Ὓ',\n  'Ὕ' => 'Ὕ',\n  'Ὗ' => 'Ὗ',\n  'ὠ' => 'ὠ',\n  'ὡ' => 'ὡ',\n  'ὢ' => 'ὢ',\n  'ὣ' => 'ὣ',\n  'ὤ' => 'ὤ',\n  'ὥ' => 'ὥ',\n  'ὦ' => 'ὦ',\n  'ὧ' => 'ὧ',\n  'Ὠ' => 'Ὠ',\n  'Ὡ' => 'Ὡ',\n  'Ὢ' => 'Ὢ',\n  'Ὣ' => 'Ὣ',\n  'Ὤ' => 'Ὤ',\n  'Ὥ' => 'Ὥ',\n  'Ὦ' => 'Ὦ',\n  'Ὧ' => 'Ὧ',\n  'ὰ' => 'ὰ',\n  'ά' => 'ά',\n  'ὲ' => 'ὲ',\n  'έ' => 'έ',\n  'ὴ' => 'ὴ',\n  'ή' => 'ή',\n  'ὶ' => 'ὶ',\n  'ί' => 'ί',\n  'ὸ' => 'ὸ',\n  'ό' => 'ό',\n  'ὺ' => 'ὺ',\n  'ύ' => 'ύ',\n  'ὼ' => 'ὼ',\n  'ώ' => 'ώ',\n  'ᾀ' => 'ᾀ',\n  'ᾁ' => 'ᾁ',\n  'ᾂ' => 'ᾂ',\n  'ᾃ' => 'ᾃ',\n  'ᾄ' => 'ᾄ',\n  'ᾅ' => 'ᾅ',\n  'ᾆ' => 'ᾆ',\n  'ᾇ' => 'ᾇ',\n  'ᾈ' => 'ᾈ',\n  'ᾉ' => 'ᾉ',\n  'ᾊ' => 'ᾊ',\n  'ᾋ' => 'ᾋ',\n  'ᾌ' => 'ᾌ',\n  'ᾍ' => 'ᾍ',\n  'ᾎ' => 'ᾎ',\n  'ᾏ' => 'ᾏ',\n  'ᾐ' => 'ᾐ',\n  'ᾑ' => 'ᾑ',\n  'ᾒ' => 'ᾒ',\n  'ᾓ' => 'ᾓ',\n  'ᾔ' => 'ᾔ',\n  'ᾕ' => 'ᾕ',\n  'ᾖ' => 'ᾖ',\n  'ᾗ' => 'ᾗ',\n  'ᾘ' => 'ᾘ',\n  'ᾙ' => 'ᾙ',\n  'ᾚ' => 'ᾚ',\n  'ᾛ' => 'ᾛ',\n  'ᾜ' => 'ᾜ',\n  'ᾝ' => 'ᾝ',\n  'ᾞ' => 'ᾞ',\n  'ᾟ' => 'ᾟ',\n  'ᾠ' => 'ᾠ',\n  'ᾡ' => 'ᾡ',\n  'ᾢ' => 'ᾢ',\n  'ᾣ' => 'ᾣ',\n  'ᾤ' => 'ᾤ',\n  'ᾥ' => 'ᾥ',\n  'ᾦ' => 'ᾦ',\n  'ᾧ' => 'ᾧ',\n  'ᾨ' => 'ᾨ',\n  'ᾩ' => 'ᾩ',\n  'ᾪ' => 'ᾪ',\n  'ᾫ' => 'ᾫ',\n  'ᾬ' => 'ᾬ',\n  'ᾭ' => 'ᾭ',\n  'ᾮ' => 'ᾮ',\n  'ᾯ' => 'ᾯ',\n  'ᾰ' => 'ᾰ',\n  'ᾱ' => 'ᾱ',\n  'ᾲ' => 'ᾲ',\n  'ᾳ' => 'ᾳ',\n  'ᾴ' => 'ᾴ',\n  'ᾶ' => 'ᾶ',\n  'ᾷ' => 'ᾷ',\n  'Ᾰ' => 'Ᾰ',\n  'Ᾱ' => 'Ᾱ',\n  'Ὰ' => 'Ὰ',\n  'Ά' => 'Ά',\n  'ᾼ' => 'ᾼ',\n  'ι' => 'ι',\n  '῁' => '῁',\n  'ῂ' => 'ῂ',\n  'ῃ' => 'ῃ',\n  'ῄ' => 'ῄ',\n  'ῆ' => 'ῆ',\n  'ῇ' => 'ῇ',\n  'Ὲ' => 'Ὲ',\n  'Έ' => 'Έ',\n  'Ὴ' => 'Ὴ',\n  'Ή' => 'Ή',\n  'ῌ' => 'ῌ',\n  '῍' => '῍',\n  '῎' => '῎',\n  '῏' => '῏',\n  'ῐ' => 'ῐ',\n  'ῑ' => 'ῑ',\n  'ῒ' => 'ῒ',\n  'ΐ' => 'ΐ',\n  'ῖ' => 'ῖ',\n  'ῗ' => 'ῗ',\n  'Ῐ' => 'Ῐ',\n  'Ῑ' => 'Ῑ',\n  'Ὶ' => 'Ὶ',\n  'Ί' => 'Ί',\n  '῝' => '῝',\n  '῞' => '῞',\n  '῟' => '῟',\n  'ῠ' => 'ῠ',\n  'ῡ' => 'ῡ',\n  'ῢ' => 'ῢ',\n  'ΰ' => 'ΰ',\n  'ῤ' => 'ῤ',\n  'ῥ' => 'ῥ',\n  'ῦ' => 'ῦ',\n  'ῧ' => 'ῧ',\n  'Ῠ' => 'Ῠ',\n  'Ῡ' => 'Ῡ',\n  'Ὺ' => 'Ὺ',\n  'Ύ' => 'Ύ',\n  'Ῥ' => 'Ῥ',\n  '῭' => '῭',\n  '΅' => '΅',\n  '`' => '`',\n  'ῲ' => 'ῲ',\n  'ῳ' => 'ῳ',\n  'ῴ' => 'ῴ',\n  'ῶ' => 'ῶ',\n  'ῷ' => 'ῷ',\n  'Ὸ' => 'Ὸ',\n  'Ό' => 'Ό',\n  'Ὼ' => 'Ὼ',\n  'Ώ' => 'Ώ',\n  'ῼ' => 'ῼ',\n  '´' => '´',\n  ' ' => ' ',\n  ' ' => ' ',\n  'Ω' => 'Ω',\n  'K' => 'K',\n  'Å' => 'Å',\n  '↚' => '↚',\n  '↛' => '↛',\n  '↮' => '↮',\n  '⇍' => '⇍',\n  '⇎' => '⇎',\n  '⇏' => '⇏',\n  '∄' => '∄',\n  '∉' => '∉',\n  '∌' => '∌',\n  '∤' => '∤',\n  '∦' => '∦',\n  '≁' => '≁',\n  '≄' => '≄',\n  '≇' => '≇',\n  '≉' => '≉',\n  '≠' => '≠',\n  '≢' => '≢',\n  '≭' => '≭',\n  '≮' => '≮',\n  '≯' => '≯',\n  '≰' => '≰',\n  '≱' => '≱',\n  '≴' => '≴',\n  '≵' => '≵',\n  '≸' => '≸',\n  '≹' => '≹',\n  '⊀' => '⊀',\n  '⊁' => '⊁',\n  '⊄' => '⊄',\n  '⊅' => '⊅',\n  '⊈' => '⊈',\n  '⊉' => '⊉',\n  '⊬' => '⊬',\n  '⊭' => '⊭',\n  '⊮' => '⊮',\n  '⊯' => '⊯',\n  '⋠' => '⋠',\n  '⋡' => '⋡',\n  '⋢' => '⋢',\n  '⋣' => '⋣',\n  '⋪' => '⋪',\n  '⋫' => '⋫',\n  '⋬' => '⋬',\n  '⋭' => '⋭',\n  '〈' => '〈',\n  '〉' => '〉',\n  '⫝̸' => '⫝̸',\n  'が' => 'が',\n  'ぎ' => 'ぎ',\n  'ぐ' => 'ぐ',\n  'げ' => 'げ',\n  'ご' => 'ご',\n  'ざ' => 'ざ',\n  'じ' => 'じ',\n  'ず' => 'ず',\n  'ぜ' => 'ぜ',\n  'ぞ' => 'ぞ',\n  'だ' => 'だ',\n  'ぢ' => 'ぢ',\n  'づ' => 'づ',\n  'で' => 'で',\n  'ど' => 'ど',\n  'ば' => 'ば',\n  'ぱ' => 'ぱ',\n  'び' => 'び',\n  'ぴ' => 'ぴ',\n  'ぶ' => 'ぶ',\n  'ぷ' => 'ぷ',\n  'べ' => 'べ',\n  'ぺ' => 'ぺ',\n  'ぼ' => 'ぼ',\n  'ぽ' => 'ぽ',\n  'ゔ' => 'ゔ',\n  'ゞ' => 'ゞ',\n  'ガ' => 'ガ',\n  'ギ' => 'ギ',\n  'グ' => 'グ',\n  'ゲ' => 'ゲ',\n  'ゴ' => 'ゴ',\n  'ザ' => 'ザ',\n  'ジ' => 'ジ',\n  'ズ' => 'ズ',\n  'ゼ' => 'ゼ',\n  'ゾ' => 'ゾ',\n  'ダ' => 'ダ',\n  'ヂ' => 'ヂ',\n  'ヅ' => 'ヅ',\n  'デ' => 'デ',\n  'ド' => 'ド',\n  'バ' => 'バ',\n  'パ' => 'パ',\n  'ビ' => 'ビ',\n  'ピ' => 'ピ',\n  'ブ' => 'ブ',\n  'プ' => 'プ',\n  'ベ' => 'ベ',\n  'ペ' => 'ペ',\n  'ボ' => 'ボ',\n  'ポ' => 'ポ',\n  'ヴ' => 'ヴ',\n  'ヷ' => 'ヷ',\n  'ヸ' => 'ヸ',\n  'ヹ' => 'ヹ',\n  'ヺ' => 'ヺ',\n  'ヾ' => 'ヾ',\n  '豈' => '豈',\n  '更' => '更',\n  '車' => '車',\n  '賈' => '賈',\n  '滑' => '滑',\n  '串' => '串',\n  '句' => '句',\n  '龜' => '龜',\n  '龜' => '龜',\n  '契' => '契',\n  '金' => '金',\n  '喇' => '喇',\n  '奈' => '奈',\n  '懶' => '懶',\n  '癩' => '癩',\n  '羅' => '羅',\n  '蘿' => '蘿',\n  '螺' => '螺',\n  '裸' => '裸',\n  '邏' => '邏',\n  '樂' => '樂',\n  '洛' => '洛',\n  '烙' => '烙',\n  '珞' => '珞',\n  '落' => '落',\n  '酪' => '酪',\n  '駱' => '駱',\n  '亂' => '亂',\n  '卵' => '卵',\n  '欄' => '欄',\n  '爛' => '爛',\n  '蘭' => '蘭',\n  '鸞' => '鸞',\n  '嵐' => '嵐',\n  '濫' => '濫',\n  '藍' => '藍',\n  '襤' => '襤',\n  '拉' => '拉',\n  '臘' => '臘',\n  '蠟' => '蠟',\n  '廊' => '廊',\n  '朗' => '朗',\n  '浪' => '浪',\n  '狼' => '狼',\n  '郎' => '郎',\n  '來' => '來',\n  '冷' => '冷',\n  '勞' => '勞',\n  '擄' => '擄',\n  '櫓' => '櫓',\n  '爐' => '爐',\n  '盧' => '盧',\n  '老' => '老',\n  '蘆' => '蘆',\n  '虜' => '虜',\n  '路' => '路',\n  '露' => '露',\n  '魯' => '魯',\n  '鷺' => '鷺',\n  '碌' => '碌',\n  '祿' => '祿',\n  '綠' => '綠',\n  '菉' => '菉',\n  '錄' => '錄',\n  '鹿' => '鹿',\n  '論' => '論',\n  '壟' => '壟',\n  '弄' => '弄',\n  '籠' => '籠',\n  '聾' => '聾',\n  '牢' => '牢',\n  '磊' => '磊',\n  '賂' => '賂',\n  '雷' => '雷',\n  '壘' => '壘',\n  '屢' => '屢',\n  '樓' => '樓',\n  '淚' => '淚',\n  '漏' => '漏',\n  '累' => '累',\n  '縷' => '縷',\n  '陋' => '陋',\n  '勒' => '勒',\n  '肋' => '肋',\n  '凜' => '凜',\n  '凌' => '凌',\n  '稜' => '稜',\n  '綾' => '綾',\n  '菱' => '菱',\n  '陵' => '陵',\n  '讀' => '讀',\n  '拏' => '拏',\n  '樂' => '樂',\n  '諾' => '諾',\n  '丹' => '丹',\n  '寧' => '寧',\n  '怒' => '怒',\n  '率' => '率',\n  '異' => '異',\n  '北' => '北',\n  '磻' => '磻',\n  '便' => '便',\n  '復' => '復',\n  '不' => '不',\n  '泌' => '泌',\n  '數' => '數',\n  '索' => '索',\n  '參' => '參',\n  '塞' => '塞',\n  '省' => '省',\n  '葉' => '葉',\n  '說' => '說',\n  '殺' => '殺',\n  '辰' => '辰',\n  '沈' => '沈',\n  '拾' => '拾',\n  '若' => '若',\n  '掠' => '掠',\n  '略' => '略',\n  '亮' => '亮',\n  '兩' => '兩',\n  '凉' => '凉',\n  '梁' => '梁',\n  '糧' => '糧',\n  '良' => '良',\n  '諒' => '諒',\n  '量' => '量',\n  '勵' => '勵',\n  '呂' => '呂',\n  '女' => '女',\n  '廬' => '廬',\n  '旅' => '旅',\n  '濾' => '濾',\n  '礪' => '礪',\n  '閭' => '閭',\n  '驪' => '驪',\n  '麗' => '麗',\n  '黎' => '黎',\n  '力' => '力',\n  '曆' => '曆',\n  '歷' => '歷',\n  '轢' => '轢',\n  '年' => '年',\n  '憐' => '憐',\n  '戀' => '戀',\n  '撚' => '撚',\n  '漣' => '漣',\n  '煉' => '煉',\n  '璉' => '璉',\n  '秊' => '秊',\n  '練' => '練',\n  '聯' => '聯',\n  '輦' => '輦',\n  '蓮' => '蓮',\n  '連' => '連',\n  '鍊' => '鍊',\n  '列' => '列',\n  '劣' => '劣',\n  '咽' => '咽',\n  '烈' => '烈',\n  '裂' => '裂',\n  '說' => '說',\n  '廉' => '廉',\n  '念' => '念',\n  '捻' => '捻',\n  '殮' => '殮',\n  '簾' => '簾',\n  '獵' => '獵',\n  '令' => '令',\n  '囹' => '囹',\n  '寧' => '寧',\n  '嶺' => '嶺',\n  '怜' => '怜',\n  '玲' => '玲',\n  '瑩' => '瑩',\n  '羚' => '羚',\n  '聆' => '聆',\n  '鈴' => '鈴',\n  '零' => '零',\n  '靈' => '靈',\n  '領' => '領',\n  '例' => '例',\n  '禮' => '禮',\n  '醴' => '醴',\n  '隸' => '隸',\n  '惡' => '惡',\n  '了' => '了',\n  '僚' => '僚',\n  '寮' => '寮',\n  '尿' => '尿',\n  '料' => '料',\n  '樂' => '樂',\n  '燎' => '燎',\n  '療' => '療',\n  '蓼' => '蓼',\n  '遼' => '遼',\n  '龍' => '龍',\n  '暈' => '暈',\n  '阮' => '阮',\n  '劉' => '劉',\n  '杻' => '杻',\n  '柳' => '柳',\n  '流' => '流',\n  '溜' => '溜',\n  '琉' => '琉',\n  '留' => '留',\n  '硫' => '硫',\n  '紐' => '紐',\n  '類' => '類',\n  '六' => '六',\n  '戮' => '戮',\n  '陸' => '陸',\n  '倫' => '倫',\n  '崙' => '崙',\n  '淪' => '淪',\n  '輪' => '輪',\n  '律' => '律',\n  '慄' => '慄',\n  '栗' => '栗',\n  '率' => '率',\n  '隆' => '隆',\n  '利' => '利',\n  '吏' => '吏',\n  '履' => '履',\n  '易' => '易',\n  '李' => '李',\n  '梨' => '梨',\n  '泥' => '泥',\n  '理' => '理',\n  '痢' => '痢',\n  '罹' => '罹',\n  '裏' => '裏',\n  '裡' => '裡',\n  '里' => '里',\n  '離' => '離',\n  '匿' => '匿',\n  '溺' => '溺',\n  '吝' => '吝',\n  '燐' => '燐',\n  '璘' => '璘',\n  '藺' => '藺',\n  '隣' => '隣',\n  '鱗' => '鱗',\n  '麟' => '麟',\n  '林' => '林',\n  '淋' => '淋',\n  '臨' => '臨',\n  '立' => '立',\n  '笠' => '笠',\n  '粒' => '粒',\n  '狀' => '狀',\n  '炙' => '炙',\n  '識' => '識',\n  '什' => '什',\n  '茶' => '茶',\n  '刺' => '刺',\n  '切' => '切',\n  '度' => '度',\n  '拓' => '拓',\n  '糖' => '糖',\n  '宅' => '宅',\n  '洞' => '洞',\n  '暴' => '暴',\n  '輻' => '輻',\n  '行' => '行',\n  '降' => '降',\n  '見' => '見',\n  '廓' => '廓',\n  '兀' => '兀',\n  '嗀' => '嗀',\n  '塚' => '塚',\n  '晴' => '晴',\n  '凞' => '凞',\n  '猪' => '猪',\n  '益' => '益',\n  '礼' => '礼',\n  '神' => '神',\n  '祥' => '祥',\n  '福' => '福',\n  '靖' => '靖',\n  '精' => '精',\n  '羽' => '羽',\n  '蘒' => '蘒',\n  '諸' => '諸',\n  '逸' => '逸',\n  '都' => '都',\n  '飯' => '飯',\n  '飼' => '飼',\n  '館' => '館',\n  '鶴' => '鶴',\n  '郞' => '郞',\n  '隷' => '隷',\n  '侮' => '侮',\n  '僧' => '僧',\n  '免' => '免',\n  '勉' => '勉',\n  '勤' => '勤',\n  '卑' => '卑',\n  '喝' => '喝',\n  '嘆' => '嘆',\n  '器' => '器',\n  '塀' => '塀',\n  '墨' => '墨',\n  '層' => '層',\n  '屮' => '屮',\n  '悔' => '悔',\n  '慨' => '慨',\n  '憎' => '憎',\n  '懲' => '懲',\n  '敏' => '敏',\n  '既' => '既',\n  '暑' => '暑',\n  '梅' => '梅',\n  '海' => '海',\n  '渚' => '渚',\n  '漢' => '漢',\n  '煮' => '煮',\n  '爫' => '爫',\n  '琢' => '琢',\n  '碑' => '碑',\n  '社' => '社',\n  '祉' => '祉',\n  '祈' => '祈',\n  '祐' => '祐',\n  '祖' => '祖',\n  '祝' => '祝',\n  '禍' => '禍',\n  '禎' => '禎',\n  '穀' => '穀',\n  '突' => '突',\n  '節' => '節',\n  '練' => '練',\n  '縉' => '縉',\n  '繁' => '繁',\n  '署' => '署',\n  '者' => '者',\n  '臭' => '臭',\n  '艹' => '艹',\n  '艹' => '艹',\n  '著' => '著',\n  '褐' => '褐',\n  '視' => '視',\n  '謁' => '謁',\n  '謹' => '謹',\n  '賓' => '賓',\n  '贈' => '贈',\n  '辶' => '辶',\n  '逸' => '逸',\n  '難' => '難',\n  '響' => '響',\n  '頻' => '頻',\n  '恵' => '恵',\n  '𤋮' => '𤋮',\n  '舘' => '舘',\n  '並' => '並',\n  '况' => '况',\n  '全' => '全',\n  '侀' => '侀',\n  '充' => '充',\n  '冀' => '冀',\n  '勇' => '勇',\n  '勺' => '勺',\n  '喝' => '喝',\n  '啕' => '啕',\n  '喙' => '喙',\n  '嗢' => '嗢',\n  '塚' => '塚',\n  '墳' => '墳',\n  '奄' => '奄',\n  '奔' => '奔',\n  '婢' => '婢',\n  '嬨' => '嬨',\n  '廒' => '廒',\n  '廙' => '廙',\n  '彩' => '彩',\n  '徭' => '徭',\n  '惘' => '惘',\n  '慎' => '慎',\n  '愈' => '愈',\n  '憎' => '憎',\n  '慠' => '慠',\n  '懲' => '懲',\n  '戴' => '戴',\n  '揄' => '揄',\n  '搜' => '搜',\n  '摒' => '摒',\n  '敖' => '敖',\n  '晴' => '晴',\n  '朗' => '朗',\n  '望' => '望',\n  '杖' => '杖',\n  '歹' => '歹',\n  '殺' => '殺',\n  '流' => '流',\n  '滛' => '滛',\n  '滋' => '滋',\n  '漢' => '漢',\n  '瀞' => '瀞',\n  '煮' => '煮',\n  '瞧' => '瞧',\n  '爵' => '爵',\n  '犯' => '犯',\n  '猪' => '猪',\n  '瑱' => '瑱',\n  '甆' => '甆',\n  '画' => '画',\n  '瘝' => '瘝',\n  '瘟' => '瘟',\n  '益' => '益',\n  '盛' => '盛',\n  '直' => '直',\n  '睊' => '睊',\n  '着' => '着',\n  '磌' => '磌',\n  '窱' => '窱',\n  '節' => '節',\n  '类' => '类',\n  '絛' => '絛',\n  '練' => '練',\n  '缾' => '缾',\n  '者' => '者',\n  '荒' => '荒',\n  '華' => '華',\n  '蝹' => '蝹',\n  '襁' => '襁',\n  '覆' => '覆',\n  '視' => '視',\n  '調' => '調',\n  '諸' => '諸',\n  '請' => '請',\n  '謁' => '謁',\n  '諾' => '諾',\n  '諭' => '諭',\n  '謹' => '謹',\n  '變' => '變',\n  '贈' => '贈',\n  '輸' => '輸',\n  '遲' => '遲',\n  '醙' => '醙',\n  '鉶' => '鉶',\n  '陼' => '陼',\n  '難' => '難',\n  '靖' => '靖',\n  '韛' => '韛',\n  '響' => '響',\n  '頋' => '頋',\n  '頻' => '頻',\n  '鬒' => '鬒',\n  '龜' => '龜',\n  '𢡊' => '𢡊',\n  '𢡄' => '𢡄',\n  '𣏕' => '𣏕',\n  '㮝' => '㮝',\n  '䀘' => '䀘',\n  '䀹' => '䀹',\n  '𥉉' => '𥉉',\n  '𥳐' => '𥳐',\n  '𧻓' => '𧻓',\n  '齃' => '齃',\n  '龎' => '龎',\n  'יִ' => 'יִ',\n  'ײַ' => 'ײַ',\n  'שׁ' => 'שׁ',\n  'שׂ' => 'שׂ',\n  'שּׁ' => 'שּׁ',\n  'שּׂ' => 'שּׂ',\n  'אַ' => 'אַ',\n  'אָ' => 'אָ',\n  'אּ' => 'אּ',\n  'בּ' => 'בּ',\n  'גּ' => 'גּ',\n  'דּ' => 'דּ',\n  'הּ' => 'הּ',\n  'וּ' => 'וּ',\n  'זּ' => 'זּ',\n  'טּ' => 'טּ',\n  'יּ' => 'יּ',\n  'ךּ' => 'ךּ',\n  'כּ' => 'כּ',\n  'לּ' => 'לּ',\n  'מּ' => 'מּ',\n  'נּ' => 'נּ',\n  'סּ' => 'סּ',\n  'ףּ' => 'ףּ',\n  'פּ' => 'פּ',\n  'צּ' => 'צּ',\n  'קּ' => 'קּ',\n  'רּ' => 'רּ',\n  'שּ' => 'שּ',\n  'תּ' => 'תּ',\n  'וֹ' => 'וֹ',\n  'בֿ' => 'בֿ',\n  'כֿ' => 'כֿ',\n  'פֿ' => 'פֿ',\n  '𑂚' => '𑂚',\n  '𑂜' => '𑂜',\n  '𑂫' => '𑂫',\n  '𑄮' => '𑄮',\n  '𑄯' => '𑄯',\n  '𑍋' => '𑍋',\n  '𑍌' => '𑍌',\n  '𑒻' => '𑒻',\n  '𑒼' => '𑒼',\n  '𑒾' => '𑒾',\n  '𑖺' => '𑖺',\n  '𑖻' => '𑖻',\n  '𑤸' => '𑤸',\n  '𝅗𝅥' => '𝅗𝅥',\n  '𝅘𝅥' => '𝅘𝅥',\n  '𝅘𝅥𝅮' => '𝅘𝅥𝅮',\n  '𝅘𝅥𝅯' => '𝅘𝅥𝅯',\n  '𝅘𝅥𝅰' => '𝅘𝅥𝅰',\n  '𝅘𝅥𝅱' => '𝅘𝅥𝅱',\n  '𝅘𝅥𝅲' => '𝅘𝅥𝅲',\n  '𝆹𝅥' => '𝆹𝅥',\n  '𝆺𝅥' => '𝆺𝅥',\n  '𝆹𝅥𝅮' => '𝆹𝅥𝅮',\n  '𝆺𝅥𝅮' => '𝆺𝅥𝅮',\n  '𝆹𝅥𝅯' => '𝆹𝅥𝅯',\n  '𝆺𝅥𝅯' => '𝆺𝅥𝅯',\n  '丽' => '丽',\n  '丸' => '丸',\n  '乁' => '乁',\n  '𠄢' => '𠄢',\n  '你' => '你',\n  '侮' => '侮',\n  '侻' => '侻',\n  '倂' => '倂',\n  '偺' => '偺',\n  '備' => '備',\n  '僧' => '僧',\n  '像' => '像',\n  '㒞' => '㒞',\n  '𠘺' => '𠘺',\n  '免' => '免',\n  '兔' => '兔',\n  '兤' => '兤',\n  '具' => '具',\n  '𠔜' => '𠔜',\n  '㒹' => '㒹',\n  '內' => '內',\n  '再' => '再',\n  '𠕋' => '𠕋',\n  '冗' => '冗',\n  '冤' => '冤',\n  '仌' => '仌',\n  '冬' => '冬',\n  '况' => '况',\n  '𩇟' => '𩇟',\n  '凵' => '凵',\n  '刃' => '刃',\n  '㓟' => '㓟',\n  '刻' => '刻',\n  '剆' => '剆',\n  '割' => '割',\n  '剷' => '剷',\n  '㔕' => '㔕',\n  '勇' => '勇',\n  '勉' => '勉',\n  '勤' => '勤',\n  '勺' => '勺',\n  '包' => '包',\n  '匆' => '匆',\n  '北' => '北',\n  '卉' => '卉',\n  '卑' => '卑',\n  '博' => '博',\n  '即' => '即',\n  '卽' => '卽',\n  '卿' => '卿',\n  '卿' => '卿',\n  '卿' => '卿',\n  '𠨬' => '𠨬',\n  '灰' => '灰',\n  '及' => '及',\n  '叟' => '叟',\n  '𠭣' => '𠭣',\n  '叫' => '叫',\n  '叱' => '叱',\n  '吆' => '吆',\n  '咞' => '咞',\n  '吸' => '吸',\n  '呈' => '呈',\n  '周' => '周',\n  '咢' => '咢',\n  '哶' => '哶',\n  '唐' => '唐',\n  '啓' => '啓',\n  '啣' => '啣',\n  '善' => '善',\n  '善' => '善',\n  '喙' => '喙',\n  '喫' => '喫',\n  '喳' => '喳',\n  '嗂' => '嗂',\n  '圖' => '圖',\n  '嘆' => '嘆',\n  '圗' => '圗',\n  '噑' => '噑',\n  '噴' => '噴',\n  '切' => '切',\n  '壮' => '壮',\n  '城' => '城',\n  '埴' => '埴',\n  '堍' => '堍',\n  '型' => '型',\n  '堲' => '堲',\n  '報' => '報',\n  '墬' => '墬',\n  '𡓤' => '𡓤',\n  '売' => '売',\n  '壷' => '壷',\n  '夆' => '夆',\n  '多' => '多',\n  '夢' => '夢',\n  '奢' => '奢',\n  '𡚨' => '𡚨',\n  '𡛪' => '𡛪',\n  '姬' => '姬',\n  '娛' => '娛',\n  '娧' => '娧',\n  '姘' => '姘',\n  '婦' => '婦',\n  '㛮' => '㛮',\n  '㛼' => '㛼',\n  '嬈' => '嬈',\n  '嬾' => '嬾',\n  '嬾' => '嬾',\n  '𡧈' => '𡧈',\n  '寃' => '寃',\n  '寘' => '寘',\n  '寧' => '寧',\n  '寳' => '寳',\n  '𡬘' => '𡬘',\n  '寿' => '寿',\n  '将' => '将',\n  '当' => '当',\n  '尢' => '尢',\n  '㞁' => '㞁',\n  '屠' => '屠',\n  '屮' => '屮',\n  '峀' => '峀',\n  '岍' => '岍',\n  '𡷤' => '𡷤',\n  '嵃' => '嵃',\n  '𡷦' => '𡷦',\n  '嵮' => '嵮',\n  '嵫' => '嵫',\n  '嵼' => '嵼',\n  '巡' => '巡',\n  '巢' => '巢',\n  '㠯' => '㠯',\n  '巽' => '巽',\n  '帨' => '帨',\n  '帽' => '帽',\n  '幩' => '幩',\n  '㡢' => '㡢',\n  '𢆃' => '𢆃',\n  '㡼' => '㡼',\n  '庰' => '庰',\n  '庳' => '庳',\n  '庶' => '庶',\n  '廊' => '廊',\n  '𪎒' => '𪎒',\n  '廾' => '廾',\n  '𢌱' => '𢌱',\n  '𢌱' => '𢌱',\n  '舁' => '舁',\n  '弢' => '弢',\n  '弢' => '弢',\n  '㣇' => '㣇',\n  '𣊸' => '𣊸',\n  '𦇚' => '𦇚',\n  '形' => '形',\n  '彫' => '彫',\n  '㣣' => '㣣',\n  '徚' => '徚',\n  '忍' => '忍',\n  '志' => '志',\n  '忹' => '忹',\n  '悁' => '悁',\n  '㤺' => '㤺',\n  '㤜' => '㤜',\n  '悔' => '悔',\n  '𢛔' => '𢛔',\n  '惇' => '惇',\n  '慈' => '慈',\n  '慌' => '慌',\n  '慎' => '慎',\n  '慌' => '慌',\n  '慺' => '慺',\n  '憎' => '憎',\n  '憲' => '憲',\n  '憤' => '憤',\n  '憯' => '憯',\n  '懞' => '懞',\n  '懲' => '懲',\n  '懶' => '懶',\n  '成' => '成',\n  '戛' => '戛',\n  '扝' => '扝',\n  '抱' => '抱',\n  '拔' => '拔',\n  '捐' => '捐',\n  '𢬌' => '𢬌',\n  '挽' => '挽',\n  '拼' => '拼',\n  '捨' => '捨',\n  '掃' => '掃',\n  '揤' => '揤',\n  '𢯱' => '𢯱',\n  '搢' => '搢',\n  '揅' => '揅',\n  '掩' => '掩',\n  '㨮' => '㨮',\n  '摩' => '摩',\n  '摾' => '摾',\n  '撝' => '撝',\n  '摷' => '摷',\n  '㩬' => '㩬',\n  '敏' => '敏',\n  '敬' => '敬',\n  '𣀊' => '𣀊',\n  '旣' => '旣',\n  '書' => '書',\n  '晉' => '晉',\n  '㬙' => '㬙',\n  '暑' => '暑',\n  '㬈' => '㬈',\n  '㫤' => '㫤',\n  '冒' => '冒',\n  '冕' => '冕',\n  '最' => '最',\n  '暜' => '暜',\n  '肭' => '肭',\n  '䏙' => '䏙',\n  '朗' => '朗',\n  '望' => '望',\n  '朡' => '朡',\n  '杞' => '杞',\n  '杓' => '杓',\n  '𣏃' => '𣏃',\n  '㭉' => '㭉',\n  '柺' => '柺',\n  '枅' => '枅',\n  '桒' => '桒',\n  '梅' => '梅',\n  '𣑭' => '𣑭',\n  '梎' => '梎',\n  '栟' => '栟',\n  '椔' => '椔',\n  '㮝' => '㮝',\n  '楂' => '楂',\n  '榣' => '榣',\n  '槪' => '槪',\n  '檨' => '檨',\n  '𣚣' => '𣚣',\n  '櫛' => '櫛',\n  '㰘' => '㰘',\n  '次' => '次',\n  '𣢧' => '𣢧',\n  '歔' => '歔',\n  '㱎' => '㱎',\n  '歲' => '歲',\n  '殟' => '殟',\n  '殺' => '殺',\n  '殻' => '殻',\n  '𣪍' => '𣪍',\n  '𡴋' => '𡴋',\n  '𣫺' => '𣫺',\n  '汎' => '汎',\n  '𣲼' => '𣲼',\n  '沿' => '沿',\n  '泍' => '泍',\n  '汧' => '汧',\n  '洖' => '洖',\n  '派' => '派',\n  '海' => '海',\n  '流' => '流',\n  '浩' => '浩',\n  '浸' => '浸',\n  '涅' => '涅',\n  '𣴞' => '𣴞',\n  '洴' => '洴',\n  '港' => '港',\n  '湮' => '湮',\n  '㴳' => '㴳',\n  '滋' => '滋',\n  '滇' => '滇',\n  '𣻑' => '𣻑',\n  '淹' => '淹',\n  '潮' => '潮',\n  '𣽞' => '𣽞',\n  '𣾎' => '𣾎',\n  '濆' => '濆',\n  '瀹' => '瀹',\n  '瀞' => '瀞',\n  '瀛' => '瀛',\n  '㶖' => '㶖',\n  '灊' => '灊',\n  '災' => '災',\n  '灷' => '灷',\n  '炭' => '炭',\n  '𠔥' => '𠔥',\n  '煅' => '煅',\n  '𤉣' => '𤉣',\n  '熜' => '熜',\n  '𤎫' => '𤎫',\n  '爨' => '爨',\n  '爵' => '爵',\n  '牐' => '牐',\n  '𤘈' => '𤘈',\n  '犀' => '犀',\n  '犕' => '犕',\n  '𤜵' => '𤜵',\n  '𤠔' => '𤠔',\n  '獺' => '獺',\n  '王' => '王',\n  '㺬' => '㺬',\n  '玥' => '玥',\n  '㺸' => '㺸',\n  '㺸' => '㺸',\n  '瑇' => '瑇',\n  '瑜' => '瑜',\n  '瑱' => '瑱',\n  '璅' => '璅',\n  '瓊' => '瓊',\n  '㼛' => '㼛',\n  '甤' => '甤',\n  '𤰶' => '𤰶',\n  '甾' => '甾',\n  '𤲒' => '𤲒',\n  '異' => '異',\n  '𢆟' => '𢆟',\n  '瘐' => '瘐',\n  '𤾡' => '𤾡',\n  '𤾸' => '𤾸',\n  '𥁄' => '𥁄',\n  '㿼' => '㿼',\n  '䀈' => '䀈',\n  '直' => '直',\n  '𥃳' => '𥃳',\n  '𥃲' => '𥃲',\n  '𥄙' => '𥄙',\n  '𥄳' => '𥄳',\n  '眞' => '眞',\n  '真' => '真',\n  '真' => '真',\n  '睊' => '睊',\n  '䀹' => '䀹',\n  '瞋' => '瞋',\n  '䁆' => '䁆',\n  '䂖' => '䂖',\n  '𥐝' => '𥐝',\n  '硎' => '硎',\n  '碌' => '碌',\n  '磌' => '磌',\n  '䃣' => '䃣',\n  '𥘦' => '𥘦',\n  '祖' => '祖',\n  '𥚚' => '𥚚',\n  '𥛅' => '𥛅',\n  '福' => '福',\n  '秫' => '秫',\n  '䄯' => '䄯',\n  '穀' => '穀',\n  '穊' => '穊',\n  '穏' => '穏',\n  '𥥼' => '𥥼',\n  '𥪧' => '𥪧',\n  '𥪧' => '𥪧',\n  '竮' => '竮',\n  '䈂' => '䈂',\n  '𥮫' => '𥮫',\n  '篆' => '篆',\n  '築' => '築',\n  '䈧' => '䈧',\n  '𥲀' => '𥲀',\n  '糒' => '糒',\n  '䊠' => '䊠',\n  '糨' => '糨',\n  '糣' => '糣',\n  '紀' => '紀',\n  '𥾆' => '𥾆',\n  '絣' => '絣',\n  '䌁' => '䌁',\n  '緇' => '緇',\n  '縂' => '縂',\n  '繅' => '繅',\n  '䌴' => '䌴',\n  '𦈨' => '𦈨',\n  '𦉇' => '𦉇',\n  '䍙' => '䍙',\n  '𦋙' => '𦋙',\n  '罺' => '罺',\n  '𦌾' => '𦌾',\n  '羕' => '羕',\n  '翺' => '翺',\n  '者' => '者',\n  '𦓚' => '𦓚',\n  '𦔣' => '𦔣',\n  '聠' => '聠',\n  '𦖨' => '𦖨',\n  '聰' => '聰',\n  '𣍟' => '𣍟',\n  '䏕' => '䏕',\n  '育' => '育',\n  '脃' => '脃',\n  '䐋' => '䐋',\n  '脾' => '脾',\n  '媵' => '媵',\n  '𦞧' => '𦞧',\n  '𦞵' => '𦞵',\n  '𣎓' => '𣎓',\n  '𣎜' => '𣎜',\n  '舁' => '舁',\n  '舄' => '舄',\n  '辞' => '辞',\n  '䑫' => '䑫',\n  '芑' => '芑',\n  '芋' => '芋',\n  '芝' => '芝',\n  '劳' => '劳',\n  '花' => '花',\n  '芳' => '芳',\n  '芽' => '芽',\n  '苦' => '苦',\n  '𦬼' => '𦬼',\n  '若' => '若',\n  '茝' => '茝',\n  '荣' => '荣',\n  '莭' => '莭',\n  '茣' => '茣',\n  '莽' => '莽',\n  '菧' => '菧',\n  '著' => '著',\n  '荓' => '荓',\n  '菊' => '菊',\n  '菌' => '菌',\n  '菜' => '菜',\n  '𦰶' => '𦰶',\n  '𦵫' => '𦵫',\n  '𦳕' => '𦳕',\n  '䔫' => '䔫',\n  '蓱' => '蓱',\n  '蓳' => '蓳',\n  '蔖' => '蔖',\n  '𧏊' => '𧏊',\n  '蕤' => '蕤',\n  '𦼬' => '𦼬',\n  '䕝' => '䕝',\n  '䕡' => '䕡',\n  '𦾱' => '𦾱',\n  '𧃒' => '𧃒',\n  '䕫' => '䕫',\n  '虐' => '虐',\n  '虜' => '虜',\n  '虧' => '虧',\n  '虩' => '虩',\n  '蚩' => '蚩',\n  '蚈' => '蚈',\n  '蜎' => '蜎',\n  '蛢' => '蛢',\n  '蝹' => '蝹',\n  '蜨' => '蜨',\n  '蝫' => '蝫',\n  '螆' => '螆',\n  '䗗' => '䗗',\n  '蟡' => '蟡',\n  '蠁' => '蠁',\n  '䗹' => '䗹',\n  '衠' => '衠',\n  '衣' => '衣',\n  '𧙧' => '𧙧',\n  '裗' => '裗',\n  '裞' => '裞',\n  '䘵' => '䘵',\n  '裺' => '裺',\n  '㒻' => '㒻',\n  '𧢮' => '𧢮',\n  '𧥦' => '𧥦',\n  '䚾' => '䚾',\n  '䛇' => '䛇',\n  '誠' => '誠',\n  '諭' => '諭',\n  '變' => '變',\n  '豕' => '豕',\n  '𧲨' => '𧲨',\n  '貫' => '貫',\n  '賁' => '賁',\n  '贛' => '贛',\n  '起' => '起',\n  '𧼯' => '𧼯',\n  '𠠄' => '𠠄',\n  '跋' => '跋',\n  '趼' => '趼',\n  '跰' => '跰',\n  '𠣞' => '𠣞',\n  '軔' => '軔',\n  '輸' => '輸',\n  '𨗒' => '𨗒',\n  '𨗭' => '𨗭',\n  '邔' => '邔',\n  '郱' => '郱',\n  '鄑' => '鄑',\n  '𨜮' => '𨜮',\n  '鄛' => '鄛',\n  '鈸' => '鈸',\n  '鋗' => '鋗',\n  '鋘' => '鋘',\n  '鉼' => '鉼',\n  '鏹' => '鏹',\n  '鐕' => '鐕',\n  '𨯺' => '𨯺',\n  '開' => '開',\n  '䦕' => '䦕',\n  '閷' => '閷',\n  '𨵷' => '𨵷',\n  '䧦' => '䧦',\n  '雃' => '雃',\n  '嶲' => '嶲',\n  '霣' => '霣',\n  '𩅅' => '𩅅',\n  '𩈚' => '𩈚',\n  '䩮' => '䩮',\n  '䩶' => '䩶',\n  '韠' => '韠',\n  '𩐊' => '𩐊',\n  '䪲' => '䪲',\n  '𩒖' => '𩒖',\n  '頋' => '頋',\n  '頋' => '頋',\n  '頩' => '頩',\n  '𩖶' => '𩖶',\n  '飢' => '飢',\n  '䬳' => '䬳',\n  '餩' => '餩',\n  '馧' => '馧',\n  '駂' => '駂',\n  '駾' => '駾',\n  '䯎' => '䯎',\n  '𩬰' => '𩬰',\n  '鬒' => '鬒',\n  '鱀' => '鱀',\n  '鳽' => '鳽',\n  '䳎' => '䳎',\n  '䳭' => '䳭',\n  '鵧' => '鵧',\n  '𪃎' => '𪃎',\n  '䳸' => '䳸',\n  '𪄅' => '𪄅',\n  '𪈎' => '𪈎',\n  '𪊑' => '𪊑',\n  '麻' => '麻',\n  '䵖' => '䵖',\n  '黹' => '黹',\n  '黾' => '黾',\n  '鼅' => '鼅',\n  '鼏' => '鼏',\n  '鼖' => '鼖',\n  '鼻' => '鼻',\n  '𪘀' => '𪘀',\n);\n","vendor/symfony/polyfill-intl-normalizer/Resources/unidata/combiningClass.php":"<?php\n\nreturn array (\n  '̀' => 230,\n  '́' => 230,\n  '̂' => 230,\n  '̃' => 230,\n  '̄' => 230,\n  '̅' => 230,\n  '̆' => 230,\n  '̇' => 230,\n  '̈' => 230,\n  '̉' => 230,\n  '̊' => 230,\n  '̋' => 230,\n  '̌' => 230,\n  '̍' => 230,\n  '̎' => 230,\n  '̏' => 230,\n  '̐' => 230,\n  '̑' => 230,\n  '̒' => 230,\n  '̓' => 230,\n  '̔' => 230,\n  '̕' => 232,\n  '̖' => 220,\n  '̗' => 220,\n  '̘' => 220,\n  '̙' => 220,\n  '̚' => 232,\n  '̛' => 216,\n  '̜' => 220,\n  '̝' => 220,\n  '̞' => 220,\n  '̟' => 220,\n  '̠' => 220,\n  '̡' => 202,\n  '̢' => 202,\n  '̣' => 220,\n  '̤' => 220,\n  '̥' => 220,\n  '̦' => 220,\n  '̧' => 202,\n  '̨' => 202,\n  '̩' => 220,\n  '̪' => 220,\n  '̫' => 220,\n  '̬' => 220,\n  '̭' => 220,\n  '̮' => 220,\n  '̯' => 220,\n  '̰' => 220,\n  '̱' => 220,\n  '̲' => 220,\n  '̳' => 220,\n  '̴' => 1,\n  '̵' => 1,\n  '̶' => 1,\n  '̷' => 1,\n  '̸' => 1,\n  '̹' => 220,\n  '̺' => 220,\n  '̻' => 220,\n  '̼' => 220,\n  '̽' => 230,\n  '̾' => 230,\n  '̿' => 230,\n  '̀' => 230,\n  '́' => 230,\n  '͂' => 230,\n  '̓' => 230,\n  '̈́' => 230,\n  'ͅ' => 240,\n  '͆' => 230,\n  '͇' => 220,\n  '͈' => 220,\n  '͉' => 220,\n  '͊' => 230,\n  '͋' => 230,\n  '͌' => 230,\n  '͍' => 220,\n  '͎' => 220,\n  '͐' => 230,\n  '͑' => 230,\n  '͒' => 230,\n  '͓' => 220,\n  '͔' => 220,\n  '͕' => 220,\n  '͖' => 220,\n  '͗' => 230,\n  '͘' => 232,\n  '͙' => 220,\n  '͚' => 220,\n  '͛' => 230,\n  '͜' => 233,\n  '͝' => 234,\n  '͞' => 234,\n  '͟' => 233,\n  '͠' => 234,\n  '͡' => 234,\n  '͢' => 233,\n  'ͣ' => 230,\n  'ͤ' => 230,\n  'ͥ' => 230,\n  'ͦ' => 230,\n  'ͧ' => 230,\n  'ͨ' => 230,\n  'ͩ' => 230,\n  'ͪ' => 230,\n  'ͫ' => 230,\n  'ͬ' => 230,\n  'ͭ' => 230,\n  'ͮ' => 230,\n  'ͯ' => 230,\n  '҃' => 230,\n  '҄' => 230,\n  '҅' => 230,\n  '҆' => 230,\n  '҇' => 230,\n  '֑' => 220,\n  '֒' => 230,\n  '֓' => 230,\n  '֔' => 230,\n  '֕' => 230,\n  '֖' => 220,\n  '֗' => 230,\n  '֘' => 230,\n  '֙' => 230,\n  '֚' => 222,\n  '֛' => 220,\n  '֜' => 230,\n  '֝' => 230,\n  '֞' => 230,\n  '֟' => 230,\n  '֠' => 230,\n  '֡' => 230,\n  '֢' => 220,\n  '֣' => 220,\n  '֤' => 220,\n  '֥' => 220,\n  '֦' => 220,\n  '֧' => 220,\n  '֨' => 230,\n  '֩' => 230,\n  '֪' => 220,\n  '֫' => 230,\n  '֬' => 230,\n  '֭' => 222,\n  '֮' => 228,\n  '֯' => 230,\n  'ְ' => 10,\n  'ֱ' => 11,\n  'ֲ' => 12,\n  'ֳ' => 13,\n  'ִ' => 14,\n  'ֵ' => 15,\n  'ֶ' => 16,\n  'ַ' => 17,\n  'ָ' => 18,\n  'ֹ' => 19,\n  'ֺ' => 19,\n  'ֻ' => 20,\n  'ּ' => 21,\n  'ֽ' => 22,\n  'ֿ' => 23,\n  'ׁ' => 24,\n  'ׂ' => 25,\n  'ׄ' => 230,\n  'ׅ' => 220,\n  'ׇ' => 18,\n  'ؐ' => 230,\n  'ؑ' => 230,\n  'ؒ' => 230,\n  'ؓ' => 230,\n  'ؔ' => 230,\n  'ؕ' => 230,\n  'ؖ' => 230,\n  'ؗ' => 230,\n  'ؘ' => 30,\n  'ؙ' => 31,\n  'ؚ' => 32,\n  'ً' => 27,\n  'ٌ' => 28,\n  'ٍ' => 29,\n  'َ' => 30,\n  'ُ' => 31,\n  'ِ' => 32,\n  'ّ' => 33,\n  'ْ' => 34,\n  'ٓ' => 230,\n  'ٔ' => 230,\n  'ٕ' => 220,\n  'ٖ' => 220,\n  'ٗ' => 230,\n  '٘' => 230,\n  'ٙ' => 230,\n  'ٚ' => 230,\n  'ٛ' => 230,\n  'ٜ' => 220,\n  'ٝ' => 230,\n  'ٞ' => 230,\n  'ٟ' => 220,\n  'ٰ' => 35,\n  'ۖ' => 230,\n  'ۗ' => 230,\n  'ۘ' => 230,\n  'ۙ' => 230,\n  'ۚ' => 230,\n  'ۛ' => 230,\n  'ۜ' => 230,\n  '۟' => 230,\n  '۠' => 230,\n  'ۡ' => 230,\n  'ۢ' => 230,\n  'ۣ' => 220,\n  'ۤ' => 230,\n  'ۧ' => 230,\n  'ۨ' => 230,\n  '۪' => 220,\n  '۫' => 230,\n  '۬' => 230,\n  'ۭ' => 220,\n  'ܑ' => 36,\n  'ܰ' => 230,\n  'ܱ' => 220,\n  'ܲ' => 230,\n  'ܳ' => 230,\n  'ܴ' => 220,\n  'ܵ' => 230,\n  'ܶ' => 230,\n  'ܷ' => 220,\n  'ܸ' => 220,\n  'ܹ' => 220,\n  'ܺ' => 230,\n  'ܻ' => 220,\n  'ܼ' => 220,\n  'ܽ' => 230,\n  'ܾ' => 220,\n  'ܿ' => 230,\n  '݀' => 230,\n  '݁' => 230,\n  '݂' => 220,\n  '݃' => 230,\n  '݄' => 220,\n  '݅' => 230,\n  '݆' => 220,\n  '݇' => 230,\n  '݈' => 220,\n  '݉' => 230,\n  '݊' => 230,\n  '߫' => 230,\n  '߬' => 230,\n  '߭' => 230,\n  '߮' => 230,\n  '߯' => 230,\n  '߰' => 230,\n  '߱' => 230,\n  '߲' => 220,\n  '߳' => 230,\n  '߽' => 220,\n  'ࠖ' => 230,\n  'ࠗ' => 230,\n  '࠘' => 230,\n  '࠙' => 230,\n  'ࠛ' => 230,\n  'ࠜ' => 230,\n  'ࠝ' => 230,\n  'ࠞ' => 230,\n  'ࠟ' => 230,\n  'ࠠ' => 230,\n  'ࠡ' => 230,\n  'ࠢ' => 230,\n  'ࠣ' => 230,\n  'ࠥ' => 230,\n  'ࠦ' => 230,\n  'ࠧ' => 230,\n  'ࠩ' => 230,\n  'ࠪ' => 230,\n  'ࠫ' => 230,\n  'ࠬ' => 230,\n  '࠭' => 230,\n  '࡙' => 220,\n  '࡚' => 220,\n  '࡛' => 220,\n  '࣓' => 220,\n  'ࣔ' => 230,\n  'ࣕ' => 230,\n  'ࣖ' => 230,\n  'ࣗ' => 230,\n  'ࣘ' => 230,\n  'ࣙ' => 230,\n  'ࣚ' => 230,\n  'ࣛ' => 230,\n  'ࣜ' => 230,\n  'ࣝ' => 230,\n  'ࣞ' => 230,\n  'ࣟ' => 230,\n  '࣠' => 230,\n  '࣡' => 230,\n  'ࣣ' => 220,\n  'ࣤ' => 230,\n  'ࣥ' => 230,\n  'ࣦ' => 220,\n  'ࣧ' => 230,\n  'ࣨ' => 230,\n  'ࣩ' => 220,\n  '࣪' => 230,\n  '࣫' => 230,\n  '࣬' => 230,\n  '࣭' => 220,\n  '࣮' => 220,\n  '࣯' => 220,\n  'ࣰ' => 27,\n  'ࣱ' => 28,\n  'ࣲ' => 29,\n  'ࣳ' => 230,\n  'ࣴ' => 230,\n  'ࣵ' => 230,\n  'ࣶ' => 220,\n  'ࣷ' => 230,\n  'ࣸ' => 230,\n  'ࣹ' => 220,\n  'ࣺ' => 220,\n  'ࣻ' => 230,\n  'ࣼ' => 230,\n  'ࣽ' => 230,\n  'ࣾ' => 230,\n  'ࣿ' => 230,\n  '़' => 7,\n  '्' => 9,\n  '॑' => 230,\n  '॒' => 220,\n  '॓' => 230,\n  '॔' => 230,\n  '়' => 7,\n  '্' => 9,\n  '৾' => 230,\n  '਼' => 7,\n  '੍' => 9,\n  '઼' => 7,\n  '્' => 9,\n  '଼' => 7,\n  '୍' => 9,\n  '்' => 9,\n  '్' => 9,\n  'ౕ' => 84,\n  'ౖ' => 91,\n  '಼' => 7,\n  '್' => 9,\n  '഻' => 9,\n  '഼' => 9,\n  '്' => 9,\n  '්' => 9,\n  'ุ' => 103,\n  'ู' => 103,\n  'ฺ' => 9,\n  '่' => 107,\n  '้' => 107,\n  '๊' => 107,\n  '๋' => 107,\n  'ຸ' => 118,\n  'ູ' => 118,\n  '຺' => 9,\n  '່' => 122,\n  '້' => 122,\n  '໊' => 122,\n  '໋' => 122,\n  '༘' => 220,\n  '༙' => 220,\n  '༵' => 220,\n  '༷' => 220,\n  '༹' => 216,\n  'ཱ' => 129,\n  'ི' => 130,\n  'ུ' => 132,\n  'ེ' => 130,\n  'ཻ' => 130,\n  'ོ' => 130,\n  'ཽ' => 130,\n  'ྀ' => 130,\n  'ྂ' => 230,\n  'ྃ' => 230,\n  '྄' => 9,\n  '྆' => 230,\n  '྇' => 230,\n  '࿆' => 220,\n  '့' => 7,\n  '္' => 9,\n  '်' => 9,\n  'ႍ' => 220,\n  '፝' => 230,\n  '፞' => 230,\n  '፟' => 230,\n  '᜔' => 9,\n  '᜴' => 9,\n  '្' => 9,\n  '៝' => 230,\n  'ᢩ' => 228,\n  '᤹' => 222,\n  '᤺' => 230,\n  '᤻' => 220,\n  'ᨗ' => 230,\n  'ᨘ' => 220,\n  '᩠' => 9,\n  '᩵' => 230,\n  '᩶' => 230,\n  '᩷' => 230,\n  '᩸' => 230,\n  '᩹' => 230,\n  '᩺' => 230,\n  '᩻' => 230,\n  '᩼' => 230,\n  '᩿' => 220,\n  '᪰' => 230,\n  '᪱' => 230,\n  '᪲' => 230,\n  '᪳' => 230,\n  '᪴' => 230,\n  '᪵' => 220,\n  '᪶' => 220,\n  '᪷' => 220,\n  '᪸' => 220,\n  '᪹' => 220,\n  '᪺' => 220,\n  '᪻' => 230,\n  '᪼' => 230,\n  '᪽' => 220,\n  'ᪿ' => 220,\n  'ᫀ' => 220,\n  '᬴' => 7,\n  '᭄' => 9,\n  '᭫' => 230,\n  '᭬' => 220,\n  '᭭' => 230,\n  '᭮' => 230,\n  '᭯' => 230,\n  '᭰' => 230,\n  '᭱' => 230,\n  '᭲' => 230,\n  '᭳' => 230,\n  '᮪' => 9,\n  '᮫' => 9,\n  '᯦' => 7,\n  '᯲' => 9,\n  '᯳' => 9,\n  '᰷' => 7,\n  '᳐' => 230,\n  '᳑' => 230,\n  '᳒' => 230,\n  '᳔' => 1,\n  '᳕' => 220,\n  '᳖' => 220,\n  '᳗' => 220,\n  '᳘' => 220,\n  '᳙' => 220,\n  '᳚' => 230,\n  '᳛' => 230,\n  '᳜' => 220,\n  '᳝' => 220,\n  '᳞' => 220,\n  '᳟' => 220,\n  '᳠' => 230,\n  '᳢' => 1,\n  '᳣' => 1,\n  '᳤' => 1,\n  '᳥' => 1,\n  '᳦' => 1,\n  '᳧' => 1,\n  '᳨' => 1,\n  '᳭' => 220,\n  '᳴' => 230,\n  '᳸' => 230,\n  '᳹' => 230,\n  '᷀' => 230,\n  '᷁' => 230,\n  '᷂' => 220,\n  '᷃' => 230,\n  '᷄' => 230,\n  '᷅' => 230,\n  '᷆' => 230,\n  '᷇' => 230,\n  '᷈' => 230,\n  '᷉' => 230,\n  '᷊' => 220,\n  '᷋' => 230,\n  '᷌' => 230,\n  '᷍' => 234,\n  '᷎' => 214,\n  '᷏' => 220,\n  '᷐' => 202,\n  '᷑' => 230,\n  '᷒' => 230,\n  'ᷓ' => 230,\n  'ᷔ' => 230,\n  'ᷕ' => 230,\n  'ᷖ' => 230,\n  'ᷗ' => 230,\n  'ᷘ' => 230,\n  'ᷙ' => 230,\n  'ᷚ' => 230,\n  'ᷛ' => 230,\n  'ᷜ' => 230,\n  'ᷝ' => 230,\n  'ᷞ' => 230,\n  'ᷟ' => 230,\n  'ᷠ' => 230,\n  'ᷡ' => 230,\n  'ᷢ' => 230,\n  'ᷣ' => 230,\n  'ᷤ' => 230,\n  'ᷥ' => 230,\n  'ᷦ' => 230,\n  'ᷧ' => 230,\n  'ᷨ' => 230,\n  'ᷩ' => 230,\n  'ᷪ' => 230,\n  'ᷫ' => 230,\n  'ᷬ' => 230,\n  'ᷭ' => 230,\n  'ᷮ' => 230,\n  'ᷯ' => 230,\n  'ᷰ' => 230,\n  'ᷱ' => 230,\n  'ᷲ' => 230,\n  'ᷳ' => 230,\n  'ᷴ' => 230,\n  '᷵' => 230,\n  '᷶' => 232,\n  '᷷' => 228,\n  '᷸' => 228,\n  '᷹' => 220,\n  '᷻' => 230,\n  '᷼' => 233,\n  '᷽' => 220,\n  '᷾' => 230,\n  '᷿' => 220,\n  '⃐' => 230,\n  '⃑' => 230,\n  '⃒' => 1,\n  '⃓' => 1,\n  '⃔' => 230,\n  '⃕' => 230,\n  '⃖' => 230,\n  '⃗' => 230,\n  '⃘' => 1,\n  '⃙' => 1,\n  '⃚' => 1,\n  '⃛' => 230,\n  '⃜' => 230,\n  '⃡' => 230,\n  '⃥' => 1,\n  '⃦' => 1,\n  '⃧' => 230,\n  '⃨' => 220,\n  '⃩' => 230,\n  '⃪' => 1,\n  '⃫' => 1,\n  '⃬' => 220,\n  '⃭' => 220,\n  '⃮' => 220,\n  '⃯' => 220,\n  '⃰' => 230,\n  '⳯' => 230,\n  '⳰' => 230,\n  '⳱' => 230,\n  '⵿' => 9,\n  'ⷠ' => 230,\n  'ⷡ' => 230,\n  'ⷢ' => 230,\n  'ⷣ' => 230,\n  'ⷤ' => 230,\n  'ⷥ' => 230,\n  'ⷦ' => 230,\n  'ⷧ' => 230,\n  'ⷨ' => 230,\n  'ⷩ' => 230,\n  'ⷪ' => 230,\n  'ⷫ' => 230,\n  'ⷬ' => 230,\n  'ⷭ' => 230,\n  'ⷮ' => 230,\n  'ⷯ' => 230,\n  'ⷰ' => 230,\n  'ⷱ' => 230,\n  'ⷲ' => 230,\n  'ⷳ' => 230,\n  'ⷴ' => 230,\n  'ⷵ' => 230,\n  'ⷶ' => 230,\n  'ⷷ' => 230,\n  'ⷸ' => 230,\n  'ⷹ' => 230,\n  'ⷺ' => 230,\n  'ⷻ' => 230,\n  'ⷼ' => 230,\n  'ⷽ' => 230,\n  'ⷾ' => 230,\n  'ⷿ' => 230,\n  '〪' => 218,\n  '〫' => 228,\n  '〬' => 232,\n  '〭' => 222,\n  '〮' => 224,\n  '〯' => 224,\n  '゙' => 8,\n  '゚' => 8,\n  '꙯' => 230,\n  'ꙴ' => 230,\n  'ꙵ' => 230,\n  'ꙶ' => 230,\n  'ꙷ' => 230,\n  'ꙸ' => 230,\n  'ꙹ' => 230,\n  'ꙺ' => 230,\n  'ꙻ' => 230,\n  '꙼' => 230,\n  '꙽' => 230,\n  'ꚞ' => 230,\n  'ꚟ' => 230,\n  '꛰' => 230,\n  '꛱' => 230,\n  '꠆' => 9,\n  '꠬' => 9,\n  '꣄' => 9,\n  '꣠' => 230,\n  '꣡' => 230,\n  '꣢' => 230,\n  '꣣' => 230,\n  '꣤' => 230,\n  '꣥' => 230,\n  '꣦' => 230,\n  '꣧' => 230,\n  '꣨' => 230,\n  '꣩' => 230,\n  '꣪' => 230,\n  '꣫' => 230,\n  '꣬' => 230,\n  '꣭' => 230,\n  '꣮' => 230,\n  '꣯' => 230,\n  '꣰' => 230,\n  '꣱' => 230,\n  '꤫' => 220,\n  '꤬' => 220,\n  '꤭' => 220,\n  '꥓' => 9,\n  '꦳' => 7,\n  '꧀' => 9,\n  'ꪰ' => 230,\n  'ꪲ' => 230,\n  'ꪳ' => 230,\n  'ꪴ' => 220,\n  'ꪷ' => 230,\n  'ꪸ' => 230,\n  'ꪾ' => 230,\n  '꪿' => 230,\n  '꫁' => 230,\n  '꫶' => 9,\n  '꯭' => 9,\n  'ﬞ' => 26,\n  '︠' => 230,\n  '︡' => 230,\n  '︢' => 230,\n  '︣' => 230,\n  '︤' => 230,\n  '︥' => 230,\n  '︦' => 230,\n  '︧' => 220,\n  '︨' => 220,\n  '︩' => 220,\n  '︪' => 220,\n  '︫' => 220,\n  '︬' => 220,\n  '︭' => 220,\n  '︮' => 230,\n  '︯' => 230,\n  '𐇽' => 220,\n  '𐋠' => 220,\n  '𐍶' => 230,\n  '𐍷' => 230,\n  '𐍸' => 230,\n  '𐍹' => 230,\n  '𐍺' => 230,\n  '𐨍' => 220,\n  '𐨏' => 230,\n  '𐨸' => 230,\n  '𐨹' => 1,\n  '𐨺' => 220,\n  '𐨿' => 9,\n  '𐫥' => 230,\n  '𐫦' => 220,\n  '𐴤' => 230,\n  '𐴥' => 230,\n  '𐴦' => 230,\n  '𐴧' => 230,\n  '𐺫' => 230,\n  '𐺬' => 230,\n  '𐽆' => 220,\n  '𐽇' => 220,\n  '𐽈' => 230,\n  '𐽉' => 230,\n  '𐽊' => 230,\n  '𐽋' => 220,\n  '𐽌' => 230,\n  '𐽍' => 220,\n  '𐽎' => 220,\n  '𐽏' => 220,\n  '𐽐' => 220,\n  '𑁆' => 9,\n  '𑁿' => 9,\n  '𑂹' => 9,\n  '𑂺' => 7,\n  '𑄀' => 230,\n  '𑄁' => 230,\n  '𑄂' => 230,\n  '𑄳' => 9,\n  '𑄴' => 9,\n  '𑅳' => 7,\n  '𑇀' => 9,\n  '𑇊' => 7,\n  '𑈵' => 9,\n  '𑈶' => 7,\n  '𑋩' => 7,\n  '𑋪' => 9,\n  '𑌻' => 7,\n  '𑌼' => 7,\n  '𑍍' => 9,\n  '𑍦' => 230,\n  '𑍧' => 230,\n  '𑍨' => 230,\n  '𑍩' => 230,\n  '𑍪' => 230,\n  '𑍫' => 230,\n  '𑍬' => 230,\n  '𑍰' => 230,\n  '𑍱' => 230,\n  '𑍲' => 230,\n  '𑍳' => 230,\n  '𑍴' => 230,\n  '𑑂' => 9,\n  '𑑆' => 7,\n  '𑑞' => 230,\n  '𑓂' => 9,\n  '𑓃' => 7,\n  '𑖿' => 9,\n  '𑗀' => 7,\n  '𑘿' => 9,\n  '𑚶' => 9,\n  '𑚷' => 7,\n  '𑜫' => 9,\n  '𑠹' => 9,\n  '𑠺' => 7,\n  '𑤽' => 9,\n  '𑤾' => 9,\n  '𑥃' => 7,\n  '𑧠' => 9,\n  '𑨴' => 9,\n  '𑩇' => 9,\n  '𑪙' => 9,\n  '𑰿' => 9,\n  '𑵂' => 7,\n  '𑵄' => 9,\n  '𑵅' => 9,\n  '𑶗' => 9,\n  '𖫰' => 1,\n  '𖫱' => 1,\n  '𖫲' => 1,\n  '𖫳' => 1,\n  '𖫴' => 1,\n  '𖬰' => 230,\n  '𖬱' => 230,\n  '𖬲' => 230,\n  '𖬳' => 230,\n  '𖬴' => 230,\n  '𖬵' => 230,\n  '𖬶' => 230,\n  '𖿰' => 6,\n  '𖿱' => 6,\n  '𛲞' => 1,\n  '𝅥' => 216,\n  '𝅦' => 216,\n  '𝅧' => 1,\n  '𝅨' => 1,\n  '𝅩' => 1,\n  '𝅭' => 226,\n  '𝅮' => 216,\n  '𝅯' => 216,\n  '𝅰' => 216,\n  '𝅱' => 216,\n  '𝅲' => 216,\n  '𝅻' => 220,\n  '𝅼' => 220,\n  '𝅽' => 220,\n  '𝅾' => 220,\n  '𝅿' => 220,\n  '𝆀' => 220,\n  '𝆁' => 220,\n  '𝆂' => 220,\n  '𝆅' => 230,\n  '𝆆' => 230,\n  '𝆇' => 230,\n  '𝆈' => 230,\n  '𝆉' => 230,\n  '𝆊' => 220,\n  '𝆋' => 220,\n  '𝆪' => 230,\n  '𝆫' => 230,\n  '𝆬' => 230,\n  '𝆭' => 230,\n  '𝉂' => 230,\n  '𝉃' => 230,\n  '𝉄' => 230,\n  '𞀀' => 230,\n  '𞀁' => 230,\n  '𞀂' => 230,\n  '𞀃' => 230,\n  '𞀄' => 230,\n  '𞀅' => 230,\n  '𞀆' => 230,\n  '𞀈' => 230,\n  '𞀉' => 230,\n  '𞀊' => 230,\n  '𞀋' => 230,\n  '𞀌' => 230,\n  '𞀍' => 230,\n  '𞀎' => 230,\n  '𞀏' => 230,\n  '𞀐' => 230,\n  '𞀑' => 230,\n  '𞀒' => 230,\n  '𞀓' => 230,\n  '𞀔' => 230,\n  '𞀕' => 230,\n  '𞀖' => 230,\n  '𞀗' => 230,\n  '𞀘' => 230,\n  '𞀛' => 230,\n  '𞀜' => 230,\n  '𞀝' => 230,\n  '𞀞' => 230,\n  '𞀟' => 230,\n  '𞀠' => 230,\n  '𞀡' => 230,\n  '𞀣' => 230,\n  '𞀤' => 230,\n  '𞀦' => 230,\n  '𞀧' => 230,\n  '𞀨' => 230,\n  '𞀩' => 230,\n  '𞀪' => 230,\n  '𞄰' => 230,\n  '𞄱' => 230,\n  '𞄲' => 230,\n  '𞄳' => 230,\n  '𞄴' => 230,\n  '𞄵' => 230,\n  '𞄶' => 230,\n  '𞋬' => 230,\n  '𞋭' => 230,\n  '𞋮' => 230,\n  '𞋯' => 230,\n  '𞣐' => 220,\n  '𞣑' => 220,\n  '𞣒' => 220,\n  '𞣓' => 220,\n  '𞣔' => 220,\n  '𞣕' => 220,\n  '𞣖' => 220,\n  '𞥄' => 230,\n  '𞥅' => 230,\n  '𞥆' => 230,\n  '𞥇' => 230,\n  '𞥈' => 230,\n  '𞥉' => 230,\n  '𞥊' => 7,\n);\n","vendor/symfony/polyfill-intl-normalizer/Resources/unidata/compatibilityDecomposition.php":"<?php\n\nreturn array (\n  ' ' => ' ',\n  '¨' => ' ̈',\n  'ª' => 'a',\n  '¯' => ' ̄',\n  '²' => '2',\n  '³' => '3',\n  '´' => ' ́',\n  'µ' => 'μ',\n  '¸' => ' ̧',\n  '¹' => '1',\n  'º' => 'o',\n  '¼' => '1⁄4',\n  '½' => '1⁄2',\n  '¾' => '3⁄4',\n  'Ĳ' => 'IJ',\n  'ĳ' => 'ij',\n  'Ŀ' => 'L·',\n  'ŀ' => 'l·',\n  'ŉ' => 'ʼn',\n  'ſ' => 's',\n  'Ǆ' => 'DŽ',\n  'ǅ' => 'Dž',\n  'ǆ' => 'dž',\n  'Ǉ' => 'LJ',\n  'ǈ' => 'Lj',\n  'ǉ' => 'lj',\n  'Ǌ' => 'NJ',\n  'ǋ' => 'Nj',\n  'ǌ' => 'nj',\n  'Ǳ' => 'DZ',\n  'ǲ' => 'Dz',\n  'ǳ' => 'dz',\n  'ʰ' => 'h',\n  'ʱ' => 'ɦ',\n  'ʲ' => 'j',\n  'ʳ' => 'r',\n  'ʴ' => 'ɹ',\n  'ʵ' => 'ɻ',\n  'ʶ' => 'ʁ',\n  'ʷ' => 'w',\n  'ʸ' => 'y',\n  '˘' => ' ̆',\n  '˙' => ' ̇',\n  '˚' => ' ̊',\n  '˛' => ' ̨',\n  '˜' => ' ̃',\n  '˝' => ' ̋',\n  'ˠ' => 'ɣ',\n  'ˡ' => 'l',\n  'ˢ' => 's',\n  'ˣ' => 'x',\n  'ˤ' => 'ʕ',\n  'ͺ' => ' ͅ',\n  '΄' => ' ́',\n  '΅' => ' ̈́',\n  'ϐ' => 'β',\n  'ϑ' => 'θ',\n  'ϒ' => 'Υ',\n  'ϓ' => 'Ύ',\n  'ϔ' => 'Ϋ',\n  'ϕ' => 'φ',\n  'ϖ' => 'π',\n  'ϰ' => 'κ',\n  'ϱ' => 'ρ',\n  'ϲ' => 'ς',\n  'ϴ' => 'Θ',\n  'ϵ' => 'ε',\n  'Ϲ' => 'Σ',\n  'և' => 'եւ',\n  'ٵ' => 'اٴ',\n  'ٶ' => 'وٴ',\n  'ٷ' => 'ۇٴ',\n  'ٸ' => 'يٴ',\n  'ำ' => 'ํา',\n  'ຳ' => 'ໍາ',\n  'ໜ' => 'ຫນ',\n  'ໝ' => 'ຫມ',\n  '༌' => '་',\n  'ཷ' => 'ྲཱྀ',\n  'ཹ' => 'ླཱྀ',\n  'ჼ' => 'ნ',\n  'ᴬ' => 'A',\n  'ᴭ' => 'Æ',\n  'ᴮ' => 'B',\n  'ᴰ' => 'D',\n  'ᴱ' => 'E',\n  'ᴲ' => 'Ǝ',\n  'ᴳ' => 'G',\n  'ᴴ' => 'H',\n  'ᴵ' => 'I',\n  'ᴶ' => 'J',\n  'ᴷ' => 'K',\n  'ᴸ' => 'L',\n  'ᴹ' => 'M',\n  'ᴺ' => 'N',\n  'ᴼ' => 'O',\n  'ᴽ' => 'Ȣ',\n  'ᴾ' => 'P',\n  'ᴿ' => 'R',\n  'ᵀ' => 'T',\n  'ᵁ' => 'U',\n  'ᵂ' => 'W',\n  'ᵃ' => 'a',\n  'ᵄ' => 'ɐ',\n  'ᵅ' => 'ɑ',\n  'ᵆ' => 'ᴂ',\n  'ᵇ' => 'b',\n  'ᵈ' => 'd',\n  'ᵉ' => 'e',\n  'ᵊ' => 'ə',\n  'ᵋ' => 'ɛ',\n  'ᵌ' => 'ɜ',\n  'ᵍ' => 'g',\n  'ᵏ' => 'k',\n  'ᵐ' => 'm',\n  'ᵑ' => 'ŋ',\n  'ᵒ' => 'o',\n  'ᵓ' => 'ɔ',\n  'ᵔ' => 'ᴖ',\n  'ᵕ' => 'ᴗ',\n  'ᵖ' => 'p',\n  'ᵗ' => 't',\n  'ᵘ' => 'u',\n  'ᵙ' => 'ᴝ',\n  'ᵚ' => 'ɯ',\n  'ᵛ' => 'v',\n  'ᵜ' => 'ᴥ',\n  'ᵝ' => 'β',\n  'ᵞ' => 'γ',\n  'ᵟ' => 'δ',\n  'ᵠ' => 'φ',\n  'ᵡ' => 'χ',\n  'ᵢ' => 'i',\n  'ᵣ' => 'r',\n  'ᵤ' => 'u',\n  'ᵥ' => 'v',\n  'ᵦ' => 'β',\n  'ᵧ' => 'γ',\n  'ᵨ' => 'ρ',\n  'ᵩ' => 'φ',\n  'ᵪ' => 'χ',\n  'ᵸ' => 'н',\n  'ᶛ' => 'ɒ',\n  'ᶜ' => 'c',\n  'ᶝ' => 'ɕ',\n  'ᶞ' => 'ð',\n  'ᶟ' => 'ɜ',\n  'ᶠ' => 'f',\n  'ᶡ' => 'ɟ',\n  'ᶢ' => 'ɡ',\n  'ᶣ' => 'ɥ',\n  'ᶤ' => 'ɨ',\n  'ᶥ' => 'ɩ',\n  'ᶦ' => 'ɪ',\n  'ᶧ' => 'ᵻ',\n  'ᶨ' => 'ʝ',\n  'ᶩ' => 'ɭ',\n  'ᶪ' => 'ᶅ',\n  'ᶫ' => 'ʟ',\n  'ᶬ' => 'ɱ',\n  'ᶭ' => 'ɰ',\n  'ᶮ' => 'ɲ',\n  'ᶯ' => 'ɳ',\n  'ᶰ' => 'ɴ',\n  'ᶱ' => 'ɵ',\n  'ᶲ' => 'ɸ',\n  'ᶳ' => 'ʂ',\n  'ᶴ' => 'ʃ',\n  'ᶵ' => 'ƫ',\n  'ᶶ' => 'ʉ',\n  'ᶷ' => 'ʊ',\n  'ᶸ' => 'ᴜ',\n  'ᶹ' => 'ʋ',\n  'ᶺ' => 'ʌ',\n  'ᶻ' => 'z',\n  'ᶼ' => 'ʐ',\n  'ᶽ' => 'ʑ',\n  'ᶾ' => 'ʒ',\n  'ᶿ' => 'θ',\n  'ẚ' => 'aʾ',\n  'ẛ' => 'ṡ',\n  '᾽' => ' ̓',\n  '᾿' => ' ̓',\n  '῀' => ' ͂',\n  '῁' => ' ̈͂',\n  '῍' => ' ̓̀',\n  '῎' => ' ̓́',\n  '῏' => ' ̓͂',\n  '῝' => ' ̔̀',\n  '῞' => ' ̔́',\n  '῟' => ' ̔͂',\n  '῭' => ' ̈̀',\n  '΅' => ' ̈́',\n  '´' => ' ́',\n  '῾' => ' ̔',\n  ' ' => ' ',\n  ' ' => ' ',\n  ' ' => ' ',\n  ' ' => ' ',\n  ' ' => ' ',\n  ' ' => ' ',\n  ' ' => ' ',\n  ' ' => ' ',\n  ' ' => ' ',\n  ' ' => ' ',\n  ' ' => ' ',\n  '‑' => '‐',\n  '‗' => ' ̳',\n  '․' => '.',\n  '‥' => '..',\n  '…' => '...',\n  ' ' => ' ',\n  '″' => '′′',\n  '‴' => '′′′',\n  '‶' => '‵‵',\n  '‷' => '‵‵‵',\n  '‼' => '!!',\n  '‾' => ' ̅',\n  '⁇' => '??',\n  '⁈' => '?!',\n  '⁉' => '!?',\n  '⁗' => '′′′′',\n  ' ' => ' ',\n  '⁰' => '0',\n  'ⁱ' => 'i',\n  '⁴' => '4',\n  '⁵' => '5',\n  '⁶' => '6',\n  '⁷' => '7',\n  '⁸' => '8',\n  '⁹' => '9',\n  '⁺' => '+',\n  '⁻' => '−',\n  '⁼' => '=',\n  '⁽' => '(',\n  '⁾' => ')',\n  'ⁿ' => 'n',\n  '₀' => '0',\n  '₁' => '1',\n  '₂' => '2',\n  '₃' => '3',\n  '₄' => '4',\n  '₅' => '5',\n  '₆' => '6',\n  '₇' => '7',\n  '₈' => '8',\n  '₉' => '9',\n  '₊' => '+',\n  '₋' => '−',\n  '₌' => '=',\n  '₍' => '(',\n  '₎' => ')',\n  'ₐ' => 'a',\n  'ₑ' => 'e',\n  'ₒ' => 'o',\n  'ₓ' => 'x',\n  'ₔ' => 'ə',\n  'ₕ' => 'h',\n  'ₖ' => 'k',\n  'ₗ' => 'l',\n  'ₘ' => 'm',\n  'ₙ' => 'n',\n  'ₚ' => 'p',\n  'ₛ' => 's',\n  'ₜ' => 't',\n  '₨' => 'Rs',\n  '℀' => 'a/c',\n  '℁' => 'a/s',\n  'ℂ' => 'C',\n  '℃' => '°C',\n  '℅' => 'c/o',\n  '℆' => 'c/u',\n  'ℇ' => 'Ɛ',\n  '℉' => '°F',\n  'ℊ' => 'g',\n  'ℋ' => 'H',\n  'ℌ' => 'H',\n  'ℍ' => 'H',\n  'ℎ' => 'h',\n  'ℏ' => 'ħ',\n  'ℐ' => 'I',\n  'ℑ' => 'I',\n  'ℒ' => 'L',\n  'ℓ' => 'l',\n  'ℕ' => 'N',\n  '№' => 'No',\n  'ℙ' => 'P',\n  'ℚ' => 'Q',\n  'ℛ' => 'R',\n  'ℜ' => 'R',\n  'ℝ' => 'R',\n  '℠' => 'SM',\n  '℡' => 'TEL',\n  '™' => 'TM',\n  'ℤ' => 'Z',\n  'ℨ' => 'Z',\n  'ℬ' => 'B',\n  'ℭ' => 'C',\n  'ℯ' => 'e',\n  'ℰ' => 'E',\n  'ℱ' => 'F',\n  'ℳ' => 'M',\n  'ℴ' => 'o',\n  'ℵ' => 'א',\n  'ℶ' => 'ב',\n  'ℷ' => 'ג',\n  'ℸ' => 'ד',\n  'ℹ' => 'i',\n  '℻' => 'FAX',\n  'ℼ' => 'π',\n  'ℽ' => 'γ',\n  'ℾ' => 'Γ',\n  'ℿ' => 'Π',\n  '⅀' => '∑',\n  'ⅅ' => 'D',\n  'ⅆ' => 'd',\n  'ⅇ' => 'e',\n  'ⅈ' => 'i',\n  'ⅉ' => 'j',\n  '⅐' => '1⁄7',\n  '⅑' => '1⁄9',\n  '⅒' => '1⁄10',\n  '⅓' => '1⁄3',\n  '⅔' => '2⁄3',\n  '⅕' => '1⁄5',\n  '⅖' => '2⁄5',\n  '⅗' => '3⁄5',\n  '⅘' => '4⁄5',\n  '⅙' => '1⁄6',\n  '⅚' => '5⁄6',\n  '⅛' => '1⁄8',\n  '⅜' => '3⁄8',\n  '⅝' => '5⁄8',\n  '⅞' => '7⁄8',\n  '⅟' => '1⁄',\n  'Ⅰ' => 'I',\n  'Ⅱ' => 'II',\n  'Ⅲ' => 'III',\n  'Ⅳ' => 'IV',\n  'Ⅴ' => 'V',\n  'Ⅵ' => 'VI',\n  'Ⅶ' => 'VII',\n  'Ⅷ' => 'VIII',\n  'Ⅸ' => 'IX',\n  'Ⅹ' => 'X',\n  'Ⅺ' => 'XI',\n  'Ⅻ' => 'XII',\n  'Ⅼ' => 'L',\n  'Ⅽ' => 'C',\n  'Ⅾ' => 'D',\n  'Ⅿ' => 'M',\n  'ⅰ' => 'i',\n  'ⅱ' => 'ii',\n  'ⅲ' => 'iii',\n  'ⅳ' => 'iv',\n  'ⅴ' => 'v',\n  'ⅵ' => 'vi',\n  'ⅶ' => 'vii',\n  'ⅷ' => 'viii',\n  'ⅸ' => 'ix',\n  'ⅹ' => 'x',\n  'ⅺ' => 'xi',\n  'ⅻ' => 'xii',\n  'ⅼ' => 'l',\n  'ⅽ' => 'c',\n  'ⅾ' => 'd',\n  'ⅿ' => 'm',\n  '↉' => '0⁄3',\n  '∬' => '∫∫',\n  '∭' => '∫∫∫',\n  '∯' => '∮∮',\n  '∰' => '∮∮∮',\n  '①' => '1',\n  '②' => '2',\n  '③' => '3',\n  '④' => '4',\n  '⑤' => '5',\n  '⑥' => '6',\n  '⑦' => '7',\n  '⑧' => '8',\n  '⑨' => '9',\n  '⑩' => '10',\n  '⑪' => '11',\n  '⑫' => '12',\n  '⑬' => '13',\n  '⑭' => '14',\n  '⑮' => '15',\n  '⑯' => '16',\n  '⑰' => '17',\n  '⑱' => '18',\n  '⑲' => '19',\n  '⑳' => '20',\n  '⑴' => '(1)',\n  '⑵' => '(2)',\n  '⑶' => '(3)',\n  '⑷' => '(4)',\n  '⑸' => '(5)',\n  '⑹' => '(6)',\n  '⑺' => '(7)',\n  '⑻' => '(8)',\n  '⑼' => '(9)',\n  '⑽' => '(10)',\n  '⑾' => '(11)',\n  '⑿' => '(12)',\n  '⒀' => '(13)',\n  '⒁' => '(14)',\n  '⒂' => '(15)',\n  '⒃' => '(16)',\n  '⒄' => '(17)',\n  '⒅' => '(18)',\n  '⒆' => '(19)',\n  '⒇' => '(20)',\n  '⒈' => '1.',\n  '⒉' => '2.',\n  '⒊' => '3.',\n  '⒋' => '4.',\n  '⒌' => '5.',\n  '⒍' => '6.',\n  '⒎' => '7.',\n  '⒏' => '8.',\n  '⒐' => '9.',\n  '⒑' => '10.',\n  '⒒' => '11.',\n  '⒓' => '12.',\n  '⒔' => '13.',\n  '⒕' => '14.',\n  '⒖' => '15.',\n  '⒗' => '16.',\n  '⒘' => '17.',\n  '⒙' => '18.',\n  '⒚' => '19.',\n  '⒛' => '20.',\n  '⒜' => '(a)',\n  '⒝' => '(b)',\n  '⒞' => '(c)',\n  '⒟' => '(d)',\n  '⒠' => '(e)',\n  '⒡' => '(f)',\n  '⒢' => '(g)',\n  '⒣' => '(h)',\n  '⒤' => '(i)',\n  '⒥' => '(j)',\n  '⒦' => '(k)',\n  '⒧' => '(l)',\n  '⒨' => '(m)',\n  '⒩' => '(n)',\n  '⒪' => '(o)',\n  '⒫' => '(p)',\n  '⒬' => '(q)',\n  '⒭' => '(r)',\n  '⒮' => '(s)',\n  '⒯' => '(t)',\n  '⒰' => '(u)',\n  '⒱' => '(v)',\n  '⒲' => '(w)',\n  '⒳' => '(x)',\n  '⒴' => '(y)',\n  '⒵' => '(z)',\n  'Ⓐ' => 'A',\n  'Ⓑ' => 'B',\n  'Ⓒ' => 'C',\n  'Ⓓ' => 'D',\n  'Ⓔ' => 'E',\n  'Ⓕ' => 'F',\n  'Ⓖ' => 'G',\n  'Ⓗ' => 'H',\n  'Ⓘ' => 'I',\n  'Ⓙ' => 'J',\n  'Ⓚ' => 'K',\n  'Ⓛ' => 'L',\n  'Ⓜ' => 'M',\n  'Ⓝ' => 'N',\n  'Ⓞ' => 'O',\n  'Ⓟ' => 'P',\n  'Ⓠ' => 'Q',\n  'Ⓡ' => 'R',\n  'Ⓢ' => 'S',\n  'Ⓣ' => 'T',\n  'Ⓤ' => 'U',\n  'Ⓥ' => 'V',\n  'Ⓦ' => 'W',\n  'Ⓧ' => 'X',\n  'Ⓨ' => 'Y',\n  'Ⓩ' => 'Z',\n  'ⓐ' => 'a',\n  'ⓑ' => 'b',\n  'ⓒ' => 'c',\n  'ⓓ' => 'd',\n  'ⓔ' => 'e',\n  'ⓕ' => 'f',\n  'ⓖ' => 'g',\n  'ⓗ' => 'h',\n  'ⓘ' => 'i',\n  'ⓙ' => 'j',\n  'ⓚ' => 'k',\n  'ⓛ' => 'l',\n  'ⓜ' => 'm',\n  'ⓝ' => 'n',\n  'ⓞ' => 'o',\n  'ⓟ' => 'p',\n  'ⓠ' => 'q',\n  'ⓡ' => 'r',\n  'ⓢ' => 's',\n  'ⓣ' => 't',\n  'ⓤ' => 'u',\n  'ⓥ' => 'v',\n  'ⓦ' => 'w',\n  'ⓧ' => 'x',\n  'ⓨ' => 'y',\n  'ⓩ' => 'z',\n  '⓪' => '0',\n  '⨌' => '∫∫∫∫',\n  '⩴' => '::=',\n  '⩵' => '==',\n  '⩶' => '===',\n  'ⱼ' => 'j',\n  'ⱽ' => 'V',\n  'ⵯ' => 'ⵡ',\n  '⺟' => '母',\n  '⻳' => '龟',\n  '⼀' => '一',\n  '⼁' => '丨',\n  '⼂' => '丶',\n  '⼃' => '丿',\n  '⼄' => '乙',\n  '⼅' => '亅',\n  '⼆' => '二',\n  '⼇' => '亠',\n  '⼈' => '人',\n  '⼉' => '儿',\n  '⼊' => '入',\n  '⼋' => '八',\n  '⼌' => '冂',\n  '⼍' => '冖',\n  '⼎' => '冫',\n  '⼏' => '几',\n  '⼐' => '凵',\n  '⼑' => '刀',\n  '⼒' => '力',\n  '⼓' => '勹',\n  '⼔' => '匕',\n  '⼕' => '匚',\n  '⼖' => '匸',\n  '⼗' => '十',\n  '⼘' => '卜',\n  '⼙' => '卩',\n  '⼚' => '厂',\n  '⼛' => '厶',\n  '⼜' => '又',\n  '⼝' => '口',\n  '⼞' => '囗',\n  '⼟' => '土',\n  '⼠' => '士',\n  '⼡' => '夂',\n  '⼢' => '夊',\n  '⼣' => '夕',\n  '⼤' => '大',\n  '⼥' => '女',\n  '⼦' => '子',\n  '⼧' => '宀',\n  '⼨' => '寸',\n  '⼩' => '小',\n  '⼪' => '尢',\n  '⼫' => '尸',\n  '⼬' => '屮',\n  '⼭' => '山',\n  '⼮' => '巛',\n  '⼯' => '工',\n  '⼰' => '己',\n  '⼱' => '巾',\n  '⼲' => '干',\n  '⼳' => '幺',\n  '⼴' => '广',\n  '⼵' => '廴',\n  '⼶' => '廾',\n  '⼷' => '弋',\n  '⼸' => '弓',\n  '⼹' => '彐',\n  '⼺' => '彡',\n  '⼻' => '彳',\n  '⼼' => '心',\n  '⼽' => '戈',\n  '⼾' => '戶',\n  '⼿' => '手',\n  '⽀' => '支',\n  '⽁' => '攴',\n  '⽂' => '文',\n  '⽃' => '斗',\n  '⽄' => '斤',\n  '⽅' => '方',\n  '⽆' => '无',\n  '⽇' => '日',\n  '⽈' => '曰',\n  '⽉' => '月',\n  '⽊' => '木',\n  '⽋' => '欠',\n  '⽌' => '止',\n  '⽍' => '歹',\n  '⽎' => '殳',\n  '⽏' => '毋',\n  '⽐' => '比',\n  '⽑' => '毛',\n  '⽒' => '氏',\n  '⽓' => '气',\n  '⽔' => '水',\n  '⽕' => '火',\n  '⽖' => '爪',\n  '⽗' => '父',\n  '⽘' => '爻',\n  '⽙' => '爿',\n  '⽚' => '片',\n  '⽛' => '牙',\n  '⽜' => '牛',\n  '⽝' => '犬',\n  '⽞' => '玄',\n  '⽟' => '玉',\n  '⽠' => '瓜',\n  '⽡' => '瓦',\n  '⽢' => '甘',\n  '⽣' => '生',\n  '⽤' => '用',\n  '⽥' => '田',\n  '⽦' => '疋',\n  '⽧' => '疒',\n  '⽨' => '癶',\n  '⽩' => '白',\n  '⽪' => '皮',\n  '⽫' => '皿',\n  '⽬' => '目',\n  '⽭' => '矛',\n  '⽮' => '矢',\n  '⽯' => '石',\n  '⽰' => '示',\n  '⽱' => '禸',\n  '⽲' => '禾',\n  '⽳' => '穴',\n  '⽴' => '立',\n  '⽵' => '竹',\n  '⽶' => '米',\n  '⽷' => '糸',\n  '⽸' => '缶',\n  '⽹' => '网',\n  '⽺' => '羊',\n  '⽻' => '羽',\n  '⽼' => '老',\n  '⽽' => '而',\n  '⽾' => '耒',\n  '⽿' => '耳',\n  '⾀' => '聿',\n  '⾁' => '肉',\n  '⾂' => '臣',\n  '⾃' => '自',\n  '⾄' => '至',\n  '⾅' => '臼',\n  '⾆' => '舌',\n  '⾇' => '舛',\n  '⾈' => '舟',\n  '⾉' => '艮',\n  '⾊' => '色',\n  '⾋' => '艸',\n  '⾌' => '虍',\n  '⾍' => '虫',\n  '⾎' => '血',\n  '⾏' => '行',\n  '⾐' => '衣',\n  '⾑' => '襾',\n  '⾒' => '見',\n  '⾓' => '角',\n  '⾔' => '言',\n  '⾕' => '谷',\n  '⾖' => '豆',\n  '⾗' => '豕',\n  '⾘' => '豸',\n  '⾙' => '貝',\n  '⾚' => '赤',\n  '⾛' => '走',\n  '⾜' => '足',\n  '⾝' => '身',\n  '⾞' => '車',\n  '⾟' => '辛',\n  '⾠' => '辰',\n  '⾡' => '辵',\n  '⾢' => '邑',\n  '⾣' => '酉',\n  '⾤' => '釆',\n  '⾥' => '里',\n  '⾦' => '金',\n  '⾧' => '長',\n  '⾨' => '門',\n  '⾩' => '阜',\n  '⾪' => '隶',\n  '⾫' => '隹',\n  '⾬' => '雨',\n  '⾭' => '靑',\n  '⾮' => '非',\n  '⾯' => '面',\n  '⾰' => '革',\n  '⾱' => '韋',\n  '⾲' => '韭',\n  '⾳' => '音',\n  '⾴' => '頁',\n  '⾵' => '風',\n  '⾶' => '飛',\n  '⾷' => '食',\n  '⾸' => '首',\n  '⾹' => '香',\n  '⾺' => '馬',\n  '⾻' => '骨',\n  '⾼' => '高',\n  '⾽' => '髟',\n  '⾾' => '鬥',\n  '⾿' => '鬯',\n  '⿀' => '鬲',\n  '⿁' => '鬼',\n  '⿂' => '魚',\n  '⿃' => '鳥',\n  '⿄' => '鹵',\n  '⿅' => '鹿',\n  '⿆' => '麥',\n  '⿇' => '麻',\n  '⿈' => '黃',\n  '⿉' => '黍',\n  '⿊' => '黑',\n  '⿋' => '黹',\n  '⿌' => '黽',\n  '⿍' => '鼎',\n  '⿎' => '鼓',\n  '⿏' => '鼠',\n  '⿐' => '鼻',\n  '⿑' => '齊',\n  '⿒' => '齒',\n  '⿓' => '龍',\n  '⿔' => '龜',\n  '⿕' => '龠',\n  '　' => ' ',\n  '〶' => '〒',\n  '〸' => '十',\n  '〹' => '卄',\n  '〺' => '卅',\n  '゛' => ' ゙',\n  '゜' => ' ゚',\n  'ゟ' => 'より',\n  'ヿ' => 'コト',\n  'ㄱ' => 'ᄀ',\n  'ㄲ' => 'ᄁ',\n  'ㄳ' => 'ᆪ',\n  'ㄴ' => 'ᄂ',\n  'ㄵ' => 'ᆬ',\n  'ㄶ' => 'ᆭ',\n  'ㄷ' => 'ᄃ',\n  'ㄸ' => 'ᄄ',\n  'ㄹ' => 'ᄅ',\n  'ㄺ' => 'ᆰ',\n  'ㄻ' => 'ᆱ',\n  'ㄼ' => 'ᆲ',\n  'ㄽ' => 'ᆳ',\n  'ㄾ' => 'ᆴ',\n  'ㄿ' => 'ᆵ',\n  'ㅀ' => 'ᄚ',\n  'ㅁ' => 'ᄆ',\n  'ㅂ' => 'ᄇ',\n  'ㅃ' => 'ᄈ',\n  'ㅄ' => 'ᄡ',\n  'ㅅ' => 'ᄉ',\n  'ㅆ' => 'ᄊ',\n  'ㅇ' => 'ᄋ',\n  'ㅈ' => 'ᄌ',\n  'ㅉ' => 'ᄍ',\n  'ㅊ' => 'ᄎ',\n  'ㅋ' => 'ᄏ',\n  'ㅌ' => 'ᄐ',\n  'ㅍ' => 'ᄑ',\n  'ㅎ' => 'ᄒ',\n  'ㅏ' => 'ᅡ',\n  'ㅐ' => 'ᅢ',\n  'ㅑ' => 'ᅣ',\n  'ㅒ' => 'ᅤ',\n  'ㅓ' => 'ᅥ',\n  'ㅔ' => 'ᅦ',\n  'ㅕ' => 'ᅧ',\n  'ㅖ' => 'ᅨ',\n  'ㅗ' => 'ᅩ',\n  'ㅘ' => 'ᅪ',\n  'ㅙ' => 'ᅫ',\n  'ㅚ' => 'ᅬ',\n  'ㅛ' => 'ᅭ',\n  'ㅜ' => 'ᅮ',\n  'ㅝ' => 'ᅯ',\n  'ㅞ' => 'ᅰ',\n  'ㅟ' => 'ᅱ',\n  'ㅠ' => 'ᅲ',\n  'ㅡ' => 'ᅳ',\n  'ㅢ' => 'ᅴ',\n  'ㅣ' => 'ᅵ',\n  'ㅤ' => 'ᅠ',\n  'ㅥ' => 'ᄔ',\n  'ㅦ' => 'ᄕ',\n  'ㅧ' => 'ᇇ',\n  'ㅨ' => 'ᇈ',\n  'ㅩ' => 'ᇌ',\n  'ㅪ' => 'ᇎ',\n  'ㅫ' => 'ᇓ',\n  'ㅬ' => 'ᇗ',\n  'ㅭ' => 'ᇙ',\n  'ㅮ' => 'ᄜ',\n  'ㅯ' => 'ᇝ',\n  'ㅰ' => 'ᇟ',\n  'ㅱ' => 'ᄝ',\n  'ㅲ' => 'ᄞ',\n  'ㅳ' => 'ᄠ',\n  'ㅴ' => 'ᄢ',\n  'ㅵ' => 'ᄣ',\n  'ㅶ' => 'ᄧ',\n  'ㅷ' => 'ᄩ',\n  'ㅸ' => 'ᄫ',\n  'ㅹ' => 'ᄬ',\n  'ㅺ' => 'ᄭ',\n  'ㅻ' => 'ᄮ',\n  'ㅼ' => 'ᄯ',\n  'ㅽ' => 'ᄲ',\n  'ㅾ' => 'ᄶ',\n  'ㅿ' => 'ᅀ',\n  'ㆀ' => 'ᅇ',\n  'ㆁ' => 'ᅌ',\n  'ㆂ' => 'ᇱ',\n  'ㆃ' => 'ᇲ',\n  'ㆄ' => 'ᅗ',\n  'ㆅ' => 'ᅘ',\n  'ㆆ' => 'ᅙ',\n  'ㆇ' => 'ᆄ',\n  'ㆈ' => 'ᆅ',\n  'ㆉ' => 'ᆈ',\n  'ㆊ' => 'ᆑ',\n  'ㆋ' => 'ᆒ',\n  'ㆌ' => 'ᆔ',\n  'ㆍ' => 'ᆞ',\n  'ㆎ' => 'ᆡ',\n  '㆒' => '一',\n  '㆓' => '二',\n  '㆔' => '三',\n  '㆕' => '四',\n  '㆖' => '上',\n  '㆗' => '中',\n  '㆘' => '下',\n  '㆙' => '甲',\n  '㆚' => '乙',\n  '㆛' => '丙',\n  '㆜' => '丁',\n  '㆝' => '天',\n  '㆞' => '地',\n  '㆟' => '人',\n  '㈀' => '(ᄀ)',\n  '㈁' => '(ᄂ)',\n  '㈂' => '(ᄃ)',\n  '㈃' => '(ᄅ)',\n  '㈄' => '(ᄆ)',\n  '㈅' => '(ᄇ)',\n  '㈆' => '(ᄉ)',\n  '㈇' => '(ᄋ)',\n  '㈈' => '(ᄌ)',\n  '㈉' => '(ᄎ)',\n  '㈊' => '(ᄏ)',\n  '㈋' => '(ᄐ)',\n  '㈌' => '(ᄑ)',\n  '㈍' => '(ᄒ)',\n  '㈎' => '(가)',\n  '㈏' => '(나)',\n  '㈐' => '(다)',\n  '㈑' => '(라)',\n  '㈒' => '(마)',\n  '㈓' => '(바)',\n  '㈔' => '(사)',\n  '㈕' => '(아)',\n  '㈖' => '(자)',\n  '㈗' => '(차)',\n  '㈘' => '(카)',\n  '㈙' => '(타)',\n  '㈚' => '(파)',\n  '㈛' => '(하)',\n  '㈜' => '(주)',\n  '㈝' => '(오전)',\n  '㈞' => '(오후)',\n  '㈠' => '(一)',\n  '㈡' => '(二)',\n  '㈢' => '(三)',\n  '㈣' => '(四)',\n  '㈤' => '(五)',\n  '㈥' => '(六)',\n  '㈦' => '(七)',\n  '㈧' => '(八)',\n  '㈨' => '(九)',\n  '㈩' => '(十)',\n  '㈪' => '(月)',\n  '㈫' => '(火)',\n  '㈬' => '(水)',\n  '㈭' => '(木)',\n  '㈮' => '(金)',\n  '㈯' => '(土)',\n  '㈰' => '(日)',\n  '㈱' => '(株)',\n  '㈲' => '(有)',\n  '㈳' => '(社)',\n  '㈴' => '(名)',\n  '㈵' => '(特)',\n  '㈶' => '(財)',\n  '㈷' => '(祝)',\n  '㈸' => '(労)',\n  '㈹' => '(代)',\n  '㈺' => '(呼)',\n  '㈻' => '(学)',\n  '㈼' => '(監)',\n  '㈽' => '(企)',\n  '㈾' => '(資)',\n  '㈿' => '(協)',\n  '㉀' => '(祭)',\n  '㉁' => '(休)',\n  '㉂' => '(自)',\n  '㉃' => '(至)',\n  '㉄' => '問',\n  '㉅' => '幼',\n  '㉆' => '文',\n  '㉇' => '箏',\n  '㉐' => 'PTE',\n  '㉑' => '21',\n  '㉒' => '22',\n  '㉓' => '23',\n  '㉔' => '24',\n  '㉕' => '25',\n  '㉖' => '26',\n  '㉗' => '27',\n  '㉘' => '28',\n  '㉙' => '29',\n  '㉚' => '30',\n  '㉛' => '31',\n  '㉜' => '32',\n  '㉝' => '33',\n  '㉞' => '34',\n  '㉟' => '35',\n  '㉠' => 'ᄀ',\n  '㉡' => 'ᄂ',\n  '㉢' => 'ᄃ',\n  '㉣' => 'ᄅ',\n  '㉤' => 'ᄆ',\n  '㉥' => 'ᄇ',\n  '㉦' => 'ᄉ',\n  '㉧' => 'ᄋ',\n  '㉨' => 'ᄌ',\n  '㉩' => 'ᄎ',\n  '㉪' => 'ᄏ',\n  '㉫' => 'ᄐ',\n  '㉬' => 'ᄑ',\n  '㉭' => 'ᄒ',\n  '㉮' => '가',\n  '㉯' => '나',\n  '㉰' => '다',\n  '㉱' => '라',\n  '㉲' => '마',\n  '㉳' => '바',\n  '㉴' => '사',\n  '㉵' => '아',\n  '㉶' => '자',\n  '㉷' => '차',\n  '㉸' => '카',\n  '㉹' => '타',\n  '㉺' => '파',\n  '㉻' => '하',\n  '㉼' => '참고',\n  '㉽' => '주의',\n  '㉾' => '우',\n  '㊀' => '一',\n  '㊁' => '二',\n  '㊂' => '三',\n  '㊃' => '四',\n  '㊄' => '五',\n  '㊅' => '六',\n  '㊆' => '七',\n  '㊇' => '八',\n  '㊈' => '九',\n  '㊉' => '十',\n  '㊊' => '月',\n  '㊋' => '火',\n  '㊌' => '水',\n  '㊍' => '木',\n  '㊎' => '金',\n  '㊏' => '土',\n  '㊐' => '日',\n  '㊑' => '株',\n  '㊒' => '有',\n  '㊓' => '社',\n  '㊔' => '名',\n  '㊕' => '特',\n  '㊖' => '財',\n  '㊗' => '祝',\n  '㊘' => '労',\n  '㊙' => '秘',\n  '㊚' => '男',\n  '㊛' => '女',\n  '㊜' => '適',\n  '㊝' => '優',\n  '㊞' => '印',\n  '㊟' => '注',\n  '㊠' => '項',\n  '㊡' => '休',\n  '㊢' => '写',\n  '㊣' => '正',\n  '㊤' => '上',\n  '㊥' => '中',\n  '㊦' => '下',\n  '㊧' => '左',\n  '㊨' => '右',\n  '㊩' => '医',\n  '㊪' => '宗',\n  '㊫' => '学',\n  '㊬' => '監',\n  '㊭' => '企',\n  '㊮' => '資',\n  '㊯' => '協',\n  '㊰' => '夜',\n  '㊱' => '36',\n  '㊲' => '37',\n  '㊳' => '38',\n  '㊴' => '39',\n  '㊵' => '40',\n  '㊶' => '41',\n  '㊷' => '42',\n  '㊸' => '43',\n  '㊹' => '44',\n  '㊺' => '45',\n  '㊻' => '46',\n  '㊼' => '47',\n  '㊽' => '48',\n  '㊾' => '49',\n  '㊿' => '50',\n  '㋀' => '1月',\n  '㋁' => '2月',\n  '㋂' => '3月',\n  '㋃' => '4月',\n  '㋄' => '5月',\n  '㋅' => '6月',\n  '㋆' => '7月',\n  '㋇' => '8月',\n  '㋈' => '9月',\n  '㋉' => '10月',\n  '㋊' => '11月',\n  '㋋' => '12月',\n  '㋌' => 'Hg',\n  '㋍' => 'erg',\n  '㋎' => 'eV',\n  '㋏' => 'LTD',\n  '㋐' => 'ア',\n  '㋑' => 'イ',\n  '㋒' => 'ウ',\n  '㋓' => 'エ',\n  '㋔' => 'オ',\n  '㋕' => 'カ',\n  '㋖' => 'キ',\n  '㋗' => 'ク',\n  '㋘' => 'ケ',\n  '㋙' => 'コ',\n  '㋚' => 'サ',\n  '㋛' => 'シ',\n  '㋜' => 'ス',\n  '㋝' => 'セ',\n  '㋞' => 'ソ',\n  '㋟' => 'タ',\n  '㋠' => 'チ',\n  '㋡' => 'ツ',\n  '㋢' => 'テ',\n  '㋣' => 'ト',\n  '㋤' => 'ナ',\n  '㋥' => 'ニ',\n  '㋦' => 'ヌ',\n  '㋧' => 'ネ',\n  '㋨' => 'ノ',\n  '㋩' => 'ハ',\n  '㋪' => 'ヒ',\n  '㋫' => 'フ',\n  '㋬' => 'ヘ',\n  '㋭' => 'ホ',\n  '㋮' => 'マ',\n  '㋯' => 'ミ',\n  '㋰' => 'ム',\n  '㋱' => 'メ',\n  '㋲' => 'モ',\n  '㋳' => 'ヤ',\n  '㋴' => 'ユ',\n  '㋵' => 'ヨ',\n  '㋶' => 'ラ',\n  '㋷' => 'リ',\n  '㋸' => 'ル',\n  '㋹' => 'レ',\n  '㋺' => 'ロ',\n  '㋻' => 'ワ',\n  '㋼' => 'ヰ',\n  '㋽' => 'ヱ',\n  '㋾' => 'ヲ',\n  '㋿' => '令和',\n  '㌀' => 'アパート',\n  '㌁' => 'アルファ',\n  '㌂' => 'アンペア',\n  '㌃' => 'アール',\n  '㌄' => 'イニング',\n  '㌅' => 'インチ',\n  '㌆' => 'ウォン',\n  '㌇' => 'エスクード',\n  '㌈' => 'エーカー',\n  '㌉' => 'オンス',\n  '㌊' => 'オーム',\n  '㌋' => 'カイリ',\n  '㌌' => 'カラット',\n  '㌍' => 'カロリー',\n  '㌎' => 'ガロン',\n  '㌏' => 'ガンマ',\n  '㌐' => 'ギガ',\n  '㌑' => 'ギニー',\n  '㌒' => 'キュリー',\n  '㌓' => 'ギルダー',\n  '㌔' => 'キロ',\n  '㌕' => 'キログラム',\n  '㌖' => 'キロメートル',\n  '㌗' => 'キロワット',\n  '㌘' => 'グラム',\n  '㌙' => 'グラムトン',\n  '㌚' => 'クルゼイロ',\n  '㌛' => 'クローネ',\n  '㌜' => 'ケース',\n  '㌝' => 'コルナ',\n  '㌞' => 'コーポ',\n  '㌟' => 'サイクル',\n  '㌠' => 'サンチーム',\n  '㌡' => 'シリング',\n  '㌢' => 'センチ',\n  '㌣' => 'セント',\n  '㌤' => 'ダース',\n  '㌥' => 'デシ',\n  '㌦' => 'ドル',\n  '㌧' => 'トン',\n  '㌨' => 'ナノ',\n  '㌩' => 'ノット',\n  '㌪' => 'ハイツ',\n  '㌫' => 'パーセント',\n  '㌬' => 'パーツ',\n  '㌭' => 'バーレル',\n  '㌮' => 'ピアストル',\n  '㌯' => 'ピクル',\n  '㌰' => 'ピコ',\n  '㌱' => 'ビル',\n  '㌲' => 'ファラッド',\n  '㌳' => 'フィート',\n  '㌴' => 'ブッシェル',\n  '㌵' => 'フラン',\n  '㌶' => 'ヘクタール',\n  '㌷' => 'ペソ',\n  '㌸' => 'ペニヒ',\n  '㌹' => 'ヘルツ',\n  '㌺' => 'ペンス',\n  '㌻' => 'ページ',\n  '㌼' => 'ベータ',\n  '㌽' => 'ポイント',\n  '㌾' => 'ボルト',\n  '㌿' => 'ホン',\n  '㍀' => 'ポンド',\n  '㍁' => 'ホール',\n  '㍂' => 'ホーン',\n  '㍃' => 'マイクロ',\n  '㍄' => 'マイル',\n  '㍅' => 'マッハ',\n  '㍆' => 'マルク',\n  '㍇' => 'マンション',\n  '㍈' => 'ミクロン',\n  '㍉' => 'ミリ',\n  '㍊' => 'ミリバール',\n  '㍋' => 'メガ',\n  '㍌' => 'メガトン',\n  '㍍' => 'メートル',\n  '㍎' => 'ヤード',\n  '㍏' => 'ヤール',\n  '㍐' => 'ユアン',\n  '㍑' => 'リットル',\n  '㍒' => 'リラ',\n  '㍓' => 'ルピー',\n  '㍔' => 'ルーブル',\n  '㍕' => 'レム',\n  '㍖' => 'レントゲン',\n  '㍗' => 'ワット',\n  '㍘' => '0点',\n  '㍙' => '1点',\n  '㍚' => '2点',\n  '㍛' => '3点',\n  '㍜' => '4点',\n  '㍝' => '5点',\n  '㍞' => '6点',\n  '㍟' => '7点',\n  '㍠' => '8点',\n  '㍡' => '9点',\n  '㍢' => '10点',\n  '㍣' => '11点',\n  '㍤' => '12点',\n  '㍥' => '13点',\n  '㍦' => '14点',\n  '㍧' => '15点',\n  '㍨' => '16点',\n  '㍩' => '17点',\n  '㍪' => '18点',\n  '㍫' => '19点',\n  '㍬' => '20点',\n  '㍭' => '21点',\n  '㍮' => '22点',\n  '㍯' => '23点',\n  '㍰' => '24点',\n  '㍱' => 'hPa',\n  '㍲' => 'da',\n  '㍳' => 'AU',\n  '㍴' => 'bar',\n  '㍵' => 'oV',\n  '㍶' => 'pc',\n  '㍷' => 'dm',\n  '㍸' => 'dm2',\n  '㍹' => 'dm3',\n  '㍺' => 'IU',\n  '㍻' => '平成',\n  '㍼' => '昭和',\n  '㍽' => '大正',\n  '㍾' => '明治',\n  '㍿' => '株式会社',\n  '㎀' => 'pA',\n  '㎁' => 'nA',\n  '㎂' => 'μA',\n  '㎃' => 'mA',\n  '㎄' => 'kA',\n  '㎅' => 'KB',\n  '㎆' => 'MB',\n  '㎇' => 'GB',\n  '㎈' => 'cal',\n  '㎉' => 'kcal',\n  '㎊' => 'pF',\n  '㎋' => 'nF',\n  '㎌' => 'μF',\n  '㎍' => 'μg',\n  '㎎' => 'mg',\n  '㎏' => 'kg',\n  '㎐' => 'Hz',\n  '㎑' => 'kHz',\n  '㎒' => 'MHz',\n  '㎓' => 'GHz',\n  '㎔' => 'THz',\n  '㎕' => 'μl',\n  '㎖' => 'ml',\n  '㎗' => 'dl',\n  '㎘' => 'kl',\n  '㎙' => 'fm',\n  '㎚' => 'nm',\n  '㎛' => 'μm',\n  '㎜' => 'mm',\n  '㎝' => 'cm',\n  '㎞' => 'km',\n  '㎟' => 'mm2',\n  '㎠' => 'cm2',\n  '㎡' => 'm2',\n  '㎢' => 'km2',\n  '㎣' => 'mm3',\n  '㎤' => 'cm3',\n  '㎥' => 'm3',\n  '㎦' => 'km3',\n  '㎧' => 'm∕s',\n  '㎨' => 'm∕s2',\n  '㎩' => 'Pa',\n  '㎪' => 'kPa',\n  '㎫' => 'MPa',\n  '㎬' => 'GPa',\n  '㎭' => 'rad',\n  '㎮' => 'rad∕s',\n  '㎯' => 'rad∕s2',\n  '㎰' => 'ps',\n  '㎱' => 'ns',\n  '㎲' => 'μs',\n  '㎳' => 'ms',\n  '㎴' => 'pV',\n  '㎵' => 'nV',\n  '㎶' => 'μV',\n  '㎷' => 'mV',\n  '㎸' => 'kV',\n  '㎹' => 'MV',\n  '㎺' => 'pW',\n  '㎻' => 'nW',\n  '㎼' => 'μW',\n  '㎽' => 'mW',\n  '㎾' => 'kW',\n  '㎿' => 'MW',\n  '㏀' => 'kΩ',\n  '㏁' => 'MΩ',\n  '㏂' => 'a.m.',\n  '㏃' => 'Bq',\n  '㏄' => 'cc',\n  '㏅' => 'cd',\n  '㏆' => 'C∕kg',\n  '㏇' => 'Co.',\n  '㏈' => 'dB',\n  '㏉' => 'Gy',\n  '㏊' => 'ha',\n  '㏋' => 'HP',\n  '㏌' => 'in',\n  '㏍' => 'KK',\n  '㏎' => 'KM',\n  '㏏' => 'kt',\n  '㏐' => 'lm',\n  '㏑' => 'ln',\n  '㏒' => 'log',\n  '㏓' => 'lx',\n  '㏔' => 'mb',\n  '㏕' => 'mil',\n  '㏖' => 'mol',\n  '㏗' => 'PH',\n  '㏘' => 'p.m.',\n  '㏙' => 'PPM',\n  '㏚' => 'PR',\n  '㏛' => 'sr',\n  '㏜' => 'Sv',\n  '㏝' => 'Wb',\n  '㏞' => 'V∕m',\n  '㏟' => 'A∕m',\n  '㏠' => '1日',\n  '㏡' => '2日',\n  '㏢' => '3日',\n  '㏣' => '4日',\n  '㏤' => '5日',\n  '㏥' => '6日',\n  '㏦' => '7日',\n  '㏧' => '8日',\n  '㏨' => '9日',\n  '㏩' => '10日',\n  '㏪' => '11日',\n  '㏫' => '12日',\n  '㏬' => '13日',\n  '㏭' => '14日',\n  '㏮' => '15日',\n  '㏯' => '16日',\n  '㏰' => '17日',\n  '㏱' => '18日',\n  '㏲' => '19日',\n  '㏳' => '20日',\n  '㏴' => '21日',\n  '㏵' => '22日',\n  '㏶' => '23日',\n  '㏷' => '24日',\n  '㏸' => '25日',\n  '㏹' => '26日',\n  '㏺' => '27日',\n  '㏻' => '28日',\n  '㏼' => '29日',\n  '㏽' => '30日',\n  '㏾' => '31日',\n  '㏿' => 'gal',\n  'ꚜ' => 'ъ',\n  'ꚝ' => 'ь',\n  'ꝰ' => 'ꝯ',\n  'ꟸ' => 'Ħ',\n  'ꟹ' => 'œ',\n  'ꭜ' => 'ꜧ',\n  'ꭝ' => 'ꬷ',\n  'ꭞ' => 'ɫ',\n  'ꭟ' => 'ꭒ',\n  'ꭩ' => 'ʍ',\n  'ﬀ' => 'ff',\n  'ﬁ' => 'fi',\n  'ﬂ' => 'fl',\n  'ﬃ' => 'ffi',\n  'ﬄ' => 'ffl',\n  'ﬅ' => 'st',\n  'ﬆ' => 'st',\n  'ﬓ' => 'մն',\n  'ﬔ' => 'մե',\n  'ﬕ' => 'մի',\n  'ﬖ' => 'վն',\n  'ﬗ' => 'մխ',\n  'ﬠ' => 'ע',\n  'ﬡ' => 'א',\n  'ﬢ' => 'ד',\n  'ﬣ' => 'ה',\n  'ﬤ' => 'כ',\n  'ﬥ' => 'ל',\n  'ﬦ' => 'ם',\n  'ﬧ' => 'ר',\n  'ﬨ' => 'ת',\n  '﬩' => '+',\n  'ﭏ' => 'אל',\n  'ﭐ' => 'ٱ',\n  'ﭑ' => 'ٱ',\n  'ﭒ' => 'ٻ',\n  'ﭓ' => 'ٻ',\n  'ﭔ' => 'ٻ',\n  'ﭕ' => 'ٻ',\n  'ﭖ' => 'پ',\n  'ﭗ' => 'پ',\n  'ﭘ' => 'پ',\n  'ﭙ' => 'پ',\n  'ﭚ' => 'ڀ',\n  'ﭛ' => 'ڀ',\n  'ﭜ' => 'ڀ',\n  'ﭝ' => 'ڀ',\n  'ﭞ' => 'ٺ',\n  'ﭟ' => 'ٺ',\n  'ﭠ' => 'ٺ',\n  'ﭡ' => 'ٺ',\n  'ﭢ' => 'ٿ',\n  'ﭣ' => 'ٿ',\n  'ﭤ' => 'ٿ',\n  'ﭥ' => 'ٿ',\n  'ﭦ' => 'ٹ',\n  'ﭧ' => 'ٹ',\n  'ﭨ' => 'ٹ',\n  'ﭩ' => 'ٹ',\n  'ﭪ' => 'ڤ',\n  'ﭫ' => 'ڤ',\n  'ﭬ' => 'ڤ',\n  'ﭭ' => 'ڤ',\n  'ﭮ' => 'ڦ',\n  'ﭯ' => 'ڦ',\n  'ﭰ' => 'ڦ',\n  'ﭱ' => 'ڦ',\n  'ﭲ' => 'ڄ',\n  'ﭳ' => 'ڄ',\n  'ﭴ' => 'ڄ',\n  'ﭵ' => 'ڄ',\n  'ﭶ' => 'ڃ',\n  'ﭷ' => 'ڃ',\n  'ﭸ' => 'ڃ',\n  'ﭹ' => 'ڃ',\n  'ﭺ' => 'چ',\n  'ﭻ' => 'چ',\n  'ﭼ' => 'چ',\n  'ﭽ' => 'چ',\n  'ﭾ' => 'ڇ',\n  'ﭿ' => 'ڇ',\n  'ﮀ' => 'ڇ',\n  'ﮁ' => 'ڇ',\n  'ﮂ' => 'ڍ',\n  'ﮃ' => 'ڍ',\n  'ﮄ' => 'ڌ',\n  'ﮅ' => 'ڌ',\n  'ﮆ' => 'ڎ',\n  'ﮇ' => 'ڎ',\n  'ﮈ' => 'ڈ',\n  'ﮉ' => 'ڈ',\n  'ﮊ' => 'ژ',\n  'ﮋ' => 'ژ',\n  'ﮌ' => 'ڑ',\n  'ﮍ' => 'ڑ',\n  'ﮎ' => 'ک',\n  'ﮏ' => 'ک',\n  'ﮐ' => 'ک',\n  'ﮑ' => 'ک',\n  'ﮒ' => 'گ',\n  'ﮓ' => 'گ',\n  'ﮔ' => 'گ',\n  'ﮕ' => 'گ',\n  'ﮖ' => 'ڳ',\n  'ﮗ' => 'ڳ',\n  'ﮘ' => 'ڳ',\n  'ﮙ' => 'ڳ',\n  'ﮚ' => 'ڱ',\n  'ﮛ' => 'ڱ',\n  'ﮜ' => 'ڱ',\n  'ﮝ' => 'ڱ',\n  'ﮞ' => 'ں',\n  'ﮟ' => 'ں',\n  'ﮠ' => 'ڻ',\n  'ﮡ' => 'ڻ',\n  'ﮢ' => 'ڻ',\n  'ﮣ' => 'ڻ',\n  'ﮤ' => 'ۀ',\n  'ﮥ' => 'ۀ',\n  'ﮦ' => 'ہ',\n  'ﮧ' => 'ہ',\n  'ﮨ' => 'ہ',\n  'ﮩ' => 'ہ',\n  'ﮪ' => 'ھ',\n  'ﮫ' => 'ھ',\n  'ﮬ' => 'ھ',\n  'ﮭ' => 'ھ',\n  'ﮮ' => 'ے',\n  'ﮯ' => 'ے',\n  'ﮰ' => 'ۓ',\n  'ﮱ' => 'ۓ',\n  'ﯓ' => 'ڭ',\n  'ﯔ' => 'ڭ',\n  'ﯕ' => 'ڭ',\n  'ﯖ' => 'ڭ',\n  'ﯗ' => 'ۇ',\n  'ﯘ' => 'ۇ',\n  'ﯙ' => 'ۆ',\n  'ﯚ' => 'ۆ',\n  'ﯛ' => 'ۈ',\n  'ﯜ' => 'ۈ',\n  'ﯝ' => 'ۇٴ',\n  'ﯞ' => 'ۋ',\n  'ﯟ' => 'ۋ',\n  'ﯠ' => 'ۅ',\n  'ﯡ' => 'ۅ',\n  'ﯢ' => 'ۉ',\n  'ﯣ' => 'ۉ',\n  'ﯤ' => 'ې',\n  'ﯥ' => 'ې',\n  'ﯦ' => 'ې',\n  'ﯧ' => 'ې',\n  'ﯨ' => 'ى',\n  'ﯩ' => 'ى',\n  'ﯪ' => 'ئا',\n  'ﯫ' => 'ئا',\n  'ﯬ' => 'ئە',\n  'ﯭ' => 'ئە',\n  'ﯮ' => 'ئو',\n  'ﯯ' => 'ئو',\n  'ﯰ' => 'ئۇ',\n  'ﯱ' => 'ئۇ',\n  'ﯲ' => 'ئۆ',\n  'ﯳ' => 'ئۆ',\n  'ﯴ' => 'ئۈ',\n  'ﯵ' => 'ئۈ',\n  'ﯶ' => 'ئې',\n  'ﯷ' => 'ئې',\n  'ﯸ' => 'ئې',\n  'ﯹ' => 'ئى',\n  'ﯺ' => 'ئى',\n  'ﯻ' => 'ئى',\n  'ﯼ' => 'ی',\n  'ﯽ' => 'ی',\n  'ﯾ' => 'ی',\n  'ﯿ' => 'ی',\n  'ﰀ' => 'ئج',\n  'ﰁ' => 'ئح',\n  'ﰂ' => 'ئم',\n  'ﰃ' => 'ئى',\n  'ﰄ' => 'ئي',\n  'ﰅ' => 'بج',\n  'ﰆ' => 'بح',\n  'ﰇ' => 'بخ',\n  'ﰈ' => 'بم',\n  'ﰉ' => 'بى',\n  'ﰊ' => 'بي',\n  'ﰋ' => 'تج',\n  'ﰌ' => 'تح',\n  'ﰍ' => 'تخ',\n  'ﰎ' => 'تم',\n  'ﰏ' => 'تى',\n  'ﰐ' => 'تي',\n  'ﰑ' => 'ثج',\n  'ﰒ' => 'ثم',\n  'ﰓ' => 'ثى',\n  'ﰔ' => 'ثي',\n  'ﰕ' => 'جح',\n  'ﰖ' => 'جم',\n  'ﰗ' => 'حج',\n  'ﰘ' => 'حم',\n  'ﰙ' => 'خج',\n  'ﰚ' => 'خح',\n  'ﰛ' => 'خم',\n  'ﰜ' => 'سج',\n  'ﰝ' => 'سح',\n  'ﰞ' => 'سخ',\n  'ﰟ' => 'سم',\n  'ﰠ' => 'صح',\n  'ﰡ' => 'صم',\n  'ﰢ' => 'ضج',\n  'ﰣ' => 'ضح',\n  'ﰤ' => 'ضخ',\n  'ﰥ' => 'ضم',\n  'ﰦ' => 'طح',\n  'ﰧ' => 'طم',\n  'ﰨ' => 'ظم',\n  'ﰩ' => 'عج',\n  'ﰪ' => 'عم',\n  'ﰫ' => 'غج',\n  'ﰬ' => 'غم',\n  'ﰭ' => 'فج',\n  'ﰮ' => 'فح',\n  'ﰯ' => 'فخ',\n  'ﰰ' => 'فم',\n  'ﰱ' => 'فى',\n  'ﰲ' => 'في',\n  'ﰳ' => 'قح',\n  'ﰴ' => 'قم',\n  'ﰵ' => 'قى',\n  'ﰶ' => 'قي',\n  'ﰷ' => 'كا',\n  'ﰸ' => 'كج',\n  'ﰹ' => 'كح',\n  'ﰺ' => 'كخ',\n  'ﰻ' => 'كل',\n  'ﰼ' => 'كم',\n  'ﰽ' => 'كى',\n  'ﰾ' => 'كي',\n  'ﰿ' => 'لج',\n  'ﱀ' => 'لح',\n  'ﱁ' => 'لخ',\n  'ﱂ' => 'لم',\n  'ﱃ' => 'لى',\n  'ﱄ' => 'لي',\n  'ﱅ' => 'مج',\n  'ﱆ' => 'مح',\n  'ﱇ' => 'مخ',\n  'ﱈ' => 'مم',\n  'ﱉ' => 'مى',\n  'ﱊ' => 'مي',\n  'ﱋ' => 'نج',\n  'ﱌ' => 'نح',\n  'ﱍ' => 'نخ',\n  'ﱎ' => 'نم',\n  'ﱏ' => 'نى',\n  'ﱐ' => 'ني',\n  'ﱑ' => 'هج',\n  'ﱒ' => 'هم',\n  'ﱓ' => 'هى',\n  'ﱔ' => 'هي',\n  'ﱕ' => 'يج',\n  'ﱖ' => 'يح',\n  'ﱗ' => 'يخ',\n  'ﱘ' => 'يم',\n  'ﱙ' => 'يى',\n  'ﱚ' => 'يي',\n  'ﱛ' => 'ذٰ',\n  'ﱜ' => 'رٰ',\n  'ﱝ' => 'ىٰ',\n  'ﱞ' => ' ٌّ',\n  'ﱟ' => ' ٍّ',\n  'ﱠ' => ' َّ',\n  'ﱡ' => ' ُّ',\n  'ﱢ' => ' ِّ',\n  'ﱣ' => ' ّٰ',\n  'ﱤ' => 'ئر',\n  'ﱥ' => 'ئز',\n  'ﱦ' => 'ئم',\n  'ﱧ' => 'ئن',\n  'ﱨ' => 'ئى',\n  'ﱩ' => 'ئي',\n  'ﱪ' => 'بر',\n  'ﱫ' => 'بز',\n  'ﱬ' => 'بم',\n  'ﱭ' => 'بن',\n  'ﱮ' => 'بى',\n  'ﱯ' => 'بي',\n  'ﱰ' => 'تر',\n  'ﱱ' => 'تز',\n  'ﱲ' => 'تم',\n  'ﱳ' => 'تن',\n  'ﱴ' => 'تى',\n  'ﱵ' => 'تي',\n  'ﱶ' => 'ثر',\n  'ﱷ' => 'ثز',\n  'ﱸ' => 'ثم',\n  'ﱹ' => 'ثن',\n  'ﱺ' => 'ثى',\n  'ﱻ' => 'ثي',\n  'ﱼ' => 'فى',\n  'ﱽ' => 'في',\n  'ﱾ' => 'قى',\n  'ﱿ' => 'قي',\n  'ﲀ' => 'كا',\n  'ﲁ' => 'كل',\n  'ﲂ' => 'كم',\n  'ﲃ' => 'كى',\n  'ﲄ' => 'كي',\n  'ﲅ' => 'لم',\n  'ﲆ' => 'لى',\n  'ﲇ' => 'لي',\n  'ﲈ' => 'ما',\n  'ﲉ' => 'مم',\n  'ﲊ' => 'نر',\n  'ﲋ' => 'نز',\n  'ﲌ' => 'نم',\n  'ﲍ' => 'نن',\n  'ﲎ' => 'نى',\n  'ﲏ' => 'ني',\n  'ﲐ' => 'ىٰ',\n  'ﲑ' => 'ير',\n  'ﲒ' => 'يز',\n  'ﲓ' => 'يم',\n  'ﲔ' => 'ين',\n  'ﲕ' => 'يى',\n  'ﲖ' => 'يي',\n  'ﲗ' => 'ئج',\n  'ﲘ' => 'ئح',\n  'ﲙ' => 'ئخ',\n  'ﲚ' => 'ئم',\n  'ﲛ' => 'ئه',\n  'ﲜ' => 'بج',\n  'ﲝ' => 'بح',\n  'ﲞ' => 'بخ',\n  'ﲟ' => 'بم',\n  'ﲠ' => 'به',\n  'ﲡ' => 'تج',\n  'ﲢ' => 'تح',\n  'ﲣ' => 'تخ',\n  'ﲤ' => 'تم',\n  'ﲥ' => 'ته',\n  'ﲦ' => 'ثم',\n  'ﲧ' => 'جح',\n  'ﲨ' => 'جم',\n  'ﲩ' => 'حج',\n  'ﲪ' => 'حم',\n  'ﲫ' => 'خج',\n  'ﲬ' => 'خم',\n  'ﲭ' => 'سج',\n  'ﲮ' => 'سح',\n  'ﲯ' => 'سخ',\n  'ﲰ' => 'سم',\n  'ﲱ' => 'صح',\n  'ﲲ' => 'صخ',\n  'ﲳ' => 'صم',\n  'ﲴ' => 'ضج',\n  'ﲵ' => 'ضح',\n  'ﲶ' => 'ضخ',\n  'ﲷ' => 'ضم',\n  'ﲸ' => 'طح',\n  'ﲹ' => 'ظم',\n  'ﲺ' => 'عج',\n  'ﲻ' => 'عم',\n  'ﲼ' => 'غج',\n  'ﲽ' => 'غم',\n  'ﲾ' => 'فج',\n  'ﲿ' => 'فح',\n  'ﳀ' => 'فخ',\n  'ﳁ' => 'فم',\n  'ﳂ' => 'قح',\n  'ﳃ' => 'قم',\n  'ﳄ' => 'كج',\n  'ﳅ' => 'كح',\n  'ﳆ' => 'كخ',\n  'ﳇ' => 'كل',\n  'ﳈ' => 'كم',\n  'ﳉ' => 'لج',\n  'ﳊ' => 'لح',\n  'ﳋ' => 'لخ',\n  'ﳌ' => 'لم',\n  'ﳍ' => 'له',\n  'ﳎ' => 'مج',\n  'ﳏ' => 'مح',\n  'ﳐ' => 'مخ',\n  'ﳑ' => 'مم',\n  'ﳒ' => 'نج',\n  'ﳓ' => 'نح',\n  'ﳔ' => 'نخ',\n  'ﳕ' => 'نم',\n  'ﳖ' => 'نه',\n  'ﳗ' => 'هج',\n  'ﳘ' => 'هم',\n  'ﳙ' => 'هٰ',\n  'ﳚ' => 'يج',\n  'ﳛ' => 'يح',\n  'ﳜ' => 'يخ',\n  'ﳝ' => 'يم',\n  'ﳞ' => 'يه',\n  'ﳟ' => 'ئم',\n  'ﳠ' => 'ئه',\n  'ﳡ' => 'بم',\n  'ﳢ' => 'به',\n  'ﳣ' => 'تم',\n  'ﳤ' => 'ته',\n  'ﳥ' => 'ثم',\n  'ﳦ' => 'ثه',\n  'ﳧ' => 'سم',\n  'ﳨ' => 'سه',\n  'ﳩ' => 'شم',\n  'ﳪ' => 'شه',\n  'ﳫ' => 'كل',\n  'ﳬ' => 'كم',\n  'ﳭ' => 'لم',\n  'ﳮ' => 'نم',\n  'ﳯ' => 'نه',\n  'ﳰ' => 'يم',\n  'ﳱ' => 'يه',\n  'ﳲ' => 'ـَّ',\n  'ﳳ' => 'ـُّ',\n  'ﳴ' => 'ـِّ',\n  'ﳵ' => 'طى',\n  'ﳶ' => 'طي',\n  'ﳷ' => 'عى',\n  'ﳸ' => 'عي',\n  'ﳹ' => 'غى',\n  'ﳺ' => 'غي',\n  'ﳻ' => 'سى',\n  'ﳼ' => 'سي',\n  'ﳽ' => 'شى',\n  'ﳾ' => 'شي',\n  'ﳿ' => 'حى',\n  'ﴀ' => 'حي',\n  'ﴁ' => 'جى',\n  'ﴂ' => 'جي',\n  'ﴃ' => 'خى',\n  'ﴄ' => 'خي',\n  'ﴅ' => 'صى',\n  'ﴆ' => 'صي',\n  'ﴇ' => 'ضى',\n  'ﴈ' => 'ضي',\n  'ﴉ' => 'شج',\n  'ﴊ' => 'شح',\n  'ﴋ' => 'شخ',\n  'ﴌ' => 'شم',\n  'ﴍ' => 'شر',\n  'ﴎ' => 'سر',\n  'ﴏ' => 'صر',\n  'ﴐ' => 'ضر',\n  'ﴑ' => 'طى',\n  'ﴒ' => 'طي',\n  'ﴓ' => 'عى',\n  'ﴔ' => 'عي',\n  'ﴕ' => 'غى',\n  'ﴖ' => 'غي',\n  'ﴗ' => 'سى',\n  'ﴘ' => 'سي',\n  'ﴙ' => 'شى',\n  'ﴚ' => 'شي',\n  'ﴛ' => 'حى',\n  'ﴜ' => 'حي',\n  'ﴝ' => 'جى',\n  'ﴞ' => 'جي',\n  'ﴟ' => 'خى',\n  'ﴠ' => 'خي',\n  'ﴡ' => 'صى',\n  'ﴢ' => 'صي',\n  'ﴣ' => 'ضى',\n  'ﴤ' => 'ضي',\n  'ﴥ' => 'شج',\n  'ﴦ' => 'شح',\n  'ﴧ' => 'شخ',\n  'ﴨ' => 'شم',\n  'ﴩ' => 'شر',\n  'ﴪ' => 'سر',\n  'ﴫ' => 'صر',\n  'ﴬ' => 'ضر',\n  'ﴭ' => 'شج',\n  'ﴮ' => 'شح',\n  'ﴯ' => 'شخ',\n  'ﴰ' => 'شم',\n  'ﴱ' => 'سه',\n  'ﴲ' => 'شه',\n  'ﴳ' => 'طم',\n  'ﴴ' => 'سج',\n  'ﴵ' => 'سح',\n  'ﴶ' => 'سخ',\n  'ﴷ' => 'شج',\n  'ﴸ' => 'شح',\n  'ﴹ' => 'شخ',\n  'ﴺ' => 'طم',\n  'ﴻ' => 'ظم',\n  'ﴼ' => 'اً',\n  'ﴽ' => 'اً',\n  'ﵐ' => 'تجم',\n  'ﵑ' => 'تحج',\n  'ﵒ' => 'تحج',\n  'ﵓ' => 'تحم',\n  'ﵔ' => 'تخم',\n  'ﵕ' => 'تمج',\n  'ﵖ' => 'تمح',\n  'ﵗ' => 'تمخ',\n  'ﵘ' => 'جمح',\n  'ﵙ' => 'جمح',\n  'ﵚ' => 'حمي',\n  'ﵛ' => 'حمى',\n  'ﵜ' => 'سحج',\n  'ﵝ' => 'سجح',\n  'ﵞ' => 'سجى',\n  'ﵟ' => 'سمح',\n  'ﵠ' => 'سمح',\n  'ﵡ' => 'سمج',\n  'ﵢ' => 'سمم',\n  'ﵣ' => 'سمم',\n  'ﵤ' => 'صحح',\n  'ﵥ' => 'صحح',\n  'ﵦ' => 'صمم',\n  'ﵧ' => 'شحم',\n  'ﵨ' => 'شحم',\n  'ﵩ' => 'شجي',\n  'ﵪ' => 'شمخ',\n  'ﵫ' => 'شمخ',\n  'ﵬ' => 'شمم',\n  'ﵭ' => 'شمم',\n  'ﵮ' => 'ضحى',\n  'ﵯ' => 'ضخم',\n  'ﵰ' => 'ضخم',\n  'ﵱ' => 'طمح',\n  'ﵲ' => 'طمح',\n  'ﵳ' => 'طمم',\n  'ﵴ' => 'طمي',\n  'ﵵ' => 'عجم',\n  'ﵶ' => 'عمم',\n  'ﵷ' => 'عمم',\n  'ﵸ' => 'عمى',\n  'ﵹ' => 'غمم',\n  'ﵺ' => 'غمي',\n  'ﵻ' => 'غمى',\n  'ﵼ' => 'فخم',\n  'ﵽ' => 'فخم',\n  'ﵾ' => 'قمح',\n  'ﵿ' => 'قمم',\n  'ﶀ' => 'لحم',\n  'ﶁ' => 'لحي',\n  'ﶂ' => 'لحى',\n  'ﶃ' => 'لجج',\n  'ﶄ' => 'لجج',\n  'ﶅ' => 'لخم',\n  'ﶆ' => 'لخم',\n  'ﶇ' => 'لمح',\n  'ﶈ' => 'لمح',\n  'ﶉ' => 'محج',\n  'ﶊ' => 'محم',\n  'ﶋ' => 'محي',\n  'ﶌ' => 'مجح',\n  'ﶍ' => 'مجم',\n  'ﶎ' => 'مخج',\n  'ﶏ' => 'مخم',\n  'ﶒ' => 'مجخ',\n  'ﶓ' => 'همج',\n  'ﶔ' => 'همم',\n  'ﶕ' => 'نحم',\n  'ﶖ' => 'نحى',\n  'ﶗ' => 'نجم',\n  'ﶘ' => 'نجم',\n  'ﶙ' => 'نجى',\n  'ﶚ' => 'نمي',\n  'ﶛ' => 'نمى',\n  'ﶜ' => 'يمم',\n  'ﶝ' => 'يمم',\n  'ﶞ' => 'بخي',\n  'ﶟ' => 'تجي',\n  'ﶠ' => 'تجى',\n  'ﶡ' => 'تخي',\n  'ﶢ' => 'تخى',\n  'ﶣ' => 'تمي',\n  'ﶤ' => 'تمى',\n  'ﶥ' => 'جمي',\n  'ﶦ' => 'جحى',\n  'ﶧ' => 'جمى',\n  'ﶨ' => 'سخى',\n  'ﶩ' => 'صحي',\n  'ﶪ' => 'شحي',\n  'ﶫ' => 'ضحي',\n  'ﶬ' => 'لجي',\n  'ﶭ' => 'لمي',\n  'ﶮ' => 'يحي',\n  'ﶯ' => 'يجي',\n  'ﶰ' => 'يمي',\n  'ﶱ' => 'ممي',\n  'ﶲ' => 'قمي',\n  'ﶳ' => 'نحي',\n  'ﶴ' => 'قمح',\n  'ﶵ' => 'لحم',\n  'ﶶ' => 'عمي',\n  'ﶷ' => 'كمي',\n  'ﶸ' => 'نجح',\n  'ﶹ' => 'مخي',\n  'ﶺ' => 'لجم',\n  'ﶻ' => 'كمم',\n  'ﶼ' => 'لجم',\n  'ﶽ' => 'نجح',\n  'ﶾ' => 'جحي',\n  'ﶿ' => 'حجي',\n  'ﷀ' => 'مجي',\n  'ﷁ' => 'فمي',\n  'ﷂ' => 'بحي',\n  'ﷃ' => 'كمم',\n  'ﷄ' => 'عجم',\n  'ﷅ' => 'صمم',\n  'ﷆ' => 'سخي',\n  'ﷇ' => 'نجي',\n  'ﷰ' => 'صلے',\n  'ﷱ' => 'قلے',\n  'ﷲ' => 'الله',\n  'ﷳ' => 'اكبر',\n  'ﷴ' => 'محمد',\n  'ﷵ' => 'صلعم',\n  'ﷶ' => 'رسول',\n  'ﷷ' => 'عليه',\n  'ﷸ' => 'وسلم',\n  'ﷹ' => 'صلى',\n  'ﷺ' => 'صلى الله عليه وسلم',\n  'ﷻ' => 'جل جلاله',\n  '﷼' => 'ریال',\n  '︐' => ',',\n  '︑' => '、',\n  '︒' => '。',\n  '︓' => ':',\n  '︔' => ';',\n  '︕' => '!',\n  '︖' => '?',\n  '︗' => '〖',\n  '︘' => '〗',\n  '︙' => '...',\n  '︰' => '..',\n  '︱' => '—',\n  '︲' => '–',\n  '︳' => '_',\n  '︴' => '_',\n  '︵' => '(',\n  '︶' => ')',\n  '︷' => '{',\n  '︸' => '}',\n  '︹' => '〔',\n  '︺' => '〕',\n  '︻' => '【',\n  '︼' => '】',\n  '︽' => '《',\n  '︾' => '》',\n  '︿' => '〈',\n  '﹀' => '〉',\n  '﹁' => '「',\n  '﹂' => '」',\n  '﹃' => '『',\n  '﹄' => '』',\n  '﹇' => '[',\n  '﹈' => ']',\n  '﹉' => ' ̅',\n  '﹊' => ' ̅',\n  '﹋' => ' ̅',\n  '﹌' => ' ̅',\n  '﹍' => '_',\n  '﹎' => '_',\n  '﹏' => '_',\n  '﹐' => ',',\n  '﹑' => '、',\n  '﹒' => '.',\n  '﹔' => ';',\n  '﹕' => ':',\n  '﹖' => '?',\n  '﹗' => '!',\n  '﹘' => '—',\n  '﹙' => '(',\n  '﹚' => ')',\n  '﹛' => '{',\n  '﹜' => '}',\n  '﹝' => '〔',\n  '﹞' => '〕',\n  '﹟' => '#',\n  '﹠' => '&',\n  '﹡' => '*',\n  '﹢' => '+',\n  '﹣' => '-',\n  '﹤' => '<',\n  '﹥' => '>',\n  '﹦' => '=',\n  '﹨' => '\\\\',\n  '﹩' => '$',\n  '﹪' => '%',\n  '﹫' => '@',\n  'ﹰ' => ' ً',\n  'ﹱ' => 'ـً',\n  'ﹲ' => ' ٌ',\n  'ﹴ' => ' ٍ',\n  'ﹶ' => ' َ',\n  'ﹷ' => 'ـَ',\n  'ﹸ' => ' ُ',\n  'ﹹ' => 'ـُ',\n  'ﹺ' => ' ِ',\n  'ﹻ' => 'ـِ',\n  'ﹼ' => ' ّ',\n  'ﹽ' => 'ـّ',\n  'ﹾ' => ' ْ',\n  'ﹿ' => 'ـْ',\n  'ﺀ' => 'ء',\n  'ﺁ' => 'آ',\n  'ﺂ' => 'آ',\n  'ﺃ' => 'أ',\n  'ﺄ' => 'أ',\n  'ﺅ' => 'ؤ',\n  'ﺆ' => 'ؤ',\n  'ﺇ' => 'إ',\n  'ﺈ' => 'إ',\n  'ﺉ' => 'ئ',\n  'ﺊ' => 'ئ',\n  'ﺋ' => 'ئ',\n  'ﺌ' => 'ئ',\n  'ﺍ' => 'ا',\n  'ﺎ' => 'ا',\n  'ﺏ' => 'ب',\n  'ﺐ' => 'ب',\n  'ﺑ' => 'ب',\n  'ﺒ' => 'ب',\n  'ﺓ' => 'ة',\n  'ﺔ' => 'ة',\n  'ﺕ' => 'ت',\n  'ﺖ' => 'ت',\n  'ﺗ' => 'ت',\n  'ﺘ' => 'ت',\n  'ﺙ' => 'ث',\n  'ﺚ' => 'ث',\n  'ﺛ' => 'ث',\n  'ﺜ' => 'ث',\n  'ﺝ' => 'ج',\n  'ﺞ' => 'ج',\n  'ﺟ' => 'ج',\n  'ﺠ' => 'ج',\n  'ﺡ' => 'ح',\n  'ﺢ' => 'ح',\n  'ﺣ' => 'ح',\n  'ﺤ' => 'ح',\n  'ﺥ' => 'خ',\n  'ﺦ' => 'خ',\n  'ﺧ' => 'خ',\n  'ﺨ' => 'خ',\n  'ﺩ' => 'د',\n  'ﺪ' => 'د',\n  'ﺫ' => 'ذ',\n  'ﺬ' => 'ذ',\n  'ﺭ' => 'ر',\n  'ﺮ' => 'ر',\n  'ﺯ' => 'ز',\n  'ﺰ' => 'ز',\n  'ﺱ' => 'س',\n  'ﺲ' => 'س',\n  'ﺳ' => 'س',\n  'ﺴ' => 'س',\n  'ﺵ' => 'ش',\n  'ﺶ' => 'ش',\n  'ﺷ' => 'ش',\n  'ﺸ' => 'ش',\n  'ﺹ' => 'ص',\n  'ﺺ' => 'ص',\n  'ﺻ' => 'ص',\n  'ﺼ' => 'ص',\n  'ﺽ' => 'ض',\n  'ﺾ' => 'ض',\n  'ﺿ' => 'ض',\n  'ﻀ' => 'ض',\n  'ﻁ' => 'ط',\n  'ﻂ' => 'ط',\n  'ﻃ' => 'ط',\n  'ﻄ' => 'ط',\n  'ﻅ' => 'ظ',\n  'ﻆ' => 'ظ',\n  'ﻇ' => 'ظ',\n  'ﻈ' => 'ظ',\n  'ﻉ' => 'ع',\n  'ﻊ' => 'ع',\n  'ﻋ' => 'ع',\n  'ﻌ' => 'ع',\n  'ﻍ' => 'غ',\n  'ﻎ' => 'غ',\n  'ﻏ' => 'غ',\n  'ﻐ' => 'غ',\n  'ﻑ' => 'ف',\n  'ﻒ' => 'ف',\n  'ﻓ' => 'ف',\n  'ﻔ' => 'ف',\n  'ﻕ' => 'ق',\n  'ﻖ' => 'ق',\n  'ﻗ' => 'ق',\n  'ﻘ' => 'ق',\n  'ﻙ' => 'ك',\n  'ﻚ' => 'ك',\n  'ﻛ' => 'ك',\n  'ﻜ' => 'ك',\n  'ﻝ' => 'ل',\n  'ﻞ' => 'ل',\n  'ﻟ' => 'ل',\n  'ﻠ' => 'ل',\n  'ﻡ' => 'م',\n  'ﻢ' => 'م',\n  'ﻣ' => 'م',\n  'ﻤ' => 'م',\n  'ﻥ' => 'ن',\n  'ﻦ' => 'ن',\n  'ﻧ' => 'ن',\n  'ﻨ' => 'ن',\n  'ﻩ' => 'ه',\n  'ﻪ' => 'ه',\n  'ﻫ' => 'ه',\n  'ﻬ' => 'ه',\n  'ﻭ' => 'و',\n  'ﻮ' => 'و',\n  'ﻯ' => 'ى',\n  'ﻰ' => 'ى',\n  'ﻱ' => 'ي',\n  'ﻲ' => 'ي',\n  'ﻳ' => 'ي',\n  'ﻴ' => 'ي',\n  'ﻵ' => 'لآ',\n  'ﻶ' => 'لآ',\n  'ﻷ' => 'لأ',\n  'ﻸ' => 'لأ',\n  'ﻹ' => 'لإ',\n  'ﻺ' => 'لإ',\n  'ﻻ' => 'لا',\n  'ﻼ' => 'لا',\n  '！' => '!',\n  '＂' => '\"',\n  '＃' => '#',\n  '＄' => '$',\n  '％' => '%',\n  '＆' => '&',\n  '＇' => '\\'',\n  '（' => '(',\n  '）' => ')',\n  '＊' => '*',\n  '＋' => '+',\n  '，' => ',',\n  '－' => '-',\n  '．' => '.',\n  '／' => '/',\n  '０' => '0',\n  '１' => '1',\n  '２' => '2',\n  '３' => '3',\n  '４' => '4',\n  '５' => '5',\n  '６' => '6',\n  '７' => '7',\n  '８' => '8',\n  '９' => '9',\n  '：' => ':',\n  '；' => ';',\n  '＜' => '<',\n  '＝' => '=',\n  '＞' => '>',\n  '？' => '?',\n  '＠' => '@',\n  'Ａ' => 'A',\n  'Ｂ' => 'B',\n  'Ｃ' => 'C',\n  'Ｄ' => 'D',\n  'Ｅ' => 'E',\n  'Ｆ' => 'F',\n  'Ｇ' => 'G',\n  'Ｈ' => 'H',\n  'Ｉ' => 'I',\n  'Ｊ' => 'J',\n  'Ｋ' => 'K',\n  'Ｌ' => 'L',\n  'Ｍ' => 'M',\n  'Ｎ' => 'N',\n  'Ｏ' => 'O',\n  'Ｐ' => 'P',\n  'Ｑ' => 'Q',\n  'Ｒ' => 'R',\n  'Ｓ' => 'S',\n  'Ｔ' => 'T',\n  'Ｕ' => 'U',\n  'Ｖ' => 'V',\n  'Ｗ' => 'W',\n  'Ｘ' => 'X',\n  'Ｙ' => 'Y',\n  'Ｚ' => 'Z',\n  '［' => '[',\n  '＼' => '\\\\',\n  '］' => ']',\n  '＾' => '^',\n  '＿' => '_',\n  '｀' => '`',\n  'ａ' => 'a',\n  'ｂ' => 'b',\n  'ｃ' => 'c',\n  'ｄ' => 'd',\n  'ｅ' => 'e',\n  'ｆ' => 'f',\n  'ｇ' => 'g',\n  'ｈ' => 'h',\n  'ｉ' => 'i',\n  'ｊ' => 'j',\n  'ｋ' => 'k',\n  'ｌ' => 'l',\n  'ｍ' => 'm',\n  'ｎ' => 'n',\n  'ｏ' => 'o',\n  'ｐ' => 'p',\n  'ｑ' => 'q',\n  'ｒ' => 'r',\n  'ｓ' => 's',\n  'ｔ' => 't',\n  'ｕ' => 'u',\n  'ｖ' => 'v',\n  'ｗ' => 'w',\n  'ｘ' => 'x',\n  'ｙ' => 'y',\n  'ｚ' => 'z',\n  '｛' => '{',\n  '｜' => '|',\n  '｝' => '}',\n  '～' => '~',\n  '｟' => '⦅',\n  '｠' => '⦆',\n  '｡' => '。',\n  '｢' => '「',\n  '｣' => '」',\n  '､' => '、',\n  '･' => '・',\n  'ｦ' => 'ヲ',\n  'ｧ' => 'ァ',\n  'ｨ' => 'ィ',\n  'ｩ' => 'ゥ',\n  'ｪ' => 'ェ',\n  'ｫ' => 'ォ',\n  'ｬ' => 'ャ',\n  'ｭ' => 'ュ',\n  'ｮ' => 'ョ',\n  'ｯ' => 'ッ',\n  'ｰ' => 'ー',\n  'ｱ' => 'ア',\n  'ｲ' => 'イ',\n  'ｳ' => 'ウ',\n  'ｴ' => 'エ',\n  'ｵ' => 'オ',\n  'ｶ' => 'カ',\n  'ｷ' => 'キ',\n  'ｸ' => 'ク',\n  'ｹ' => 'ケ',\n  'ｺ' => 'コ',\n  'ｻ' => 'サ',\n  'ｼ' => 'シ',\n  'ｽ' => 'ス',\n  'ｾ' => 'セ',\n  'ｿ' => 'ソ',\n  'ﾀ' => 'タ',\n  'ﾁ' => 'チ',\n  'ﾂ' => 'ツ',\n  'ﾃ' => 'テ',\n  'ﾄ' => 'ト',\n  'ﾅ' => 'ナ',\n  'ﾆ' => 'ニ',\n  'ﾇ' => 'ヌ',\n  'ﾈ' => 'ネ',\n  'ﾉ' => 'ノ',\n  'ﾊ' => 'ハ',\n  'ﾋ' => 'ヒ',\n  'ﾌ' => 'フ',\n  'ﾍ' => 'ヘ',\n  'ﾎ' => 'ホ',\n  'ﾏ' => 'マ',\n  'ﾐ' => 'ミ',\n  'ﾑ' => 'ム',\n  'ﾒ' => 'メ',\n  'ﾓ' => 'モ',\n  'ﾔ' => 'ヤ',\n  'ﾕ' => 'ユ',\n  'ﾖ' => 'ヨ',\n  'ﾗ' => 'ラ',\n  'ﾘ' => 'リ',\n  'ﾙ' => 'ル',\n  'ﾚ' => 'レ',\n  'ﾛ' => 'ロ',\n  'ﾜ' => 'ワ',\n  'ﾝ' => 'ン',\n  'ﾞ' => '゙',\n  'ﾟ' => '゚',\n  'ﾠ' => 'ᅠ',\n  'ﾡ' => 'ᄀ',\n  'ﾢ' => 'ᄁ',\n  'ﾣ' => 'ᆪ',\n  'ﾤ' => 'ᄂ',\n  'ﾥ' => 'ᆬ',\n  'ﾦ' => 'ᆭ',\n  'ﾧ' => 'ᄃ',\n  'ﾨ' => 'ᄄ',\n  'ﾩ' => 'ᄅ',\n  'ﾪ' => 'ᆰ',\n  'ﾫ' => 'ᆱ',\n  'ﾬ' => 'ᆲ',\n  'ﾭ' => 'ᆳ',\n  'ﾮ' => 'ᆴ',\n  'ﾯ' => 'ᆵ',\n  'ﾰ' => 'ᄚ',\n  'ﾱ' => 'ᄆ',\n  'ﾲ' => 'ᄇ',\n  'ﾳ' => 'ᄈ',\n  'ﾴ' => 'ᄡ',\n  'ﾵ' => 'ᄉ',\n  'ﾶ' => 'ᄊ',\n  'ﾷ' => 'ᄋ',\n  'ﾸ' => 'ᄌ',\n  'ﾹ' => 'ᄍ',\n  'ﾺ' => 'ᄎ',\n  'ﾻ' => 'ᄏ',\n  'ﾼ' => 'ᄐ',\n  'ﾽ' => 'ᄑ',\n  'ﾾ' => 'ᄒ',\n  'ￂ' => 'ᅡ',\n  'ￃ' => 'ᅢ',\n  'ￄ' => 'ᅣ',\n  'ￅ' => 'ᅤ',\n  'ￆ' => 'ᅥ',\n  'ￇ' => 'ᅦ',\n  'ￊ' => 'ᅧ',\n  'ￋ' => 'ᅨ',\n  'ￌ' => 'ᅩ',\n  'ￍ' => 'ᅪ',\n  'ￎ' => 'ᅫ',\n  'ￏ' => 'ᅬ',\n  'ￒ' => 'ᅭ',\n  'ￓ' => 'ᅮ',\n  'ￔ' => 'ᅯ',\n  'ￕ' => 'ᅰ',\n  'ￖ' => 'ᅱ',\n  'ￗ' => 'ᅲ',\n  'ￚ' => 'ᅳ',\n  'ￛ' => 'ᅴ',\n  'ￜ' => 'ᅵ',\n  '￠' => '¢',\n  '￡' => '£',\n  '￢' => '¬',\n  '￣' => ' ̄',\n  '￤' => '¦',\n  '￥' => '¥',\n  '￦' => '₩',\n  '￨' => '│',\n  '￩' => '←',\n  '￪' => '↑',\n  '￫' => '→',\n  '￬' => '↓',\n  '￭' => '■',\n  '￮' => '○',\n  '𝐀' => 'A',\n  '𝐁' => 'B',\n  '𝐂' => 'C',\n  '𝐃' => 'D',\n  '𝐄' => 'E',\n  '𝐅' => 'F',\n  '𝐆' => 'G',\n  '𝐇' => 'H',\n  '𝐈' => 'I',\n  '𝐉' => 'J',\n  '𝐊' => 'K',\n  '𝐋' => 'L',\n  '𝐌' => 'M',\n  '𝐍' => 'N',\n  '𝐎' => 'O',\n  '𝐏' => 'P',\n  '𝐐' => 'Q',\n  '𝐑' => 'R',\n  '𝐒' => 'S',\n  '𝐓' => 'T',\n  '𝐔' => 'U',\n  '𝐕' => 'V',\n  '𝐖' => 'W',\n  '𝐗' => 'X',\n  '𝐘' => 'Y',\n  '𝐙' => 'Z',\n  '𝐚' => 'a',\n  '𝐛' => 'b',\n  '𝐜' => 'c',\n  '𝐝' => 'd',\n  '𝐞' => 'e',\n  '𝐟' => 'f',\n  '𝐠' => 'g',\n  '𝐡' => 'h',\n  '𝐢' => 'i',\n  '𝐣' => 'j',\n  '𝐤' => 'k',\n  '𝐥' => 'l',\n  '𝐦' => 'm',\n  '𝐧' => 'n',\n  '𝐨' => 'o',\n  '𝐩' => 'p',\n  '𝐪' => 'q',\n  '𝐫' => 'r',\n  '𝐬' => 's',\n  '𝐭' => 't',\n  '𝐮' => 'u',\n  '𝐯' => 'v',\n  '𝐰' => 'w',\n  '𝐱' => 'x',\n  '𝐲' => 'y',\n  '𝐳' => 'z',\n  '𝐴' => 'A',\n  '𝐵' => 'B',\n  '𝐶' => 'C',\n  '𝐷' => 'D',\n  '𝐸' => 'E',\n  '𝐹' => 'F',\n  '𝐺' => 'G',\n  '𝐻' => 'H',\n  '𝐼' => 'I',\n  '𝐽' => 'J',\n  '𝐾' => 'K',\n  '𝐿' => 'L',\n  '𝑀' => 'M',\n  '𝑁' => 'N',\n  '𝑂' => 'O',\n  '𝑃' => 'P',\n  '𝑄' => 'Q',\n  '𝑅' => 'R',\n  '𝑆' => 'S',\n  '𝑇' => 'T',\n  '𝑈' => 'U',\n  '𝑉' => 'V',\n  '𝑊' => 'W',\n  '𝑋' => 'X',\n  '𝑌' => 'Y',\n  '𝑍' => 'Z',\n  '𝑎' => 'a',\n  '𝑏' => 'b',\n  '𝑐' => 'c',\n  '𝑑' => 'd',\n  '𝑒' => 'e',\n  '𝑓' => 'f',\n  '𝑔' => 'g',\n  '𝑖' => 'i',\n  '𝑗' => 'j',\n  '𝑘' => 'k',\n  '𝑙' => 'l',\n  '𝑚' => 'm',\n  '𝑛' => 'n',\n  '𝑜' => 'o',\n  '𝑝' => 'p',\n  '𝑞' => 'q',\n  '𝑟' => 'r',\n  '𝑠' => 's',\n  '𝑡' => 't',\n  '𝑢' => 'u',\n  '𝑣' => 'v',\n  '𝑤' => 'w',\n  '𝑥' => 'x',\n  '𝑦' => 'y',\n  '𝑧' => 'z',\n  '𝑨' => 'A',\n  '𝑩' => 'B',\n  '𝑪' => 'C',\n  '𝑫' => 'D',\n  '𝑬' => 'E',\n  '𝑭' => 'F',\n  '𝑮' => 'G',\n  '𝑯' => 'H',\n  '𝑰' => 'I',\n  '𝑱' => 'J',\n  '𝑲' => 'K',\n  '𝑳' => 'L',\n  '𝑴' => 'M',\n  '𝑵' => 'N',\n  '𝑶' => 'O',\n  '𝑷' => 'P',\n  '𝑸' => 'Q',\n  '𝑹' => 'R',\n  '𝑺' => 'S',\n  '𝑻' => 'T',\n  '𝑼' => 'U',\n  '𝑽' => 'V',\n  '𝑾' => 'W',\n  '𝑿' => 'X',\n  '𝒀' => 'Y',\n  '𝒁' => 'Z',\n  '𝒂' => 'a',\n  '𝒃' => 'b',\n  '𝒄' => 'c',\n  '𝒅' => 'd',\n  '𝒆' => 'e',\n  '𝒇' => 'f',\n  '𝒈' => 'g',\n  '𝒉' => 'h',\n  '𝒊' => 'i',\n  '𝒋' => 'j',\n  '𝒌' => 'k',\n  '𝒍' => 'l',\n  '𝒎' => 'm',\n  '𝒏' => 'n',\n  '𝒐' => 'o',\n  '𝒑' => 'p',\n  '𝒒' => 'q',\n  '𝒓' => 'r',\n  '𝒔' => 's',\n  '𝒕' => 't',\n  '𝒖' => 'u',\n  '𝒗' => 'v',\n  '𝒘' => 'w',\n  '𝒙' => 'x',\n  '𝒚' => 'y',\n  '𝒛' => 'z',\n  '𝒜' => 'A',\n  '𝒞' => 'C',\n  '𝒟' => 'D',\n  '𝒢' => 'G',\n  '𝒥' => 'J',\n  '𝒦' => 'K',\n  '𝒩' => 'N',\n  '𝒪' => 'O',\n  '𝒫' => 'P',\n  '𝒬' => 'Q',\n  '𝒮' => 'S',\n  '𝒯' => 'T',\n  '𝒰' => 'U',\n  '𝒱' => 'V',\n  '𝒲' => 'W',\n  '𝒳' => 'X',\n  '𝒴' => 'Y',\n  '𝒵' => 'Z',\n  '𝒶' => 'a',\n  '𝒷' => 'b',\n  '𝒸' => 'c',\n  '𝒹' => 'd',\n  '𝒻' => 'f',\n  '𝒽' => 'h',\n  '𝒾' => 'i',\n  '𝒿' => 'j',\n  '𝓀' => 'k',\n  '𝓁' => 'l',\n  '𝓂' => 'm',\n  '𝓃' => 'n',\n  '𝓅' => 'p',\n  '𝓆' => 'q',\n  '𝓇' => 'r',\n  '𝓈' => 's',\n  '𝓉' => 't',\n  '𝓊' => 'u',\n  '𝓋' => 'v',\n  '𝓌' => 'w',\n  '𝓍' => 'x',\n  '𝓎' => 'y',\n  '𝓏' => 'z',\n  '𝓐' => 'A',\n  '𝓑' => 'B',\n  '𝓒' => 'C',\n  '𝓓' => 'D',\n  '𝓔' => 'E',\n  '𝓕' => 'F',\n  '𝓖' => 'G',\n  '𝓗' => 'H',\n  '𝓘' => 'I',\n  '𝓙' => 'J',\n  '𝓚' => 'K',\n  '𝓛' => 'L',\n  '𝓜' => 'M',\n  '𝓝' => 'N',\n  '𝓞' => 'O',\n  '𝓟' => 'P',\n  '𝓠' => 'Q',\n  '𝓡' => 'R',\n  '𝓢' => 'S',\n  '𝓣' => 'T',\n  '𝓤' => 'U',\n  '𝓥' => 'V',\n  '𝓦' => 'W',\n  '𝓧' => 'X',\n  '𝓨' => 'Y',\n  '𝓩' => 'Z',\n  '𝓪' => 'a',\n  '𝓫' => 'b',\n  '𝓬' => 'c',\n  '𝓭' => 'd',\n  '𝓮' => 'e',\n  '𝓯' => 'f',\n  '𝓰' => 'g',\n  '𝓱' => 'h',\n  '𝓲' => 'i',\n  '𝓳' => 'j',\n  '𝓴' => 'k',\n  '𝓵' => 'l',\n  '𝓶' => 'm',\n  '𝓷' => 'n',\n  '𝓸' => 'o',\n  '𝓹' => 'p',\n  '𝓺' => 'q',\n  '𝓻' => 'r',\n  '𝓼' => 's',\n  '𝓽' => 't',\n  '𝓾' => 'u',\n  '𝓿' => 'v',\n  '𝔀' => 'w',\n  '𝔁' => 'x',\n  '𝔂' => 'y',\n  '𝔃' => 'z',\n  '𝔄' => 'A',\n  '𝔅' => 'B',\n  '𝔇' => 'D',\n  '𝔈' => 'E',\n  '𝔉' => 'F',\n  '𝔊' => 'G',\n  '𝔍' => 'J',\n  '𝔎' => 'K',\n  '𝔏' => 'L',\n  '𝔐' => 'M',\n  '𝔑' => 'N',\n  '𝔒' => 'O',\n  '𝔓' => 'P',\n  '𝔔' => 'Q',\n  '𝔖' => 'S',\n  '𝔗' => 'T',\n  '𝔘' => 'U',\n  '𝔙' => 'V',\n  '𝔚' => 'W',\n  '𝔛' => 'X',\n  '𝔜' => 'Y',\n  '𝔞' => 'a',\n  '𝔟' => 'b',\n  '𝔠' => 'c',\n  '𝔡' => 'd',\n  '𝔢' => 'e',\n  '𝔣' => 'f',\n  '𝔤' => 'g',\n  '𝔥' => 'h',\n  '𝔦' => 'i',\n  '𝔧' => 'j',\n  '𝔨' => 'k',\n  '𝔩' => 'l',\n  '𝔪' => 'm',\n  '𝔫' => 'n',\n  '𝔬' => 'o',\n  '𝔭' => 'p',\n  '𝔮' => 'q',\n  '𝔯' => 'r',\n  '𝔰' => 's',\n  '𝔱' => 't',\n  '𝔲' => 'u',\n  '𝔳' => 'v',\n  '𝔴' => 'w',\n  '𝔵' => 'x',\n  '𝔶' => 'y',\n  '𝔷' => 'z',\n  '𝔸' => 'A',\n  '𝔹' => 'B',\n  '𝔻' => 'D',\n  '𝔼' => 'E',\n  '𝔽' => 'F',\n  '𝔾' => 'G',\n  '𝕀' => 'I',\n  '𝕁' => 'J',\n  '𝕂' => 'K',\n  '𝕃' => 'L',\n  '𝕄' => 'M',\n  '𝕆' => 'O',\n  '𝕊' => 'S',\n  '𝕋' => 'T',\n  '𝕌' => 'U',\n  '𝕍' => 'V',\n  '𝕎' => 'W',\n  '𝕏' => 'X',\n  '𝕐' => 'Y',\n  '𝕒' => 'a',\n  '𝕓' => 'b',\n  '𝕔' => 'c',\n  '𝕕' => 'd',\n  '𝕖' => 'e',\n  '𝕗' => 'f',\n  '𝕘' => 'g',\n  '𝕙' => 'h',\n  '𝕚' => 'i',\n  '𝕛' => 'j',\n  '𝕜' => 'k',\n  '𝕝' => 'l',\n  '𝕞' => 'm',\n  '𝕟' => 'n',\n  '𝕠' => 'o',\n  '𝕡' => 'p',\n  '𝕢' => 'q',\n  '𝕣' => 'r',\n  '𝕤' => 's',\n  '𝕥' => 't',\n  '𝕦' => 'u',\n  '𝕧' => 'v',\n  '𝕨' => 'w',\n  '𝕩' => 'x',\n  '𝕪' => 'y',\n  '𝕫' => 'z',\n  '𝕬' => 'A',\n  '𝕭' => 'B',\n  '𝕮' => 'C',\n  '𝕯' => 'D',\n  '𝕰' => 'E',\n  '𝕱' => 'F',\n  '𝕲' => 'G',\n  '𝕳' => 'H',\n  '𝕴' => 'I',\n  '𝕵' => 'J',\n  '𝕶' => 'K',\n  '𝕷' => 'L',\n  '𝕸' => 'M',\n  '𝕹' => 'N',\n  '𝕺' => 'O',\n  '𝕻' => 'P',\n  '𝕼' => 'Q',\n  '𝕽' => 'R',\n  '𝕾' => 'S',\n  '𝕿' => 'T',\n  '𝖀' => 'U',\n  '𝖁' => 'V',\n  '𝖂' => 'W',\n  '𝖃' => 'X',\n  '𝖄' => 'Y',\n  '𝖅' => 'Z',\n  '𝖆' => 'a',\n  '𝖇' => 'b',\n  '𝖈' => 'c',\n  '𝖉' => 'd',\n  '𝖊' => 'e',\n  '𝖋' => 'f',\n  '𝖌' => 'g',\n  '𝖍' => 'h',\n  '𝖎' => 'i',\n  '𝖏' => 'j',\n  '𝖐' => 'k',\n  '𝖑' => 'l',\n  '𝖒' => 'm',\n  '𝖓' => 'n',\n  '𝖔' => 'o',\n  '𝖕' => 'p',\n  '𝖖' => 'q',\n  '𝖗' => 'r',\n  '𝖘' => 's',\n  '𝖙' => 't',\n  '𝖚' => 'u',\n  '𝖛' => 'v',\n  '𝖜' => 'w',\n  '𝖝' => 'x',\n  '𝖞' => 'y',\n  '𝖟' => 'z',\n  '𝖠' => 'A',\n  '𝖡' => 'B',\n  '𝖢' => 'C',\n  '𝖣' => 'D',\n  '𝖤' => 'E',\n  '𝖥' => 'F',\n  '𝖦' => 'G',\n  '𝖧' => 'H',\n  '𝖨' => 'I',\n  '𝖩' => 'J',\n  '𝖪' => 'K',\n  '𝖫' => 'L',\n  '𝖬' => 'M',\n  '𝖭' => 'N',\n  '𝖮' => 'O',\n  '𝖯' => 'P',\n  '𝖰' => 'Q',\n  '𝖱' => 'R',\n  '𝖲' => 'S',\n  '𝖳' => 'T',\n  '𝖴' => 'U',\n  '𝖵' => 'V',\n  '𝖶' => 'W',\n  '𝖷' => 'X',\n  '𝖸' => 'Y',\n  '𝖹' => 'Z',\n  '𝖺' => 'a',\n  '𝖻' => 'b',\n  '𝖼' => 'c',\n  '𝖽' => 'd',\n  '𝖾' => 'e',\n  '𝖿' => 'f',\n  '𝗀' => 'g',\n  '𝗁' => 'h',\n  '𝗂' => 'i',\n  '𝗃' => 'j',\n  '𝗄' => 'k',\n  '𝗅' => 'l',\n  '𝗆' => 'm',\n  '𝗇' => 'n',\n  '𝗈' => 'o',\n  '𝗉' => 'p',\n  '𝗊' => 'q',\n  '𝗋' => 'r',\n  '𝗌' => 's',\n  '𝗍' => 't',\n  '𝗎' => 'u',\n  '𝗏' => 'v',\n  '𝗐' => 'w',\n  '𝗑' => 'x',\n  '𝗒' => 'y',\n  '𝗓' => 'z',\n  '𝗔' => 'A',\n  '𝗕' => 'B',\n  '𝗖' => 'C',\n  '𝗗' => 'D',\n  '𝗘' => 'E',\n  '𝗙' => 'F',\n  '𝗚' => 'G',\n  '𝗛' => 'H',\n  '𝗜' => 'I',\n  '𝗝' => 'J',\n  '𝗞' => 'K',\n  '𝗟' => 'L',\n  '𝗠' => 'M',\n  '𝗡' => 'N',\n  '𝗢' => 'O',\n  '𝗣' => 'P',\n  '𝗤' => 'Q',\n  '𝗥' => 'R',\n  '𝗦' => 'S',\n  '𝗧' => 'T',\n  '𝗨' => 'U',\n  '𝗩' => 'V',\n  '𝗪' => 'W',\n  '𝗫' => 'X',\n  '𝗬' => 'Y',\n  '𝗭' => 'Z',\n  '𝗮' => 'a',\n  '𝗯' => 'b',\n  '𝗰' => 'c',\n  '𝗱' => 'd',\n  '𝗲' => 'e',\n  '𝗳' => 'f',\n  '𝗴' => 'g',\n  '𝗵' => 'h',\n  '𝗶' => 'i',\n  '𝗷' => 'j',\n  '𝗸' => 'k',\n  '𝗹' => 'l',\n  '𝗺' => 'm',\n  '𝗻' => 'n',\n  '𝗼' => 'o',\n  '𝗽' => 'p',\n  '𝗾' => 'q',\n  '𝗿' => 'r',\n  '𝘀' => 's',\n  '𝘁' => 't',\n  '𝘂' => 'u',\n  '𝘃' => 'v',\n  '𝘄' => 'w',\n  '𝘅' => 'x',\n  '𝘆' => 'y',\n  '𝘇' => 'z',\n  '𝘈' => 'A',\n  '𝘉' => 'B',\n  '𝘊' => 'C',\n  '𝘋' => 'D',\n  '𝘌' => 'E',\n  '𝘍' => 'F',\n  '𝘎' => 'G',\n  '𝘏' => 'H',\n  '𝘐' => 'I',\n  '𝘑' => 'J',\n  '𝘒' => 'K',\n  '𝘓' => 'L',\n  '𝘔' => 'M',\n  '𝘕' => 'N',\n  '𝘖' => 'O',\n  '𝘗' => 'P',\n  '𝘘' => 'Q',\n  '𝘙' => 'R',\n  '𝘚' => 'S',\n  '𝘛' => 'T',\n  '𝘜' => 'U',\n  '𝘝' => 'V',\n  '𝘞' => 'W',\n  '𝘟' => 'X',\n  '𝘠' => 'Y',\n  '𝘡' => 'Z',\n  '𝘢' => 'a',\n  '𝘣' => 'b',\n  '𝘤' => 'c',\n  '𝘥' => 'd',\n  '𝘦' => 'e',\n  '𝘧' => 'f',\n  '𝘨' => 'g',\n  '𝘩' => 'h',\n  '𝘪' => 'i',\n  '𝘫' => 'j',\n  '𝘬' => 'k',\n  '𝘭' => 'l',\n  '𝘮' => 'm',\n  '𝘯' => 'n',\n  '𝘰' => 'o',\n  '𝘱' => 'p',\n  '𝘲' => 'q',\n  '𝘳' => 'r',\n  '𝘴' => 's',\n  '𝘵' => 't',\n  '𝘶' => 'u',\n  '𝘷' => 'v',\n  '𝘸' => 'w',\n  '𝘹' => 'x',\n  '𝘺' => 'y',\n  '𝘻' => 'z',\n  '𝘼' => 'A',\n  '𝘽' => 'B',\n  '𝘾' => 'C',\n  '𝘿' => 'D',\n  '𝙀' => 'E',\n  '𝙁' => 'F',\n  '𝙂' => 'G',\n  '𝙃' => 'H',\n  '𝙄' => 'I',\n  '𝙅' => 'J',\n  '𝙆' => 'K',\n  '𝙇' => 'L',\n  '𝙈' => 'M',\n  '𝙉' => 'N',\n  '𝙊' => 'O',\n  '𝙋' => 'P',\n  '𝙌' => 'Q',\n  '𝙍' => 'R',\n  '𝙎' => 'S',\n  '𝙏' => 'T',\n  '𝙐' => 'U',\n  '𝙑' => 'V',\n  '𝙒' => 'W',\n  '𝙓' => 'X',\n  '𝙔' => 'Y',\n  '𝙕' => 'Z',\n  '𝙖' => 'a',\n  '𝙗' => 'b',\n  '𝙘' => 'c',\n  '𝙙' => 'd',\n  '𝙚' => 'e',\n  '𝙛' => 'f',\n  '𝙜' => 'g',\n  '𝙝' => 'h',\n  '𝙞' => 'i',\n  '𝙟' => 'j',\n  '𝙠' => 'k',\n  '𝙡' => 'l',\n  '𝙢' => 'm',\n  '𝙣' => 'n',\n  '𝙤' => 'o',\n  '𝙥' => 'p',\n  '𝙦' => 'q',\n  '𝙧' => 'r',\n  '𝙨' => 's',\n  '𝙩' => 't',\n  '𝙪' => 'u',\n  '𝙫' => 'v',\n  '𝙬' => 'w',\n  '𝙭' => 'x',\n  '𝙮' => 'y',\n  '𝙯' => 'z',\n  '𝙰' => 'A',\n  '𝙱' => 'B',\n  '𝙲' => 'C',\n  '𝙳' => 'D',\n  '𝙴' => 'E',\n  '𝙵' => 'F',\n  '𝙶' => 'G',\n  '𝙷' => 'H',\n  '𝙸' => 'I',\n  '𝙹' => 'J',\n  '𝙺' => 'K',\n  '𝙻' => 'L',\n  '𝙼' => 'M',\n  '𝙽' => 'N',\n  '𝙾' => 'O',\n  '𝙿' => 'P',\n  '𝚀' => 'Q',\n  '𝚁' => 'R',\n  '𝚂' => 'S',\n  '𝚃' => 'T',\n  '𝚄' => 'U',\n  '𝚅' => 'V',\n  '𝚆' => 'W',\n  '𝚇' => 'X',\n  '𝚈' => 'Y',\n  '𝚉' => 'Z',\n  '𝚊' => 'a',\n  '𝚋' => 'b',\n  '𝚌' => 'c',\n  '𝚍' => 'd',\n  '𝚎' => 'e',\n  '𝚏' => 'f',\n  '𝚐' => 'g',\n  '𝚑' => 'h',\n  '𝚒' => 'i',\n  '𝚓' => 'j',\n  '𝚔' => 'k',\n  '𝚕' => 'l',\n  '𝚖' => 'm',\n  '𝚗' => 'n',\n  '𝚘' => 'o',\n  '𝚙' => 'p',\n  '𝚚' => 'q',\n  '𝚛' => 'r',\n  '𝚜' => 's',\n  '𝚝' => 't',\n  '𝚞' => 'u',\n  '𝚟' => 'v',\n  '𝚠' => 'w',\n  '𝚡' => 'x',\n  '𝚢' => 'y',\n  '𝚣' => 'z',\n  '𝚤' => 'ı',\n  '𝚥' => 'ȷ',\n  '𝚨' => 'Α',\n  '𝚩' => 'Β',\n  '𝚪' => 'Γ',\n  '𝚫' => 'Δ',\n  '𝚬' => 'Ε',\n  '𝚭' => 'Ζ',\n  '𝚮' => 'Η',\n  '𝚯' => 'Θ',\n  '𝚰' => 'Ι',\n  '𝚱' => 'Κ',\n  '𝚲' => 'Λ',\n  '𝚳' => 'Μ',\n  '𝚴' => 'Ν',\n  '𝚵' => 'Ξ',\n  '𝚶' => 'Ο',\n  '𝚷' => 'Π',\n  '𝚸' => 'Ρ',\n  '𝚹' => 'Θ',\n  '𝚺' => 'Σ',\n  '𝚻' => 'Τ',\n  '𝚼' => 'Υ',\n  '𝚽' => 'Φ',\n  '𝚾' => 'Χ',\n  '𝚿' => 'Ψ',\n  '𝛀' => 'Ω',\n  '𝛁' => '∇',\n  '𝛂' => 'α',\n  '𝛃' => 'β',\n  '𝛄' => 'γ',\n  '𝛅' => 'δ',\n  '𝛆' => 'ε',\n  '𝛇' => 'ζ',\n  '𝛈' => 'η',\n  '𝛉' => 'θ',\n  '𝛊' => 'ι',\n  '𝛋' => 'κ',\n  '𝛌' => 'λ',\n  '𝛍' => 'μ',\n  '𝛎' => 'ν',\n  '𝛏' => 'ξ',\n  '𝛐' => 'ο',\n  '𝛑' => 'π',\n  '𝛒' => 'ρ',\n  '𝛓' => 'ς',\n  '𝛔' => 'σ',\n  '𝛕' => 'τ',\n  '𝛖' => 'υ',\n  '𝛗' => 'φ',\n  '𝛘' => 'χ',\n  '𝛙' => 'ψ',\n  '𝛚' => 'ω',\n  '𝛛' => '∂',\n  '𝛜' => 'ε',\n  '𝛝' => 'θ',\n  '𝛞' => 'κ',\n  '𝛟' => 'φ',\n  '𝛠' => 'ρ',\n  '𝛡' => 'π',\n  '𝛢' => 'Α',\n  '𝛣' => 'Β',\n  '𝛤' => 'Γ',\n  '𝛥' => 'Δ',\n  '𝛦' => 'Ε',\n  '𝛧' => 'Ζ',\n  '𝛨' => 'Η',\n  '𝛩' => 'Θ',\n  '𝛪' => 'Ι',\n  '𝛫' => 'Κ',\n  '𝛬' => 'Λ',\n  '𝛭' => 'Μ',\n  '𝛮' => 'Ν',\n  '𝛯' => 'Ξ',\n  '𝛰' => 'Ο',\n  '𝛱' => 'Π',\n  '𝛲' => 'Ρ',\n  '𝛳' => 'Θ',\n  '𝛴' => 'Σ',\n  '𝛵' => 'Τ',\n  '𝛶' => 'Υ',\n  '𝛷' => 'Φ',\n  '𝛸' => 'Χ',\n  '𝛹' => 'Ψ',\n  '𝛺' => 'Ω',\n  '𝛻' => '∇',\n  '𝛼' => 'α',\n  '𝛽' => 'β',\n  '𝛾' => 'γ',\n  '𝛿' => 'δ',\n  '𝜀' => 'ε',\n  '𝜁' => 'ζ',\n  '𝜂' => 'η',\n  '𝜃' => 'θ',\n  '𝜄' => 'ι',\n  '𝜅' => 'κ',\n  '𝜆' => 'λ',\n  '𝜇' => 'μ',\n  '𝜈' => 'ν',\n  '𝜉' => 'ξ',\n  '𝜊' => 'ο',\n  '𝜋' => 'π',\n  '𝜌' => 'ρ',\n  '𝜍' => 'ς',\n  '𝜎' => 'σ',\n  '𝜏' => 'τ',\n  '𝜐' => 'υ',\n  '𝜑' => 'φ',\n  '𝜒' => 'χ',\n  '𝜓' => 'ψ',\n  '𝜔' => 'ω',\n  '𝜕' => '∂',\n  '𝜖' => 'ε',\n  '𝜗' => 'θ',\n  '𝜘' => 'κ',\n  '𝜙' => 'φ',\n  '𝜚' => 'ρ',\n  '𝜛' => 'π',\n  '𝜜' => 'Α',\n  '𝜝' => 'Β',\n  '𝜞' => 'Γ',\n  '𝜟' => 'Δ',\n  '𝜠' => 'Ε',\n  '𝜡' => 'Ζ',\n  '𝜢' => 'Η',\n  '𝜣' => 'Θ',\n  '𝜤' => 'Ι',\n  '𝜥' => 'Κ',\n  '𝜦' => 'Λ',\n  '𝜧' => 'Μ',\n  '𝜨' => 'Ν',\n  '𝜩' => 'Ξ',\n  '𝜪' => 'Ο',\n  '𝜫' => 'Π',\n  '𝜬' => 'Ρ',\n  '𝜭' => 'Θ',\n  '𝜮' => 'Σ',\n  '𝜯' => 'Τ',\n  '𝜰' => 'Υ',\n  '𝜱' => 'Φ',\n  '𝜲' => 'Χ',\n  '𝜳' => 'Ψ',\n  '𝜴' => 'Ω',\n  '𝜵' => '∇',\n  '𝜶' => 'α',\n  '𝜷' => 'β',\n  '𝜸' => 'γ',\n  '𝜹' => 'δ',\n  '𝜺' => 'ε',\n  '𝜻' => 'ζ',\n  '𝜼' => 'η',\n  '𝜽' => 'θ',\n  '𝜾' => 'ι',\n  '𝜿' => 'κ',\n  '𝝀' => 'λ',\n  '𝝁' => 'μ',\n  '𝝂' => 'ν',\n  '𝝃' => 'ξ',\n  '𝝄' => 'ο',\n  '𝝅' => 'π',\n  '𝝆' => 'ρ',\n  '𝝇' => 'ς',\n  '𝝈' => 'σ',\n  '𝝉' => 'τ',\n  '𝝊' => 'υ',\n  '𝝋' => 'φ',\n  '𝝌' => 'χ',\n  '𝝍' => 'ψ',\n  '𝝎' => 'ω',\n  '𝝏' => '∂',\n  '𝝐' => 'ε',\n  '𝝑' => 'θ',\n  '𝝒' => 'κ',\n  '𝝓' => 'φ',\n  '𝝔' => 'ρ',\n  '𝝕' => 'π',\n  '𝝖' => 'Α',\n  '𝝗' => 'Β',\n  '𝝘' => 'Γ',\n  '𝝙' => 'Δ',\n  '𝝚' => 'Ε',\n  '𝝛' => 'Ζ',\n  '𝝜' => 'Η',\n  '𝝝' => 'Θ',\n  '𝝞' => 'Ι',\n  '𝝟' => 'Κ',\n  '𝝠' => 'Λ',\n  '𝝡' => 'Μ',\n  '𝝢' => 'Ν',\n  '𝝣' => 'Ξ',\n  '𝝤' => 'Ο',\n  '𝝥' => 'Π',\n  '𝝦' => 'Ρ',\n  '𝝧' => 'Θ',\n  '𝝨' => 'Σ',\n  '𝝩' => 'Τ',\n  '𝝪' => 'Υ',\n  '𝝫' => 'Φ',\n  '𝝬' => 'Χ',\n  '𝝭' => 'Ψ',\n  '𝝮' => 'Ω',\n  '𝝯' => '∇',\n  '𝝰' => 'α',\n  '𝝱' => 'β',\n  '𝝲' => 'γ',\n  '𝝳' => 'δ',\n  '𝝴' => 'ε',\n  '𝝵' => 'ζ',\n  '𝝶' => 'η',\n  '𝝷' => 'θ',\n  '𝝸' => 'ι',\n  '𝝹' => 'κ',\n  '𝝺' => 'λ',\n  '𝝻' => 'μ',\n  '𝝼' => 'ν',\n  '𝝽' => 'ξ',\n  '𝝾' => 'ο',\n  '𝝿' => 'π',\n  '𝞀' => 'ρ',\n  '𝞁' => 'ς',\n  '𝞂' => 'σ',\n  '𝞃' => 'τ',\n  '𝞄' => 'υ',\n  '𝞅' => 'φ',\n  '𝞆' => 'χ',\n  '𝞇' => 'ψ',\n  '𝞈' => 'ω',\n  '𝞉' => '∂',\n  '𝞊' => 'ε',\n  '𝞋' => 'θ',\n  '𝞌' => 'κ',\n  '𝞍' => 'φ',\n  '𝞎' => 'ρ',\n  '𝞏' => 'π',\n  '𝞐' => 'Α',\n  '𝞑' => 'Β',\n  '𝞒' => 'Γ',\n  '𝞓' => 'Δ',\n  '𝞔' => 'Ε',\n  '𝞕' => 'Ζ',\n  '𝞖' => 'Η',\n  '𝞗' => 'Θ',\n  '𝞘' => 'Ι',\n  '𝞙' => 'Κ',\n  '𝞚' => 'Λ',\n  '𝞛' => 'Μ',\n  '𝞜' => 'Ν',\n  '𝞝' => 'Ξ',\n  '𝞞' => 'Ο',\n  '𝞟' => 'Π',\n  '𝞠' => 'Ρ',\n  '𝞡' => 'Θ',\n  '𝞢' => 'Σ',\n  '𝞣' => 'Τ',\n  '𝞤' => 'Υ',\n  '𝞥' => 'Φ',\n  '𝞦' => 'Χ',\n  '𝞧' => 'Ψ',\n  '𝞨' => 'Ω',\n  '𝞩' => '∇',\n  '𝞪' => 'α',\n  '𝞫' => 'β',\n  '𝞬' => 'γ',\n  '𝞭' => 'δ',\n  '𝞮' => 'ε',\n  '𝞯' => 'ζ',\n  '𝞰' => 'η',\n  '𝞱' => 'θ',\n  '𝞲' => 'ι',\n  '𝞳' => 'κ',\n  '𝞴' => 'λ',\n  '𝞵' => 'μ',\n  '𝞶' => 'ν',\n  '𝞷' => 'ξ',\n  '𝞸' => 'ο',\n  '𝞹' => 'π',\n  '𝞺' => 'ρ',\n  '𝞻' => 'ς',\n  '𝞼' => 'σ',\n  '𝞽' => 'τ',\n  '𝞾' => 'υ',\n  '𝞿' => 'φ',\n  '𝟀' => 'χ',\n  '𝟁' => 'ψ',\n  '𝟂' => 'ω',\n  '𝟃' => '∂',\n  '𝟄' => 'ε',\n  '𝟅' => 'θ',\n  '𝟆' => 'κ',\n  '𝟇' => 'φ',\n  '𝟈' => 'ρ',\n  '𝟉' => 'π',\n  '𝟊' => 'Ϝ',\n  '𝟋' => 'ϝ',\n  '𝟎' => '0',\n  '𝟏' => '1',\n  '𝟐' => '2',\n  '𝟑' => '3',\n  '𝟒' => '4',\n  '𝟓' => '5',\n  '𝟔' => '6',\n  '𝟕' => '7',\n  '𝟖' => '8',\n  '𝟗' => '9',\n  '𝟘' => '0',\n  '𝟙' => '1',\n  '𝟚' => '2',\n  '𝟛' => '3',\n  '𝟜' => '4',\n  '𝟝' => '5',\n  '𝟞' => '6',\n  '𝟟' => '7',\n  '𝟠' => '8',\n  '𝟡' => '9',\n  '𝟢' => '0',\n  '𝟣' => '1',\n  '𝟤' => '2',\n  '𝟥' => '3',\n  '𝟦' => '4',\n  '𝟧' => '5',\n  '𝟨' => '6',\n  '𝟩' => '7',\n  '𝟪' => '8',\n  '𝟫' => '9',\n  '𝟬' => '0',\n  '𝟭' => '1',\n  '𝟮' => '2',\n  '𝟯' => '3',\n  '𝟰' => '4',\n  '𝟱' => '5',\n  '𝟲' => '6',\n  '𝟳' => '7',\n  '𝟴' => '8',\n  '𝟵' => '9',\n  '𝟶' => '0',\n  '𝟷' => '1',\n  '𝟸' => '2',\n  '𝟹' => '3',\n  '𝟺' => '4',\n  '𝟻' => '5',\n  '𝟼' => '6',\n  '𝟽' => '7',\n  '𝟾' => '8',\n  '𝟿' => '9',\n  '𞸀' => 'ا',\n  '𞸁' => 'ب',\n  '𞸂' => 'ج',\n  '𞸃' => 'د',\n  '𞸅' => 'و',\n  '𞸆' => 'ز',\n  '𞸇' => 'ح',\n  '𞸈' => 'ط',\n  '𞸉' => 'ي',\n  '𞸊' => 'ك',\n  '𞸋' => 'ل',\n  '𞸌' => 'م',\n  '𞸍' => 'ن',\n  '𞸎' => 'س',\n  '𞸏' => 'ع',\n  '𞸐' => 'ف',\n  '𞸑' => 'ص',\n  '𞸒' => 'ق',\n  '𞸓' => 'ر',\n  '𞸔' => 'ش',\n  '𞸕' => 'ت',\n  '𞸖' => 'ث',\n  '𞸗' => 'خ',\n  '𞸘' => 'ذ',\n  '𞸙' => 'ض',\n  '𞸚' => 'ظ',\n  '𞸛' => 'غ',\n  '𞸜' => 'ٮ',\n  '𞸝' => 'ں',\n  '𞸞' => 'ڡ',\n  '𞸟' => 'ٯ',\n  '𞸡' => 'ب',\n  '𞸢' => 'ج',\n  '𞸤' => 'ه',\n  '𞸧' => 'ح',\n  '𞸩' => 'ي',\n  '𞸪' => 'ك',\n  '𞸫' => 'ل',\n  '𞸬' => 'م',\n  '𞸭' => 'ن',\n  '𞸮' => 'س',\n  '𞸯' => 'ع',\n  '𞸰' => 'ف',\n  '𞸱' => 'ص',\n  '𞸲' => 'ق',\n  '𞸴' => 'ش',\n  '𞸵' => 'ت',\n  '𞸶' => 'ث',\n  '𞸷' => 'خ',\n  '𞸹' => 'ض',\n  '𞸻' => 'غ',\n  '𞹂' => 'ج',\n  '𞹇' => 'ح',\n  '𞹉' => 'ي',\n  '𞹋' => 'ل',\n  '𞹍' => 'ن',\n  '𞹎' => 'س',\n  '𞹏' => 'ع',\n  '𞹑' => 'ص',\n  '𞹒' => 'ق',\n  '𞹔' => 'ش',\n  '𞹗' => 'خ',\n  '𞹙' => 'ض',\n  '𞹛' => 'غ',\n  '𞹝' => 'ں',\n  '𞹟' => 'ٯ',\n  '𞹡' => 'ب',\n  '𞹢' => 'ج',\n  '𞹤' => 'ه',\n  '𞹧' => 'ح',\n  '𞹨' => 'ط',\n  '𞹩' => 'ي',\n  '𞹪' => 'ك',\n  '𞹬' => 'م',\n  '𞹭' => 'ن',\n  '𞹮' => 'س',\n  '𞹯' => 'ع',\n  '𞹰' => 'ف',\n  '𞹱' => 'ص',\n  '𞹲' => 'ق',\n  '𞹴' => 'ش',\n  '𞹵' => 'ت',\n  '𞹶' => 'ث',\n  '𞹷' => 'خ',\n  '𞹹' => 'ض',\n  '𞹺' => 'ظ',\n  '𞹻' => 'غ',\n  '𞹼' => 'ٮ',\n  '𞹾' => 'ڡ',\n  '𞺀' => 'ا',\n  '𞺁' => 'ب',\n  '𞺂' => 'ج',\n  '𞺃' => 'د',\n  '𞺄' => 'ه',\n  '𞺅' => 'و',\n  '𞺆' => 'ز',\n  '𞺇' => 'ح',\n  '𞺈' => 'ط',\n  '𞺉' => 'ي',\n  '𞺋' => 'ل',\n  '𞺌' => 'م',\n  '𞺍' => 'ن',\n  '𞺎' => 'س',\n  '𞺏' => 'ع',\n  '𞺐' => 'ف',\n  '𞺑' => 'ص',\n  '𞺒' => 'ق',\n  '𞺓' => 'ر',\n  '𞺔' => 'ش',\n  '𞺕' => 'ت',\n  '𞺖' => 'ث',\n  '𞺗' => 'خ',\n  '𞺘' => 'ذ',\n  '𞺙' => 'ض',\n  '𞺚' => 'ظ',\n  '𞺛' => 'غ',\n  '𞺡' => 'ب',\n  '𞺢' => 'ج',\n  '𞺣' => 'د',\n  '𞺥' => 'و',\n  '𞺦' => 'ز',\n  '𞺧' => 'ح',\n  '𞺨' => 'ط',\n  '𞺩' => 'ي',\n  '𞺫' => 'ل',\n  '𞺬' => 'م',\n  '𞺭' => 'ن',\n  '𞺮' => 'س',\n  '𞺯' => 'ع',\n  '𞺰' => 'ف',\n  '𞺱' => 'ص',\n  '𞺲' => 'ق',\n  '𞺳' => 'ر',\n  '𞺴' => 'ش',\n  '𞺵' => 'ت',\n  '𞺶' => 'ث',\n  '𞺷' => 'خ',\n  '𞺸' => 'ذ',\n  '𞺹' => 'ض',\n  '𞺺' => 'ظ',\n  '𞺻' => 'غ',\n  '🄀' => '0.',\n  '🄁' => '0,',\n  '🄂' => '1,',\n  '🄃' => '2,',\n  '🄄' => '3,',\n  '🄅' => '4,',\n  '🄆' => '5,',\n  '🄇' => '6,',\n  '🄈' => '7,',\n  '🄉' => '8,',\n  '🄊' => '9,',\n  '🄐' => '(A)',\n  '🄑' => '(B)',\n  '🄒' => '(C)',\n  '🄓' => '(D)',\n  '🄔' => '(E)',\n  '🄕' => '(F)',\n  '🄖' => '(G)',\n  '🄗' => '(H)',\n  '🄘' => '(I)',\n  '🄙' => '(J)',\n  '🄚' => '(K)',\n  '🄛' => '(L)',\n  '🄜' => '(M)',\n  '🄝' => '(N)',\n  '🄞' => '(O)',\n  '🄟' => '(P)',\n  '🄠' => '(Q)',\n  '🄡' => '(R)',\n  '🄢' => '(S)',\n  '🄣' => '(T)',\n  '🄤' => '(U)',\n  '🄥' => '(V)',\n  '🄦' => '(W)',\n  '🄧' => '(X)',\n  '🄨' => '(Y)',\n  '🄩' => '(Z)',\n  '🄪' => '〔S〕',\n  '🄫' => 'C',\n  '🄬' => 'R',\n  '🄭' => 'CD',\n  '🄮' => 'WZ',\n  '🄰' => 'A',\n  '🄱' => 'B',\n  '🄲' => 'C',\n  '🄳' => 'D',\n  '🄴' => 'E',\n  '🄵' => 'F',\n  '🄶' => 'G',\n  '🄷' => 'H',\n  '🄸' => 'I',\n  '🄹' => 'J',\n  '🄺' => 'K',\n  '🄻' => 'L',\n  '🄼' => 'M',\n  '🄽' => 'N',\n  '🄾' => 'O',\n  '🄿' => 'P',\n  '🅀' => 'Q',\n  '🅁' => 'R',\n  '🅂' => 'S',\n  '🅃' => 'T',\n  '🅄' => 'U',\n  '🅅' => 'V',\n  '🅆' => 'W',\n  '🅇' => 'X',\n  '🅈' => 'Y',\n  '🅉' => 'Z',\n  '🅊' => 'HV',\n  '🅋' => 'MV',\n  '🅌' => 'SD',\n  '🅍' => 'SS',\n  '🅎' => 'PPV',\n  '🅏' => 'WC',\n  '🅪' => 'MC',\n  '🅫' => 'MD',\n  '🅬' => 'MR',\n  '🆐' => 'DJ',\n  '🈀' => 'ほか',\n  '🈁' => 'ココ',\n  '🈂' => 'サ',\n  '🈐' => '手',\n  '🈑' => '字',\n  '🈒' => '双',\n  '🈓' => 'デ',\n  '🈔' => '二',\n  '🈕' => '多',\n  '🈖' => '解',\n  '🈗' => '天',\n  '🈘' => '交',\n  '🈙' => '映',\n  '🈚' => '無',\n  '🈛' => '料',\n  '🈜' => '前',\n  '🈝' => '後',\n  '🈞' => '再',\n  '🈟' => '新',\n  '🈠' => '初',\n  '🈡' => '終',\n  '🈢' => '生',\n  '🈣' => '販',\n  '🈤' => '声',\n  '🈥' => '吹',\n  '🈦' => '演',\n  '🈧' => '投',\n  '🈨' => '捕',\n  '🈩' => '一',\n  '🈪' => '三',\n  '🈫' => '遊',\n  '🈬' => '左',\n  '🈭' => '中',\n  '🈮' => '右',\n  '🈯' => '指',\n  '🈰' => '走',\n  '🈱' => '打',\n  '🈲' => '禁',\n  '🈳' => '空',\n  '🈴' => '合',\n  '🈵' => '満',\n  '🈶' => '有',\n  '🈷' => '月',\n  '🈸' => '申',\n  '🈹' => '割',\n  '🈺' => '営',\n  '🈻' => '配',\n  '🉀' => '〔本〕',\n  '🉁' => '〔三〕',\n  '🉂' => '〔二〕',\n  '🉃' => '〔安〕',\n  '🉄' => '〔点〕',\n  '🉅' => '〔打〕',\n  '🉆' => '〔盗〕',\n  '🉇' => '〔勝〕',\n  '🉈' => '〔敗〕',\n  '🉐' => '得',\n  '🉑' => '可',\n  '🯰' => '0',\n  '🯱' => '1',\n  '🯲' => '2',\n  '🯳' => '3',\n  '🯴' => '4',\n  '🯵' => '5',\n  '🯶' => '6',\n  '🯷' => '7',\n  '🯸' => '8',\n  '🯹' => '9',\n);\n","vendor/symfony/polyfill-intl-normalizer/Resources/unidata/rawCanonicalDecomposition.php":"<?php\n\nreturn array (\n  'À' => 'À',\n  'Á' => 'Á',\n  'Â' => 'Â',\n  'Ã' => 'Ã',\n  'Ä' => 'Ä',\n  'Å' => 'Å',\n  'Ç' => 'Ç',\n  'È' => 'È',\n  'É' => 'É',\n  'Ê' => 'Ê',\n  'Ë' => 'Ë',\n  'Ì' => 'Ì',\n  'Í' => 'Í',\n  'Î' => 'Î',\n  'Ï' => 'Ï',\n  'Ñ' => 'Ñ',\n  'Ò' => 'Ò',\n  'Ó' => 'Ó',\n  'Ô' => 'Ô',\n  'Õ' => 'Õ',\n  'Ö' => 'Ö',\n  'Ù' => 'Ù',\n  'Ú' => 'Ú',\n  'Û' => 'Û',\n  'Ü' => 'Ü',\n  'Ý' => 'Ý',\n  'à' => 'à',\n  'á' => 'á',\n  'â' => 'â',\n  'ã' => 'ã',\n  'ä' => 'ä',\n  'å' => 'å',\n  'ç' => 'ç',\n  'è' => 'è',\n  'é' => 'é',\n  'ê' => 'ê',\n  'ë' => 'ë',\n  'ì' => 'ì',\n  'í' => 'í',\n  'î' => 'î',\n  'ï' => 'ï',\n  'ñ' => 'ñ',\n  'ò' => 'ò',\n  'ó' => 'ó',\n  'ô' => 'ô',\n  'õ' => 'õ',\n  'ö' => 'ö',\n  'ù' => 'ù',\n  'ú' => 'ú',\n  'û' => 'û',\n  'ü' => 'ü',\n  'ý' => 'ý',\n  'ÿ' => 'ÿ',\n  'Ā' => 'Ā',\n  'ā' => 'ā',\n  'Ă' => 'Ă',\n  'ă' => 'ă',\n  'Ą' => 'Ą',\n  'ą' => 'ą',\n  'Ć' => 'Ć',\n  'ć' => 'ć',\n  'Ĉ' => 'Ĉ',\n  'ĉ' => 'ĉ',\n  'Ċ' => 'Ċ',\n  'ċ' => 'ċ',\n  'Č' => 'Č',\n  'č' => 'č',\n  'Ď' => 'Ď',\n  'ď' => 'ď',\n  'Ē' => 'Ē',\n  'ē' => 'ē',\n  'Ĕ' => 'Ĕ',\n  'ĕ' => 'ĕ',\n  'Ė' => 'Ė',\n  'ė' => 'ė',\n  'Ę' => 'Ę',\n  'ę' => 'ę',\n  'Ě' => 'Ě',\n  'ě' => 'ě',\n  'Ĝ' => 'Ĝ',\n  'ĝ' => 'ĝ',\n  'Ğ' => 'Ğ',\n  'ğ' => 'ğ',\n  'Ġ' => 'Ġ',\n  'ġ' => 'ġ',\n  'Ģ' => 'Ģ',\n  'ģ' => 'ģ',\n  'Ĥ' => 'Ĥ',\n  'ĥ' => 'ĥ',\n  'Ĩ' => 'Ĩ',\n  'ĩ' => 'ĩ',\n  'Ī' => 'Ī',\n  'ī' => 'ī',\n  'Ĭ' => 'Ĭ',\n  'ĭ' => 'ĭ',\n  'Į' => 'Į',\n  'į' => 'į',\n  'İ' => 'İ',\n  'Ĵ' => 'Ĵ',\n  'ĵ' => 'ĵ',\n  'Ķ' => 'Ķ',\n  'ķ' => 'ķ',\n  'Ĺ' => 'Ĺ',\n  'ĺ' => 'ĺ',\n  'Ļ' => 'Ļ',\n  'ļ' => 'ļ',\n  'Ľ' => 'Ľ',\n  'ľ' => 'ľ',\n  'Ń' => 'Ń',\n  'ń' => 'ń',\n  'Ņ' => 'Ņ',\n  'ņ' => 'ņ',\n  'Ň' => 'Ň',\n  'ň' => 'ň',\n  'Ō' => 'Ō',\n  'ō' => 'ō',\n  'Ŏ' => 'Ŏ',\n  'ŏ' => 'ŏ',\n  'Ő' => 'Ő',\n  'ő' => 'ő',\n  'Ŕ' => 'Ŕ',\n  'ŕ' => 'ŕ',\n  'Ŗ' => 'Ŗ',\n  'ŗ' => 'ŗ',\n  'Ř' => 'Ř',\n  'ř' => 'ř',\n  'Ś' => 'Ś',\n  'ś' => 'ś',\n  'Ŝ' => 'Ŝ',\n  'ŝ' => 'ŝ',\n  'Ş' => 'Ş',\n  'ş' => 'ş',\n  'Š' => 'Š',\n  'š' => 'š',\n  'Ţ' => 'Ţ',\n  'ţ' => 'ţ',\n  'Ť' => 'Ť',\n  'ť' => 'ť',\n  'Ũ' => 'Ũ',\n  'ũ' => 'ũ',\n  'Ū' => 'Ū',\n  'ū' => 'ū',\n  'Ŭ' => 'Ŭ',\n  'ŭ' => 'ŭ',\n  'Ů' => 'Ů',\n  'ů' => 'ů',\n  'Ű' => 'Ű',\n  'ű' => 'ű',\n  'Ų' => 'Ų',\n  'ų' => 'ų',\n  'Ŵ' => 'Ŵ',\n  'ŵ' => 'ŵ',\n  'Ŷ' => 'Ŷ',\n  'ŷ' => 'ŷ',\n  'Ÿ' => 'Ÿ',\n  'Ź' => 'Ź',\n  'ź' => 'ź',\n  'Ż' => 'Ż',\n  'ż' => 'ż',\n  'Ž' => 'Ž',\n  'ž' => 'ž',\n  'Ơ' => 'Ơ',\n  'ơ' => 'ơ',\n  'Ư' => 'Ư',\n  'ư' => 'ư',\n  'Ǎ' => 'Ǎ',\n  'ǎ' => 'ǎ',\n  'Ǐ' => 'Ǐ',\n  'ǐ' => 'ǐ',\n  'Ǒ' => 'Ǒ',\n  'ǒ' => 'ǒ',\n  'Ǔ' => 'Ǔ',\n  'ǔ' => 'ǔ',\n  'Ǖ' => 'Ǖ',\n  'ǖ' => 'ǖ',\n  'Ǘ' => 'Ǘ',\n  'ǘ' => 'ǘ',\n  'Ǚ' => 'Ǚ',\n  'ǚ' => 'ǚ',\n  'Ǜ' => 'Ǜ',\n  'ǜ' => 'ǜ',\n  'Ǟ' => 'Ǟ',\n  'ǟ' => 'ǟ',\n  'Ǡ' => 'Ǡ',\n  'ǡ' => 'ǡ',\n  'Ǣ' => 'Ǣ',\n  'ǣ' => 'ǣ',\n  'Ǧ' => 'Ǧ',\n  'ǧ' => 'ǧ',\n  'Ǩ' => 'Ǩ',\n  'ǩ' => 'ǩ',\n  'Ǫ' => 'Ǫ',\n  'ǫ' => 'ǫ',\n  'Ǭ' => 'Ǭ',\n  'ǭ' => 'ǭ',\n  'Ǯ' => 'Ǯ',\n  'ǯ' => 'ǯ',\n  'ǰ' => 'ǰ',\n  'Ǵ' => 'Ǵ',\n  'ǵ' => 'ǵ',\n  'Ǹ' => 'Ǹ',\n  'ǹ' => 'ǹ',\n  'Ǻ' => 'Ǻ',\n  'ǻ' => 'ǻ',\n  'Ǽ' => 'Ǽ',\n  'ǽ' => 'ǽ',\n  'Ǿ' => 'Ǿ',\n  'ǿ' => 'ǿ',\n  'Ȁ' => 'Ȁ',\n  'ȁ' => 'ȁ',\n  'Ȃ' => 'Ȃ',\n  'ȃ' => 'ȃ',\n  'Ȅ' => 'Ȅ',\n  'ȅ' => 'ȅ',\n  'Ȇ' => 'Ȇ',\n  'ȇ' => 'ȇ',\n  'Ȉ' => 'Ȉ',\n  'ȉ' => 'ȉ',\n  'Ȋ' => 'Ȋ',\n  'ȋ' => 'ȋ',\n  'Ȍ' => 'Ȍ',\n  'ȍ' => 'ȍ',\n  'Ȏ' => 'Ȏ',\n  'ȏ' => 'ȏ',\n  'Ȑ' => 'Ȑ',\n  'ȑ' => 'ȑ',\n  'Ȓ' => 'Ȓ',\n  'ȓ' => 'ȓ',\n  'Ȕ' => 'Ȕ',\n  'ȕ' => 'ȕ',\n  'Ȗ' => 'Ȗ',\n  'ȗ' => 'ȗ',\n  'Ș' => 'Ș',\n  'ș' => 'ș',\n  'Ț' => 'Ț',\n  'ț' => 'ț',\n  'Ȟ' => 'Ȟ',\n  'ȟ' => 'ȟ',\n  'Ȧ' => 'Ȧ',\n  'ȧ' => 'ȧ',\n  'Ȩ' => 'Ȩ',\n  'ȩ' => 'ȩ',\n  'Ȫ' => 'Ȫ',\n  'ȫ' => 'ȫ',\n  'Ȭ' => 'Ȭ',\n  'ȭ' => 'ȭ',\n  'Ȯ' => 'Ȯ',\n  'ȯ' => 'ȯ',\n  'Ȱ' => 'Ȱ',\n  'ȱ' => 'ȱ',\n  'Ȳ' => 'Ȳ',\n  'ȳ' => 'ȳ',\n  '̀' => '̀',\n  '́' => '́',\n  '̓' => '̓',\n  '̈́' => '̈́',\n  'ʹ' => 'ʹ',\n  ';' => ';',\n  '΅' => '΅',\n  'Ά' => 'Ά',\n  '·' => '·',\n  'Έ' => 'Έ',\n  'Ή' => 'Ή',\n  'Ί' => 'Ί',\n  'Ό' => 'Ό',\n  'Ύ' => 'Ύ',\n  'Ώ' => 'Ώ',\n  'ΐ' => 'ΐ',\n  'Ϊ' => 'Ϊ',\n  'Ϋ' => 'Ϋ',\n  'ά' => 'ά',\n  'έ' => 'έ',\n  'ή' => 'ή',\n  'ί' => 'ί',\n  'ΰ' => 'ΰ',\n  'ϊ' => 'ϊ',\n  'ϋ' => 'ϋ',\n  'ό' => 'ό',\n  'ύ' => 'ύ',\n  'ώ' => 'ώ',\n  'ϓ' => 'ϓ',\n  'ϔ' => 'ϔ',\n  'Ѐ' => 'Ѐ',\n  'Ё' => 'Ё',\n  'Ѓ' => 'Ѓ',\n  'Ї' => 'Ї',\n  'Ќ' => 'Ќ',\n  'Ѝ' => 'Ѝ',\n  'Ў' => 'Ў',\n  'Й' => 'Й',\n  'й' => 'й',\n  'ѐ' => 'ѐ',\n  'ё' => 'ё',\n  'ѓ' => 'ѓ',\n  'ї' => 'ї',\n  'ќ' => 'ќ',\n  'ѝ' => 'ѝ',\n  'ў' => 'ў',\n  'Ѷ' => 'Ѷ',\n  'ѷ' => 'ѷ',\n  'Ӂ' => 'Ӂ',\n  'ӂ' => 'ӂ',\n  'Ӑ' => 'Ӑ',\n  'ӑ' => 'ӑ',\n  'Ӓ' => 'Ӓ',\n  'ӓ' => 'ӓ',\n  'Ӗ' => 'Ӗ',\n  'ӗ' => 'ӗ',\n  'Ӛ' => 'Ӛ',\n  'ӛ' => 'ӛ',\n  'Ӝ' => 'Ӝ',\n  'ӝ' => 'ӝ',\n  'Ӟ' => 'Ӟ',\n  'ӟ' => 'ӟ',\n  'Ӣ' => 'Ӣ',\n  'ӣ' => 'ӣ',\n  'Ӥ' => 'Ӥ',\n  'ӥ' => 'ӥ',\n  'Ӧ' => 'Ӧ',\n  'ӧ' => 'ӧ',\n  'Ӫ' => 'Ӫ',\n  'ӫ' => 'ӫ',\n  'Ӭ' => 'Ӭ',\n  'ӭ' => 'ӭ',\n  'Ӯ' => 'Ӯ',\n  'ӯ' => 'ӯ',\n  'Ӱ' => 'Ӱ',\n  'ӱ' => 'ӱ',\n  'Ӳ' => 'Ӳ',\n  'ӳ' => 'ӳ',\n  'Ӵ' => 'Ӵ',\n  'ӵ' => 'ӵ',\n  'Ӹ' => 'Ӹ',\n  'ӹ' => 'ӹ',\n  'آ' => 'آ',\n  'أ' => 'أ',\n  'ؤ' => 'ؤ',\n  'إ' => 'إ',\n  'ئ' => 'ئ',\n  'ۀ' => 'ۀ',\n  'ۂ' => 'ۂ',\n  'ۓ' => 'ۓ',\n  'ऩ' => 'ऩ',\n  'ऱ' => 'ऱ',\n  'ऴ' => 'ऴ',\n  'क़' => 'क़',\n  'ख़' => 'ख़',\n  'ग़' => 'ग़',\n  'ज़' => 'ज़',\n  'ड़' => 'ड़',\n  'ढ़' => 'ढ़',\n  'फ़' => 'फ़',\n  'य़' => 'य़',\n  'ো' => 'ো',\n  'ৌ' => 'ৌ',\n  'ড়' => 'ড়',\n  'ঢ়' => 'ঢ়',\n  'য়' => 'য়',\n  'ਲ਼' => 'ਲ਼',\n  'ਸ਼' => 'ਸ਼',\n  'ਖ਼' => 'ਖ਼',\n  'ਗ਼' => 'ਗ਼',\n  'ਜ਼' => 'ਜ਼',\n  'ਫ਼' => 'ਫ਼',\n  'ୈ' => 'ୈ',\n  'ୋ' => 'ୋ',\n  'ୌ' => 'ୌ',\n  'ଡ଼' => 'ଡ଼',\n  'ଢ଼' => 'ଢ଼',\n  'ஔ' => 'ஔ',\n  'ொ' => 'ொ',\n  'ோ' => 'ோ',\n  'ௌ' => 'ௌ',\n  'ై' => 'ై',\n  'ೀ' => 'ೀ',\n  'ೇ' => 'ೇ',\n  'ೈ' => 'ೈ',\n  'ೊ' => 'ೊ',\n  'ೋ' => 'ೋ',\n  'ൊ' => 'ൊ',\n  'ോ' => 'ോ',\n  'ൌ' => 'ൌ',\n  'ේ' => 'ේ',\n  'ො' => 'ො',\n  'ෝ' => 'ෝ',\n  'ෞ' => 'ෞ',\n  'གྷ' => 'གྷ',\n  'ཌྷ' => 'ཌྷ',\n  'དྷ' => 'དྷ',\n  'བྷ' => 'བྷ',\n  'ཛྷ' => 'ཛྷ',\n  'ཀྵ' => 'ཀྵ',\n  'ཱི' => 'ཱི',\n  'ཱུ' => 'ཱུ',\n  'ྲྀ' => 'ྲྀ',\n  'ླྀ' => 'ླྀ',\n  'ཱྀ' => 'ཱྀ',\n  'ྒྷ' => 'ྒྷ',\n  'ྜྷ' => 'ྜྷ',\n  'ྡྷ' => 'ྡྷ',\n  'ྦྷ' => 'ྦྷ',\n  'ྫྷ' => 'ྫྷ',\n  'ྐྵ' => 'ྐྵ',\n  'ဦ' => 'ဦ',\n  'ᬆ' => 'ᬆ',\n  'ᬈ' => 'ᬈ',\n  'ᬊ' => 'ᬊ',\n  'ᬌ' => 'ᬌ',\n  'ᬎ' => 'ᬎ',\n  'ᬒ' => 'ᬒ',\n  'ᬻ' => 'ᬻ',\n  'ᬽ' => 'ᬽ',\n  'ᭀ' => 'ᭀ',\n  'ᭁ' => 'ᭁ',\n  'ᭃ' => 'ᭃ',\n  'Ḁ' => 'Ḁ',\n  'ḁ' => 'ḁ',\n  'Ḃ' => 'Ḃ',\n  'ḃ' => 'ḃ',\n  'Ḅ' => 'Ḅ',\n  'ḅ' => 'ḅ',\n  'Ḇ' => 'Ḇ',\n  'ḇ' => 'ḇ',\n  'Ḉ' => 'Ḉ',\n  'ḉ' => 'ḉ',\n  'Ḋ' => 'Ḋ',\n  'ḋ' => 'ḋ',\n  'Ḍ' => 'Ḍ',\n  'ḍ' => 'ḍ',\n  'Ḏ' => 'Ḏ',\n  'ḏ' => 'ḏ',\n  'Ḑ' => 'Ḑ',\n  'ḑ' => 'ḑ',\n  'Ḓ' => 'Ḓ',\n  'ḓ' => 'ḓ',\n  'Ḕ' => 'Ḕ',\n  'ḕ' => 'ḕ',\n  'Ḗ' => 'Ḗ',\n  'ḗ' => 'ḗ',\n  'Ḙ' => 'Ḙ',\n  'ḙ' => 'ḙ',\n  'Ḛ' => 'Ḛ',\n  'ḛ' => 'ḛ',\n  'Ḝ' => 'Ḝ',\n  'ḝ' => 'ḝ',\n  'Ḟ' => 'Ḟ',\n  'ḟ' => 'ḟ',\n  'Ḡ' => 'Ḡ',\n  'ḡ' => 'ḡ',\n  'Ḣ' => 'Ḣ',\n  'ḣ' => 'ḣ',\n  'Ḥ' => 'Ḥ',\n  'ḥ' => 'ḥ',\n  'Ḧ' => 'Ḧ',\n  'ḧ' => 'ḧ',\n  'Ḩ' => 'Ḩ',\n  'ḩ' => 'ḩ',\n  'Ḫ' => 'Ḫ',\n  'ḫ' => 'ḫ',\n  'Ḭ' => 'Ḭ',\n  'ḭ' => 'ḭ',\n  'Ḯ' => 'Ḯ',\n  'ḯ' => 'ḯ',\n  'Ḱ' => 'Ḱ',\n  'ḱ' => 'ḱ',\n  'Ḳ' => 'Ḳ',\n  'ḳ' => 'ḳ',\n  'Ḵ' => 'Ḵ',\n  'ḵ' => 'ḵ',\n  'Ḷ' => 'Ḷ',\n  'ḷ' => 'ḷ',\n  'Ḹ' => 'Ḹ',\n  'ḹ' => 'ḹ',\n  'Ḻ' => 'Ḻ',\n  'ḻ' => 'ḻ',\n  'Ḽ' => 'Ḽ',\n  'ḽ' => 'ḽ',\n  'Ḿ' => 'Ḿ',\n  'ḿ' => 'ḿ',\n  'Ṁ' => 'Ṁ',\n  'ṁ' => 'ṁ',\n  'Ṃ' => 'Ṃ',\n  'ṃ' => 'ṃ',\n  'Ṅ' => 'Ṅ',\n  'ṅ' => 'ṅ',\n  'Ṇ' => 'Ṇ',\n  'ṇ' => 'ṇ',\n  'Ṉ' => 'Ṉ',\n  'ṉ' => 'ṉ',\n  'Ṋ' => 'Ṋ',\n  'ṋ' => 'ṋ',\n  'Ṍ' => 'Ṍ',\n  'ṍ' => 'ṍ',\n  'Ṏ' => 'Ṏ',\n  'ṏ' => 'ṏ',\n  'Ṑ' => 'Ṑ',\n  'ṑ' => 'ṑ',\n  'Ṓ' => 'Ṓ',\n  'ṓ' => 'ṓ',\n  'Ṕ' => 'Ṕ',\n  'ṕ' => 'ṕ',\n  'Ṗ' => 'Ṗ',\n  'ṗ' => 'ṗ',\n  'Ṙ' => 'Ṙ',\n  'ṙ' => 'ṙ',\n  'Ṛ' => 'Ṛ',\n  'ṛ' => 'ṛ',\n  'Ṝ' => 'Ṝ',\n  'ṝ' => 'ṝ',\n  'Ṟ' => 'Ṟ',\n  'ṟ' => 'ṟ',\n  'Ṡ' => 'Ṡ',\n  'ṡ' => 'ṡ',\n  'Ṣ' => 'Ṣ',\n  'ṣ' => 'ṣ',\n  'Ṥ' => 'Ṥ',\n  'ṥ' => 'ṥ',\n  'Ṧ' => 'Ṧ',\n  'ṧ' => 'ṧ',\n  'Ṩ' => 'Ṩ',\n  'ṩ' => 'ṩ',\n  'Ṫ' => 'Ṫ',\n  'ṫ' => 'ṫ',\n  'Ṭ' => 'Ṭ',\n  'ṭ' => 'ṭ',\n  'Ṯ' => 'Ṯ',\n  'ṯ' => 'ṯ',\n  'Ṱ' => 'Ṱ',\n  'ṱ' => 'ṱ',\n  'Ṳ' => 'Ṳ',\n  'ṳ' => 'ṳ',\n  'Ṵ' => 'Ṵ',\n  'ṵ' => 'ṵ',\n  'Ṷ' => 'Ṷ',\n  'ṷ' => 'ṷ',\n  'Ṹ' => 'Ṹ',\n  'ṹ' => 'ṹ',\n  'Ṻ' => 'Ṻ',\n  'ṻ' => 'ṻ',\n  'Ṽ' => 'Ṽ',\n  'ṽ' => 'ṽ',\n  'Ṿ' => 'Ṿ',\n  'ṿ' => 'ṿ',\n  'Ẁ' => 'Ẁ',\n  'ẁ' => 'ẁ',\n  'Ẃ' => 'Ẃ',\n  'ẃ' => 'ẃ',\n  'Ẅ' => 'Ẅ',\n  'ẅ' => 'ẅ',\n  'Ẇ' => 'Ẇ',\n  'ẇ' => 'ẇ',\n  'Ẉ' => 'Ẉ',\n  'ẉ' => 'ẉ',\n  'Ẋ' => 'Ẋ',\n  'ẋ' => 'ẋ',\n  'Ẍ' => 'Ẍ',\n  'ẍ' => 'ẍ',\n  'Ẏ' => 'Ẏ',\n  'ẏ' => 'ẏ',\n  'Ẑ' => 'Ẑ',\n  'ẑ' => 'ẑ',\n  'Ẓ' => 'Ẓ',\n  'ẓ' => 'ẓ',\n  'Ẕ' => 'Ẕ',\n  'ẕ' => 'ẕ',\n  'ẖ' => 'ẖ',\n  'ẗ' => 'ẗ',\n  'ẘ' => 'ẘ',\n  'ẙ' => 'ẙ',\n  'ẛ' => 'ẛ',\n  'Ạ' => 'Ạ',\n  'ạ' => 'ạ',\n  'Ả' => 'Ả',\n  'ả' => 'ả',\n  'Ấ' => 'Ấ',\n  'ấ' => 'ấ',\n  'Ầ' => 'Ầ',\n  'ầ' => 'ầ',\n  'Ẩ' => 'Ẩ',\n  'ẩ' => 'ẩ',\n  'Ẫ' => 'Ẫ',\n  'ẫ' => 'ẫ',\n  'Ậ' => 'Ậ',\n  'ậ' => 'ậ',\n  'Ắ' => 'Ắ',\n  'ắ' => 'ắ',\n  'Ằ' => 'Ằ',\n  'ằ' => 'ằ',\n  'Ẳ' => 'Ẳ',\n  'ẳ' => 'ẳ',\n  'Ẵ' => 'Ẵ',\n  'ẵ' => 'ẵ',\n  'Ặ' => 'Ặ',\n  'ặ' => 'ặ',\n  'Ẹ' => 'Ẹ',\n  'ẹ' => 'ẹ',\n  'Ẻ' => 'Ẻ',\n  'ẻ' => 'ẻ',\n  'Ẽ' => 'Ẽ',\n  'ẽ' => 'ẽ',\n  'Ế' => 'Ế',\n  'ế' => 'ế',\n  'Ề' => 'Ề',\n  'ề' => 'ề',\n  'Ể' => 'Ể',\n  'ể' => 'ể',\n  'Ễ' => 'Ễ',\n  'ễ' => 'ễ',\n  'Ệ' => 'Ệ',\n  'ệ' => 'ệ',\n  'Ỉ' => 'Ỉ',\n  'ỉ' => 'ỉ',\n  'Ị' => 'Ị',\n  'ị' => 'ị',\n  'Ọ' => 'Ọ',\n  'ọ' => 'ọ',\n  'Ỏ' => 'Ỏ',\n  'ỏ' => 'ỏ',\n  'Ố' => 'Ố',\n  'ố' => 'ố',\n  'Ồ' => 'Ồ',\n  'ồ' => 'ồ',\n  'Ổ' => 'Ổ',\n  'ổ' => 'ổ',\n  'Ỗ' => 'Ỗ',\n  'ỗ' => 'ỗ',\n  'Ộ' => 'Ộ',\n  'ộ' => 'ộ',\n  'Ớ' => 'Ớ',\n  'ớ' => 'ớ',\n  'Ờ' => 'Ờ',\n  'ờ' => 'ờ',\n  'Ở' => 'Ở',\n  'ở' => 'ở',\n  'Ỡ' => 'Ỡ',\n  'ỡ' => 'ỡ',\n  'Ợ' => 'Ợ',\n  'ợ' => 'ợ',\n  'Ụ' => 'Ụ',\n  'ụ' => 'ụ',\n  'Ủ' => 'Ủ',\n  'ủ' => 'ủ',\n  'Ứ' => 'Ứ',\n  'ứ' => 'ứ',\n  'Ừ' => 'Ừ',\n  'ừ' => 'ừ',\n  'Ử' => 'Ử',\n  'ử' => 'ử',\n  'Ữ' => 'Ữ',\n  'ữ' => 'ữ',\n  'Ự' => 'Ự',\n  'ự' => 'ự',\n  'Ỳ' => 'Ỳ',\n  'ỳ' => 'ỳ',\n  'Ỵ' => 'Ỵ',\n  'ỵ' => 'ỵ',\n  'Ỷ' => 'Ỷ',\n  'ỷ' => 'ỷ',\n  'Ỹ' => 'Ỹ',\n  'ỹ' => 'ỹ',\n  'ἀ' => 'ἀ',\n  'ἁ' => 'ἁ',\n  'ἂ' => 'ἂ',\n  'ἃ' => 'ἃ',\n  'ἄ' => 'ἄ',\n  'ἅ' => 'ἅ',\n  'ἆ' => 'ἆ',\n  'ἇ' => 'ἇ',\n  'Ἀ' => 'Ἀ',\n  'Ἁ' => 'Ἁ',\n  'Ἂ' => 'Ἂ',\n  'Ἃ' => 'Ἃ',\n  'Ἄ' => 'Ἄ',\n  'Ἅ' => 'Ἅ',\n  'Ἆ' => 'Ἆ',\n  'Ἇ' => 'Ἇ',\n  'ἐ' => 'ἐ',\n  'ἑ' => 'ἑ',\n  'ἒ' => 'ἒ',\n  'ἓ' => 'ἓ',\n  'ἔ' => 'ἔ',\n  'ἕ' => 'ἕ',\n  'Ἐ' => 'Ἐ',\n  'Ἑ' => 'Ἑ',\n  'Ἒ' => 'Ἒ',\n  'Ἓ' => 'Ἓ',\n  'Ἔ' => 'Ἔ',\n  'Ἕ' => 'Ἕ',\n  'ἠ' => 'ἠ',\n  'ἡ' => 'ἡ',\n  'ἢ' => 'ἢ',\n  'ἣ' => 'ἣ',\n  'ἤ' => 'ἤ',\n  'ἥ' => 'ἥ',\n  'ἦ' => 'ἦ',\n  'ἧ' => 'ἧ',\n  'Ἠ' => 'Ἠ',\n  'Ἡ' => 'Ἡ',\n  'Ἢ' => 'Ἢ',\n  'Ἣ' => 'Ἣ',\n  'Ἤ' => 'Ἤ',\n  'Ἥ' => 'Ἥ',\n  'Ἦ' => 'Ἦ',\n  'Ἧ' => 'Ἧ',\n  'ἰ' => 'ἰ',\n  'ἱ' => 'ἱ',\n  'ἲ' => 'ἲ',\n  'ἳ' => 'ἳ',\n  'ἴ' => 'ἴ',\n  'ἵ' => 'ἵ',\n  'ἶ' => 'ἶ',\n  'ἷ' => 'ἷ',\n  'Ἰ' => 'Ἰ',\n  'Ἱ' => 'Ἱ',\n  'Ἲ' => 'Ἲ',\n  'Ἳ' => 'Ἳ',\n  'Ἴ' => 'Ἴ',\n  'Ἵ' => 'Ἵ',\n  'Ἶ' => 'Ἶ',\n  'Ἷ' => 'Ἷ',\n  'ὀ' => 'ὀ',\n  'ὁ' => 'ὁ',\n  'ὂ' => 'ὂ',\n  'ὃ' => 'ὃ',\n  'ὄ' => 'ὄ',\n  'ὅ' => 'ὅ',\n  'Ὀ' => 'Ὀ',\n  'Ὁ' => 'Ὁ',\n  'Ὂ' => 'Ὂ',\n  'Ὃ' => 'Ὃ',\n  'Ὄ' => 'Ὄ',\n  'Ὅ' => 'Ὅ',\n  'ὐ' => 'ὐ',\n  'ὑ' => 'ὑ',\n  'ὒ' => 'ὒ',\n  'ὓ' => 'ὓ',\n  'ὔ' => 'ὔ',\n  'ὕ' => 'ὕ',\n  'ὖ' => 'ὖ',\n  'ὗ' => 'ὗ',\n  'Ὑ' => 'Ὑ',\n  'Ὓ' => 'Ὓ',\n  'Ὕ' => 'Ὕ',\n  'Ὗ' => 'Ὗ',\n  'ὠ' => 'ὠ',\n  'ὡ' => 'ὡ',\n  'ὢ' => 'ὢ',\n  'ὣ' => 'ὣ',\n  'ὤ' => 'ὤ',\n  'ὥ' => 'ὥ',\n  'ὦ' => 'ὦ',\n  'ὧ' => 'ὧ',\n  'Ὠ' => 'Ὠ',\n  'Ὡ' => 'Ὡ',\n  'Ὢ' => 'Ὢ',\n  'Ὣ' => 'Ὣ',\n  'Ὤ' => 'Ὤ',\n  'Ὥ' => 'Ὥ',\n  'Ὦ' => 'Ὦ',\n  'Ὧ' => 'Ὧ',\n  'ὰ' => 'ὰ',\n  'ά' => 'ά',\n  'ὲ' => 'ὲ',\n  'έ' => 'έ',\n  'ὴ' => 'ὴ',\n  'ή' => 'ή',\n  'ὶ' => 'ὶ',\n  'ί' => 'ί',\n  'ὸ' => 'ὸ',\n  'ό' => 'ό',\n  'ὺ' => 'ὺ',\n  'ύ' => 'ύ',\n  'ὼ' => 'ὼ',\n  'ώ' => 'ώ',\n  'ᾀ' => 'ᾀ',\n  'ᾁ' => 'ᾁ',\n  'ᾂ' => 'ᾂ',\n  'ᾃ' => 'ᾃ',\n  'ᾄ' => 'ᾄ',\n  'ᾅ' => 'ᾅ',\n  'ᾆ' => 'ᾆ',\n  'ᾇ' => 'ᾇ',\n  'ᾈ' => 'ᾈ',\n  'ᾉ' => 'ᾉ',\n  'ᾊ' => 'ᾊ',\n  'ᾋ' => 'ᾋ',\n  'ᾌ' => 'ᾌ',\n  'ᾍ' => 'ᾍ',\n  'ᾎ' => 'ᾎ',\n  'ᾏ' => 'ᾏ',\n  'ᾐ' => 'ᾐ',\n  'ᾑ' => 'ᾑ',\n  'ᾒ' => 'ᾒ',\n  'ᾓ' => 'ᾓ',\n  'ᾔ' => 'ᾔ',\n  'ᾕ' => 'ᾕ',\n  'ᾖ' => 'ᾖ',\n  'ᾗ' => 'ᾗ',\n  'ᾘ' => 'ᾘ',\n  'ᾙ' => 'ᾙ',\n  'ᾚ' => 'ᾚ',\n  'ᾛ' => 'ᾛ',\n  'ᾜ' => 'ᾜ',\n  'ᾝ' => 'ᾝ',\n  'ᾞ' => 'ᾞ',\n  'ᾟ' => 'ᾟ',\n  'ᾠ' => 'ᾠ',\n  'ᾡ' => 'ᾡ',\n  'ᾢ' => 'ᾢ',\n  'ᾣ' => 'ᾣ',\n  'ᾤ' => 'ᾤ',\n  'ᾥ' => 'ᾥ',\n  'ᾦ' => 'ᾦ',\n  'ᾧ' => 'ᾧ',\n  'ᾨ' => 'ᾨ',\n  'ᾩ' => 'ᾩ',\n  'ᾪ' => 'ᾪ',\n  'ᾫ' => 'ᾫ',\n  'ᾬ' => 'ᾬ',\n  'ᾭ' => 'ᾭ',\n  'ᾮ' => 'ᾮ',\n  'ᾯ' => 'ᾯ',\n  'ᾰ' => 'ᾰ',\n  'ᾱ' => 'ᾱ',\n  'ᾲ' => 'ᾲ',\n  'ᾳ' => 'ᾳ',\n  'ᾴ' => 'ᾴ',\n  'ᾶ' => 'ᾶ',\n  'ᾷ' => 'ᾷ',\n  'Ᾰ' => 'Ᾰ',\n  'Ᾱ' => 'Ᾱ',\n  'Ὰ' => 'Ὰ',\n  'Ά' => 'Ά',\n  'ᾼ' => 'ᾼ',\n  'ι' => 'ι',\n  '῁' => '῁',\n  'ῂ' => 'ῂ',\n  'ῃ' => 'ῃ',\n  'ῄ' => 'ῄ',\n  'ῆ' => 'ῆ',\n  'ῇ' => 'ῇ',\n  'Ὲ' => 'Ὲ',\n  'Έ' => 'Έ',\n  'Ὴ' => 'Ὴ',\n  'Ή' => 'Ή',\n  'ῌ' => 'ῌ',\n  '῍' => '῍',\n  '῎' => '῎',\n  '῏' => '῏',\n  'ῐ' => 'ῐ',\n  'ῑ' => 'ῑ',\n  'ῒ' => 'ῒ',\n  'ΐ' => 'ΐ',\n  'ῖ' => 'ῖ',\n  'ῗ' => 'ῗ',\n  'Ῐ' => 'Ῐ',\n  'Ῑ' => 'Ῑ',\n  'Ὶ' => 'Ὶ',\n  'Ί' => 'Ί',\n  '῝' => '῝',\n  '῞' => '῞',\n  '῟' => '῟',\n  'ῠ' => 'ῠ',\n  'ῡ' => 'ῡ',\n  'ῢ' => 'ῢ',\n  'ΰ' => 'ΰ',\n  'ῤ' => 'ῤ',\n  'ῥ' => 'ῥ',\n  'ῦ' => 'ῦ',\n  'ῧ' => 'ῧ',\n  'Ῠ' => 'Ῠ',\n  'Ῡ' => 'Ῡ',\n  'Ὺ' => 'Ὺ',\n  'Ύ' => 'Ύ',\n  'Ῥ' => 'Ῥ',\n  '῭' => '῭',\n  '΅' => '΅',\n  '`' => '`',\n  'ῲ' => 'ῲ',\n  'ῳ' => 'ῳ',\n  'ῴ' => 'ῴ',\n  'ῶ' => 'ῶ',\n  'ῷ' => 'ῷ',\n  'Ὸ' => 'Ὸ',\n  'Ό' => 'Ό',\n  'Ὼ' => 'Ὼ',\n  'Ώ' => 'Ώ',\n  'ῼ' => 'ῼ',\n  '´' => '´',\n  ' ' => ' ',\n  ' ' => ' ',\n  'Ω' => 'Ω',\n  'K' => 'K',\n  'Å' => 'Å',\n  '↚' => '↚',\n  '↛' => '↛',\n  '↮' => '↮',\n  '⇍' => '⇍',\n  '⇎' => '⇎',\n  '⇏' => '⇏',\n  '∄' => '∄',\n  '∉' => '∉',\n  '∌' => '∌',\n  '∤' => '∤',\n  '∦' => '∦',\n  '≁' => '≁',\n  '≄' => '≄',\n  '≇' => '≇',\n  '≉' => '≉',\n  '≠' => '≠',\n  '≢' => '≢',\n  '≭' => '≭',\n  '≮' => '≮',\n  '≯' => '≯',\n  '≰' => '≰',\n  '≱' => '≱',\n  '≴' => '≴',\n  '≵' => '≵',\n  '≸' => '≸',\n  '≹' => '≹',\n  '⊀' => '⊀',\n  '⊁' => '⊁',\n  '⊄' => '⊄',\n  '⊅' => '⊅',\n  '⊈' => '⊈',\n  '⊉' => '⊉',\n  '⊬' => '⊬',\n  '⊭' => '⊭',\n  '⊮' => '⊮',\n  '⊯' => '⊯',\n  '⋠' => '⋠',\n  '⋡' => '⋡',\n  '⋢' => '⋢',\n  '⋣' => '⋣',\n  '⋪' => '⋪',\n  '⋫' => '⋫',\n  '⋬' => '⋬',\n  '⋭' => '⋭',\n  '〈' => '〈',\n  '〉' => '〉',\n  '⫝̸' => '⫝̸',\n  'が' => 'が',\n  'ぎ' => 'ぎ',\n  'ぐ' => 'ぐ',\n  'げ' => 'げ',\n  'ご' => 'ご',\n  'ざ' => 'ざ',\n  'じ' => 'じ',\n  'ず' => 'ず',\n  'ぜ' => 'ぜ',\n  'ぞ' => 'ぞ',\n  'だ' => 'だ',\n  'ぢ' => 'ぢ',\n  'づ' => 'づ',\n  'で' => 'で',\n  'ど' => 'ど',\n  'ば' => 'ば',\n  'ぱ' => 'ぱ',\n  'び' => 'び',\n  'ぴ' => 'ぴ',\n  'ぶ' => 'ぶ',\n  'ぷ' => 'ぷ',\n  'べ' => 'べ',\n  'ぺ' => 'ぺ',\n  'ぼ' => 'ぼ',\n  'ぽ' => 'ぽ',\n  'ゔ' => 'ゔ',\n  'ゞ' => 'ゞ',\n  'ガ' => 'ガ',\n  'ギ' => 'ギ',\n  'グ' => 'グ',\n  'ゲ' => 'ゲ',\n  'ゴ' => 'ゴ',\n  'ザ' => 'ザ',\n  'ジ' => 'ジ',\n  'ズ' => 'ズ',\n  'ゼ' => 'ゼ',\n  'ゾ' => 'ゾ',\n  'ダ' => 'ダ',\n  'ヂ' => 'ヂ',\n  'ヅ' => 'ヅ',\n  'デ' => 'デ',\n  'ド' => 'ド',\n  'バ' => 'バ',\n  'パ' => 'パ',\n  'ビ' => 'ビ',\n  'ピ' => 'ピ',\n  'ブ' => 'ブ',\n  'プ' => 'プ',\n  'ベ' => 'ベ',\n  'ペ' => 'ペ',\n  'ボ' => 'ボ',\n  'ポ' => 'ポ',\n  'ヴ' => 'ヴ',\n  'ヷ' => 'ヷ',\n  'ヸ' => 'ヸ',\n  'ヹ' => 'ヹ',\n  'ヺ' => 'ヺ',\n  'ヾ' => 'ヾ',\n  '豈' => '豈',\n  '更' => '更',\n  '車' => '車',\n  '賈' => '賈',\n  '滑' => '滑',\n  '串' => '串',\n  '句' => '句',\n  '龜' => '龜',\n  '龜' => '龜',\n  '契' => '契',\n  '金' => '金',\n  '喇' => '喇',\n  '奈' => '奈',\n  '懶' => '懶',\n  '癩' => '癩',\n  '羅' => '羅',\n  '蘿' => '蘿',\n  '螺' => '螺',\n  '裸' => '裸',\n  '邏' => '邏',\n  '樂' => '樂',\n  '洛' => '洛',\n  '烙' => '烙',\n  '珞' => '珞',\n  '落' => '落',\n  '酪' => '酪',\n  '駱' => '駱',\n  '亂' => '亂',\n  '卵' => '卵',\n  '欄' => '欄',\n  '爛' => '爛',\n  '蘭' => '蘭',\n  '鸞' => '鸞',\n  '嵐' => '嵐',\n  '濫' => '濫',\n  '藍' => '藍',\n  '襤' => '襤',\n  '拉' => '拉',\n  '臘' => '臘',\n  '蠟' => '蠟',\n  '廊' => '廊',\n  '朗' => '朗',\n  '浪' => '浪',\n  '狼' => '狼',\n  '郎' => '郎',\n  '來' => '來',\n  '冷' => '冷',\n  '勞' => '勞',\n  '擄' => '擄',\n  '櫓' => '櫓',\n  '爐' => '爐',\n  '盧' => '盧',\n  '老' => '老',\n  '蘆' => '蘆',\n  '虜' => '虜',\n  '路' => '路',\n  '露' => '露',\n  '魯' => '魯',\n  '鷺' => '鷺',\n  '碌' => '碌',\n  '祿' => '祿',\n  '綠' => '綠',\n  '菉' => '菉',\n  '錄' => '錄',\n  '鹿' => '鹿',\n  '論' => '論',\n  '壟' => '壟',\n  '弄' => '弄',\n  '籠' => '籠',\n  '聾' => '聾',\n  '牢' => '牢',\n  '磊' => '磊',\n  '賂' => '賂',\n  '雷' => '雷',\n  '壘' => '壘',\n  '屢' => '屢',\n  '樓' => '樓',\n  '淚' => '淚',\n  '漏' => '漏',\n  '累' => '累',\n  '縷' => '縷',\n  '陋' => '陋',\n  '勒' => '勒',\n  '肋' => '肋',\n  '凜' => '凜',\n  '凌' => '凌',\n  '稜' => '稜',\n  '綾' => '綾',\n  '菱' => '菱',\n  '陵' => '陵',\n  '讀' => '讀',\n  '拏' => '拏',\n  '樂' => '樂',\n  '諾' => '諾',\n  '丹' => '丹',\n  '寧' => '寧',\n  '怒' => '怒',\n  '率' => '率',\n  '異' => '異',\n  '北' => '北',\n  '磻' => '磻',\n  '便' => '便',\n  '復' => '復',\n  '不' => '不',\n  '泌' => '泌',\n  '數' => '數',\n  '索' => '索',\n  '參' => '參',\n  '塞' => '塞',\n  '省' => '省',\n  '葉' => '葉',\n  '說' => '說',\n  '殺' => '殺',\n  '辰' => '辰',\n  '沈' => '沈',\n  '拾' => '拾',\n  '若' => '若',\n  '掠' => '掠',\n  '略' => '略',\n  '亮' => '亮',\n  '兩' => '兩',\n  '凉' => '凉',\n  '梁' => '梁',\n  '糧' => '糧',\n  '良' => '良',\n  '諒' => '諒',\n  '量' => '量',\n  '勵' => '勵',\n  '呂' => '呂',\n  '女' => '女',\n  '廬' => '廬',\n  '旅' => '旅',\n  '濾' => '濾',\n  '礪' => '礪',\n  '閭' => '閭',\n  '驪' => '驪',\n  '麗' => '麗',\n  '黎' => '黎',\n  '力' => '力',\n  '曆' => '曆',\n  '歷' => '歷',\n  '轢' => '轢',\n  '年' => '年',\n  '憐' => '憐',\n  '戀' => '戀',\n  '撚' => '撚',\n  '漣' => '漣',\n  '煉' => '煉',\n  '璉' => '璉',\n  '秊' => '秊',\n  '練' => '練',\n  '聯' => '聯',\n  '輦' => '輦',\n  '蓮' => '蓮',\n  '連' => '連',\n  '鍊' => '鍊',\n  '列' => '列',\n  '劣' => '劣',\n  '咽' => '咽',\n  '烈' => '烈',\n  '裂' => '裂',\n  '說' => '說',\n  '廉' => '廉',\n  '念' => '念',\n  '捻' => '捻',\n  '殮' => '殮',\n  '簾' => '簾',\n  '獵' => '獵',\n  '令' => '令',\n  '囹' => '囹',\n  '寧' => '寧',\n  '嶺' => '嶺',\n  '怜' => '怜',\n  '玲' => '玲',\n  '瑩' => '瑩',\n  '羚' => '羚',\n  '聆' => '聆',\n  '鈴' => '鈴',\n  '零' => '零',\n  '靈' => '靈',\n  '領' => '領',\n  '例' => '例',\n  '禮' => '禮',\n  '醴' => '醴',\n  '隸' => '隸',\n  '惡' => '惡',\n  '了' => '了',\n  '僚' => '僚',\n  '寮' => '寮',\n  '尿' => '尿',\n  '料' => '料',\n  '樂' => '樂',\n  '燎' => '燎',\n  '療' => '療',\n  '蓼' => '蓼',\n  '遼' => '遼',\n  '龍' => '龍',\n  '暈' => '暈',\n  '阮' => '阮',\n  '劉' => '劉',\n  '杻' => '杻',\n  '柳' => '柳',\n  '流' => '流',\n  '溜' => '溜',\n  '琉' => '琉',\n  '留' => '留',\n  '硫' => '硫',\n  '紐' => '紐',\n  '類' => '類',\n  '六' => '六',\n  '戮' => '戮',\n  '陸' => '陸',\n  '倫' => '倫',\n  '崙' => '崙',\n  '淪' => '淪',\n  '輪' => '輪',\n  '律' => '律',\n  '慄' => '慄',\n  '栗' => '栗',\n  '率' => '率',\n  '隆' => '隆',\n  '利' => '利',\n  '吏' => '吏',\n  '履' => '履',\n  '易' => '易',\n  '李' => '李',\n  '梨' => '梨',\n  '泥' => '泥',\n  '理' => '理',\n  '痢' => '痢',\n  '罹' => '罹',\n  '裏' => '裏',\n  '裡' => '裡',\n  '里' => '里',\n  '離' => '離',\n  '匿' => '匿',\n  '溺' => '溺',\n  '吝' => '吝',\n  '燐' => '燐',\n  '璘' => '璘',\n  '藺' => '藺',\n  '隣' => '隣',\n  '鱗' => '鱗',\n  '麟' => '麟',\n  '林' => '林',\n  '淋' => '淋',\n  '臨' => '臨',\n  '立' => '立',\n  '笠' => '笠',\n  '粒' => '粒',\n  '狀' => '狀',\n  '炙' => '炙',\n  '識' => '識',\n  '什' => '什',\n  '茶' => '茶',\n  '刺' => '刺',\n  '切' => '切',\n  '度' => '度',\n  '拓' => '拓',\n  '糖' => '糖',\n  '宅' => '宅',\n  '洞' => '洞',\n  '暴' => '暴',\n  '輻' => '輻',\n  '行' => '行',\n  '降' => '降',\n  '見' => '見',\n  '廓' => '廓',\n  '兀' => '兀',\n  '嗀' => '嗀',\n  '塚' => '塚',\n  '晴' => '晴',\n  '凞' => '凞',\n  '猪' => '猪',\n  '益' => '益',\n  '礼' => '礼',\n  '神' => '神',\n  '祥' => '祥',\n  '福' => '福',\n  '靖' => '靖',\n  '精' => '精',\n  '羽' => '羽',\n  '蘒' => '蘒',\n  '諸' => '諸',\n  '逸' => '逸',\n  '都' => '都',\n  '飯' => '飯',\n  '飼' => '飼',\n  '館' => '館',\n  '鶴' => '鶴',\n  '郞' => '郞',\n  '隷' => '隷',\n  '侮' => '侮',\n  '僧' => '僧',\n  '免' => '免',\n  '勉' => '勉',\n  '勤' => '勤',\n  '卑' => '卑',\n  '喝' => '喝',\n  '嘆' => '嘆',\n  '器' => '器',\n  '塀' => '塀',\n  '墨' => '墨',\n  '層' => '層',\n  '屮' => '屮',\n  '悔' => '悔',\n  '慨' => '慨',\n  '憎' => '憎',\n  '懲' => '懲',\n  '敏' => '敏',\n  '既' => '既',\n  '暑' => '暑',\n  '梅' => '梅',\n  '海' => '海',\n  '渚' => '渚',\n  '漢' => '漢',\n  '煮' => '煮',\n  '爫' => '爫',\n  '琢' => '琢',\n  '碑' => '碑',\n  '社' => '社',\n  '祉' => '祉',\n  '祈' => '祈',\n  '祐' => '祐',\n  '祖' => '祖',\n  '祝' => '祝',\n  '禍' => '禍',\n  '禎' => '禎',\n  '穀' => '穀',\n  '突' => '突',\n  '節' => '節',\n  '練' => '練',\n  '縉' => '縉',\n  '繁' => '繁',\n  '署' => '署',\n  '者' => '者',\n  '臭' => '臭',\n  '艹' => '艹',\n  '艹' => '艹',\n  '著' => '著',\n  '褐' => '褐',\n  '視' => '視',\n  '謁' => '謁',\n  '謹' => '謹',\n  '賓' => '賓',\n  '贈' => '贈',\n  '辶' => '辶',\n  '逸' => '逸',\n  '難' => '難',\n  '響' => '響',\n  '頻' => '頻',\n  '恵' => '恵',\n  '𤋮' => '𤋮',\n  '舘' => '舘',\n  '並' => '並',\n  '况' => '况',\n  '全' => '全',\n  '侀' => '侀',\n  '充' => '充',\n  '冀' => '冀',\n  '勇' => '勇',\n  '勺' => '勺',\n  '喝' => '喝',\n  '啕' => '啕',\n  '喙' => '喙',\n  '嗢' => '嗢',\n  '塚' => '塚',\n  '墳' => '墳',\n  '奄' => '奄',\n  '奔' => '奔',\n  '婢' => '婢',\n  '嬨' => '嬨',\n  '廒' => '廒',\n  '廙' => '廙',\n  '彩' => '彩',\n  '徭' => '徭',\n  '惘' => '惘',\n  '慎' => '慎',\n  '愈' => '愈',\n  '憎' => '憎',\n  '慠' => '慠',\n  '懲' => '懲',\n  '戴' => '戴',\n  '揄' => '揄',\n  '搜' => '搜',\n  '摒' => '摒',\n  '敖' => '敖',\n  '晴' => '晴',\n  '朗' => '朗',\n  '望' => '望',\n  '杖' => '杖',\n  '歹' => '歹',\n  '殺' => '殺',\n  '流' => '流',\n  '滛' => '滛',\n  '滋' => '滋',\n  '漢' => '漢',\n  '瀞' => '瀞',\n  '煮' => '煮',\n  '瞧' => '瞧',\n  '爵' => '爵',\n  '犯' => '犯',\n  '猪' => '猪',\n  '瑱' => '瑱',\n  '甆' => '甆',\n  '画' => '画',\n  '瘝' => '瘝',\n  '瘟' => '瘟',\n  '益' => '益',\n  '盛' => '盛',\n  '直' => '直',\n  '睊' => '睊',\n  '着' => '着',\n  '磌' => '磌',\n  '窱' => '窱',\n  '節' => '節',\n  '类' => '类',\n  '絛' => '絛',\n  '練' => '練',\n  '缾' => '缾',\n  '者' => '者',\n  '荒' => '荒',\n  '華' => '華',\n  '蝹' => '蝹',\n  '襁' => '襁',\n  '覆' => '覆',\n  '視' => '視',\n  '調' => '調',\n  '諸' => '諸',\n  '請' => '請',\n  '謁' => '謁',\n  '諾' => '諾',\n  '諭' => '諭',\n  '謹' => '謹',\n  '變' => '變',\n  '贈' => '贈',\n  '輸' => '輸',\n  '遲' => '遲',\n  '醙' => '醙',\n  '鉶' => '鉶',\n  '陼' => '陼',\n  '難' => '難',\n  '靖' => '靖',\n  '韛' => '韛',\n  '響' => '響',\n  '頋' => '頋',\n  '頻' => '頻',\n  '鬒' => '鬒',\n  '龜' => '龜',\n  '𢡊' => '𢡊',\n  '𢡄' => '𢡄',\n  '𣏕' => '𣏕',\n  '㮝' => '㮝',\n  '䀘' => '䀘',\n  '䀹' => '䀹',\n  '𥉉' => '𥉉',\n  '𥳐' => '𥳐',\n  '𧻓' => '𧻓',\n  '齃' => '齃',\n  '龎' => '龎',\n  'יִ' => 'יִ',\n  'ײַ' => 'ײַ',\n  'שׁ' => 'שׁ',\n  'שׂ' => 'שׂ',\n  'שּׁ' => 'שּׁ',\n  'שּׂ' => 'שּׂ',\n  'אַ' => 'אַ',\n  'אָ' => 'אָ',\n  'אּ' => 'אּ',\n  'בּ' => 'בּ',\n  'גּ' => 'גּ',\n  'דּ' => 'דּ',\n  'הּ' => 'הּ',\n  'וּ' => 'וּ',\n  'זּ' => 'זּ',\n  'טּ' => 'טּ',\n  'יּ' => 'יּ',\n  'ךּ' => 'ךּ',\n  'כּ' => 'כּ',\n  'לּ' => 'לּ',\n  'מּ' => 'מּ',\n  'נּ' => 'נּ',\n  'סּ' => 'סּ',\n  'ףּ' => 'ףּ',\n  'פּ' => 'פּ',\n  'צּ' => 'צּ',\n  'קּ' => 'קּ',\n  'רּ' => 'רּ',\n  'שּ' => 'שּ',\n  'תּ' => 'תּ',\n  'וֹ' => 'וֹ',\n  'בֿ' => 'בֿ',\n  'כֿ' => 'כֿ',\n  'פֿ' => 'פֿ',\n  '𑂚' => '𑂚',\n  '𑂜' => '𑂜',\n  '𑂫' => '𑂫',\n  '𑄮' => '𑄮',\n  '𑄯' => '𑄯',\n  '𑍋' => '𑍋',\n  '𑍌' => '𑍌',\n  '𑒻' => '𑒻',\n  '𑒼' => '𑒼',\n  '𑒾' => '𑒾',\n  '𑖺' => '𑖺',\n  '𑖻' => '𑖻',\n  '𑤸' => '𑤸',\n  '𝅗𝅥' => '𝅗𝅥',\n  '𝅘𝅥' => '𝅘𝅥',\n  '𝅘𝅥𝅮' => '𝅘𝅥𝅮',\n  '𝅘𝅥𝅯' => '𝅘𝅥𝅯',\n  '𝅘𝅥𝅰' => '𝅘𝅥𝅰',\n  '𝅘𝅥𝅱' => '𝅘𝅥𝅱',\n  '𝅘𝅥𝅲' => '𝅘𝅥𝅲',\n  '𝆹𝅥' => '𝆹𝅥',\n  '𝆺𝅥' => '𝆺𝅥',\n  '𝆹𝅥𝅮' => '𝆹𝅥𝅮',\n  '𝆺𝅥𝅮' => '𝆺𝅥𝅮',\n  '𝆹𝅥𝅯' => '𝆹𝅥𝅯',\n  '𝆺𝅥𝅯' => '𝆺𝅥𝅯',\n  '丽' => '丽',\n  '丸' => '丸',\n  '乁' => '乁',\n  '𠄢' => '𠄢',\n  '你' => '你',\n  '侮' => '侮',\n  '侻' => '侻',\n  '倂' => '倂',\n  '偺' => '偺',\n  '備' => '備',\n  '僧' => '僧',\n  '像' => '像',\n  '㒞' => '㒞',\n  '𠘺' => '𠘺',\n  '免' => '免',\n  '兔' => '兔',\n  '兤' => '兤',\n  '具' => '具',\n  '𠔜' => '𠔜',\n  '㒹' => '㒹',\n  '內' => '內',\n  '再' => '再',\n  '𠕋' => '𠕋',\n  '冗' => '冗',\n  '冤' => '冤',\n  '仌' => '仌',\n  '冬' => '冬',\n  '况' => '况',\n  '𩇟' => '𩇟',\n  '凵' => '凵',\n  '刃' => '刃',\n  '㓟' => '㓟',\n  '刻' => '刻',\n  '剆' => '剆',\n  '割' => '割',\n  '剷' => '剷',\n  '㔕' => '㔕',\n  '勇' => '勇',\n  '勉' => '勉',\n  '勤' => '勤',\n  '勺' => '勺',\n  '包' => '包',\n  '匆' => '匆',\n  '北' => '北',\n  '卉' => '卉',\n  '卑' => '卑',\n  '博' => '博',\n  '即' => '即',\n  '卽' => '卽',\n  '卿' => '卿',\n  '卿' => '卿',\n  '卿' => '卿',\n  '𠨬' => '𠨬',\n  '灰' => '灰',\n  '及' => '及',\n  '叟' => '叟',\n  '𠭣' => '𠭣',\n  '叫' => '叫',\n  '叱' => '叱',\n  '吆' => '吆',\n  '咞' => '咞',\n  '吸' => '吸',\n  '呈' => '呈',\n  '周' => '周',\n  '咢' => '咢',\n  '哶' => '哶',\n  '唐' => '唐',\n  '啓' => '啓',\n  '啣' => '啣',\n  '善' => '善',\n  '善' => '善',\n  '喙' => '喙',\n  '喫' => '喫',\n  '喳' => '喳',\n  '嗂' => '嗂',\n  '圖' => '圖',\n  '嘆' => '嘆',\n  '圗' => '圗',\n  '噑' => '噑',\n  '噴' => '噴',\n  '切' => '切',\n  '壮' => '壮',\n  '城' => '城',\n  '埴' => '埴',\n  '堍' => '堍',\n  '型' => '型',\n  '堲' => '堲',\n  '報' => '報',\n  '墬' => '墬',\n  '𡓤' => '𡓤',\n  '売' => '売',\n  '壷' => '壷',\n  '夆' => '夆',\n  '多' => '多',\n  '夢' => '夢',\n  '奢' => '奢',\n  '𡚨' => '𡚨',\n  '𡛪' => '𡛪',\n  '姬' => '姬',\n  '娛' => '娛',\n  '娧' => '娧',\n  '姘' => '姘',\n  '婦' => '婦',\n  '㛮' => '㛮',\n  '㛼' => '㛼',\n  '嬈' => '嬈',\n  '嬾' => '嬾',\n  '嬾' => '嬾',\n  '𡧈' => '𡧈',\n  '寃' => '寃',\n  '寘' => '寘',\n  '寧' => '寧',\n  '寳' => '寳',\n  '𡬘' => '𡬘',\n  '寿' => '寿',\n  '将' => '将',\n  '当' => '当',\n  '尢' => '尢',\n  '㞁' => '㞁',\n  '屠' => '屠',\n  '屮' => '屮',\n  '峀' => '峀',\n  '岍' => '岍',\n  '𡷤' => '𡷤',\n  '嵃' => '嵃',\n  '𡷦' => '𡷦',\n  '嵮' => '嵮',\n  '嵫' => '嵫',\n  '嵼' => '嵼',\n  '巡' => '巡',\n  '巢' => '巢',\n  '㠯' => '㠯',\n  '巽' => '巽',\n  '帨' => '帨',\n  '帽' => '帽',\n  '幩' => '幩',\n  '㡢' => '㡢',\n  '𢆃' => '𢆃',\n  '㡼' => '㡼',\n  '庰' => '庰',\n  '庳' => '庳',\n  '庶' => '庶',\n  '廊' => '廊',\n  '𪎒' => '𪎒',\n  '廾' => '廾',\n  '𢌱' => '𢌱',\n  '𢌱' => '𢌱',\n  '舁' => '舁',\n  '弢' => '弢',\n  '弢' => '弢',\n  '㣇' => '㣇',\n  '𣊸' => '𣊸',\n  '𦇚' => '𦇚',\n  '形' => '形',\n  '彫' => '彫',\n  '㣣' => '㣣',\n  '徚' => '徚',\n  '忍' => '忍',\n  '志' => '志',\n  '忹' => '忹',\n  '悁' => '悁',\n  '㤺' => '㤺',\n  '㤜' => '㤜',\n  '悔' => '悔',\n  '𢛔' => '𢛔',\n  '惇' => '惇',\n  '慈' => '慈',\n  '慌' => '慌',\n  '慎' => '慎',\n  '慌' => '慌',\n  '慺' => '慺',\n  '憎' => '憎',\n  '憲' => '憲',\n  '憤' => '憤',\n  '憯' => '憯',\n  '懞' => '懞',\n  '懲' => '懲',\n  '懶' => '懶',\n  '成' => '成',\n  '戛' => '戛',\n  '扝' => '扝',\n  '抱' => '抱',\n  '拔' => '拔',\n  '捐' => '捐',\n  '𢬌' => '𢬌',\n  '挽' => '挽',\n  '拼' => '拼',\n  '捨' => '捨',\n  '掃' => '掃',\n  '揤' => '揤',\n  '𢯱' => '𢯱',\n  '搢' => '搢',\n  '揅' => '揅',\n  '掩' => '掩',\n  '㨮' => '㨮',\n  '摩' => '摩',\n  '摾' => '摾',\n  '撝' => '撝',\n  '摷' => '摷',\n  '㩬' => '㩬',\n  '敏' => '敏',\n  '敬' => '敬',\n  '𣀊' => '𣀊',\n  '旣' => '旣',\n  '書' => '書',\n  '晉' => '晉',\n  '㬙' => '㬙',\n  '暑' => '暑',\n  '㬈' => '㬈',\n  '㫤' => '㫤',\n  '冒' => '冒',\n  '冕' => '冕',\n  '最' => '最',\n  '暜' => '暜',\n  '肭' => '肭',\n  '䏙' => '䏙',\n  '朗' => '朗',\n  '望' => '望',\n  '朡' => '朡',\n  '杞' => '杞',\n  '杓' => '杓',\n  '𣏃' => '𣏃',\n  '㭉' => '㭉',\n  '柺' => '柺',\n  '枅' => '枅',\n  '桒' => '桒',\n  '梅' => '梅',\n  '𣑭' => '𣑭',\n  '梎' => '梎',\n  '栟' => '栟',\n  '椔' => '椔',\n  '㮝' => '㮝',\n  '楂' => '楂',\n  '榣' => '榣',\n  '槪' => '槪',\n  '檨' => '檨',\n  '𣚣' => '𣚣',\n  '櫛' => '櫛',\n  '㰘' => '㰘',\n  '次' => '次',\n  '𣢧' => '𣢧',\n  '歔' => '歔',\n  '㱎' => '㱎',\n  '歲' => '歲',\n  '殟' => '殟',\n  '殺' => '殺',\n  '殻' => '殻',\n  '𣪍' => '𣪍',\n  '𡴋' => '𡴋',\n  '𣫺' => '𣫺',\n  '汎' => '汎',\n  '𣲼' => '𣲼',\n  '沿' => '沿',\n  '泍' => '泍',\n  '汧' => '汧',\n  '洖' => '洖',\n  '派' => '派',\n  '海' => '海',\n  '流' => '流',\n  '浩' => '浩',\n  '浸' => '浸',\n  '涅' => '涅',\n  '𣴞' => '𣴞',\n  '洴' => '洴',\n  '港' => '港',\n  '湮' => '湮',\n  '㴳' => '㴳',\n  '滋' => '滋',\n  '滇' => '滇',\n  '𣻑' => '𣻑',\n  '淹' => '淹',\n  '潮' => '潮',\n  '𣽞' => '𣽞',\n  '𣾎' => '𣾎',\n  '濆' => '濆',\n  '瀹' => '瀹',\n  '瀞' => '瀞',\n  '瀛' => '瀛',\n  '㶖' => '㶖',\n  '灊' => '灊',\n  '災' => '災',\n  '灷' => '灷',\n  '炭' => '炭',\n  '𠔥' => '𠔥',\n  '煅' => '煅',\n  '𤉣' => '𤉣',\n  '熜' => '熜',\n  '𤎫' => '𤎫',\n  '爨' => '爨',\n  '爵' => '爵',\n  '牐' => '牐',\n  '𤘈' => '𤘈',\n  '犀' => '犀',\n  '犕' => '犕',\n  '𤜵' => '𤜵',\n  '𤠔' => '𤠔',\n  '獺' => '獺',\n  '王' => '王',\n  '㺬' => '㺬',\n  '玥' => '玥',\n  '㺸' => '㺸',\n  '㺸' => '㺸',\n  '瑇' => '瑇',\n  '瑜' => '瑜',\n  '瑱' => '瑱',\n  '璅' => '璅',\n  '瓊' => '瓊',\n  '㼛' => '㼛',\n  '甤' => '甤',\n  '𤰶' => '𤰶',\n  '甾' => '甾',\n  '𤲒' => '𤲒',\n  '異' => '異',\n  '𢆟' => '𢆟',\n  '瘐' => '瘐',\n  '𤾡' => '𤾡',\n  '𤾸' => '𤾸',\n  '𥁄' => '𥁄',\n  '㿼' => '㿼',\n  '䀈' => '䀈',\n  '直' => '直',\n  '𥃳' => '𥃳',\n  '𥃲' => '𥃲',\n  '𥄙' => '𥄙',\n  '𥄳' => '𥄳',\n  '眞' => '眞',\n  '真' => '真',\n  '真' => '真',\n  '睊' => '睊',\n  '䀹' => '䀹',\n  '瞋' => '瞋',\n  '䁆' => '䁆',\n  '䂖' => '䂖',\n  '𥐝' => '𥐝',\n  '硎' => '硎',\n  '碌' => '碌',\n  '磌' => '磌',\n  '䃣' => '䃣',\n  '𥘦' => '𥘦',\n  '祖' => '祖',\n  '𥚚' => '𥚚',\n  '𥛅' => '𥛅',\n  '福' => '福',\n  '秫' => '秫',\n  '䄯' => '䄯',\n  '穀' => '穀',\n  '穊' => '穊',\n  '穏' => '穏',\n  '𥥼' => '𥥼',\n  '𥪧' => '𥪧',\n  '𥪧' => '𥪧',\n  '竮' => '竮',\n  '䈂' => '䈂',\n  '𥮫' => '𥮫',\n  '篆' => '篆',\n  '築' => '築',\n  '䈧' => '䈧',\n  '𥲀' => '𥲀',\n  '糒' => '糒',\n  '䊠' => '䊠',\n  '糨' => '糨',\n  '糣' => '糣',\n  '紀' => '紀',\n  '𥾆' => '𥾆',\n  '絣' => '絣',\n  '䌁' => '䌁',\n  '緇' => '緇',\n  '縂' => '縂',\n  '繅' => '繅',\n  '䌴' => '䌴',\n  '𦈨' => '𦈨',\n  '𦉇' => '𦉇',\n  '䍙' => '䍙',\n  '𦋙' => '𦋙',\n  '罺' => '罺',\n  '𦌾' => '𦌾',\n  '羕' => '羕',\n  '翺' => '翺',\n  '者' => '者',\n  '𦓚' => '𦓚',\n  '𦔣' => '𦔣',\n  '聠' => '聠',\n  '𦖨' => '𦖨',\n  '聰' => '聰',\n  '𣍟' => '𣍟',\n  '䏕' => '䏕',\n  '育' => '育',\n  '脃' => '脃',\n  '䐋' => '䐋',\n  '脾' => '脾',\n  '媵' => '媵',\n  '𦞧' => '𦞧',\n  '𦞵' => '𦞵',\n  '𣎓' => '𣎓',\n  '𣎜' => '𣎜',\n  '舁' => '舁',\n  '舄' => '舄',\n  '辞' => '辞',\n  '䑫' => '䑫',\n  '芑' => '芑',\n  '芋' => '芋',\n  '芝' => '芝',\n  '劳' => '劳',\n  '花' => '花',\n  '芳' => '芳',\n  '芽' => '芽',\n  '苦' => '苦',\n  '𦬼' => '𦬼',\n  '若' => '若',\n  '茝' => '茝',\n  '荣' => '荣',\n  '莭' => '莭',\n  '茣' => '茣',\n  '莽' => '莽',\n  '菧' => '菧',\n  '著' => '著',\n  '荓' => '荓',\n  '菊' => '菊',\n  '菌' => '菌',\n  '菜' => '菜',\n  '𦰶' => '𦰶',\n  '𦵫' => '𦵫',\n  '𦳕' => '𦳕',\n  '䔫' => '䔫',\n  '蓱' => '蓱',\n  '蓳' => '蓳',\n  '蔖' => '蔖',\n  '𧏊' => '𧏊',\n  '蕤' => '蕤',\n  '𦼬' => '𦼬',\n  '䕝' => '䕝',\n  '䕡' => '䕡',\n  '𦾱' => '𦾱',\n  '𧃒' => '𧃒',\n  '䕫' => '䕫',\n  '虐' => '虐',\n  '虜' => '虜',\n  '虧' => '虧',\n  '虩' => '虩',\n  '蚩' => '蚩',\n  '蚈' => '蚈',\n  '蜎' => '蜎',\n  '蛢' => '蛢',\n  '蝹' => '蝹',\n  '蜨' => '蜨',\n  '蝫' => '蝫',\n  '螆' => '螆',\n  '䗗' => '䗗',\n  '蟡' => '蟡',\n  '蠁' => '蠁',\n  '䗹' => '䗹',\n  '衠' => '衠',\n  '衣' => '衣',\n  '𧙧' => '𧙧',\n  '裗' => '裗',\n  '裞' => '裞',\n  '䘵' => '䘵',\n  '裺' => '裺',\n  '㒻' => '㒻',\n  '𧢮' => '𧢮',\n  '𧥦' => '𧥦',\n  '䚾' => '䚾',\n  '䛇' => '䛇',\n  '誠' => '誠',\n  '諭' => '諭',\n  '變' => '變',\n  '豕' => '豕',\n  '𧲨' => '𧲨',\n  '貫' => '貫',\n  '賁' => '賁',\n  '贛' => '贛',\n  '起' => '起',\n  '𧼯' => '𧼯',\n  '𠠄' => '𠠄',\n  '跋' => '跋',\n  '趼' => '趼',\n  '跰' => '跰',\n  '𠣞' => '𠣞',\n  '軔' => '軔',\n  '輸' => '輸',\n  '𨗒' => '𨗒',\n  '𨗭' => '𨗭',\n  '邔' => '邔',\n  '郱' => '郱',\n  '鄑' => '鄑',\n  '𨜮' => '𨜮',\n  '鄛' => '鄛',\n  '鈸' => '鈸',\n  '鋗' => '鋗',\n  '鋘' => '鋘',\n  '鉼' => '鉼',\n  '鏹' => '鏹',\n  '鐕' => '鐕',\n  '𨯺' => '𨯺',\n  '開' => '開',\n  '䦕' => '䦕',\n  '閷' => '閷',\n  '𨵷' => '𨵷',\n  '䧦' => '䧦',\n  '雃' => '雃',\n  '嶲' => '嶲',\n  '霣' => '霣',\n  '𩅅' => '𩅅',\n  '𩈚' => '𩈚',\n  '䩮' => '䩮',\n  '䩶' => '䩶',\n  '韠' => '韠',\n  '𩐊' => '𩐊',\n  '䪲' => '䪲',\n  '𩒖' => '𩒖',\n  '頋' => '頋',\n  '頋' => '頋',\n  '頩' => '頩',\n  '𩖶' => '𩖶',\n  '飢' => '飢',\n  '䬳' => '䬳',\n  '餩' => '餩',\n  '馧' => '馧',\n  '駂' => '駂',\n  '駾' => '駾',\n  '䯎' => '䯎',\n  '𩬰' => '𩬰',\n  '鬒' => '鬒',\n  '鱀' => '鱀',\n  '鳽' => '鳽',\n  '䳎' => '䳎',\n  '䳭' => '䳭',\n  '鵧' => '鵧',\n  '𪃎' => '𪃎',\n  '䳸' => '䳸',\n  '𪄅' => '𪄅',\n  '𪈎' => '𪈎',\n  '𪊑' => '𪊑',\n  '麻' => '麻',\n  '䵖' => '䵖',\n  '黹' => '黹',\n  '黾' => '黾',\n  '鼅' => '鼅',\n  '鼏' => '鼏',\n  '鼖' => '鼖',\n  '鼻' => '鼻',\n  '𪘀' => '𪘀',\n);\n","vendor/symfony/polyfill-intl-normalizer/Resources/unidata/rawCompatibilityDecomposition.php":"<?php\n\nreturn array (\n  ' ' => ' ',\n  '¨' => ' ̈',\n  'ª' => 'a',\n  '¯' => ' ̄',\n  '²' => '2',\n  '³' => '3',\n  '´' => ' ́',\n  'µ' => 'μ',\n  '¸' => ' ̧',\n  '¹' => '1',\n  'º' => 'o',\n  '¼' => '1⁄4',\n  '½' => '1⁄2',\n  '¾' => '3⁄4',\n  'Ĳ' => 'IJ',\n  'ĳ' => 'ij',\n  'Ŀ' => 'L·',\n  'ŀ' => 'l·',\n  'ŉ' => 'ʼn',\n  'ſ' => 's',\n  'Ǆ' => 'DŽ',\n  'ǅ' => 'Dž',\n  'ǆ' => 'dž',\n  'Ǉ' => 'LJ',\n  'ǈ' => 'Lj',\n  'ǉ' => 'lj',\n  'Ǌ' => 'NJ',\n  'ǋ' => 'Nj',\n  'ǌ' => 'nj',\n  'Ǳ' => 'DZ',\n  'ǲ' => 'Dz',\n  'ǳ' => 'dz',\n  'ʰ' => 'h',\n  'ʱ' => 'ɦ',\n  'ʲ' => 'j',\n  'ʳ' => 'r',\n  'ʴ' => 'ɹ',\n  'ʵ' => 'ɻ',\n  'ʶ' => 'ʁ',\n  'ʷ' => 'w',\n  'ʸ' => 'y',\n  '˘' => ' ̆',\n  '˙' => ' ̇',\n  '˚' => ' ̊',\n  '˛' => ' ̨',\n  '˜' => ' ̃',\n  '˝' => ' ̋',\n  'ˠ' => 'ɣ',\n  'ˡ' => 'l',\n  'ˢ' => 's',\n  'ˣ' => 'x',\n  'ˤ' => 'ʕ',\n  'ͺ' => ' ͅ',\n  '΄' => ' ́',\n  'ϐ' => 'β',\n  'ϑ' => 'θ',\n  'ϒ' => 'Υ',\n  'ϕ' => 'φ',\n  'ϖ' => 'π',\n  'ϰ' => 'κ',\n  'ϱ' => 'ρ',\n  'ϲ' => 'ς',\n  'ϴ' => 'Θ',\n  'ϵ' => 'ε',\n  'Ϲ' => 'Σ',\n  'և' => 'եւ',\n  'ٵ' => 'اٴ',\n  'ٶ' => 'وٴ',\n  'ٷ' => 'ۇٴ',\n  'ٸ' => 'يٴ',\n  'ำ' => 'ํา',\n  'ຳ' => 'ໍາ',\n  'ໜ' => 'ຫນ',\n  'ໝ' => 'ຫມ',\n  '༌' => '་',\n  'ཷ' => 'ྲཱྀ',\n  'ཹ' => 'ླཱྀ',\n  'ჼ' => 'ნ',\n  'ᴬ' => 'A',\n  'ᴭ' => 'Æ',\n  'ᴮ' => 'B',\n  'ᴰ' => 'D',\n  'ᴱ' => 'E',\n  'ᴲ' => 'Ǝ',\n  'ᴳ' => 'G',\n  'ᴴ' => 'H',\n  'ᴵ' => 'I',\n  'ᴶ' => 'J',\n  'ᴷ' => 'K',\n  'ᴸ' => 'L',\n  'ᴹ' => 'M',\n  'ᴺ' => 'N',\n  'ᴼ' => 'O',\n  'ᴽ' => 'Ȣ',\n  'ᴾ' => 'P',\n  'ᴿ' => 'R',\n  'ᵀ' => 'T',\n  'ᵁ' => 'U',\n  'ᵂ' => 'W',\n  'ᵃ' => 'a',\n  'ᵄ' => 'ɐ',\n  'ᵅ' => 'ɑ',\n  'ᵆ' => 'ᴂ',\n  'ᵇ' => 'b',\n  'ᵈ' => 'd',\n  'ᵉ' => 'e',\n  'ᵊ' => 'ə',\n  'ᵋ' => 'ɛ',\n  'ᵌ' => 'ɜ',\n  'ᵍ' => 'g',\n  'ᵏ' => 'k',\n  'ᵐ' => 'm',\n  'ᵑ' => 'ŋ',\n  'ᵒ' => 'o',\n  'ᵓ' => 'ɔ',\n  'ᵔ' => 'ᴖ',\n  'ᵕ' => 'ᴗ',\n  'ᵖ' => 'p',\n  'ᵗ' => 't',\n  'ᵘ' => 'u',\n  'ᵙ' => 'ᴝ',\n  'ᵚ' => 'ɯ',\n  'ᵛ' => 'v',\n  'ᵜ' => 'ᴥ',\n  'ᵝ' => 'β',\n  'ᵞ' => 'γ',\n  'ᵟ' => 'δ',\n  'ᵠ' => 'φ',\n  'ᵡ' => 'χ',\n  'ᵢ' => 'i',\n  'ᵣ' => 'r',\n  'ᵤ' => 'u',\n  'ᵥ' => 'v',\n  'ᵦ' => 'β',\n  'ᵧ' => 'γ',\n  'ᵨ' => 'ρ',\n  'ᵩ' => 'φ',\n  'ᵪ' => 'χ',\n  'ᵸ' => 'н',\n  'ᶛ' => 'ɒ',\n  'ᶜ' => 'c',\n  'ᶝ' => 'ɕ',\n  'ᶞ' => 'ð',\n  'ᶟ' => 'ɜ',\n  'ᶠ' => 'f',\n  'ᶡ' => 'ɟ',\n  'ᶢ' => 'ɡ',\n  'ᶣ' => 'ɥ',\n  'ᶤ' => 'ɨ',\n  'ᶥ' => 'ɩ',\n  'ᶦ' => 'ɪ',\n  'ᶧ' => 'ᵻ',\n  'ᶨ' => 'ʝ',\n  'ᶩ' => 'ɭ',\n  'ᶪ' => 'ᶅ',\n  'ᶫ' => 'ʟ',\n  'ᶬ' => 'ɱ',\n  'ᶭ' => 'ɰ',\n  'ᶮ' => 'ɲ',\n  'ᶯ' => 'ɳ',\n  'ᶰ' => 'ɴ',\n  'ᶱ' => 'ɵ',\n  'ᶲ' => 'ɸ',\n  'ᶳ' => 'ʂ',\n  'ᶴ' => 'ʃ',\n  'ᶵ' => 'ƫ',\n  'ᶶ' => 'ʉ',\n  'ᶷ' => 'ʊ',\n  'ᶸ' => 'ᴜ',\n  'ᶹ' => 'ʋ',\n  'ᶺ' => 'ʌ',\n  'ᶻ' => 'z',\n  'ᶼ' => 'ʐ',\n  'ᶽ' => 'ʑ',\n  'ᶾ' => 'ʒ',\n  'ᶿ' => 'θ',\n  'ẚ' => 'aʾ',\n  '᾽' => ' ̓',\n  '᾿' => ' ̓',\n  '῀' => ' ͂',\n  '῾' => ' ̔',\n  ' ' => ' ',\n  ' ' => ' ',\n  ' ' => ' ',\n  ' ' => ' ',\n  ' ' => ' ',\n  ' ' => ' ',\n  ' ' => ' ',\n  ' ' => ' ',\n  ' ' => ' ',\n  '‑' => '‐',\n  '‗' => ' ̳',\n  '․' => '.',\n  '‥' => '..',\n  '…' => '...',\n  ' ' => ' ',\n  '″' => '′′',\n  '‴' => '′′′',\n  '‶' => '‵‵',\n  '‷' => '‵‵‵',\n  '‼' => '!!',\n  '‾' => ' ̅',\n  '⁇' => '??',\n  '⁈' => '?!',\n  '⁉' => '!?',\n  '⁗' => '′′′′',\n  ' ' => ' ',\n  '⁰' => '0',\n  'ⁱ' => 'i',\n  '⁴' => '4',\n  '⁵' => '5',\n  '⁶' => '6',\n  '⁷' => '7',\n  '⁸' => '8',\n  '⁹' => '9',\n  '⁺' => '+',\n  '⁻' => '−',\n  '⁼' => '=',\n  '⁽' => '(',\n  '⁾' => ')',\n  'ⁿ' => 'n',\n  '₀' => '0',\n  '₁' => '1',\n  '₂' => '2',\n  '₃' => '3',\n  '₄' => '4',\n  '₅' => '5',\n  '₆' => '6',\n  '₇' => '7',\n  '₈' => '8',\n  '₉' => '9',\n  '₊' => '+',\n  '₋' => '−',\n  '₌' => '=',\n  '₍' => '(',\n  '₎' => ')',\n  'ₐ' => 'a',\n  'ₑ' => 'e',\n  'ₒ' => 'o',\n  'ₓ' => 'x',\n  'ₔ' => 'ə',\n  'ₕ' => 'h',\n  'ₖ' => 'k',\n  'ₗ' => 'l',\n  'ₘ' => 'm',\n  'ₙ' => 'n',\n  'ₚ' => 'p',\n  'ₛ' => 's',\n  'ₜ' => 't',\n  '₨' => 'Rs',\n  '℀' => 'a/c',\n  '℁' => 'a/s',\n  'ℂ' => 'C',\n  '℃' => '°C',\n  '℅' => 'c/o',\n  '℆' => 'c/u',\n  'ℇ' => 'Ɛ',\n  '℉' => '°F',\n  'ℊ' => 'g',\n  'ℋ' => 'H',\n  'ℌ' => 'H',\n  'ℍ' => 'H',\n  'ℎ' => 'h',\n  'ℏ' => 'ħ',\n  'ℐ' => 'I',\n  'ℑ' => 'I',\n  'ℒ' => 'L',\n  'ℓ' => 'l',\n  'ℕ' => 'N',\n  '№' => 'No',\n  'ℙ' => 'P',\n  'ℚ' => 'Q',\n  'ℛ' => 'R',\n  'ℜ' => 'R',\n  'ℝ' => 'R',\n  '℠' => 'SM',\n  '℡' => 'TEL',\n  '™' => 'TM',\n  'ℤ' => 'Z',\n  'ℨ' => 'Z',\n  'ℬ' => 'B',\n  'ℭ' => 'C',\n  'ℯ' => 'e',\n  'ℰ' => 'E',\n  'ℱ' => 'F',\n  'ℳ' => 'M',\n  'ℴ' => 'o',\n  'ℵ' => 'א',\n  'ℶ' => 'ב',\n  'ℷ' => 'ג',\n  'ℸ' => 'ד',\n  'ℹ' => 'i',\n  '℻' => 'FAX',\n  'ℼ' => 'π',\n  'ℽ' => 'γ',\n  'ℾ' => 'Γ',\n  'ℿ' => 'Π',\n  '⅀' => '∑',\n  'ⅅ' => 'D',\n  'ⅆ' => 'd',\n  'ⅇ' => 'e',\n  'ⅈ' => 'i',\n  'ⅉ' => 'j',\n  '⅐' => '1⁄7',\n  '⅑' => '1⁄9',\n  '⅒' => '1⁄10',\n  '⅓' => '1⁄3',\n  '⅔' => '2⁄3',\n  '⅕' => '1⁄5',\n  '⅖' => '2⁄5',\n  '⅗' => '3⁄5',\n  '⅘' => '4⁄5',\n  '⅙' => '1⁄6',\n  '⅚' => '5⁄6',\n  '⅛' => '1⁄8',\n  '⅜' => '3⁄8',\n  '⅝' => '5⁄8',\n  '⅞' => '7⁄8',\n  '⅟' => '1⁄',\n  'Ⅰ' => 'I',\n  'Ⅱ' => 'II',\n  'Ⅲ' => 'III',\n  'Ⅳ' => 'IV',\n  'Ⅴ' => 'V',\n  'Ⅵ' => 'VI',\n  'Ⅶ' => 'VII',\n  'Ⅷ' => 'VIII',\n  'Ⅸ' => 'IX',\n  'Ⅹ' => 'X',\n  'Ⅺ' => 'XI',\n  'Ⅻ' => 'XII',\n  'Ⅼ' => 'L',\n  'Ⅽ' => 'C',\n  'Ⅾ' => 'D',\n  'Ⅿ' => 'M',\n  'ⅰ' => 'i',\n  'ⅱ' => 'ii',\n  'ⅲ' => 'iii',\n  'ⅳ' => 'iv',\n  'ⅴ' => 'v',\n  'ⅵ' => 'vi',\n  'ⅶ' => 'vii',\n  'ⅷ' => 'viii',\n  'ⅸ' => 'ix',\n  'ⅹ' => 'x',\n  'ⅺ' => 'xi',\n  'ⅻ' => 'xii',\n  'ⅼ' => 'l',\n  'ⅽ' => 'c',\n  'ⅾ' => 'd',\n  'ⅿ' => 'm',\n  '↉' => '0⁄3',\n  '∬' => '∫∫',\n  '∭' => '∫∫∫',\n  '∯' => '∮∮',\n  '∰' => '∮∮∮',\n  '①' => '1',\n  '②' => '2',\n  '③' => '3',\n  '④' => '4',\n  '⑤' => '5',\n  '⑥' => '6',\n  '⑦' => '7',\n  '⑧' => '8',\n  '⑨' => '9',\n  '⑩' => '10',\n  '⑪' => '11',\n  '⑫' => '12',\n  '⑬' => '13',\n  '⑭' => '14',\n  '⑮' => '15',\n  '⑯' => '16',\n  '⑰' => '17',\n  '⑱' => '18',\n  '⑲' => '19',\n  '⑳' => '20',\n  '⑴' => '(1)',\n  '⑵' => '(2)',\n  '⑶' => '(3)',\n  '⑷' => '(4)',\n  '⑸' => '(5)',\n  '⑹' => '(6)',\n  '⑺' => '(7)',\n  '⑻' => '(8)',\n  '⑼' => '(9)',\n  '⑽' => '(10)',\n  '⑾' => '(11)',\n  '⑿' => '(12)',\n  '⒀' => '(13)',\n  '⒁' => '(14)',\n  '⒂' => '(15)',\n  '⒃' => '(16)',\n  '⒄' => '(17)',\n  '⒅' => '(18)',\n  '⒆' => '(19)',\n  '⒇' => '(20)',\n  '⒈' => '1.',\n  '⒉' => '2.',\n  '⒊' => '3.',\n  '⒋' => '4.',\n  '⒌' => '5.',\n  '⒍' => '6.',\n  '⒎' => '7.',\n  '⒏' => '8.',\n  '⒐' => '9.',\n  '⒑' => '10.',\n  '⒒' => '11.',\n  '⒓' => '12.',\n  '⒔' => '13.',\n  '⒕' => '14.',\n  '⒖' => '15.',\n  '⒗' => '16.',\n  '⒘' => '17.',\n  '⒙' => '18.',\n  '⒚' => '19.',\n  '⒛' => '20.',\n  '⒜' => '(a)',\n  '⒝' => '(b)',\n  '⒞' => '(c)',\n  '⒟' => '(d)',\n  '⒠' => '(e)',\n  '⒡' => '(f)',\n  '⒢' => '(g)',\n  '⒣' => '(h)',\n  '⒤' => '(i)',\n  '⒥' => '(j)',\n  '⒦' => '(k)',\n  '⒧' => '(l)',\n  '⒨' => '(m)',\n  '⒩' => '(n)',\n  '⒪' => '(o)',\n  '⒫' => '(p)',\n  '⒬' => '(q)',\n  '⒭' => '(r)',\n  '⒮' => '(s)',\n  '⒯' => '(t)',\n  '⒰' => '(u)',\n  '⒱' => '(v)',\n  '⒲' => '(w)',\n  '⒳' => '(x)',\n  '⒴' => '(y)',\n  '⒵' => '(z)',\n  'Ⓐ' => 'A',\n  'Ⓑ' => 'B',\n  'Ⓒ' => 'C',\n  'Ⓓ' => 'D',\n  'Ⓔ' => 'E',\n  'Ⓕ' => 'F',\n  'Ⓖ' => 'G',\n  'Ⓗ' => 'H',\n  'Ⓘ' => 'I',\n  'Ⓙ' => 'J',\n  'Ⓚ' => 'K',\n  'Ⓛ' => 'L',\n  'Ⓜ' => 'M',\n  'Ⓝ' => 'N',\n  'Ⓞ' => 'O',\n  'Ⓟ' => 'P',\n  'Ⓠ' => 'Q',\n  'Ⓡ' => 'R',\n  'Ⓢ' => 'S',\n  'Ⓣ' => 'T',\n  'Ⓤ' => 'U',\n  'Ⓥ' => 'V',\n  'Ⓦ' => 'W',\n  'Ⓧ' => 'X',\n  'Ⓨ' => 'Y',\n  'Ⓩ' => 'Z',\n  'ⓐ' => 'a',\n  'ⓑ' => 'b',\n  'ⓒ' => 'c',\n  'ⓓ' => 'd',\n  'ⓔ' => 'e',\n  'ⓕ' => 'f',\n  'ⓖ' => 'g',\n  'ⓗ' => 'h',\n  'ⓘ' => 'i',\n  'ⓙ' => 'j',\n  'ⓚ' => 'k',\n  'ⓛ' => 'l',\n  'ⓜ' => 'm',\n  'ⓝ' => 'n',\n  'ⓞ' => 'o',\n  'ⓟ' => 'p',\n  'ⓠ' => 'q',\n  'ⓡ' => 'r',\n  'ⓢ' => 's',\n  'ⓣ' => 't',\n  'ⓤ' => 'u',\n  'ⓥ' => 'v',\n  'ⓦ' => 'w',\n  'ⓧ' => 'x',\n  'ⓨ' => 'y',\n  'ⓩ' => 'z',\n  '⓪' => '0',\n  '⨌' => '∫∫∫∫',\n  '⩴' => '::=',\n  '⩵' => '==',\n  '⩶' => '===',\n  'ⱼ' => 'j',\n  'ⱽ' => 'V',\n  'ⵯ' => 'ⵡ',\n  '⺟' => '母',\n  '⻳' => '龟',\n  '⼀' => '一',\n  '⼁' => '丨',\n  '⼂' => '丶',\n  '⼃' => '丿',\n  '⼄' => '乙',\n  '⼅' => '亅',\n  '⼆' => '二',\n  '⼇' => '亠',\n  '⼈' => '人',\n  '⼉' => '儿',\n  '⼊' => '入',\n  '⼋' => '八',\n  '⼌' => '冂',\n  '⼍' => '冖',\n  '⼎' => '冫',\n  '⼏' => '几',\n  '⼐' => '凵',\n  '⼑' => '刀',\n  '⼒' => '力',\n  '⼓' => '勹',\n  '⼔' => '匕',\n  '⼕' => '匚',\n  '⼖' => '匸',\n  '⼗' => '十',\n  '⼘' => '卜',\n  '⼙' => '卩',\n  '⼚' => '厂',\n  '⼛' => '厶',\n  '⼜' => '又',\n  '⼝' => '口',\n  '⼞' => '囗',\n  '⼟' => '土',\n  '⼠' => '士',\n  '⼡' => '夂',\n  '⼢' => '夊',\n  '⼣' => '夕',\n  '⼤' => '大',\n  '⼥' => '女',\n  '⼦' => '子',\n  '⼧' => '宀',\n  '⼨' => '寸',\n  '⼩' => '小',\n  '⼪' => '尢',\n  '⼫' => '尸',\n  '⼬' => '屮',\n  '⼭' => '山',\n  '⼮' => '巛',\n  '⼯' => '工',\n  '⼰' => '己',\n  '⼱' => '巾',\n  '⼲' => '干',\n  '⼳' => '幺',\n  '⼴' => '广',\n  '⼵' => '廴',\n  '⼶' => '廾',\n  '⼷' => '弋',\n  '⼸' => '弓',\n  '⼹' => '彐',\n  '⼺' => '彡',\n  '⼻' => '彳',\n  '⼼' => '心',\n  '⼽' => '戈',\n  '⼾' => '戶',\n  '⼿' => '手',\n  '⽀' => '支',\n  '⽁' => '攴',\n  '⽂' => '文',\n  '⽃' => '斗',\n  '⽄' => '斤',\n  '⽅' => '方',\n  '⽆' => '无',\n  '⽇' => '日',\n  '⽈' => '曰',\n  '⽉' => '月',\n  '⽊' => '木',\n  '⽋' => '欠',\n  '⽌' => '止',\n  '⽍' => '歹',\n  '⽎' => '殳',\n  '⽏' => '毋',\n  '⽐' => '比',\n  '⽑' => '毛',\n  '⽒' => '氏',\n  '⽓' => '气',\n  '⽔' => '水',\n  '⽕' => '火',\n  '⽖' => '爪',\n  '⽗' => '父',\n  '⽘' => '爻',\n  '⽙' => '爿',\n  '⽚' => '片',\n  '⽛' => '牙',\n  '⽜' => '牛',\n  '⽝' => '犬',\n  '⽞' => '玄',\n  '⽟' => '玉',\n  '⽠' => '瓜',\n  '⽡' => '瓦',\n  '⽢' => '甘',\n  '⽣' => '生',\n  '⽤' => '用',\n  '⽥' => '田',\n  '⽦' => '疋',\n  '⽧' => '疒',\n  '⽨' => '癶',\n  '⽩' => '白',\n  '⽪' => '皮',\n  '⽫' => '皿',\n  '⽬' => '目',\n  '⽭' => '矛',\n  '⽮' => '矢',\n  '⽯' => '石',\n  '⽰' => '示',\n  '⽱' => '禸',\n  '⽲' => '禾',\n  '⽳' => '穴',\n  '⽴' => '立',\n  '⽵' => '竹',\n  '⽶' => '米',\n  '⽷' => '糸',\n  '⽸' => '缶',\n  '⽹' => '网',\n  '⽺' => '羊',\n  '⽻' => '羽',\n  '⽼' => '老',\n  '⽽' => '而',\n  '⽾' => '耒',\n  '⽿' => '耳',\n  '⾀' => '聿',\n  '⾁' => '肉',\n  '⾂' => '臣',\n  '⾃' => '自',\n  '⾄' => '至',\n  '⾅' => '臼',\n  '⾆' => '舌',\n  '⾇' => '舛',\n  '⾈' => '舟',\n  '⾉' => '艮',\n  '⾊' => '色',\n  '⾋' => '艸',\n  '⾌' => '虍',\n  '⾍' => '虫',\n  '⾎' => '血',\n  '⾏' => '行',\n  '⾐' => '衣',\n  '⾑' => '襾',\n  '⾒' => '見',\n  '⾓' => '角',\n  '⾔' => '言',\n  '⾕' => '谷',\n  '⾖' => '豆',\n  '⾗' => '豕',\n  '⾘' => '豸',\n  '⾙' => '貝',\n  '⾚' => '赤',\n  '⾛' => '走',\n  '⾜' => '足',\n  '⾝' => '身',\n  '⾞' => '車',\n  '⾟' => '辛',\n  '⾠' => '辰',\n  '⾡' => '辵',\n  '⾢' => '邑',\n  '⾣' => '酉',\n  '⾤' => '釆',\n  '⾥' => '里',\n  '⾦' => '金',\n  '⾧' => '長',\n  '⾨' => '門',\n  '⾩' => '阜',\n  '⾪' => '隶',\n  '⾫' => '隹',\n  '⾬' => '雨',\n  '⾭' => '靑',\n  '⾮' => '非',\n  '⾯' => '面',\n  '⾰' => '革',\n  '⾱' => '韋',\n  '⾲' => '韭',\n  '⾳' => '音',\n  '⾴' => '頁',\n  '⾵' => '風',\n  '⾶' => '飛',\n  '⾷' => '食',\n  '⾸' => '首',\n  '⾹' => '香',\n  '⾺' => '馬',\n  '⾻' => '骨',\n  '⾼' => '高',\n  '⾽' => '髟',\n  '⾾' => '鬥',\n  '⾿' => '鬯',\n  '⿀' => '鬲',\n  '⿁' => '鬼',\n  '⿂' => '魚',\n  '⿃' => '鳥',\n  '⿄' => '鹵',\n  '⿅' => '鹿',\n  '⿆' => '麥',\n  '⿇' => '麻',\n  '⿈' => '黃',\n  '⿉' => '黍',\n  '⿊' => '黑',\n  '⿋' => '黹',\n  '⿌' => '黽',\n  '⿍' => '鼎',\n  '⿎' => '鼓',\n  '⿏' => '鼠',\n  '⿐' => '鼻',\n  '⿑' => '齊',\n  '⿒' => '齒',\n  '⿓' => '龍',\n  '⿔' => '龜',\n  '⿕' => '龠',\n  '　' => ' ',\n  '〶' => '〒',\n  '〸' => '十',\n  '〹' => '卄',\n  '〺' => '卅',\n  '゛' => ' ゙',\n  '゜' => ' ゚',\n  'ゟ' => 'より',\n  'ヿ' => 'コト',\n  'ㄱ' => 'ᄀ',\n  'ㄲ' => 'ᄁ',\n  'ㄳ' => 'ᆪ',\n  'ㄴ' => 'ᄂ',\n  'ㄵ' => 'ᆬ',\n  'ㄶ' => 'ᆭ',\n  'ㄷ' => 'ᄃ',\n  'ㄸ' => 'ᄄ',\n  'ㄹ' => 'ᄅ',\n  'ㄺ' => 'ᆰ',\n  'ㄻ' => 'ᆱ',\n  'ㄼ' => 'ᆲ',\n  'ㄽ' => 'ᆳ',\n  'ㄾ' => 'ᆴ',\n  'ㄿ' => 'ᆵ',\n  'ㅀ' => 'ᄚ',\n  'ㅁ' => 'ᄆ',\n  'ㅂ' => 'ᄇ',\n  'ㅃ' => 'ᄈ',\n  'ㅄ' => 'ᄡ',\n  'ㅅ' => 'ᄉ',\n  'ㅆ' => 'ᄊ',\n  'ㅇ' => 'ᄋ',\n  'ㅈ' => 'ᄌ',\n  'ㅉ' => 'ᄍ',\n  'ㅊ' => 'ᄎ',\n  'ㅋ' => 'ᄏ',\n  'ㅌ' => 'ᄐ',\n  'ㅍ' => 'ᄑ',\n  'ㅎ' => 'ᄒ',\n  'ㅏ' => 'ᅡ',\n  'ㅐ' => 'ᅢ',\n  'ㅑ' => 'ᅣ',\n  'ㅒ' => 'ᅤ',\n  'ㅓ' => 'ᅥ',\n  'ㅔ' => 'ᅦ',\n  'ㅕ' => 'ᅧ',\n  'ㅖ' => 'ᅨ',\n  'ㅗ' => 'ᅩ',\n  'ㅘ' => 'ᅪ',\n  'ㅙ' => 'ᅫ',\n  'ㅚ' => 'ᅬ',\n  'ㅛ' => 'ᅭ',\n  'ㅜ' => 'ᅮ',\n  'ㅝ' => 'ᅯ',\n  'ㅞ' => 'ᅰ',\n  'ㅟ' => 'ᅱ',\n  'ㅠ' => 'ᅲ',\n  'ㅡ' => 'ᅳ',\n  'ㅢ' => 'ᅴ',\n  'ㅣ' => 'ᅵ',\n  'ㅤ' => 'ᅠ',\n  'ㅥ' => 'ᄔ',\n  'ㅦ' => 'ᄕ',\n  'ㅧ' => 'ᇇ',\n  'ㅨ' => 'ᇈ',\n  'ㅩ' => 'ᇌ',\n  'ㅪ' => 'ᇎ',\n  'ㅫ' => 'ᇓ',\n  'ㅬ' => 'ᇗ',\n  'ㅭ' => 'ᇙ',\n  'ㅮ' => 'ᄜ',\n  'ㅯ' => 'ᇝ',\n  'ㅰ' => 'ᇟ',\n  'ㅱ' => 'ᄝ',\n  'ㅲ' => 'ᄞ',\n  'ㅳ' => 'ᄠ',\n  'ㅴ' => 'ᄢ',\n  'ㅵ' => 'ᄣ',\n  'ㅶ' => 'ᄧ',\n  'ㅷ' => 'ᄩ',\n  'ㅸ' => 'ᄫ',\n  'ㅹ' => 'ᄬ',\n  'ㅺ' => 'ᄭ',\n  'ㅻ' => 'ᄮ',\n  'ㅼ' => 'ᄯ',\n  'ㅽ' => 'ᄲ',\n  'ㅾ' => 'ᄶ',\n  'ㅿ' => 'ᅀ',\n  'ㆀ' => 'ᅇ',\n  'ㆁ' => 'ᅌ',\n  'ㆂ' => 'ᇱ',\n  'ㆃ' => 'ᇲ',\n  'ㆄ' => 'ᅗ',\n  'ㆅ' => 'ᅘ',\n  'ㆆ' => 'ᅙ',\n  'ㆇ' => 'ᆄ',\n  'ㆈ' => 'ᆅ',\n  'ㆉ' => 'ᆈ',\n  'ㆊ' => 'ᆑ',\n  'ㆋ' => 'ᆒ',\n  'ㆌ' => 'ᆔ',\n  'ㆍ' => 'ᆞ',\n  'ㆎ' => 'ᆡ',\n  '㆒' => '一',\n  '㆓' => '二',\n  '㆔' => '三',\n  '㆕' => '四',\n  '㆖' => '上',\n  '㆗' => '中',\n  '㆘' => '下',\n  '㆙' => '甲',\n  '㆚' => '乙',\n  '㆛' => '丙',\n  '㆜' => '丁',\n  '㆝' => '天',\n  '㆞' => '地',\n  '㆟' => '人',\n  '㈀' => '(ᄀ)',\n  '㈁' => '(ᄂ)',\n  '㈂' => '(ᄃ)',\n  '㈃' => '(ᄅ)',\n  '㈄' => '(ᄆ)',\n  '㈅' => '(ᄇ)',\n  '㈆' => '(ᄉ)',\n  '㈇' => '(ᄋ)',\n  '㈈' => '(ᄌ)',\n  '㈉' => '(ᄎ)',\n  '㈊' => '(ᄏ)',\n  '㈋' => '(ᄐ)',\n  '㈌' => '(ᄑ)',\n  '㈍' => '(ᄒ)',\n  '㈎' => '(가)',\n  '㈏' => '(나)',\n  '㈐' => '(다)',\n  '㈑' => '(라)',\n  '㈒' => '(마)',\n  '㈓' => '(바)',\n  '㈔' => '(사)',\n  '㈕' => '(아)',\n  '㈖' => '(자)',\n  '㈗' => '(차)',\n  '㈘' => '(카)',\n  '㈙' => '(타)',\n  '㈚' => '(파)',\n  '㈛' => '(하)',\n  '㈜' => '(주)',\n  '㈝' => '(오전)',\n  '㈞' => '(오후)',\n  '㈠' => '(一)',\n  '㈡' => '(二)',\n  '㈢' => '(三)',\n  '㈣' => '(四)',\n  '㈤' => '(五)',\n  '㈥' => '(六)',\n  '㈦' => '(七)',\n  '㈧' => '(八)',\n  '㈨' => '(九)',\n  '㈩' => '(十)',\n  '㈪' => '(月)',\n  '㈫' => '(火)',\n  '㈬' => '(水)',\n  '㈭' => '(木)',\n  '㈮' => '(金)',\n  '㈯' => '(土)',\n  '㈰' => '(日)',\n  '㈱' => '(株)',\n  '㈲' => '(有)',\n  '㈳' => '(社)',\n  '㈴' => '(名)',\n  '㈵' => '(特)',\n  '㈶' => '(財)',\n  '㈷' => '(祝)',\n  '㈸' => '(労)',\n  '㈹' => '(代)',\n  '㈺' => '(呼)',\n  '㈻' => '(学)',\n  '㈼' => '(監)',\n  '㈽' => '(企)',\n  '㈾' => '(資)',\n  '㈿' => '(協)',\n  '㉀' => '(祭)',\n  '㉁' => '(休)',\n  '㉂' => '(自)',\n  '㉃' => '(至)',\n  '㉄' => '問',\n  '㉅' => '幼',\n  '㉆' => '文',\n  '㉇' => '箏',\n  '㉐' => 'PTE',\n  '㉑' => '21',\n  '㉒' => '22',\n  '㉓' => '23',\n  '㉔' => '24',\n  '㉕' => '25',\n  '㉖' => '26',\n  '㉗' => '27',\n  '㉘' => '28',\n  '㉙' => '29',\n  '㉚' => '30',\n  '㉛' => '31',\n  '㉜' => '32',\n  '㉝' => '33',\n  '㉞' => '34',\n  '㉟' => '35',\n  '㉠' => 'ᄀ',\n  '㉡' => 'ᄂ',\n  '㉢' => 'ᄃ',\n  '㉣' => 'ᄅ',\n  '㉤' => 'ᄆ',\n  '㉥' => 'ᄇ',\n  '㉦' => 'ᄉ',\n  '㉧' => 'ᄋ',\n  '㉨' => 'ᄌ',\n  '㉩' => 'ᄎ',\n  '㉪' => 'ᄏ',\n  '㉫' => 'ᄐ',\n  '㉬' => 'ᄑ',\n  '㉭' => 'ᄒ',\n  '㉮' => '가',\n  '㉯' => '나',\n  '㉰' => '다',\n  '㉱' => '라',\n  '㉲' => '마',\n  '㉳' => '바',\n  '㉴' => '사',\n  '㉵' => '아',\n  '㉶' => '자',\n  '㉷' => '차',\n  '㉸' => '카',\n  '㉹' => '타',\n  '㉺' => '파',\n  '㉻' => '하',\n  '㉼' => '참고',\n  '㉽' => '주의',\n  '㉾' => '우',\n  '㊀' => '一',\n  '㊁' => '二',\n  '㊂' => '三',\n  '㊃' => '四',\n  '㊄' => '五',\n  '㊅' => '六',\n  '㊆' => '七',\n  '㊇' => '八',\n  '㊈' => '九',\n  '㊉' => '十',\n  '㊊' => '月',\n  '㊋' => '火',\n  '㊌' => '水',\n  '㊍' => '木',\n  '㊎' => '金',\n  '㊏' => '土',\n  '㊐' => '日',\n  '㊑' => '株',\n  '㊒' => '有',\n  '㊓' => '社',\n  '㊔' => '名',\n  '㊕' => '特',\n  '㊖' => '財',\n  '㊗' => '祝',\n  '㊘' => '労',\n  '㊙' => '秘',\n  '㊚' => '男',\n  '㊛' => '女',\n  '㊜' => '適',\n  '㊝' => '優',\n  '㊞' => '印',\n  '㊟' => '注',\n  '㊠' => '項',\n  '㊡' => '休',\n  '㊢' => '写',\n  '㊣' => '正',\n  '㊤' => '上',\n  '㊥' => '中',\n  '㊦' => '下',\n  '㊧' => '左',\n  '㊨' => '右',\n  '㊩' => '医',\n  '㊪' => '宗',\n  '㊫' => '学',\n  '㊬' => '監',\n  '㊭' => '企',\n  '㊮' => '資',\n  '㊯' => '協',\n  '㊰' => '夜',\n  '㊱' => '36',\n  '㊲' => '37',\n  '㊳' => '38',\n  '㊴' => '39',\n  '㊵' => '40',\n  '㊶' => '41',\n  '㊷' => '42',\n  '㊸' => '43',\n  '㊹' => '44',\n  '㊺' => '45',\n  '㊻' => '46',\n  '㊼' => '47',\n  '㊽' => '48',\n  '㊾' => '49',\n  '㊿' => '50',\n  '㋀' => '1月',\n  '㋁' => '2月',\n  '㋂' => '3月',\n  '㋃' => '4月',\n  '㋄' => '5月',\n  '㋅' => '6月',\n  '㋆' => '7月',\n  '㋇' => '8月',\n  '㋈' => '9月',\n  '㋉' => '10月',\n  '㋊' => '11月',\n  '㋋' => '12月',\n  '㋌' => 'Hg',\n  '㋍' => 'erg',\n  '㋎' => 'eV',\n  '㋏' => 'LTD',\n  '㋐' => 'ア',\n  '㋑' => 'イ',\n  '㋒' => 'ウ',\n  '㋓' => 'エ',\n  '㋔' => 'オ',\n  '㋕' => 'カ',\n  '㋖' => 'キ',\n  '㋗' => 'ク',\n  '㋘' => 'ケ',\n  '㋙' => 'コ',\n  '㋚' => 'サ',\n  '㋛' => 'シ',\n  '㋜' => 'ス',\n  '㋝' => 'セ',\n  '㋞' => 'ソ',\n  '㋟' => 'タ',\n  '㋠' => 'チ',\n  '㋡' => 'ツ',\n  '㋢' => 'テ',\n  '㋣' => 'ト',\n  '㋤' => 'ナ',\n  '㋥' => 'ニ',\n  '㋦' => 'ヌ',\n  '㋧' => 'ネ',\n  '㋨' => 'ノ',\n  '㋩' => 'ハ',\n  '㋪' => 'ヒ',\n  '㋫' => 'フ',\n  '㋬' => 'ヘ',\n  '㋭' => 'ホ',\n  '㋮' => 'マ',\n  '㋯' => 'ミ',\n  '㋰' => 'ム',\n  '㋱' => 'メ',\n  '㋲' => 'モ',\n  '㋳' => 'ヤ',\n  '㋴' => 'ユ',\n  '㋵' => 'ヨ',\n  '㋶' => 'ラ',\n  '㋷' => 'リ',\n  '㋸' => 'ル',\n  '㋹' => 'レ',\n  '㋺' => 'ロ',\n  '㋻' => 'ワ',\n  '㋼' => 'ヰ',\n  '㋽' => 'ヱ',\n  '㋾' => 'ヲ',\n  '㋿' => '令和',\n  '㌀' => 'アパート',\n  '㌁' => 'アルファ',\n  '㌂' => 'アンペア',\n  '㌃' => 'アール',\n  '㌄' => 'イニング',\n  '㌅' => 'インチ',\n  '㌆' => 'ウォン',\n  '㌇' => 'エスクード',\n  '㌈' => 'エーカー',\n  '㌉' => 'オンス',\n  '㌊' => 'オーム',\n  '㌋' => 'カイリ',\n  '㌌' => 'カラット',\n  '㌍' => 'カロリー',\n  '㌎' => 'ガロン',\n  '㌏' => 'ガンマ',\n  '㌐' => 'ギガ',\n  '㌑' => 'ギニー',\n  '㌒' => 'キュリー',\n  '㌓' => 'ギルダー',\n  '㌔' => 'キロ',\n  '㌕' => 'キログラム',\n  '㌖' => 'キロメートル',\n  '㌗' => 'キロワット',\n  '㌘' => 'グラム',\n  '㌙' => 'グラムトン',\n  '㌚' => 'クルゼイロ',\n  '㌛' => 'クローネ',\n  '㌜' => 'ケース',\n  '㌝' => 'コルナ',\n  '㌞' => 'コーポ',\n  '㌟' => 'サイクル',\n  '㌠' => 'サンチーム',\n  '㌡' => 'シリング',\n  '㌢' => 'センチ',\n  '㌣' => 'セント',\n  '㌤' => 'ダース',\n  '㌥' => 'デシ',\n  '㌦' => 'ドル',\n  '㌧' => 'トン',\n  '㌨' => 'ナノ',\n  '㌩' => 'ノット',\n  '㌪' => 'ハイツ',\n  '㌫' => 'パーセント',\n  '㌬' => 'パーツ',\n  '㌭' => 'バーレル',\n  '㌮' => 'ピアストル',\n  '㌯' => 'ピクル',\n  '㌰' => 'ピコ',\n  '㌱' => 'ビル',\n  '㌲' => 'ファラッド',\n  '㌳' => 'フィート',\n  '㌴' => 'ブッシェル',\n  '㌵' => 'フラン',\n  '㌶' => 'ヘクタール',\n  '㌷' => 'ペソ',\n  '㌸' => 'ペニヒ',\n  '㌹' => 'ヘルツ',\n  '㌺' => 'ペンス',\n  '㌻' => 'ページ',\n  '㌼' => 'ベータ',\n  '㌽' => 'ポイント',\n  '㌾' => 'ボルト',\n  '㌿' => 'ホン',\n  '㍀' => 'ポンド',\n  '㍁' => 'ホール',\n  '㍂' => 'ホーン',\n  '㍃' => 'マイクロ',\n  '㍄' => 'マイル',\n  '㍅' => 'マッハ',\n  '㍆' => 'マルク',\n  '㍇' => 'マンション',\n  '㍈' => 'ミクロン',\n  '㍉' => 'ミリ',\n  '㍊' => 'ミリバール',\n  '㍋' => 'メガ',\n  '㍌' => 'メガトン',\n  '㍍' => 'メートル',\n  '㍎' => 'ヤード',\n  '㍏' => 'ヤール',\n  '㍐' => 'ユアン',\n  '㍑' => 'リットル',\n  '㍒' => 'リラ',\n  '㍓' => 'ルピー',\n  '㍔' => 'ルーブル',\n  '㍕' => 'レム',\n  '㍖' => 'レントゲン',\n  '㍗' => 'ワット',\n  '㍘' => '0点',\n  '㍙' => '1点',\n  '㍚' => '2点',\n  '㍛' => '3点',\n  '㍜' => '4点',\n  '㍝' => '5点',\n  '㍞' => '6点',\n  '㍟' => '7点',\n  '㍠' => '8点',\n  '㍡' => '9点',\n  '㍢' => '10点',\n  '㍣' => '11点',\n  '㍤' => '12点',\n  '㍥' => '13点',\n  '㍦' => '14点',\n  '㍧' => '15点',\n  '㍨' => '16点',\n  '㍩' => '17点',\n  '㍪' => '18点',\n  '㍫' => '19点',\n  '㍬' => '20点',\n  '㍭' => '21点',\n  '㍮' => '22点',\n  '㍯' => '23点',\n  '㍰' => '24点',\n  '㍱' => 'hPa',\n  '㍲' => 'da',\n  '㍳' => 'AU',\n  '㍴' => 'bar',\n  '㍵' => 'oV',\n  '㍶' => 'pc',\n  '㍷' => 'dm',\n  '㍸' => 'dm²',\n  '㍹' => 'dm³',\n  '㍺' => 'IU',\n  '㍻' => '平成',\n  '㍼' => '昭和',\n  '㍽' => '大正',\n  '㍾' => '明治',\n  '㍿' => '株式会社',\n  '㎀' => 'pA',\n  '㎁' => 'nA',\n  '㎂' => 'μA',\n  '㎃' => 'mA',\n  '㎄' => 'kA',\n  '㎅' => 'KB',\n  '㎆' => 'MB',\n  '㎇' => 'GB',\n  '㎈' => 'cal',\n  '㎉' => 'kcal',\n  '㎊' => 'pF',\n  '㎋' => 'nF',\n  '㎌' => 'μF',\n  '㎍' => 'μg',\n  '㎎' => 'mg',\n  '㎏' => 'kg',\n  '㎐' => 'Hz',\n  '㎑' => 'kHz',\n  '㎒' => 'MHz',\n  '㎓' => 'GHz',\n  '㎔' => 'THz',\n  '㎕' => 'μℓ',\n  '㎖' => 'mℓ',\n  '㎗' => 'dℓ',\n  '㎘' => 'kℓ',\n  '㎙' => 'fm',\n  '㎚' => 'nm',\n  '㎛' => 'μm',\n  '㎜' => 'mm',\n  '㎝' => 'cm',\n  '㎞' => 'km',\n  '㎟' => 'mm²',\n  '㎠' => 'cm²',\n  '㎡' => 'm²',\n  '㎢' => 'km²',\n  '㎣' => 'mm³',\n  '㎤' => 'cm³',\n  '㎥' => 'm³',\n  '㎦' => 'km³',\n  '㎧' => 'm∕s',\n  '㎨' => 'm∕s²',\n  '㎩' => 'Pa',\n  '㎪' => 'kPa',\n  '㎫' => 'MPa',\n  '㎬' => 'GPa',\n  '㎭' => 'rad',\n  '㎮' => 'rad∕s',\n  '㎯' => 'rad∕s²',\n  '㎰' => 'ps',\n  '㎱' => 'ns',\n  '㎲' => 'μs',\n  '㎳' => 'ms',\n  '㎴' => 'pV',\n  '㎵' => 'nV',\n  '㎶' => 'μV',\n  '㎷' => 'mV',\n  '㎸' => 'kV',\n  '㎹' => 'MV',\n  '㎺' => 'pW',\n  '㎻' => 'nW',\n  '㎼' => 'μW',\n  '㎽' => 'mW',\n  '㎾' => 'kW',\n  '㎿' => 'MW',\n  '㏀' => 'kΩ',\n  '㏁' => 'MΩ',\n  '㏂' => 'a.m.',\n  '㏃' => 'Bq',\n  '㏄' => 'cc',\n  '㏅' => 'cd',\n  '㏆' => 'C∕kg',\n  '㏇' => 'Co.',\n  '㏈' => 'dB',\n  '㏉' => 'Gy',\n  '㏊' => 'ha',\n  '㏋' => 'HP',\n  '㏌' => 'in',\n  '㏍' => 'KK',\n  '㏎' => 'KM',\n  '㏏' => 'kt',\n  '㏐' => 'lm',\n  '㏑' => 'ln',\n  '㏒' => 'log',\n  '㏓' => 'lx',\n  '㏔' => 'mb',\n  '㏕' => 'mil',\n  '㏖' => 'mol',\n  '㏗' => 'PH',\n  '㏘' => 'p.m.',\n  '㏙' => 'PPM',\n  '㏚' => 'PR',\n  '㏛' => 'sr',\n  '㏜' => 'Sv',\n  '㏝' => 'Wb',\n  '㏞' => 'V∕m',\n  '㏟' => 'A∕m',\n  '㏠' => '1日',\n  '㏡' => '2日',\n  '㏢' => '3日',\n  '㏣' => '4日',\n  '㏤' => '5日',\n  '㏥' => '6日',\n  '㏦' => '7日',\n  '㏧' => '8日',\n  '㏨' => '9日',\n  '㏩' => '10日',\n  '㏪' => '11日',\n  '㏫' => '12日',\n  '㏬' => '13日',\n  '㏭' => '14日',\n  '㏮' => '15日',\n  '㏯' => '16日',\n  '㏰' => '17日',\n  '㏱' => '18日',\n  '㏲' => '19日',\n  '㏳' => '20日',\n  '㏴' => '21日',\n  '㏵' => '22日',\n  '㏶' => '23日',\n  '㏷' => '24日',\n  '㏸' => '25日',\n  '㏹' => '26日',\n  '㏺' => '27日',\n  '㏻' => '28日',\n  '㏼' => '29日',\n  '㏽' => '30日',\n  '㏾' => '31日',\n  '㏿' => 'gal',\n  'ꚜ' => 'ъ',\n  'ꚝ' => 'ь',\n  'ꝰ' => 'ꝯ',\n  'ꟲ' => 'C',\n  'ꟳ' => 'F',\n  'ꟴ' => 'Q',\n  'ꟸ' => 'Ħ',\n  'ꟹ' => 'œ',\n  'ꭜ' => 'ꜧ',\n  'ꭝ' => 'ꬷ',\n  'ꭞ' => 'ɫ',\n  'ꭟ' => 'ꭒ',\n  'ꭩ' => 'ʍ',\n  'ﬀ' => 'ff',\n  'ﬁ' => 'fi',\n  'ﬂ' => 'fl',\n  'ﬃ' => 'ffi',\n  'ﬄ' => 'ffl',\n  'ﬅ' => 'ſt',\n  'ﬆ' => 'st',\n  'ﬓ' => 'մն',\n  'ﬔ' => 'մե',\n  'ﬕ' => 'մի',\n  'ﬖ' => 'վն',\n  'ﬗ' => 'մխ',\n  'ﬠ' => 'ע',\n  'ﬡ' => 'א',\n  'ﬢ' => 'ד',\n  'ﬣ' => 'ה',\n  'ﬤ' => 'כ',\n  'ﬥ' => 'ל',\n  'ﬦ' => 'ם',\n  'ﬧ' => 'ר',\n  'ﬨ' => 'ת',\n  '﬩' => '+',\n  'ﭏ' => 'אל',\n  'ﭐ' => 'ٱ',\n  'ﭑ' => 'ٱ',\n  'ﭒ' => 'ٻ',\n  'ﭓ' => 'ٻ',\n  'ﭔ' => 'ٻ',\n  'ﭕ' => 'ٻ',\n  'ﭖ' => 'پ',\n  'ﭗ' => 'پ',\n  'ﭘ' => 'پ',\n  'ﭙ' => 'پ',\n  'ﭚ' => 'ڀ',\n  'ﭛ' => 'ڀ',\n  'ﭜ' => 'ڀ',\n  'ﭝ' => 'ڀ',\n  'ﭞ' => 'ٺ',\n  'ﭟ' => 'ٺ',\n  'ﭠ' => 'ٺ',\n  'ﭡ' => 'ٺ',\n  'ﭢ' => 'ٿ',\n  'ﭣ' => 'ٿ',\n  'ﭤ' => 'ٿ',\n  'ﭥ' => 'ٿ',\n  'ﭦ' => 'ٹ',\n  'ﭧ' => 'ٹ',\n  'ﭨ' => 'ٹ',\n  'ﭩ' => 'ٹ',\n  'ﭪ' => 'ڤ',\n  'ﭫ' => 'ڤ',\n  'ﭬ' => 'ڤ',\n  'ﭭ' => 'ڤ',\n  'ﭮ' => 'ڦ',\n  'ﭯ' => 'ڦ',\n  'ﭰ' => 'ڦ',\n  'ﭱ' => 'ڦ',\n  'ﭲ' => 'ڄ',\n  'ﭳ' => 'ڄ',\n  'ﭴ' => 'ڄ',\n  'ﭵ' => 'ڄ',\n  'ﭶ' => 'ڃ',\n  'ﭷ' => 'ڃ',\n  'ﭸ' => 'ڃ',\n  'ﭹ' => 'ڃ',\n  'ﭺ' => 'چ',\n  'ﭻ' => 'چ',\n  'ﭼ' => 'چ',\n  'ﭽ' => 'چ',\n  'ﭾ' => 'ڇ',\n  'ﭿ' => 'ڇ',\n  'ﮀ' => 'ڇ',\n  'ﮁ' => 'ڇ',\n  'ﮂ' => 'ڍ',\n  'ﮃ' => 'ڍ',\n  'ﮄ' => 'ڌ',\n  'ﮅ' => 'ڌ',\n  'ﮆ' => 'ڎ',\n  'ﮇ' => 'ڎ',\n  'ﮈ' => 'ڈ',\n  'ﮉ' => 'ڈ',\n  'ﮊ' => 'ژ',\n  'ﮋ' => 'ژ',\n  'ﮌ' => 'ڑ',\n  'ﮍ' => 'ڑ',\n  'ﮎ' => 'ک',\n  'ﮏ' => 'ک',\n  'ﮐ' => 'ک',\n  'ﮑ' => 'ک',\n  'ﮒ' => 'گ',\n  'ﮓ' => 'گ',\n  'ﮔ' => 'گ',\n  'ﮕ' => 'گ',\n  'ﮖ' => 'ڳ',\n  'ﮗ' => 'ڳ',\n  'ﮘ' => 'ڳ',\n  'ﮙ' => 'ڳ',\n  'ﮚ' => 'ڱ',\n  'ﮛ' => 'ڱ',\n  'ﮜ' => 'ڱ',\n  'ﮝ' => 'ڱ',\n  'ﮞ' => 'ں',\n  'ﮟ' => 'ں',\n  'ﮠ' => 'ڻ',\n  'ﮡ' => 'ڻ',\n  'ﮢ' => 'ڻ',\n  'ﮣ' => 'ڻ',\n  'ﮤ' => 'ۀ',\n  'ﮥ' => 'ۀ',\n  'ﮦ' => 'ہ',\n  'ﮧ' => 'ہ',\n  'ﮨ' => 'ہ',\n  'ﮩ' => 'ہ',\n  'ﮪ' => 'ھ',\n  'ﮫ' => 'ھ',\n  'ﮬ' => 'ھ',\n  'ﮭ' => 'ھ',\n  'ﮮ' => 'ے',\n  'ﮯ' => 'ے',\n  'ﮰ' => 'ۓ',\n  'ﮱ' => 'ۓ',\n  'ﯓ' => 'ڭ',\n  'ﯔ' => 'ڭ',\n  'ﯕ' => 'ڭ',\n  'ﯖ' => 'ڭ',\n  'ﯗ' => 'ۇ',\n  'ﯘ' => 'ۇ',\n  'ﯙ' => 'ۆ',\n  'ﯚ' => 'ۆ',\n  'ﯛ' => 'ۈ',\n  'ﯜ' => 'ۈ',\n  'ﯝ' => 'ٷ',\n  'ﯞ' => 'ۋ',\n  'ﯟ' => 'ۋ',\n  'ﯠ' => 'ۅ',\n  'ﯡ' => 'ۅ',\n  'ﯢ' => 'ۉ',\n  'ﯣ' => 'ۉ',\n  'ﯤ' => 'ې',\n  'ﯥ' => 'ې',\n  'ﯦ' => 'ې',\n  'ﯧ' => 'ې',\n  'ﯨ' => 'ى',\n  'ﯩ' => 'ى',\n  'ﯪ' => 'ئا',\n  'ﯫ' => 'ئا',\n  'ﯬ' => 'ئە',\n  'ﯭ' => 'ئە',\n  'ﯮ' => 'ئو',\n  'ﯯ' => 'ئو',\n  'ﯰ' => 'ئۇ',\n  'ﯱ' => 'ئۇ',\n  'ﯲ' => 'ئۆ',\n  'ﯳ' => 'ئۆ',\n  'ﯴ' => 'ئۈ',\n  'ﯵ' => 'ئۈ',\n  'ﯶ' => 'ئې',\n  'ﯷ' => 'ئې',\n  'ﯸ' => 'ئې',\n  'ﯹ' => 'ئى',\n  'ﯺ' => 'ئى',\n  'ﯻ' => 'ئى',\n  'ﯼ' => 'ی',\n  'ﯽ' => 'ی',\n  'ﯾ' => 'ی',\n  'ﯿ' => 'ی',\n  'ﰀ' => 'ئج',\n  'ﰁ' => 'ئح',\n  'ﰂ' => 'ئم',\n  'ﰃ' => 'ئى',\n  'ﰄ' => 'ئي',\n  'ﰅ' => 'بج',\n  'ﰆ' => 'بح',\n  'ﰇ' => 'بخ',\n  'ﰈ' => 'بم',\n  'ﰉ' => 'بى',\n  'ﰊ' => 'بي',\n  'ﰋ' => 'تج',\n  'ﰌ' => 'تح',\n  'ﰍ' => 'تخ',\n  'ﰎ' => 'تم',\n  'ﰏ' => 'تى',\n  'ﰐ' => 'تي',\n  'ﰑ' => 'ثج',\n  'ﰒ' => 'ثم',\n  'ﰓ' => 'ثى',\n  'ﰔ' => 'ثي',\n  'ﰕ' => 'جح',\n  'ﰖ' => 'جم',\n  'ﰗ' => 'حج',\n  'ﰘ' => 'حم',\n  'ﰙ' => 'خج',\n  'ﰚ' => 'خح',\n  'ﰛ' => 'خم',\n  'ﰜ' => 'سج',\n  'ﰝ' => 'سح',\n  'ﰞ' => 'سخ',\n  'ﰟ' => 'سم',\n  'ﰠ' => 'صح',\n  'ﰡ' => 'صم',\n  'ﰢ' => 'ضج',\n  'ﰣ' => 'ضح',\n  'ﰤ' => 'ضخ',\n  'ﰥ' => 'ضم',\n  'ﰦ' => 'طح',\n  'ﰧ' => 'طم',\n  'ﰨ' => 'ظم',\n  'ﰩ' => 'عج',\n  'ﰪ' => 'عم',\n  'ﰫ' => 'غج',\n  'ﰬ' => 'غم',\n  'ﰭ' => 'فج',\n  'ﰮ' => 'فح',\n  'ﰯ' => 'فخ',\n  'ﰰ' => 'فم',\n  'ﰱ' => 'فى',\n  'ﰲ' => 'في',\n  'ﰳ' => 'قح',\n  'ﰴ' => 'قم',\n  'ﰵ' => 'قى',\n  'ﰶ' => 'قي',\n  'ﰷ' => 'كا',\n  'ﰸ' => 'كج',\n  'ﰹ' => 'كح',\n  'ﰺ' => 'كخ',\n  'ﰻ' => 'كل',\n  'ﰼ' => 'كم',\n  'ﰽ' => 'كى',\n  'ﰾ' => 'كي',\n  'ﰿ' => 'لج',\n  'ﱀ' => 'لح',\n  'ﱁ' => 'لخ',\n  'ﱂ' => 'لم',\n  'ﱃ' => 'لى',\n  'ﱄ' => 'لي',\n  'ﱅ' => 'مج',\n  'ﱆ' => 'مح',\n  'ﱇ' => 'مخ',\n  'ﱈ' => 'مم',\n  'ﱉ' => 'مى',\n  'ﱊ' => 'مي',\n  'ﱋ' => 'نج',\n  'ﱌ' => 'نح',\n  'ﱍ' => 'نخ',\n  'ﱎ' => 'نم',\n  'ﱏ' => 'نى',\n  'ﱐ' => 'ني',\n  'ﱑ' => 'هج',\n  'ﱒ' => 'هم',\n  'ﱓ' => 'هى',\n  'ﱔ' => 'هي',\n  'ﱕ' => 'يج',\n  'ﱖ' => 'يح',\n  'ﱗ' => 'يخ',\n  'ﱘ' => 'يم',\n  'ﱙ' => 'يى',\n  'ﱚ' => 'يي',\n  'ﱛ' => 'ذٰ',\n  'ﱜ' => 'رٰ',\n  'ﱝ' => 'ىٰ',\n  'ﱞ' => ' ٌّ',\n  'ﱟ' => ' ٍّ',\n  'ﱠ' => ' َّ',\n  'ﱡ' => ' ُّ',\n  'ﱢ' => ' ِّ',\n  'ﱣ' => ' ّٰ',\n  'ﱤ' => 'ئر',\n  'ﱥ' => 'ئز',\n  'ﱦ' => 'ئم',\n  'ﱧ' => 'ئن',\n  'ﱨ' => 'ئى',\n  'ﱩ' => 'ئي',\n  'ﱪ' => 'بر',\n  'ﱫ' => 'بز',\n  'ﱬ' => 'بم',\n  'ﱭ' => 'بن',\n  'ﱮ' => 'بى',\n  'ﱯ' => 'بي',\n  'ﱰ' => 'تر',\n  'ﱱ' => 'تز',\n  'ﱲ' => 'تم',\n  'ﱳ' => 'تن',\n  'ﱴ' => 'تى',\n  'ﱵ' => 'تي',\n  'ﱶ' => 'ثر',\n  'ﱷ' => 'ثز',\n  'ﱸ' => 'ثم',\n  'ﱹ' => 'ثن',\n  'ﱺ' => 'ثى',\n  'ﱻ' => 'ثي',\n  'ﱼ' => 'فى',\n  'ﱽ' => 'في',\n  'ﱾ' => 'قى',\n  'ﱿ' => 'قي',\n  'ﲀ' => 'كا',\n  'ﲁ' => 'كل',\n  'ﲂ' => 'كم',\n  'ﲃ' => 'كى',\n  'ﲄ' => 'كي',\n  'ﲅ' => 'لم',\n  'ﲆ' => 'لى',\n  'ﲇ' => 'لي',\n  'ﲈ' => 'ما',\n  'ﲉ' => 'مم',\n  'ﲊ' => 'نر',\n  'ﲋ' => 'نز',\n  'ﲌ' => 'نم',\n  'ﲍ' => 'نن',\n  'ﲎ' => 'نى',\n  'ﲏ' => 'ني',\n  'ﲐ' => 'ىٰ',\n  'ﲑ' => 'ير',\n  'ﲒ' => 'يز',\n  'ﲓ' => 'يم',\n  'ﲔ' => 'ين',\n  'ﲕ' => 'يى',\n  'ﲖ' => 'يي',\n  'ﲗ' => 'ئج',\n  'ﲘ' => 'ئح',\n  'ﲙ' => 'ئخ',\n  'ﲚ' => 'ئم',\n  'ﲛ' => 'ئه',\n  'ﲜ' => 'بج',\n  'ﲝ' => 'بح',\n  'ﲞ' => 'بخ',\n  'ﲟ' => 'بم',\n  'ﲠ' => 'به',\n  'ﲡ' => 'تج',\n  'ﲢ' => 'تح',\n  'ﲣ' => 'تخ',\n  'ﲤ' => 'تم',\n  'ﲥ' => 'ته',\n  'ﲦ' => 'ثم',\n  'ﲧ' => 'جح',\n  'ﲨ' => 'جم',\n  'ﲩ' => 'حج',\n  'ﲪ' => 'حم',\n  'ﲫ' => 'خج',\n  'ﲬ' => 'خم',\n  'ﲭ' => 'سج',\n  'ﲮ' => 'سح',\n  'ﲯ' => 'سخ',\n  'ﲰ' => 'سم',\n  'ﲱ' => 'صح',\n  'ﲲ' => 'صخ',\n  'ﲳ' => 'صم',\n  'ﲴ' => 'ضج',\n  'ﲵ' => 'ضح',\n  'ﲶ' => 'ضخ',\n  'ﲷ' => 'ضم',\n  'ﲸ' => 'طح',\n  'ﲹ' => 'ظم',\n  'ﲺ' => 'عج',\n  'ﲻ' => 'عم',\n  'ﲼ' => 'غج',\n  'ﲽ' => 'غم',\n  'ﲾ' => 'فج',\n  'ﲿ' => 'فح',\n  'ﳀ' => 'فخ',\n  'ﳁ' => 'فم',\n  'ﳂ' => 'قح',\n  'ﳃ' => 'قم',\n  'ﳄ' => 'كج',\n  'ﳅ' => 'كح',\n  'ﳆ' => 'كخ',\n  'ﳇ' => 'كل',\n  'ﳈ' => 'كم',\n  'ﳉ' => 'لج',\n  'ﳊ' => 'لح',\n  'ﳋ' => 'لخ',\n  'ﳌ' => 'لم',\n  'ﳍ' => 'له',\n  'ﳎ' => 'مج',\n  'ﳏ' => 'مح',\n  'ﳐ' => 'مخ',\n  'ﳑ' => 'مم',\n  'ﳒ' => 'نج',\n  'ﳓ' => 'نح',\n  'ﳔ' => 'نخ',\n  'ﳕ' => 'نم',\n  'ﳖ' => 'نه',\n  'ﳗ' => 'هج',\n  'ﳘ' => 'هم',\n  'ﳙ' => 'هٰ',\n  'ﳚ' => 'يج',\n  'ﳛ' => 'يح',\n  'ﳜ' => 'يخ',\n  'ﳝ' => 'يم',\n  'ﳞ' => 'يه',\n  'ﳟ' => 'ئم',\n  'ﳠ' => 'ئه',\n  'ﳡ' => 'بم',\n  'ﳢ' => 'به',\n  'ﳣ' => 'تم',\n  'ﳤ' => 'ته',\n  'ﳥ' => 'ثم',\n  'ﳦ' => 'ثه',\n  'ﳧ' => 'سم',\n  'ﳨ' => 'سه',\n  'ﳩ' => 'شم',\n  'ﳪ' => 'شه',\n  'ﳫ' => 'كل',\n  'ﳬ' => 'كم',\n  'ﳭ' => 'لم',\n  'ﳮ' => 'نم',\n  'ﳯ' => 'نه',\n  'ﳰ' => 'يم',\n  'ﳱ' => 'يه',\n  'ﳲ' => 'ـَّ',\n  'ﳳ' => 'ـُّ',\n  'ﳴ' => 'ـِّ',\n  'ﳵ' => 'طى',\n  'ﳶ' => 'طي',\n  'ﳷ' => 'عى',\n  'ﳸ' => 'عي',\n  'ﳹ' => 'غى',\n  'ﳺ' => 'غي',\n  'ﳻ' => 'سى',\n  'ﳼ' => 'سي',\n  'ﳽ' => 'شى',\n  'ﳾ' => 'شي',\n  'ﳿ' => 'حى',\n  'ﴀ' => 'حي',\n  'ﴁ' => 'جى',\n  'ﴂ' => 'جي',\n  'ﴃ' => 'خى',\n  'ﴄ' => 'خي',\n  'ﴅ' => 'صى',\n  'ﴆ' => 'صي',\n  'ﴇ' => 'ضى',\n  'ﴈ' => 'ضي',\n  'ﴉ' => 'شج',\n  'ﴊ' => 'شح',\n  'ﴋ' => 'شخ',\n  'ﴌ' => 'شم',\n  'ﴍ' => 'شر',\n  'ﴎ' => 'سر',\n  'ﴏ' => 'صر',\n  'ﴐ' => 'ضر',\n  'ﴑ' => 'طى',\n  'ﴒ' => 'طي',\n  'ﴓ' => 'عى',\n  'ﴔ' => 'عي',\n  'ﴕ' => 'غى',\n  'ﴖ' => 'غي',\n  'ﴗ' => 'سى',\n  'ﴘ' => 'سي',\n  'ﴙ' => 'شى',\n  'ﴚ' => 'شي',\n  'ﴛ' => 'حى',\n  'ﴜ' => 'حي',\n  'ﴝ' => 'جى',\n  'ﴞ' => 'جي',\n  'ﴟ' => 'خى',\n  'ﴠ' => 'خي',\n  'ﴡ' => 'صى',\n  'ﴢ' => 'صي',\n  'ﴣ' => 'ضى',\n  'ﴤ' => 'ضي',\n  'ﴥ' => 'شج',\n  'ﴦ' => 'شح',\n  'ﴧ' => 'شخ',\n  'ﴨ' => 'شم',\n  'ﴩ' => 'شر',\n  'ﴪ' => 'سر',\n  'ﴫ' => 'صر',\n  'ﴬ' => 'ضر',\n  'ﴭ' => 'شج',\n  'ﴮ' => 'شح',\n  'ﴯ' => 'شخ',\n  'ﴰ' => 'شم',\n  'ﴱ' => 'سه',\n  'ﴲ' => 'شه',\n  'ﴳ' => 'طم',\n  'ﴴ' => 'سج',\n  'ﴵ' => 'سح',\n  'ﴶ' => 'سخ',\n  'ﴷ' => 'شج',\n  'ﴸ' => 'شح',\n  'ﴹ' => 'شخ',\n  'ﴺ' => 'طم',\n  'ﴻ' => 'ظم',\n  'ﴼ' => 'اً',\n  'ﴽ' => 'اً',\n  'ﵐ' => 'تجم',\n  'ﵑ' => 'تحج',\n  'ﵒ' => 'تحج',\n  'ﵓ' => 'تحم',\n  'ﵔ' => 'تخم',\n  'ﵕ' => 'تمج',\n  'ﵖ' => 'تمح',\n  'ﵗ' => 'تمخ',\n  'ﵘ' => 'جمح',\n  'ﵙ' => 'جمح',\n  'ﵚ' => 'حمي',\n  'ﵛ' => 'حمى',\n  'ﵜ' => 'سحج',\n  'ﵝ' => 'سجح',\n  'ﵞ' => 'سجى',\n  'ﵟ' => 'سمح',\n  'ﵠ' => 'سمح',\n  'ﵡ' => 'سمج',\n  'ﵢ' => 'سمم',\n  'ﵣ' => 'سمم',\n  'ﵤ' => 'صحح',\n  'ﵥ' => 'صحح',\n  'ﵦ' => 'صمم',\n  'ﵧ' => 'شحم',\n  'ﵨ' => 'شحم',\n  'ﵩ' => 'شجي',\n  'ﵪ' => 'شمخ',\n  'ﵫ' => 'شمخ',\n  'ﵬ' => 'شمم',\n  'ﵭ' => 'شمم',\n  'ﵮ' => 'ضحى',\n  'ﵯ' => 'ضخم',\n  'ﵰ' => 'ضخم',\n  'ﵱ' => 'طمح',\n  'ﵲ' => 'طمح',\n  'ﵳ' => 'طمم',\n  'ﵴ' => 'طمي',\n  'ﵵ' => 'عجم',\n  'ﵶ' => 'عمم',\n  'ﵷ' => 'عمم',\n  'ﵸ' => 'عمى',\n  'ﵹ' => 'غمم',\n  'ﵺ' => 'غمي',\n  'ﵻ' => 'غمى',\n  'ﵼ' => 'فخم',\n  'ﵽ' => 'فخم',\n  'ﵾ' => 'قمح',\n  'ﵿ' => 'قمم',\n  'ﶀ' => 'لحم',\n  'ﶁ' => 'لحي',\n  'ﶂ' => 'لحى',\n  'ﶃ' => 'لجج',\n  'ﶄ' => 'لجج',\n  'ﶅ' => 'لخم',\n  'ﶆ' => 'لخم',\n  'ﶇ' => 'لمح',\n  'ﶈ' => 'لمح',\n  'ﶉ' => 'محج',\n  'ﶊ' => 'محم',\n  'ﶋ' => 'محي',\n  'ﶌ' => 'مجح',\n  'ﶍ' => 'مجم',\n  'ﶎ' => 'مخج',\n  'ﶏ' => 'مخم',\n  'ﶒ' => 'مجخ',\n  'ﶓ' => 'همج',\n  'ﶔ' => 'همم',\n  'ﶕ' => 'نحم',\n  'ﶖ' => 'نحى',\n  'ﶗ' => 'نجم',\n  'ﶘ' => 'نجم',\n  'ﶙ' => 'نجى',\n  'ﶚ' => 'نمي',\n  'ﶛ' => 'نمى',\n  'ﶜ' => 'يمم',\n  'ﶝ' => 'يمم',\n  'ﶞ' => 'بخي',\n  'ﶟ' => 'تجي',\n  'ﶠ' => 'تجى',\n  'ﶡ' => 'تخي',\n  'ﶢ' => 'تخى',\n  'ﶣ' => 'تمي',\n  'ﶤ' => 'تمى',\n  'ﶥ' => 'جمي',\n  'ﶦ' => 'جحى',\n  'ﶧ' => 'جمى',\n  'ﶨ' => 'سخى',\n  'ﶩ' => 'صحي',\n  'ﶪ' => 'شحي',\n  'ﶫ' => 'ضحي',\n  'ﶬ' => 'لجي',\n  'ﶭ' => 'لمي',\n  'ﶮ' => 'يحي',\n  'ﶯ' => 'يجي',\n  'ﶰ' => 'يمي',\n  'ﶱ' => 'ممي',\n  'ﶲ' => 'قمي',\n  'ﶳ' => 'نحي',\n  'ﶴ' => 'قمح',\n  'ﶵ' => 'لحم',\n  'ﶶ' => 'عمي',\n  'ﶷ' => 'كمي',\n  'ﶸ' => 'نجح',\n  'ﶹ' => 'مخي',\n  'ﶺ' => 'لجم',\n  'ﶻ' => 'كمم',\n  'ﶼ' => 'لجم',\n  'ﶽ' => 'نجح',\n  'ﶾ' => 'جحي',\n  'ﶿ' => 'حجي',\n  'ﷀ' => 'مجي',\n  'ﷁ' => 'فمي',\n  'ﷂ' => 'بحي',\n  'ﷃ' => 'كمم',\n  'ﷄ' => 'عجم',\n  'ﷅ' => 'صمم',\n  'ﷆ' => 'سخي',\n  'ﷇ' => 'نجي',\n  'ﷰ' => 'صلے',\n  'ﷱ' => 'قلے',\n  'ﷲ' => 'الله',\n  'ﷳ' => 'اكبر',\n  'ﷴ' => 'محمد',\n  'ﷵ' => 'صلعم',\n  'ﷶ' => 'رسول',\n  'ﷷ' => 'عليه',\n  'ﷸ' => 'وسلم',\n  'ﷹ' => 'صلى',\n  'ﷺ' => 'صلى الله عليه وسلم',\n  'ﷻ' => 'جل جلاله',\n  '﷼' => 'ریال',\n  '︐' => ',',\n  '︑' => '、',\n  '︒' => '。',\n  '︓' => ':',\n  '︔' => ';',\n  '︕' => '!',\n  '︖' => '?',\n  '︗' => '〖',\n  '︘' => '〗',\n  '︙' => '…',\n  '︰' => '‥',\n  '︱' => '—',\n  '︲' => '–',\n  '︳' => '_',\n  '︴' => '_',\n  '︵' => '(',\n  '︶' => ')',\n  '︷' => '{',\n  '︸' => '}',\n  '︹' => '〔',\n  '︺' => '〕',\n  '︻' => '【',\n  '︼' => '】',\n  '︽' => '《',\n  '︾' => '》',\n  '︿' => '〈',\n  '﹀' => '〉',\n  '﹁' => '「',\n  '﹂' => '」',\n  '﹃' => '『',\n  '﹄' => '』',\n  '﹇' => '[',\n  '﹈' => ']',\n  '﹉' => '‾',\n  '﹊' => '‾',\n  '﹋' => '‾',\n  '﹌' => '‾',\n  '﹍' => '_',\n  '﹎' => '_',\n  '﹏' => '_',\n  '﹐' => ',',\n  '﹑' => '、',\n  '﹒' => '.',\n  '﹔' => ';',\n  '﹕' => ':',\n  '﹖' => '?',\n  '﹗' => '!',\n  '﹘' => '—',\n  '﹙' => '(',\n  '﹚' => ')',\n  '﹛' => '{',\n  '﹜' => '}',\n  '﹝' => '〔',\n  '﹞' => '〕',\n  '﹟' => '#',\n  '﹠' => '&',\n  '﹡' => '*',\n  '﹢' => '+',\n  '﹣' => '-',\n  '﹤' => '<',\n  '﹥' => '>',\n  '﹦' => '=',\n  '﹨' => '\\\\',\n  '﹩' => '$',\n  '﹪' => '%',\n  '﹫' => '@',\n  'ﹰ' => ' ً',\n  'ﹱ' => 'ـً',\n  'ﹲ' => ' ٌ',\n  'ﹴ' => ' ٍ',\n  'ﹶ' => ' َ',\n  'ﹷ' => 'ـَ',\n  'ﹸ' => ' ُ',\n  'ﹹ' => 'ـُ',\n  'ﹺ' => ' ِ',\n  'ﹻ' => 'ـِ',\n  'ﹼ' => ' ّ',\n  'ﹽ' => 'ـّ',\n  'ﹾ' => ' ْ',\n  'ﹿ' => 'ـْ',\n  'ﺀ' => 'ء',\n  'ﺁ' => 'آ',\n  'ﺂ' => 'آ',\n  'ﺃ' => 'أ',\n  'ﺄ' => 'أ',\n  'ﺅ' => 'ؤ',\n  'ﺆ' => 'ؤ',\n  'ﺇ' => 'إ',\n  'ﺈ' => 'إ',\n  'ﺉ' => 'ئ',\n  'ﺊ' => 'ئ',\n  'ﺋ' => 'ئ',\n  'ﺌ' => 'ئ',\n  'ﺍ' => 'ا',\n  'ﺎ' => 'ا',\n  'ﺏ' => 'ب',\n  'ﺐ' => 'ب',\n  'ﺑ' => 'ب',\n  'ﺒ' => 'ب',\n  'ﺓ' => 'ة',\n  'ﺔ' => 'ة',\n  'ﺕ' => 'ت',\n  'ﺖ' => 'ت',\n  'ﺗ' => 'ت',\n  'ﺘ' => 'ت',\n  'ﺙ' => 'ث',\n  'ﺚ' => 'ث',\n  'ﺛ' => 'ث',\n  'ﺜ' => 'ث',\n  'ﺝ' => 'ج',\n  'ﺞ' => 'ج',\n  'ﺟ' => 'ج',\n  'ﺠ' => 'ج',\n  'ﺡ' => 'ح',\n  'ﺢ' => 'ح',\n  'ﺣ' => 'ح',\n  'ﺤ' => 'ح',\n  'ﺥ' => 'خ',\n  'ﺦ' => 'خ',\n  'ﺧ' => 'خ',\n  'ﺨ' => 'خ',\n  'ﺩ' => 'د',\n  'ﺪ' => 'د',\n  'ﺫ' => 'ذ',\n  'ﺬ' => 'ذ',\n  'ﺭ' => 'ر',\n  'ﺮ' => 'ر',\n  'ﺯ' => 'ز',\n  'ﺰ' => 'ز',\n  'ﺱ' => 'س',\n  'ﺲ' => 'س',\n  'ﺳ' => 'س',\n  'ﺴ' => 'س',\n  'ﺵ' => 'ش',\n  'ﺶ' => 'ش',\n  'ﺷ' => 'ش',\n  'ﺸ' => 'ش',\n  'ﺹ' => 'ص',\n  'ﺺ' => 'ص',\n  'ﺻ' => 'ص',\n  'ﺼ' => 'ص',\n  'ﺽ' => 'ض',\n  'ﺾ' => 'ض',\n  'ﺿ' => 'ض',\n  'ﻀ' => 'ض',\n  'ﻁ' => 'ط',\n  'ﻂ' => 'ط',\n  'ﻃ' => 'ط',\n  'ﻄ' => 'ط',\n  'ﻅ' => 'ظ',\n  'ﻆ' => 'ظ',\n  'ﻇ' => 'ظ',\n  'ﻈ' => 'ظ',\n  'ﻉ' => 'ع',\n  'ﻊ' => 'ع',\n  'ﻋ' => 'ع',\n  'ﻌ' => 'ع',\n  'ﻍ' => 'غ',\n  'ﻎ' => 'غ',\n  'ﻏ' => 'غ',\n  'ﻐ' => 'غ',\n  'ﻑ' => 'ف',\n  'ﻒ' => 'ف',\n  'ﻓ' => 'ف',\n  'ﻔ' => 'ف',\n  'ﻕ' => 'ق',\n  'ﻖ' => 'ق',\n  'ﻗ' => 'ق',\n  'ﻘ' => 'ق',\n  'ﻙ' => 'ك',\n  'ﻚ' => 'ك',\n  'ﻛ' => 'ك',\n  'ﻜ' => 'ك',\n  'ﻝ' => 'ل',\n  'ﻞ' => 'ل',\n  'ﻟ' => 'ل',\n  'ﻠ' => 'ل',\n  'ﻡ' => 'م',\n  'ﻢ' => 'م',\n  'ﻣ' => 'م',\n  'ﻤ' => 'م',\n  'ﻥ' => 'ن',\n  'ﻦ' => 'ن',\n  'ﻧ' => 'ن',\n  'ﻨ' => 'ن',\n  'ﻩ' => 'ه',\n  'ﻪ' => 'ه',\n  'ﻫ' => 'ه',\n  'ﻬ' => 'ه',\n  'ﻭ' => 'و',\n  'ﻮ' => 'و',\n  'ﻯ' => 'ى',\n  'ﻰ' => 'ى',\n  'ﻱ' => 'ي',\n  'ﻲ' => 'ي',\n  'ﻳ' => 'ي',\n  'ﻴ' => 'ي',\n  'ﻵ' => 'لآ',\n  'ﻶ' => 'لآ',\n  'ﻷ' => 'لأ',\n  'ﻸ' => 'لأ',\n  'ﻹ' => 'لإ',\n  'ﻺ' => 'لإ',\n  'ﻻ' => 'لا',\n  'ﻼ' => 'لا',\n  '！' => '!',\n  '＂' => '\"',\n  '＃' => '#',\n  '＄' => '$',\n  '％' => '%',\n  '＆' => '&',\n  '＇' => '\\'',\n  '（' => '(',\n  '）' => ')',\n  '＊' => '*',\n  '＋' => '+',\n  '，' => ',',\n  '－' => '-',\n  '．' => '.',\n  '／' => '/',\n  '０' => '0',\n  '１' => '1',\n  '２' => '2',\n  '３' => '3',\n  '４' => '4',\n  '５' => '5',\n  '６' => '6',\n  '７' => '7',\n  '８' => '8',\n  '９' => '9',\n  '：' => ':',\n  '；' => ';',\n  '＜' => '<',\n  '＝' => '=',\n  '＞' => '>',\n  '？' => '?',\n  '＠' => '@',\n  'Ａ' => 'A',\n  'Ｂ' => 'B',\n  'Ｃ' => 'C',\n  'Ｄ' => 'D',\n  'Ｅ' => 'E',\n  'Ｆ' => 'F',\n  'Ｇ' => 'G',\n  'Ｈ' => 'H',\n  'Ｉ' => 'I',\n  'Ｊ' => 'J',\n  'Ｋ' => 'K',\n  'Ｌ' => 'L',\n  'Ｍ' => 'M',\n  'Ｎ' => 'N',\n  'Ｏ' => 'O',\n  'Ｐ' => 'P',\n  'Ｑ' => 'Q',\n  'Ｒ' => 'R',\n  'Ｓ' => 'S',\n  'Ｔ' => 'T',\n  'Ｕ' => 'U',\n  'Ｖ' => 'V',\n  'Ｗ' => 'W',\n  'Ｘ' => 'X',\n  'Ｙ' => 'Y',\n  'Ｚ' => 'Z',\n  '［' => '[',\n  '＼' => '\\\\',\n  '］' => ']',\n  '＾' => '^',\n  '＿' => '_',\n  '｀' => '`',\n  'ａ' => 'a',\n  'ｂ' => 'b',\n  'ｃ' => 'c',\n  'ｄ' => 'd',\n  'ｅ' => 'e',\n  'ｆ' => 'f',\n  'ｇ' => 'g',\n  'ｈ' => 'h',\n  'ｉ' => 'i',\n  'ｊ' => 'j',\n  'ｋ' => 'k',\n  'ｌ' => 'l',\n  'ｍ' => 'm',\n  'ｎ' => 'n',\n  'ｏ' => 'o',\n  'ｐ' => 'p',\n  'ｑ' => 'q',\n  'ｒ' => 'r',\n  'ｓ' => 's',\n  'ｔ' => 't',\n  'ｕ' => 'u',\n  'ｖ' => 'v',\n  'ｗ' => 'w',\n  'ｘ' => 'x',\n  'ｙ' => 'y',\n  'ｚ' => 'z',\n  '｛' => '{',\n  '｜' => '|',\n  '｝' => '}',\n  '～' => '~',\n  '｟' => '⦅',\n  '｠' => '⦆',\n  '｡' => '。',\n  '｢' => '「',\n  '｣' => '」',\n  '､' => '、',\n  '･' => '・',\n  'ｦ' => 'ヲ',\n  'ｧ' => 'ァ',\n  'ｨ' => 'ィ',\n  'ｩ' => 'ゥ',\n  'ｪ' => 'ェ',\n  'ｫ' => 'ォ',\n  'ｬ' => 'ャ',\n  'ｭ' => 'ュ',\n  'ｮ' => 'ョ',\n  'ｯ' => 'ッ',\n  'ｰ' => 'ー',\n  'ｱ' => 'ア',\n  'ｲ' => 'イ',\n  'ｳ' => 'ウ',\n  'ｴ' => 'エ',\n  'ｵ' => 'オ',\n  'ｶ' => 'カ',\n  'ｷ' => 'キ',\n  'ｸ' => 'ク',\n  'ｹ' => 'ケ',\n  'ｺ' => 'コ',\n  'ｻ' => 'サ',\n  'ｼ' => 'シ',\n  'ｽ' => 'ス',\n  'ｾ' => 'セ',\n  'ｿ' => 'ソ',\n  'ﾀ' => 'タ',\n  'ﾁ' => 'チ',\n  'ﾂ' => 'ツ',\n  'ﾃ' => 'テ',\n  'ﾄ' => 'ト',\n  'ﾅ' => 'ナ',\n  'ﾆ' => 'ニ',\n  'ﾇ' => 'ヌ',\n  'ﾈ' => 'ネ',\n  'ﾉ' => 'ノ',\n  'ﾊ' => 'ハ',\n  'ﾋ' => 'ヒ',\n  'ﾌ' => 'フ',\n  'ﾍ' => 'ヘ',\n  'ﾎ' => 'ホ',\n  'ﾏ' => 'マ',\n  'ﾐ' => 'ミ',\n  'ﾑ' => 'ム',\n  'ﾒ' => 'メ',\n  'ﾓ' => 'モ',\n  'ﾔ' => 'ヤ',\n  'ﾕ' => 'ユ',\n  'ﾖ' => 'ヨ',\n  'ﾗ' => 'ラ',\n  'ﾘ' => 'リ',\n  'ﾙ' => 'ル',\n  'ﾚ' => 'レ',\n  'ﾛ' => 'ロ',\n  'ﾜ' => 'ワ',\n  'ﾝ' => 'ン',\n  'ﾞ' => '゙',\n  'ﾟ' => '゚',\n  'ﾠ' => 'ㅤ',\n  'ﾡ' => 'ㄱ',\n  'ﾢ' => 'ㄲ',\n  'ﾣ' => 'ㄳ',\n  'ﾤ' => 'ㄴ',\n  'ﾥ' => 'ㄵ',\n  'ﾦ' => 'ㄶ',\n  'ﾧ' => 'ㄷ',\n  'ﾨ' => 'ㄸ',\n  'ﾩ' => 'ㄹ',\n  'ﾪ' => 'ㄺ',\n  'ﾫ' => 'ㄻ',\n  'ﾬ' => 'ㄼ',\n  'ﾭ' => 'ㄽ',\n  'ﾮ' => 'ㄾ',\n  'ﾯ' => 'ㄿ',\n  'ﾰ' => 'ㅀ',\n  'ﾱ' => 'ㅁ',\n  'ﾲ' => 'ㅂ',\n  'ﾳ' => 'ㅃ',\n  'ﾴ' => 'ㅄ',\n  'ﾵ' => 'ㅅ',\n  'ﾶ' => 'ㅆ',\n  'ﾷ' => 'ㅇ',\n  'ﾸ' => 'ㅈ',\n  'ﾹ' => 'ㅉ',\n  'ﾺ' => 'ㅊ',\n  'ﾻ' => 'ㅋ',\n  'ﾼ' => 'ㅌ',\n  'ﾽ' => 'ㅍ',\n  'ﾾ' => 'ㅎ',\n  'ￂ' => 'ㅏ',\n  'ￃ' => 'ㅐ',\n  'ￄ' => 'ㅑ',\n  'ￅ' => 'ㅒ',\n  'ￆ' => 'ㅓ',\n  'ￇ' => 'ㅔ',\n  'ￊ' => 'ㅕ',\n  'ￋ' => 'ㅖ',\n  'ￌ' => 'ㅗ',\n  'ￍ' => 'ㅘ',\n  'ￎ' => 'ㅙ',\n  'ￏ' => 'ㅚ',\n  'ￒ' => 'ㅛ',\n  'ￓ' => 'ㅜ',\n  'ￔ' => 'ㅝ',\n  'ￕ' => 'ㅞ',\n  'ￖ' => 'ㅟ',\n  'ￗ' => 'ㅠ',\n  'ￚ' => 'ㅡ',\n  'ￛ' => 'ㅢ',\n  'ￜ' => 'ㅣ',\n  '￠' => '¢',\n  '￡' => '£',\n  '￢' => '¬',\n  '￣' => '¯',\n  '￤' => '¦',\n  '￥' => '¥',\n  '￦' => '₩',\n  '￨' => '│',\n  '￩' => '←',\n  '￪' => '↑',\n  '￫' => '→',\n  '￬' => '↓',\n  '￭' => '■',\n  '￮' => '○',\n  '𐞁' => 'ː',\n  '𐞂' => 'ˑ',\n  '𐞃' => 'æ',\n  '𐞄' => 'ʙ',\n  '𐞅' => 'ɓ',\n  '𐞇' => 'ʣ',\n  '𐞈' => 'ꭦ',\n  '𐞉' => 'ʥ',\n  '𐞊' => 'ʤ',\n  '𐞋' => 'ɖ',\n  '𐞌' => 'ɗ',\n  '𐞍' => 'ᶑ',\n  '𐞎' => 'ɘ',\n  '𐞏' => 'ɞ',\n  '𐞐' => 'ʩ',\n  '𐞑' => 'ɤ',\n  '𐞒' => 'ɢ',\n  '𐞓' => 'ɠ',\n  '𐞔' => 'ʛ',\n  '𐞕' => 'ħ',\n  '𐞖' => 'ʜ',\n  '𐞗' => 'ɧ',\n  '𐞘' => 'ʄ',\n  '𐞙' => 'ʪ',\n  '𐞚' => 'ʫ',\n  '𐞛' => 'ɬ',\n  '𐞜' => '𝼄',\n  '𐞝' => 'ꞎ',\n  '𐞞' => 'ɮ',\n  '𐞟' => '𝼅',\n  '𐞠' => 'ʎ',\n  '𐞡' => '𝼆',\n  '𐞢' => 'ø',\n  '𐞣' => 'ɶ',\n  '𐞤' => 'ɷ',\n  '𐞥' => 'q',\n  '𐞦' => 'ɺ',\n  '𐞧' => '𝼈',\n  '𐞨' => 'ɽ',\n  '𐞩' => 'ɾ',\n  '𐞪' => 'ʀ',\n  '𐞫' => 'ʨ',\n  '𐞬' => 'ʦ',\n  '𐞭' => 'ꭧ',\n  '𐞮' => 'ʧ',\n  '𐞯' => 'ʈ',\n  '𐞰' => 'ⱱ',\n  '𐞲' => 'ʏ',\n  '𐞳' => 'ʡ',\n  '𐞴' => 'ʢ',\n  '𐞵' => 'ʘ',\n  '𐞶' => 'ǀ',\n  '𐞷' => 'ǁ',\n  '𐞸' => 'ǂ',\n  '𐞹' => '𝼊',\n  '𐞺' => '𝼞',\n  '𝐀' => 'A',\n  '𝐁' => 'B',\n  '𝐂' => 'C',\n  '𝐃' => 'D',\n  '𝐄' => 'E',\n  '𝐅' => 'F',\n  '𝐆' => 'G',\n  '𝐇' => 'H',\n  '𝐈' => 'I',\n  '𝐉' => 'J',\n  '𝐊' => 'K',\n  '𝐋' => 'L',\n  '𝐌' => 'M',\n  '𝐍' => 'N',\n  '𝐎' => 'O',\n  '𝐏' => 'P',\n  '𝐐' => 'Q',\n  '𝐑' => 'R',\n  '𝐒' => 'S',\n  '𝐓' => 'T',\n  '𝐔' => 'U',\n  '𝐕' => 'V',\n  '𝐖' => 'W',\n  '𝐗' => 'X',\n  '𝐘' => 'Y',\n  '𝐙' => 'Z',\n  '𝐚' => 'a',\n  '𝐛' => 'b',\n  '𝐜' => 'c',\n  '𝐝' => 'd',\n  '𝐞' => 'e',\n  '𝐟' => 'f',\n  '𝐠' => 'g',\n  '𝐡' => 'h',\n  '𝐢' => 'i',\n  '𝐣' => 'j',\n  '𝐤' => 'k',\n  '𝐥' => 'l',\n  '𝐦' => 'm',\n  '𝐧' => 'n',\n  '𝐨' => 'o',\n  '𝐩' => 'p',\n  '𝐪' => 'q',\n  '𝐫' => 'r',\n  '𝐬' => 's',\n  '𝐭' => 't',\n  '𝐮' => 'u',\n  '𝐯' => 'v',\n  '𝐰' => 'w',\n  '𝐱' => 'x',\n  '𝐲' => 'y',\n  '𝐳' => 'z',\n  '𝐴' => 'A',\n  '𝐵' => 'B',\n  '𝐶' => 'C',\n  '𝐷' => 'D',\n  '𝐸' => 'E',\n  '𝐹' => 'F',\n  '𝐺' => 'G',\n  '𝐻' => 'H',\n  '𝐼' => 'I',\n  '𝐽' => 'J',\n  '𝐾' => 'K',\n  '𝐿' => 'L',\n  '𝑀' => 'M',\n  '𝑁' => 'N',\n  '𝑂' => 'O',\n  '𝑃' => 'P',\n  '𝑄' => 'Q',\n  '𝑅' => 'R',\n  '𝑆' => 'S',\n  '𝑇' => 'T',\n  '𝑈' => 'U',\n  '𝑉' => 'V',\n  '𝑊' => 'W',\n  '𝑋' => 'X',\n  '𝑌' => 'Y',\n  '𝑍' => 'Z',\n  '𝑎' => 'a',\n  '𝑏' => 'b',\n  '𝑐' => 'c',\n  '𝑑' => 'd',\n  '𝑒' => 'e',\n  '𝑓' => 'f',\n  '𝑔' => 'g',\n  '𝑖' => 'i',\n  '𝑗' => 'j',\n  '𝑘' => 'k',\n  '𝑙' => 'l',\n  '𝑚' => 'm',\n  '𝑛' => 'n',\n  '𝑜' => 'o',\n  '𝑝' => 'p',\n  '𝑞' => 'q',\n  '𝑟' => 'r',\n  '𝑠' => 's',\n  '𝑡' => 't',\n  '𝑢' => 'u',\n  '𝑣' => 'v',\n  '𝑤' => 'w',\n  '𝑥' => 'x',\n  '𝑦' => 'y',\n  '𝑧' => 'z',\n  '𝑨' => 'A',\n  '𝑩' => 'B',\n  '𝑪' => 'C',\n  '𝑫' => 'D',\n  '𝑬' => 'E',\n  '𝑭' => 'F',\n  '𝑮' => 'G',\n  '𝑯' => 'H',\n  '𝑰' => 'I',\n  '𝑱' => 'J',\n  '𝑲' => 'K',\n  '𝑳' => 'L',\n  '𝑴' => 'M',\n  '𝑵' => 'N',\n  '𝑶' => 'O',\n  '𝑷' => 'P',\n  '𝑸' => 'Q',\n  '𝑹' => 'R',\n  '𝑺' => 'S',\n  '𝑻' => 'T',\n  '𝑼' => 'U',\n  '𝑽' => 'V',\n  '𝑾' => 'W',\n  '𝑿' => 'X',\n  '𝒀' => 'Y',\n  '𝒁' => 'Z',\n  '𝒂' => 'a',\n  '𝒃' => 'b',\n  '𝒄' => 'c',\n  '𝒅' => 'd',\n  '𝒆' => 'e',\n  '𝒇' => 'f',\n  '𝒈' => 'g',\n  '𝒉' => 'h',\n  '𝒊' => 'i',\n  '𝒋' => 'j',\n  '𝒌' => 'k',\n  '𝒍' => 'l',\n  '𝒎' => 'm',\n  '𝒏' => 'n',\n  '𝒐' => 'o',\n  '𝒑' => 'p',\n  '𝒒' => 'q',\n  '𝒓' => 'r',\n  '𝒔' => 's',\n  '𝒕' => 't',\n  '𝒖' => 'u',\n  '𝒗' => 'v',\n  '𝒘' => 'w',\n  '𝒙' => 'x',\n  '𝒚' => 'y',\n  '𝒛' => 'z',\n  '𝒜' => 'A',\n  '𝒞' => 'C',\n  '𝒟' => 'D',\n  '𝒢' => 'G',\n  '𝒥' => 'J',\n  '𝒦' => 'K',\n  '𝒩' => 'N',\n  '𝒪' => 'O',\n  '𝒫' => 'P',\n  '𝒬' => 'Q',\n  '𝒮' => 'S',\n  '𝒯' => 'T',\n  '𝒰' => 'U',\n  '𝒱' => 'V',\n  '𝒲' => 'W',\n  '𝒳' => 'X',\n  '𝒴' => 'Y',\n  '𝒵' => 'Z',\n  '𝒶' => 'a',\n  '𝒷' => 'b',\n  '𝒸' => 'c',\n  '𝒹' => 'd',\n  '𝒻' => 'f',\n  '𝒽' => 'h',\n  '𝒾' => 'i',\n  '𝒿' => 'j',\n  '𝓀' => 'k',\n  '𝓁' => 'l',\n  '𝓂' => 'm',\n  '𝓃' => 'n',\n  '𝓅' => 'p',\n  '𝓆' => 'q',\n  '𝓇' => 'r',\n  '𝓈' => 's',\n  '𝓉' => 't',\n  '𝓊' => 'u',\n  '𝓋' => 'v',\n  '𝓌' => 'w',\n  '𝓍' => 'x',\n  '𝓎' => 'y',\n  '𝓏' => 'z',\n  '𝓐' => 'A',\n  '𝓑' => 'B',\n  '𝓒' => 'C',\n  '𝓓' => 'D',\n  '𝓔' => 'E',\n  '𝓕' => 'F',\n  '𝓖' => 'G',\n  '𝓗' => 'H',\n  '𝓘' => 'I',\n  '𝓙' => 'J',\n  '𝓚' => 'K',\n  '𝓛' => 'L',\n  '𝓜' => 'M',\n  '𝓝' => 'N',\n  '𝓞' => 'O',\n  '𝓟' => 'P',\n  '𝓠' => 'Q',\n  '𝓡' => 'R',\n  '𝓢' => 'S',\n  '𝓣' => 'T',\n  '𝓤' => 'U',\n  '𝓥' => 'V',\n  '𝓦' => 'W',\n  '𝓧' => 'X',\n  '𝓨' => 'Y',\n  '𝓩' => 'Z',\n  '𝓪' => 'a',\n  '𝓫' => 'b',\n  '𝓬' => 'c',\n  '𝓭' => 'd',\n  '𝓮' => 'e',\n  '𝓯' => 'f',\n  '𝓰' => 'g',\n  '𝓱' => 'h',\n  '𝓲' => 'i',\n  '𝓳' => 'j',\n  '𝓴' => 'k',\n  '𝓵' => 'l',\n  '𝓶' => 'm',\n  '𝓷' => 'n',\n  '𝓸' => 'o',\n  '𝓹' => 'p',\n  '𝓺' => 'q',\n  '𝓻' => 'r',\n  '𝓼' => 's',\n  '𝓽' => 't',\n  '𝓾' => 'u',\n  '𝓿' => 'v',\n  '𝔀' => 'w',\n  '𝔁' => 'x',\n  '𝔂' => 'y',\n  '𝔃' => 'z',\n  '𝔄' => 'A',\n  '𝔅' => 'B',\n  '𝔇' => 'D',\n  '𝔈' => 'E',\n  '𝔉' => 'F',\n  '𝔊' => 'G',\n  '𝔍' => 'J',\n  '𝔎' => 'K',\n  '𝔏' => 'L',\n  '𝔐' => 'M',\n  '𝔑' => 'N',\n  '𝔒' => 'O',\n  '𝔓' => 'P',\n  '𝔔' => 'Q',\n  '𝔖' => 'S',\n  '𝔗' => 'T',\n  '𝔘' => 'U',\n  '𝔙' => 'V',\n  '𝔚' => 'W',\n  '𝔛' => 'X',\n  '𝔜' => 'Y',\n  '𝔞' => 'a',\n  '𝔟' => 'b',\n  '𝔠' => 'c',\n  '𝔡' => 'd',\n  '𝔢' => 'e',\n  '𝔣' => 'f',\n  '𝔤' => 'g',\n  '𝔥' => 'h',\n  '𝔦' => 'i',\n  '𝔧' => 'j',\n  '𝔨' => 'k',\n  '𝔩' => 'l',\n  '𝔪' => 'm',\n  '𝔫' => 'n',\n  '𝔬' => 'o',\n  '𝔭' => 'p',\n  '𝔮' => 'q',\n  '𝔯' => 'r',\n  '𝔰' => 's',\n  '𝔱' => 't',\n  '𝔲' => 'u',\n  '𝔳' => 'v',\n  '𝔴' => 'w',\n  '𝔵' => 'x',\n  '𝔶' => 'y',\n  '𝔷' => 'z',\n  '𝔸' => 'A',\n  '𝔹' => 'B',\n  '𝔻' => 'D',\n  '𝔼' => 'E',\n  '𝔽' => 'F',\n  '𝔾' => 'G',\n  '𝕀' => 'I',\n  '𝕁' => 'J',\n  '𝕂' => 'K',\n  '𝕃' => 'L',\n  '𝕄' => 'M',\n  '𝕆' => 'O',\n  '𝕊' => 'S',\n  '𝕋' => 'T',\n  '𝕌' => 'U',\n  '𝕍' => 'V',\n  '𝕎' => 'W',\n  '𝕏' => 'X',\n  '𝕐' => 'Y',\n  '𝕒' => 'a',\n  '𝕓' => 'b',\n  '𝕔' => 'c',\n  '𝕕' => 'd',\n  '𝕖' => 'e',\n  '𝕗' => 'f',\n  '𝕘' => 'g',\n  '𝕙' => 'h',\n  '𝕚' => 'i',\n  '𝕛' => 'j',\n  '𝕜' => 'k',\n  '𝕝' => 'l',\n  '𝕞' => 'm',\n  '𝕟' => 'n',\n  '𝕠' => 'o',\n  '𝕡' => 'p',\n  '𝕢' => 'q',\n  '𝕣' => 'r',\n  '𝕤' => 's',\n  '𝕥' => 't',\n  '𝕦' => 'u',\n  '𝕧' => 'v',\n  '𝕨' => 'w',\n  '𝕩' => 'x',\n  '𝕪' => 'y',\n  '𝕫' => 'z',\n  '𝕬' => 'A',\n  '𝕭' => 'B',\n  '𝕮' => 'C',\n  '𝕯' => 'D',\n  '𝕰' => 'E',\n  '𝕱' => 'F',\n  '𝕲' => 'G',\n  '𝕳' => 'H',\n  '𝕴' => 'I',\n  '𝕵' => 'J',\n  '𝕶' => 'K',\n  '𝕷' => 'L',\n  '𝕸' => 'M',\n  '𝕹' => 'N',\n  '𝕺' => 'O',\n  '𝕻' => 'P',\n  '𝕼' => 'Q',\n  '𝕽' => 'R',\n  '𝕾' => 'S',\n  '𝕿' => 'T',\n  '𝖀' => 'U',\n  '𝖁' => 'V',\n  '𝖂' => 'W',\n  '𝖃' => 'X',\n  '𝖄' => 'Y',\n  '𝖅' => 'Z',\n  '𝖆' => 'a',\n  '𝖇' => 'b',\n  '𝖈' => 'c',\n  '𝖉' => 'd',\n  '𝖊' => 'e',\n  '𝖋' => 'f',\n  '𝖌' => 'g',\n  '𝖍' => 'h',\n  '𝖎' => 'i',\n  '𝖏' => 'j',\n  '𝖐' => 'k',\n  '𝖑' => 'l',\n  '𝖒' => 'm',\n  '𝖓' => 'n',\n  '𝖔' => 'o',\n  '𝖕' => 'p',\n  '𝖖' => 'q',\n  '𝖗' => 'r',\n  '𝖘' => 's',\n  '𝖙' => 't',\n  '𝖚' => 'u',\n  '𝖛' => 'v',\n  '𝖜' => 'w',\n  '𝖝' => 'x',\n  '𝖞' => 'y',\n  '𝖟' => 'z',\n  '𝖠' => 'A',\n  '𝖡' => 'B',\n  '𝖢' => 'C',\n  '𝖣' => 'D',\n  '𝖤' => 'E',\n  '𝖥' => 'F',\n  '𝖦' => 'G',\n  '𝖧' => 'H',\n  '𝖨' => 'I',\n  '𝖩' => 'J',\n  '𝖪' => 'K',\n  '𝖫' => 'L',\n  '𝖬' => 'M',\n  '𝖭' => 'N',\n  '𝖮' => 'O',\n  '𝖯' => 'P',\n  '𝖰' => 'Q',\n  '𝖱' => 'R',\n  '𝖲' => 'S',\n  '𝖳' => 'T',\n  '𝖴' => 'U',\n  '𝖵' => 'V',\n  '𝖶' => 'W',\n  '𝖷' => 'X',\n  '𝖸' => 'Y',\n  '𝖹' => 'Z',\n  '𝖺' => 'a',\n  '𝖻' => 'b',\n  '𝖼' => 'c',\n  '𝖽' => 'd',\n  '𝖾' => 'e',\n  '𝖿' => 'f',\n  '𝗀' => 'g',\n  '𝗁' => 'h',\n  '𝗂' => 'i',\n  '𝗃' => 'j',\n  '𝗄' => 'k',\n  '𝗅' => 'l',\n  '𝗆' => 'm',\n  '𝗇' => 'n',\n  '𝗈' => 'o',\n  '𝗉' => 'p',\n  '𝗊' => 'q',\n  '𝗋' => 'r',\n  '𝗌' => 's',\n  '𝗍' => 't',\n  '𝗎' => 'u',\n  '𝗏' => 'v',\n  '𝗐' => 'w',\n  '𝗑' => 'x',\n  '𝗒' => 'y',\n  '𝗓' => 'z',\n  '𝗔' => 'A',\n  '𝗕' => 'B',\n  '𝗖' => 'C',\n  '𝗗' => 'D',\n  '𝗘' => 'E',\n  '𝗙' => 'F',\n  '𝗚' => 'G',\n  '𝗛' => 'H',\n  '𝗜' => 'I',\n  '𝗝' => 'J',\n  '𝗞' => 'K',\n  '𝗟' => 'L',\n  '𝗠' => 'M',\n  '𝗡' => 'N',\n  '𝗢' => 'O',\n  '𝗣' => 'P',\n  '𝗤' => 'Q',\n  '𝗥' => 'R',\n  '𝗦' => 'S',\n  '𝗧' => 'T',\n  '𝗨' => 'U',\n  '𝗩' => 'V',\n  '𝗪' => 'W',\n  '𝗫' => 'X',\n  '𝗬' => 'Y',\n  '𝗭' => 'Z',\n  '𝗮' => 'a',\n  '𝗯' => 'b',\n  '𝗰' => 'c',\n  '𝗱' => 'd',\n  '𝗲' => 'e',\n  '𝗳' => 'f',\n  '𝗴' => 'g',\n  '𝗵' => 'h',\n  '𝗶' => 'i',\n  '𝗷' => 'j',\n  '𝗸' => 'k',\n  '𝗹' => 'l',\n  '𝗺' => 'm',\n  '𝗻' => 'n',\n  '𝗼' => 'o',\n  '𝗽' => 'p',\n  '𝗾' => 'q',\n  '𝗿' => 'r',\n  '𝘀' => 's',\n  '𝘁' => 't',\n  '𝘂' => 'u',\n  '𝘃' => 'v',\n  '𝘄' => 'w',\n  '𝘅' => 'x',\n  '𝘆' => 'y',\n  '𝘇' => 'z',\n  '𝘈' => 'A',\n  '𝘉' => 'B',\n  '𝘊' => 'C',\n  '𝘋' => 'D',\n  '𝘌' => 'E',\n  '𝘍' => 'F',\n  '𝘎' => 'G',\n  '𝘏' => 'H',\n  '𝘐' => 'I',\n  '𝘑' => 'J',\n  '𝘒' => 'K',\n  '𝘓' => 'L',\n  '𝘔' => 'M',\n  '𝘕' => 'N',\n  '𝘖' => 'O',\n  '𝘗' => 'P',\n  '𝘘' => 'Q',\n  '𝘙' => 'R',\n  '𝘚' => 'S',\n  '𝘛' => 'T',\n  '𝘜' => 'U',\n  '𝘝' => 'V',\n  '𝘞' => 'W',\n  '𝘟' => 'X',\n  '𝘠' => 'Y',\n  '𝘡' => 'Z',\n  '𝘢' => 'a',\n  '𝘣' => 'b',\n  '𝘤' => 'c',\n  '𝘥' => 'd',\n  '𝘦' => 'e',\n  '𝘧' => 'f',\n  '𝘨' => 'g',\n  '𝘩' => 'h',\n  '𝘪' => 'i',\n  '𝘫' => 'j',\n  '𝘬' => 'k',\n  '𝘭' => 'l',\n  '𝘮' => 'm',\n  '𝘯' => 'n',\n  '𝘰' => 'o',\n  '𝘱' => 'p',\n  '𝘲' => 'q',\n  '𝘳' => 'r',\n  '𝘴' => 's',\n  '𝘵' => 't',\n  '𝘶' => 'u',\n  '𝘷' => 'v',\n  '𝘸' => 'w',\n  '𝘹' => 'x',\n  '𝘺' => 'y',\n  '𝘻' => 'z',\n  '𝘼' => 'A',\n  '𝘽' => 'B',\n  '𝘾' => 'C',\n  '𝘿' => 'D',\n  '𝙀' => 'E',\n  '𝙁' => 'F',\n  '𝙂' => 'G',\n  '𝙃' => 'H',\n  '𝙄' => 'I',\n  '𝙅' => 'J',\n  '𝙆' => 'K',\n  '𝙇' => 'L',\n  '𝙈' => 'M',\n  '𝙉' => 'N',\n  '𝙊' => 'O',\n  '𝙋' => 'P',\n  '𝙌' => 'Q',\n  '𝙍' => 'R',\n  '𝙎' => 'S',\n  '𝙏' => 'T',\n  '𝙐' => 'U',\n  '𝙑' => 'V',\n  '𝙒' => 'W',\n  '𝙓' => 'X',\n  '𝙔' => 'Y',\n  '𝙕' => 'Z',\n  '𝙖' => 'a',\n  '𝙗' => 'b',\n  '𝙘' => 'c',\n  '𝙙' => 'd',\n  '𝙚' => 'e',\n  '𝙛' => 'f',\n  '𝙜' => 'g',\n  '𝙝' => 'h',\n  '𝙞' => 'i',\n  '𝙟' => 'j',\n  '𝙠' => 'k',\n  '𝙡' => 'l',\n  '𝙢' => 'm',\n  '𝙣' => 'n',\n  '𝙤' => 'o',\n  '𝙥' => 'p',\n  '𝙦' => 'q',\n  '𝙧' => 'r',\n  '𝙨' => 's',\n  '𝙩' => 't',\n  '𝙪' => 'u',\n  '𝙫' => 'v',\n  '𝙬' => 'w',\n  '𝙭' => 'x',\n  '𝙮' => 'y',\n  '𝙯' => 'z',\n  '𝙰' => 'A',\n  '𝙱' => 'B',\n  '𝙲' => 'C',\n  '𝙳' => 'D',\n  '𝙴' => 'E',\n  '𝙵' => 'F',\n  '𝙶' => 'G',\n  '𝙷' => 'H',\n  '𝙸' => 'I',\n  '𝙹' => 'J',\n  '𝙺' => 'K',\n  '𝙻' => 'L',\n  '𝙼' => 'M',\n  '𝙽' => 'N',\n  '𝙾' => 'O',\n  '𝙿' => 'P',\n  '𝚀' => 'Q',\n  '𝚁' => 'R',\n  '𝚂' => 'S',\n  '𝚃' => 'T',\n  '𝚄' => 'U',\n  '𝚅' => 'V',\n  '𝚆' => 'W',\n  '𝚇' => 'X',\n  '𝚈' => 'Y',\n  '𝚉' => 'Z',\n  '𝚊' => 'a',\n  '𝚋' => 'b',\n  '𝚌' => 'c',\n  '𝚍' => 'd',\n  '𝚎' => 'e',\n  '𝚏' => 'f',\n  '𝚐' => 'g',\n  '𝚑' => 'h',\n  '𝚒' => 'i',\n  '𝚓' => 'j',\n  '𝚔' => 'k',\n  '𝚕' => 'l',\n  '𝚖' => 'm',\n  '𝚗' => 'n',\n  '𝚘' => 'o',\n  '𝚙' => 'p',\n  '𝚚' => 'q',\n  '𝚛' => 'r',\n  '𝚜' => 's',\n  '𝚝' => 't',\n  '𝚞' => 'u',\n  '𝚟' => 'v',\n  '𝚠' => 'w',\n  '𝚡' => 'x',\n  '𝚢' => 'y',\n  '𝚣' => 'z',\n  '𝚤' => 'ı',\n  '𝚥' => 'ȷ',\n  '𝚨' => 'Α',\n  '𝚩' => 'Β',\n  '𝚪' => 'Γ',\n  '𝚫' => 'Δ',\n  '𝚬' => 'Ε',\n  '𝚭' => 'Ζ',\n  '𝚮' => 'Η',\n  '𝚯' => 'Θ',\n  '𝚰' => 'Ι',\n  '𝚱' => 'Κ',\n  '𝚲' => 'Λ',\n  '𝚳' => 'Μ',\n  '𝚴' => 'Ν',\n  '𝚵' => 'Ξ',\n  '𝚶' => 'Ο',\n  '𝚷' => 'Π',\n  '𝚸' => 'Ρ',\n  '𝚹' => 'ϴ',\n  '𝚺' => 'Σ',\n  '𝚻' => 'Τ',\n  '𝚼' => 'Υ',\n  '𝚽' => 'Φ',\n  '𝚾' => 'Χ',\n  '𝚿' => 'Ψ',\n  '𝛀' => 'Ω',\n  '𝛁' => '∇',\n  '𝛂' => 'α',\n  '𝛃' => 'β',\n  '𝛄' => 'γ',\n  '𝛅' => 'δ',\n  '𝛆' => 'ε',\n  '𝛇' => 'ζ',\n  '𝛈' => 'η',\n  '𝛉' => 'θ',\n  '𝛊' => 'ι',\n  '𝛋' => 'κ',\n  '𝛌' => 'λ',\n  '𝛍' => 'μ',\n  '𝛎' => 'ν',\n  '𝛏' => 'ξ',\n  '𝛐' => 'ο',\n  '𝛑' => 'π',\n  '𝛒' => 'ρ',\n  '𝛓' => 'ς',\n  '𝛔' => 'σ',\n  '𝛕' => 'τ',\n  '𝛖' => 'υ',\n  '𝛗' => 'φ',\n  '𝛘' => 'χ',\n  '𝛙' => 'ψ',\n  '𝛚' => 'ω',\n  '𝛛' => '∂',\n  '𝛜' => 'ϵ',\n  '𝛝' => 'ϑ',\n  '𝛞' => 'ϰ',\n  '𝛟' => 'ϕ',\n  '𝛠' => 'ϱ',\n  '𝛡' => 'ϖ',\n  '𝛢' => 'Α',\n  '𝛣' => 'Β',\n  '𝛤' => 'Γ',\n  '𝛥' => 'Δ',\n  '𝛦' => 'Ε',\n  '𝛧' => 'Ζ',\n  '𝛨' => 'Η',\n  '𝛩' => 'Θ',\n  '𝛪' => 'Ι',\n  '𝛫' => 'Κ',\n  '𝛬' => 'Λ',\n  '𝛭' => 'Μ',\n  '𝛮' => 'Ν',\n  '𝛯' => 'Ξ',\n  '𝛰' => 'Ο',\n  '𝛱' => 'Π',\n  '𝛲' => 'Ρ',\n  '𝛳' => 'ϴ',\n  '𝛴' => 'Σ',\n  '𝛵' => 'Τ',\n  '𝛶' => 'Υ',\n  '𝛷' => 'Φ',\n  '𝛸' => 'Χ',\n  '𝛹' => 'Ψ',\n  '𝛺' => 'Ω',\n  '𝛻' => '∇',\n  '𝛼' => 'α',\n  '𝛽' => 'β',\n  '𝛾' => 'γ',\n  '𝛿' => 'δ',\n  '𝜀' => 'ε',\n  '𝜁' => 'ζ',\n  '𝜂' => 'η',\n  '𝜃' => 'θ',\n  '𝜄' => 'ι',\n  '𝜅' => 'κ',\n  '𝜆' => 'λ',\n  '𝜇' => 'μ',\n  '𝜈' => 'ν',\n  '𝜉' => 'ξ',\n  '𝜊' => 'ο',\n  '𝜋' => 'π',\n  '𝜌' => 'ρ',\n  '𝜍' => 'ς',\n  '𝜎' => 'σ',\n  '𝜏' => 'τ',\n  '𝜐' => 'υ',\n  '𝜑' => 'φ',\n  '𝜒' => 'χ',\n  '𝜓' => 'ψ',\n  '𝜔' => 'ω',\n  '𝜕' => '∂',\n  '𝜖' => 'ϵ',\n  '𝜗' => 'ϑ',\n  '𝜘' => 'ϰ',\n  '𝜙' => 'ϕ',\n  '𝜚' => 'ϱ',\n  '𝜛' => 'ϖ',\n  '𝜜' => 'Α',\n  '𝜝' => 'Β',\n  '𝜞' => 'Γ',\n  '𝜟' => 'Δ',\n  '𝜠' => 'Ε',\n  '𝜡' => 'Ζ',\n  '𝜢' => 'Η',\n  '𝜣' => 'Θ',\n  '𝜤' => 'Ι',\n  '𝜥' => 'Κ',\n  '𝜦' => 'Λ',\n  '𝜧' => 'Μ',\n  '𝜨' => 'Ν',\n  '𝜩' => 'Ξ',\n  '𝜪' => 'Ο',\n  '𝜫' => 'Π',\n  '𝜬' => 'Ρ',\n  '𝜭' => 'ϴ',\n  '𝜮' => 'Σ',\n  '𝜯' => 'Τ',\n  '𝜰' => 'Υ',\n  '𝜱' => 'Φ',\n  '𝜲' => 'Χ',\n  '𝜳' => 'Ψ',\n  '𝜴' => 'Ω',\n  '𝜵' => '∇',\n  '𝜶' => 'α',\n  '𝜷' => 'β',\n  '𝜸' => 'γ',\n  '𝜹' => 'δ',\n  '𝜺' => 'ε',\n  '𝜻' => 'ζ',\n  '𝜼' => 'η',\n  '𝜽' => 'θ',\n  '𝜾' => 'ι',\n  '𝜿' => 'κ',\n  '𝝀' => 'λ',\n  '𝝁' => 'μ',\n  '𝝂' => 'ν',\n  '𝝃' => 'ξ',\n  '𝝄' => 'ο',\n  '𝝅' => 'π',\n  '𝝆' => 'ρ',\n  '𝝇' => 'ς',\n  '𝝈' => 'σ',\n  '𝝉' => 'τ',\n  '𝝊' => 'υ',\n  '𝝋' => 'φ',\n  '𝝌' => 'χ',\n  '𝝍' => 'ψ',\n  '𝝎' => 'ω',\n  '𝝏' => '∂',\n  '𝝐' => 'ϵ',\n  '𝝑' => 'ϑ',\n  '𝝒' => 'ϰ',\n  '𝝓' => 'ϕ',\n  '𝝔' => 'ϱ',\n  '𝝕' => 'ϖ',\n  '𝝖' => 'Α',\n  '𝝗' => 'Β',\n  '𝝘' => 'Γ',\n  '𝝙' => 'Δ',\n  '𝝚' => 'Ε',\n  '𝝛' => 'Ζ',\n  '𝝜' => 'Η',\n  '𝝝' => 'Θ',\n  '𝝞' => 'Ι',\n  '𝝟' => 'Κ',\n  '𝝠' => 'Λ',\n  '𝝡' => 'Μ',\n  '𝝢' => 'Ν',\n  '𝝣' => 'Ξ',\n  '𝝤' => 'Ο',\n  '𝝥' => 'Π',\n  '𝝦' => 'Ρ',\n  '𝝧' => 'ϴ',\n  '𝝨' => 'Σ',\n  '𝝩' => 'Τ',\n  '𝝪' => 'Υ',\n  '𝝫' => 'Φ',\n  '𝝬' => 'Χ',\n  '𝝭' => 'Ψ',\n  '𝝮' => 'Ω',\n  '𝝯' => '∇',\n  '𝝰' => 'α',\n  '𝝱' => 'β',\n  '𝝲' => 'γ',\n  '𝝳' => 'δ',\n  '𝝴' => 'ε',\n  '𝝵' => 'ζ',\n  '𝝶' => 'η',\n  '𝝷' => 'θ',\n  '𝝸' => 'ι',\n  '𝝹' => 'κ',\n  '𝝺' => 'λ',\n  '𝝻' => 'μ',\n  '𝝼' => 'ν',\n  '𝝽' => 'ξ',\n  '𝝾' => 'ο',\n  '𝝿' => 'π',\n  '𝞀' => 'ρ',\n  '𝞁' => 'ς',\n  '𝞂' => 'σ',\n  '𝞃' => 'τ',\n  '𝞄' => 'υ',\n  '𝞅' => 'φ',\n  '𝞆' => 'χ',\n  '𝞇' => 'ψ',\n  '𝞈' => 'ω',\n  '𝞉' => '∂',\n  '𝞊' => 'ϵ',\n  '𝞋' => 'ϑ',\n  '𝞌' => 'ϰ',\n  '𝞍' => 'ϕ',\n  '𝞎' => 'ϱ',\n  '𝞏' => 'ϖ',\n  '𝞐' => 'Α',\n  '𝞑' => 'Β',\n  '𝞒' => 'Γ',\n  '𝞓' => 'Δ',\n  '𝞔' => 'Ε',\n  '𝞕' => 'Ζ',\n  '𝞖' => 'Η',\n  '𝞗' => 'Θ',\n  '𝞘' => 'Ι',\n  '𝞙' => 'Κ',\n  '𝞚' => 'Λ',\n  '𝞛' => 'Μ',\n  '𝞜' => 'Ν',\n  '𝞝' => 'Ξ',\n  '𝞞' => 'Ο',\n  '𝞟' => 'Π',\n  '𝞠' => 'Ρ',\n  '𝞡' => 'ϴ',\n  '𝞢' => 'Σ',\n  '𝞣' => 'Τ',\n  '𝞤' => 'Υ',\n  '𝞥' => 'Φ',\n  '𝞦' => 'Χ',\n  '𝞧' => 'Ψ',\n  '𝞨' => 'Ω',\n  '𝞩' => '∇',\n  '𝞪' => 'α',\n  '𝞫' => 'β',\n  '𝞬' => 'γ',\n  '𝞭' => 'δ',\n  '𝞮' => 'ε',\n  '𝞯' => 'ζ',\n  '𝞰' => 'η',\n  '𝞱' => 'θ',\n  '𝞲' => 'ι',\n  '𝞳' => 'κ',\n  '𝞴' => 'λ',\n  '𝞵' => 'μ',\n  '𝞶' => 'ν',\n  '𝞷' => 'ξ',\n  '𝞸' => 'ο',\n  '𝞹' => 'π',\n  '𝞺' => 'ρ',\n  '𝞻' => 'ς',\n  '𝞼' => 'σ',\n  '𝞽' => 'τ',\n  '𝞾' => 'υ',\n  '𝞿' => 'φ',\n  '𝟀' => 'χ',\n  '𝟁' => 'ψ',\n  '𝟂' => 'ω',\n  '𝟃' => '∂',\n  '𝟄' => 'ϵ',\n  '𝟅' => 'ϑ',\n  '𝟆' => 'ϰ',\n  '𝟇' => 'ϕ',\n  '𝟈' => 'ϱ',\n  '𝟉' => 'ϖ',\n  '𝟊' => 'Ϝ',\n  '𝟋' => 'ϝ',\n  '𝟎' => '0',\n  '𝟏' => '1',\n  '𝟐' => '2',\n  '𝟑' => '3',\n  '𝟒' => '4',\n  '𝟓' => '5',\n  '𝟔' => '6',\n  '𝟕' => '7',\n  '𝟖' => '8',\n  '𝟗' => '9',\n  '𝟘' => '0',\n  '𝟙' => '1',\n  '𝟚' => '2',\n  '𝟛' => '3',\n  '𝟜' => '4',\n  '𝟝' => '5',\n  '𝟞' => '6',\n  '𝟟' => '7',\n  '𝟠' => '8',\n  '𝟡' => '9',\n  '𝟢' => '0',\n  '𝟣' => '1',\n  '𝟤' => '2',\n  '𝟥' => '3',\n  '𝟦' => '4',\n  '𝟧' => '5',\n  '𝟨' => '6',\n  '𝟩' => '7',\n  '𝟪' => '8',\n  '𝟫' => '9',\n  '𝟬' => '0',\n  '𝟭' => '1',\n  '𝟮' => '2',\n  '𝟯' => '3',\n  '𝟰' => '4',\n  '𝟱' => '5',\n  '𝟲' => '6',\n  '𝟳' => '7',\n  '𝟴' => '8',\n  '𝟵' => '9',\n  '𝟶' => '0',\n  '𝟷' => '1',\n  '𝟸' => '2',\n  '𝟹' => '3',\n  '𝟺' => '4',\n  '𝟻' => '5',\n  '𝟼' => '6',\n  '𝟽' => '7',\n  '𝟾' => '8',\n  '𝟿' => '9',\n  '𞀰' => 'а',\n  '𞀱' => 'б',\n  '𞀲' => 'в',\n  '𞀳' => 'г',\n  '𞀴' => 'д',\n  '𞀵' => 'е',\n  '𞀶' => 'ж',\n  '𞀷' => 'з',\n  '𞀸' => 'и',\n  '𞀹' => 'к',\n  '𞀺' => 'л',\n  '𞀻' => 'м',\n  '𞀼' => 'о',\n  '𞀽' => 'п',\n  '𞀾' => 'р',\n  '𞀿' => 'с',\n  '𞁀' => 'т',\n  '𞁁' => 'у',\n  '𞁂' => 'ф',\n  '𞁃' => 'х',\n  '𞁄' => 'ц',\n  '𞁅' => 'ч',\n  '𞁆' => 'ш',\n  '𞁇' => 'ы',\n  '𞁈' => 'э',\n  '𞁉' => 'ю',\n  '𞁊' => 'ꚉ',\n  '𞁋' => 'ә',\n  '𞁌' => 'і',\n  '𞁍' => 'ј',\n  '𞁎' => 'ө',\n  '𞁏' => 'ү',\n  '𞁐' => 'ӏ',\n  '𞁑' => 'а',\n  '𞁒' => 'б',\n  '𞁓' => 'в',\n  '𞁔' => 'г',\n  '𞁕' => 'д',\n  '𞁖' => 'е',\n  '𞁗' => 'ж',\n  '𞁘' => 'з',\n  '𞁙' => 'и',\n  '𞁚' => 'к',\n  '𞁛' => 'л',\n  '𞁜' => 'о',\n  '𞁝' => 'п',\n  '𞁞' => 'с',\n  '𞁟' => 'у',\n  '𞁠' => 'ф',\n  '𞁡' => 'х',\n  '𞁢' => 'ц',\n  '𞁣' => 'ч',\n  '𞁤' => 'ш',\n  '𞁥' => 'ъ',\n  '𞁦' => 'ы',\n  '𞁧' => 'ґ',\n  '𞁨' => 'і',\n  '𞁩' => 'ѕ',\n  '𞁪' => 'џ',\n  '𞁫' => 'ҫ',\n  '𞁬' => 'ꙑ',\n  '𞁭' => 'ұ',\n  '𞸀' => 'ا',\n  '𞸁' => 'ب',\n  '𞸂' => 'ج',\n  '𞸃' => 'د',\n  '𞸅' => 'و',\n  '𞸆' => 'ز',\n  '𞸇' => 'ح',\n  '𞸈' => 'ط',\n  '𞸉' => 'ي',\n  '𞸊' => 'ك',\n  '𞸋' => 'ل',\n  '𞸌' => 'م',\n  '𞸍' => 'ن',\n  '𞸎' => 'س',\n  '𞸏' => 'ع',\n  '𞸐' => 'ف',\n  '𞸑' => 'ص',\n  '𞸒' => 'ق',\n  '𞸓' => 'ر',\n  '𞸔' => 'ش',\n  '𞸕' => 'ت',\n  '𞸖' => 'ث',\n  '𞸗' => 'خ',\n  '𞸘' => 'ذ',\n  '𞸙' => 'ض',\n  '𞸚' => 'ظ',\n  '𞸛' => 'غ',\n  '𞸜' => 'ٮ',\n  '𞸝' => 'ں',\n  '𞸞' => 'ڡ',\n  '𞸟' => 'ٯ',\n  '𞸡' => 'ب',\n  '𞸢' => 'ج',\n  '𞸤' => 'ه',\n  '𞸧' => 'ح',\n  '𞸩' => 'ي',\n  '𞸪' => 'ك',\n  '𞸫' => 'ل',\n  '𞸬' => 'م',\n  '𞸭' => 'ن',\n  '𞸮' => 'س',\n  '𞸯' => 'ع',\n  '𞸰' => 'ف',\n  '𞸱' => 'ص',\n  '𞸲' => 'ق',\n  '𞸴' => 'ش',\n  '𞸵' => 'ت',\n  '𞸶' => 'ث',\n  '𞸷' => 'خ',\n  '𞸹' => 'ض',\n  '𞸻' => 'غ',\n  '𞹂' => 'ج',\n  '𞹇' => 'ح',\n  '𞹉' => 'ي',\n  '𞹋' => 'ل',\n  '𞹍' => 'ن',\n  '𞹎' => 'س',\n  '𞹏' => 'ع',\n  '𞹑' => 'ص',\n  '𞹒' => 'ق',\n  '𞹔' => 'ش',\n  '𞹗' => 'خ',\n  '𞹙' => 'ض',\n  '𞹛' => 'غ',\n  '𞹝' => 'ں',\n  '𞹟' => 'ٯ',\n  '𞹡' => 'ب',\n  '𞹢' => 'ج',\n  '𞹤' => 'ه',\n  '𞹧' => 'ح',\n  '𞹨' => 'ط',\n  '𞹩' => 'ي',\n  '𞹪' => 'ك',\n  '𞹬' => 'م',\n  '𞹭' => 'ن',\n  '𞹮' => 'س',\n  '𞹯' => 'ع',\n  '𞹰' => 'ف',\n  '𞹱' => 'ص',\n  '𞹲' => 'ق',\n  '𞹴' => 'ش',\n  '𞹵' => 'ت',\n  '𞹶' => 'ث',\n  '𞹷' => 'خ',\n  '𞹹' => 'ض',\n  '𞹺' => 'ظ',\n  '𞹻' => 'غ',\n  '𞹼' => 'ٮ',\n  '𞹾' => 'ڡ',\n  '𞺀' => 'ا',\n  '𞺁' => 'ب',\n  '𞺂' => 'ج',\n  '𞺃' => 'د',\n  '𞺄' => 'ه',\n  '𞺅' => 'و',\n  '𞺆' => 'ز',\n  '𞺇' => 'ح',\n  '𞺈' => 'ط',\n  '𞺉' => 'ي',\n  '𞺋' => 'ل',\n  '𞺌' => 'م',\n  '𞺍' => 'ن',\n  '𞺎' => 'س',\n  '𞺏' => 'ع',\n  '𞺐' => 'ف',\n  '𞺑' => 'ص',\n  '𞺒' => 'ق',\n  '𞺓' => 'ر',\n  '𞺔' => 'ش',\n  '𞺕' => 'ت',\n  '𞺖' => 'ث',\n  '𞺗' => 'خ',\n  '𞺘' => 'ذ',\n  '𞺙' => 'ض',\n  '𞺚' => 'ظ',\n  '𞺛' => 'غ',\n  '𞺡' => 'ب',\n  '𞺢' => 'ج',\n  '𞺣' => 'د',\n  '𞺥' => 'و',\n  '𞺦' => 'ز',\n  '𞺧' => 'ح',\n  '𞺨' => 'ط',\n  '𞺩' => 'ي',\n  '𞺫' => 'ل',\n  '𞺬' => 'م',\n  '𞺭' => 'ن',\n  '𞺮' => 'س',\n  '𞺯' => 'ع',\n  '𞺰' => 'ف',\n  '𞺱' => 'ص',\n  '𞺲' => 'ق',\n  '𞺳' => 'ر',\n  '𞺴' => 'ش',\n  '𞺵' => 'ت',\n  '𞺶' => 'ث',\n  '𞺷' => 'خ',\n  '𞺸' => 'ذ',\n  '𞺹' => 'ض',\n  '𞺺' => 'ظ',\n  '𞺻' => 'غ',\n  '🄀' => '0.',\n  '🄁' => '0,',\n  '🄂' => '1,',\n  '🄃' => '2,',\n  '🄄' => '3,',\n  '🄅' => '4,',\n  '🄆' => '5,',\n  '🄇' => '6,',\n  '🄈' => '7,',\n  '🄉' => '8,',\n  '🄊' => '9,',\n  '🄐' => '(A)',\n  '🄑' => '(B)',\n  '🄒' => '(C)',\n  '🄓' => '(D)',\n  '🄔' => '(E)',\n  '🄕' => '(F)',\n  '🄖' => '(G)',\n  '🄗' => '(H)',\n  '🄘' => '(I)',\n  '🄙' => '(J)',\n  '🄚' => '(K)',\n  '🄛' => '(L)',\n  '🄜' => '(M)',\n  '🄝' => '(N)',\n  '🄞' => '(O)',\n  '🄟' => '(P)',\n  '🄠' => '(Q)',\n  '🄡' => '(R)',\n  '🄢' => '(S)',\n  '🄣' => '(T)',\n  '🄤' => '(U)',\n  '🄥' => '(V)',\n  '🄦' => '(W)',\n  '🄧' => '(X)',\n  '🄨' => '(Y)',\n  '🄩' => '(Z)',\n  '🄪' => '〔S〕',\n  '🄫' => 'C',\n  '🄬' => 'R',\n  '🄭' => 'CD',\n  '🄮' => 'WZ',\n  '🄰' => 'A',\n  '🄱' => 'B',\n  '🄲' => 'C',\n  '🄳' => 'D',\n  '🄴' => 'E',\n  '🄵' => 'F',\n  '🄶' => 'G',\n  '🄷' => 'H',\n  '🄸' => 'I',\n  '🄹' => 'J',\n  '🄺' => 'K',\n  '🄻' => 'L',\n  '🄼' => 'M',\n  '🄽' => 'N',\n  '🄾' => 'O',\n  '🄿' => 'P',\n  '🅀' => 'Q',\n  '🅁' => 'R',\n  '🅂' => 'S',\n  '🅃' => 'T',\n  '🅄' => 'U',\n  '🅅' => 'V',\n  '🅆' => 'W',\n  '🅇' => 'X',\n  '🅈' => 'Y',\n  '🅉' => 'Z',\n  '🅊' => 'HV',\n  '🅋' => 'MV',\n  '🅌' => 'SD',\n  '🅍' => 'SS',\n  '🅎' => 'PPV',\n  '🅏' => 'WC',\n  '🅪' => 'MC',\n  '🅫' => 'MD',\n  '🅬' => 'MR',\n  '🆐' => 'DJ',\n  '🈀' => 'ほか',\n  '🈁' => 'ココ',\n  '🈂' => 'サ',\n  '🈐' => '手',\n  '🈑' => '字',\n  '🈒' => '双',\n  '🈓' => 'デ',\n  '🈔' => '二',\n  '🈕' => '多',\n  '🈖' => '解',\n  '🈗' => '天',\n  '🈘' => '交',\n  '🈙' => '映',\n  '🈚' => '無',\n  '🈛' => '料',\n  '🈜' => '前',\n  '🈝' => '後',\n  '🈞' => '再',\n  '🈟' => '新',\n  '🈠' => '初',\n  '🈡' => '終',\n  '🈢' => '生',\n  '🈣' => '販',\n  '🈤' => '声',\n  '🈥' => '吹',\n  '🈦' => '演',\n  '🈧' => '投',\n  '🈨' => '捕',\n  '🈩' => '一',\n  '🈪' => '三',\n  '🈫' => '遊',\n  '🈬' => '左',\n  '🈭' => '中',\n  '🈮' => '右',\n  '🈯' => '指',\n  '🈰' => '走',\n  '🈱' => '打',\n  '🈲' => '禁',\n  '🈳' => '空',\n  '🈴' => '合',\n  '🈵' => '満',\n  '🈶' => '有',\n  '🈷' => '月',\n  '🈸' => '申',\n  '🈹' => '割',\n  '🈺' => '営',\n  '🈻' => '配',\n  '🉀' => '〔本〕',\n  '🉁' => '〔三〕',\n  '🉂' => '〔二〕',\n  '🉃' => '〔安〕',\n  '🉄' => '〔点〕',\n  '🉅' => '〔打〕',\n  '🉆' => '〔盗〕',\n  '🉇' => '〔勝〕',\n  '🉈' => '〔敗〕',\n  '🉐' => '得',\n  '🉑' => '可',\n  '🯰' => '0',\n  '🯱' => '1',\n  '🯲' => '2',\n  '🯳' => '3',\n  '🯴' => '4',\n  '🯵' => '5',\n  '🯶' => '6',\n  '🯷' => '7',\n  '🯸' => '8',\n  '🯹' => '9',\n);\n","vendor/symfony/polyfill-intl-normalizer/bootstrap.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nuse Symfony\\Polyfill\\Intl\\Normalizer as p;\n\nif (\\PHP_VERSION_ID >= 80000) {\n    return require __DIR__.'/bootstrap80.php';\n}\n\nif (!function_exists('normalizer_is_normalized')) {\n    function normalizer_is_normalized($string, $form = p\\Normalizer::FORM_C) { return p\\Normalizer::isNormalized($string, $form); }\n}\nif (!function_exists('normalizer_normalize')) {\n    function normalizer_normalize($string, $form = p\\Normalizer::FORM_C) { return p\\Normalizer::normalize($string, $form); }\n}\nif (!function_exists('normalizer_get_raw_decomposition')) {\n    function normalizer_get_raw_decomposition(?string $string, ?int $form = p\\Normalizer::FORM_C) { return p\\Normalizer::getRawDecomposition((string) $string, (int) $form); }\n}\n","vendor/symfony/polyfill-intl-normalizer/bootstrap80.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nuse Symfony\\Polyfill\\Intl\\Normalizer as p;\n\nif (!function_exists('normalizer_is_normalized')) {\n    function normalizer_is_normalized(?string $string, ?int $form = p\\Normalizer::FORM_C): bool { return p\\Normalizer::isNormalized((string) $string, (int) $form); }\n}\nif (!function_exists('normalizer_normalize')) {\n    function normalizer_normalize(?string $string, ?int $form = p\\Normalizer::FORM_C): string|false { return p\\Normalizer::normalize((string) $string, (int) $form); }\n}\nif (!function_exists('normalizer_get_raw_decomposition')) {\n    function normalizer_get_raw_decomposition(?string $string, ?int $form = p\\Normalizer::FORM_C): ?string { return p\\Normalizer::getRawDecomposition((string) $string, (int) $form); }\n}\n","vendor/symfony/polyfill-intl-normalizer/composer.json":"{\n    \"name\": \"symfony/polyfill-intl-normalizer\",\n    \"type\": \"library\",\n    \"description\": \"Symfony polyfill for intl's Normalizer class and related functions\",\n    \"keywords\": [\"polyfill\", \"shim\", \"compatibility\", \"portable\", \"intl\", \"normalizer\"],\n    \"homepage\": \"https://symfony.com\",\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"Nicolas Grekas\",\n            \"email\": \"p@tchwork.com\"\n        },\n        {\n            \"name\": \"Symfony Community\",\n            \"homepage\": \"https://symfony.com/contributors\"\n        }\n    ],\n    \"require\": {\n        \"php\": \">=7.2\"\n    },\n    \"autoload\": {\n        \"psr-4\": { \"Symfony\\\\Polyfill\\\\Intl\\\\Normalizer\\\\\": \"\" },\n        \"files\": [ \"bootstrap.php\" ],\n        \"classmap\": [ \"Resources/stubs\" ]\n    },\n    \"suggest\": {\n        \"ext-intl\": \"For best performance\"\n    },\n    \"minimum-stability\": \"dev\",\n    \"extra\": {\n        \"thanks\": {\n            \"name\": \"symfony/polyfill\",\n            \"url\": \"https://github.com/symfony/polyfill\"\n        }\n    }\n}\n","vendor/symfony/polyfill-mbstring/LICENSE":"Copyright (c) 2015-present Fabien Potencier\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is furnished\nto do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n","vendor/symfony/polyfill-mbstring/Mbstring.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Polyfill\\Mbstring;\n\n/**\n * Partial mbstring implementation in PHP, iconv based, UTF-8 centric.\n *\n * Implemented:\n * - mb_chr                  - Returns a specific character from its Unicode code point\n * - mb_convert_encoding     - Convert character encoding\n * - mb_convert_variables    - Convert character code in variable(s)\n * - mb_decode_mimeheader    - Decode string in MIME header field\n * - mb_encode_mimeheader    - Encode string for MIME header XXX NATIVE IMPLEMENTATION IS REALLY BUGGED\n * - mb_decode_numericentity - Decode HTML numeric string reference to character\n * - mb_encode_numericentity - Encode character to HTML numeric string reference\n * - mb_convert_case         - Perform case folding on a string\n * - mb_detect_encoding      - Detect character encoding\n * - mb_get_info             - Get internal settings of mbstring\n * - mb_http_input           - Detect HTTP input character encoding\n * - mb_http_output          - Set/Get HTTP output character encoding\n * - mb_internal_encoding    - Set/Get internal character encoding\n * - mb_list_encodings       - Returns an array of all supported encodings\n * - mb_ord                  - Returns the Unicode code point of a character\n * - mb_output_handler       - Callback function converts character encoding in output buffer\n * - mb_scrub                - Replaces ill-formed byte sequences with substitute characters\n * - mb_strlen               - Get string length\n * - mb_strpos               - Find position of first occurrence of string in a string\n * - mb_strrpos              - Find position of last occurrence of a string in a string\n * - mb_str_split            - Convert a string to an array\n * - mb_strtolower           - Make a string lowercase\n * - mb_strtoupper           - Make a string uppercase\n * - mb_substitute_character - Set/Get substitution character\n * - mb_substr               - Get part of string\n * - mb_stripos              - Finds position of first occurrence of a string within another, case insensitive\n * - mb_stristr              - Finds first occurrence of a string within another, case insensitive\n * - mb_strrchr              - Finds the last occurrence of a character in a string within another\n * - mb_strrichr             - Finds the last occurrence of a character in a string within another, case insensitive\n * - mb_strripos             - Finds position of last occurrence of a string within another, case insensitive\n * - mb_strstr               - Finds first occurrence of a string within another\n * - mb_strwidth             - Return width of string\n * - mb_substr_count         - Count the number of substring occurrences\n * - mb_ucfirst              - Make a string's first character uppercase\n * - mb_lcfirst              - Make a string's first character lowercase\n * - mb_trim                 - Strip whitespace (or other characters) from the beginning and end of a string\n * - mb_ltrim                - Strip whitespace (or other characters) from the beginning of a string\n * - mb_rtrim                - Strip whitespace (or other characters) from the end of a string\n *\n * Not implemented:\n * - mb_convert_kana         - Convert \"kana\" one from another (\"zen-kaku\", \"han-kaku\" and more)\n * - mb_ereg_*               - Regular expression with multibyte support\n * - mb_parse_str            - Parse GET/POST/COOKIE data and set global variable\n * - mb_preferred_mime_name  - Get MIME charset string\n * - mb_regex_encoding       - Returns current encoding for multibyte regex as string\n * - mb_regex_set_options    - Set/Get the default options for mbregex functions\n * - mb_send_mail            - Send encoded mail\n * - mb_split                - Split multibyte string using regular expression\n * - mb_strcut               - Get part of string\n * - mb_strimwidth           - Get truncated string with specified width\n *\n * @author Nicolas Grekas <p@tchwork.com>\n *\n * @internal\n */\nfinal class Mbstring\n{\n    public const MB_CASE_FOLD = \\PHP_INT_MAX;\n\n    private const SIMPLE_CASE_FOLD = [\n        ['µ', 'ſ', \"\\xCD\\x85\", 'ς', \"\\xCF\\x90\", \"\\xCF\\x91\", \"\\xCF\\x95\", \"\\xCF\\x96\", \"\\xCF\\xB0\", \"\\xCF\\xB1\", \"\\xCF\\xB5\", \"\\xE1\\xBA\\x9B\", \"\\xE1\\xBE\\xBE\"],\n        ['μ', 's', 'ι',        'σ', 'β',        'θ',        'φ',        'π',        'κ',        'ρ',        'ε',        \"\\xE1\\xB9\\xA1\", 'ι'],\n    ];\n\n    private static $encodingList = ['ASCII', 'UTF-8'];\n    private static $language = 'neutral';\n    private static $internalEncoding = 'UTF-8';\n    private static $iconvSupportsIgnore;\n\n    public static function mb_convert_encoding($s, $toEncoding, $fromEncoding = null)\n    {\n        if (\\is_array($s)) {\n            $r = [];\n            foreach ($s as $str) {\n                $r[] = self::mb_convert_encoding($str, $toEncoding, $fromEncoding);\n            }\n\n            return $r;\n        }\n\n        if (\\is_array($fromEncoding) || (null !== $fromEncoding && false !== strpos($fromEncoding, ','))) {\n            $fromEncoding = self::mb_detect_encoding($s, $fromEncoding);\n        } else {\n            $fromEncoding = self::getEncoding($fromEncoding);\n        }\n\n        $toEncoding = self::getEncoding($toEncoding);\n\n        if ('BASE64' === $fromEncoding) {\n            $s = base64_decode($s);\n            $fromEncoding = $toEncoding;\n        }\n\n        if ('BASE64' === $toEncoding) {\n            return base64_encode($s);\n        }\n\n        if ('HTML-ENTITIES' === $toEncoding || 'HTML' === $toEncoding) {\n            if ('HTML-ENTITIES' === $fromEncoding || 'HTML' === $fromEncoding) {\n                $fromEncoding = 'Windows-1252';\n            }\n            if ('UTF-8' !== $fromEncoding) {\n                $s = self::iconv($fromEncoding, 'UTF-8', $s);\n            }\n\n            return preg_replace_callback('/[\\x80-\\xFF]+/', [__CLASS__, 'html_encoding_callback'], $s);\n        }\n\n        if ('HTML-ENTITIES' === $fromEncoding) {\n            $decodeControlChars = static function ($m) {\n                $code = '' !== ($m[2] ?? '') ? hexdec($m[2]) : (int) $m[1];\n\n                if ($code < 32 || 127 === $code) {\n                    return \\chr($code);\n                }\n                if (128 <= $code && $code <= 159) {\n                    return \"\\xC2\".\\chr(0x80 | ($code & 0x3F));\n                }\n\n                return $m[0];\n            };\n\n            if (\\PHP_VERSION_ID >= 70400) {\n                $s = html_entity_decode($s, \\ENT_QUOTES, 'UTF-8');\n                // html_entity_decode() leaves numeric entities for C0/C1 control\n                // characters as-is (HTML spec), but mb_convert_encoding() decodes\n                // them. Catch what html_entity_decode() missed.\n                if (false !== strpos($s, '&#')) {\n                    $s = preg_replace_callback('/&#(?:0*([0-9]++)|[xX]0*([0-9a-fA-F]++));/', $decodeControlChars, $s);\n                }\n            } else {\n                // PHP < 7.4: html_entity_decode() truncates strings at NUL bytes,\n                // so decode the control character entities first then call\n                // html_entity_decode() on each NUL-delimited chunk independently.\n                $s = preg_replace_callback('/&#(?:0*([0-9]++)|[xX]0*([0-9a-fA-F]++));/', $decodeControlChars, $s);\n                $s = implode(\"\\0\", array_map(static function ($chunk) {\n                    return html_entity_decode($chunk, \\ENT_QUOTES, 'UTF-8');\n                }, explode(\"\\0\", $s)));\n            }\n            $fromEncoding = 'UTF-8';\n        }\n\n        return self::iconv($fromEncoding, $toEncoding, $s);\n    }\n\n    public static function mb_convert_variables($toEncoding, $fromEncoding, &...$vars)\n    {\n        $ok = true;\n        array_walk_recursive($vars, static function (&$v) use (&$ok, $toEncoding, $fromEncoding) {\n            if (false === $v = self::mb_convert_encoding($v, $toEncoding, $fromEncoding)) {\n                $ok = false;\n            }\n        });\n\n        return $ok ? $fromEncoding : false;\n    }\n\n    public static function mb_decode_mimeheader($s)\n    {\n        return iconv_mime_decode($s, 2, self::$internalEncoding);\n    }\n\n    public static function mb_encode_mimeheader($s, $charset = null, $transferEncoding = null, $linefeed = null, $indent = null)\n    {\n        trigger_error('mb_encode_mimeheader() is bugged. Please use iconv_mime_encode() instead', \\E_USER_WARNING);\n    }\n\n    public static function mb_decode_numericentity($s, $convmap, $encoding = null)\n    {\n        if (null !== $s && !\\is_scalar($s) && !(\\is_object($s) && method_exists($s, '__toString'))) {\n            trigger_error('mb_decode_numericentity() expects parameter 1 to be string, '.\\gettype($s).' given', \\E_USER_WARNING);\n\n            return null;\n        }\n\n        if (!\\is_array($convmap) || (80000 > \\PHP_VERSION_ID && !$convmap)) {\n            return false;\n        }\n\n        if (null !== $encoding && !\\is_scalar($encoding)) {\n            trigger_error('mb_decode_numericentity() expects parameter 3 to be string, '.\\gettype($s).' given', \\E_USER_WARNING);\n\n            return '';  // Instead of null (cf. mb_encode_numericentity).\n        }\n\n        $s = (string) $s;\n        if ('' === $s) {\n            return '';\n        }\n\n        $encoding = self::getEncoding($encoding);\n\n        if ('UTF-8' === $encoding) {\n            $encoding = null;\n            if (!preg_match('//u', $s)) {\n                $s = @self::iconv('UTF-8', 'UTF-8', $s);\n            }\n        } else {\n            $s = self::iconv($encoding, 'UTF-8', $s);\n        }\n\n        $cnt = floor(\\count($convmap) / 4) * 4;\n\n        for ($i = 0; $i < $cnt; $i += 4) {\n            // collector_decode_htmlnumericentity ignores $convmap[$i + 3]\n            $convmap[$i] += $convmap[$i + 2];\n            $convmap[$i + 1] += $convmap[$i + 2];\n        }\n\n        $s = preg_replace_callback('/&#(?:0*([0-9]+)|x0*([0-9a-fA-F]+))'.(\\PHP_VERSION_ID >= 80200 ? '' : '(?!&)').';?/', static function (array $m) use ($cnt, $convmap) {\n            $c = isset($m[2]) ? (int) hexdec($m[2]) : $m[1];\n            for ($i = 0; $i < $cnt; $i += 4) {\n                if ($c >= $convmap[$i] && $c <= $convmap[$i + 1]) {\n                    return self::mb_chr($c - $convmap[$i + 2]);\n                }\n            }\n\n            return $m[0];\n        }, $s);\n\n        if (null === $encoding) {\n            return $s;\n        }\n\n        return self::iconv('UTF-8', $encoding, $s);\n    }\n\n    public static function mb_encode_numericentity($s, $convmap, $encoding = null, $is_hex = false)\n    {\n        if (null !== $s && !\\is_scalar($s) && !(\\is_object($s) && method_exists($s, '__toString'))) {\n            trigger_error('mb_encode_numericentity() expects parameter 1 to be string, '.\\gettype($s).' given', \\E_USER_WARNING);\n\n            return null;\n        }\n\n        if (!\\is_array($convmap) || (80000 > \\PHP_VERSION_ID && !$convmap)) {\n            return false;\n        }\n\n        if (null !== $encoding && !\\is_scalar($encoding)) {\n            trigger_error('mb_encode_numericentity() expects parameter 3 to be string, '.\\gettype($s).' given', \\E_USER_WARNING);\n\n            return null;  // Instead of '' (cf. mb_decode_numericentity).\n        }\n\n        if (null !== $is_hex && !\\is_scalar($is_hex)) {\n            trigger_error('mb_encode_numericentity() expects parameter 4 to be boolean, '.\\gettype($s).' given', \\E_USER_WARNING);\n\n            return null;\n        }\n\n        $s = (string) $s;\n        if ('' === $s) {\n            return '';\n        }\n\n        $encoding = self::getEncoding($encoding);\n\n        if ('UTF-8' === $encoding) {\n            $encoding = null;\n            if (!preg_match('//u', $s)) {\n                $s = @self::iconv('UTF-8', 'UTF-8', $s);\n            }\n        } else {\n            $s = self::iconv($encoding, 'UTF-8', $s);\n        }\n\n        static $ulenMask = [\"\\xC0\" => 2, \"\\xD0\" => 2, \"\\xE0\" => 3, \"\\xF0\" => 4];\n\n        $cnt = floor(\\count($convmap) / 4) * 4;\n        $i = 0;\n        $len = \\strlen($s);\n        $result = '';\n\n        while ($i < $len) {\n            $ulen = $s[$i] < \"\\x80\" ? 1 : $ulenMask[$s[$i] & \"\\xF0\"];\n            $uchr = substr($s, $i, $ulen);\n            $i += $ulen;\n            $c = self::mb_ord($uchr);\n\n            for ($j = 0; $j < $cnt; $j += 4) {\n                if ($c >= $convmap[$j] && $c <= $convmap[$j + 1]) {\n                    $cOffset = ($c + $convmap[$j + 2]) & $convmap[$j + 3];\n                    $result .= $is_hex ? \\sprintf('&#x%X;', $cOffset) : '&#'.$cOffset.';';\n                    continue 2;\n                }\n            }\n            $result .= $uchr;\n        }\n\n        if (null === $encoding) {\n            return $result;\n        }\n\n        return self::iconv('UTF-8', $encoding, $result);\n    }\n\n    public static function mb_convert_case($s, $mode, $encoding = null)\n    {\n        $s = (string) $s;\n        if ('' === $s) {\n            return '';\n        }\n\n        $encoding = self::getEncoding($encoding);\n\n        if ('UTF-8' === $encoding) {\n            $encoding = null;\n            if (!preg_match('//u', $s)) {\n                $s = @self::iconv('UTF-8', 'UTF-8', $s);\n            }\n        } else {\n            $s = self::iconv($encoding, 'UTF-8', $s);\n        }\n\n        if (\\MB_CASE_TITLE == $mode) {\n            static $titleRegexp = null;\n            if (null === $titleRegexp) {\n                $titleRegexp = self::getData('titleCaseRegexp');\n            }\n            $s = preg_replace_callback($titleRegexp, [__CLASS__, 'title_case'], $s);\n        } else {\n            if (\\MB_CASE_UPPER == $mode) {\n                static $upper = null;\n                if (null === $upper) {\n                    $upper = self::getData('upperCase');\n                }\n                $map = $upper;\n            } else {\n                if (self::MB_CASE_FOLD === $mode) {\n                    static $caseFolding = null;\n                    if (null === $caseFolding) {\n                        $caseFolding = self::getData('caseFolding');\n                    }\n                    $s = strtr($s, $caseFolding);\n                }\n\n                static $lower = null;\n                if (null === $lower) {\n                    $lower = self::getData('lowerCase');\n                }\n                $map = $lower;\n            }\n\n            static $ulenMask = [\"\\xC0\" => 2, \"\\xD0\" => 2, \"\\xE0\" => 3, \"\\xF0\" => 4];\n\n            $i = 0;\n            $len = \\strlen($s);\n\n            while ($i < $len) {\n                $ulen = $s[$i] < \"\\x80\" ? 1 : $ulenMask[$s[$i] & \"\\xF0\"];\n                $uchr = substr($s, $i, $ulen);\n                $i += $ulen;\n\n                if (isset($map[$uchr])) {\n                    $uchr = $map[$uchr];\n                    $nlen = \\strlen($uchr);\n\n                    if ($nlen == $ulen) {\n                        $nlen = $i;\n                        do {\n                            $s[--$nlen] = $uchr[--$ulen];\n                        } while ($ulen);\n                    } else {\n                        $s = substr_replace($s, $uchr, $i - $ulen, $ulen);\n                        $len += $nlen - $ulen;\n                        $i += $nlen - $ulen;\n                    }\n                }\n            }\n        }\n\n        if (null === $encoding) {\n            return $s;\n        }\n\n        return self::iconv('UTF-8', $encoding, $s);\n    }\n\n    public static function mb_internal_encoding($encoding = null)\n    {\n        if (null === $encoding) {\n            return self::$internalEncoding;\n        }\n\n        $normalizedEncoding = self::getEncoding($encoding);\n\n        if ('UTF-8' === $normalizedEncoding || false !== @iconv($normalizedEncoding, $normalizedEncoding, ' ')) {\n            self::$internalEncoding = $normalizedEncoding;\n\n            return true;\n        }\n\n        if (80000 > \\PHP_VERSION_ID) {\n            return false;\n        }\n\n        throw new \\ValueError(\\sprintf('Argument #1 ($encoding) must be a valid encoding, \"%s\" given', $encoding));\n    }\n\n    public static function mb_language($lang = null)\n    {\n        if (null === $lang) {\n            return self::$language;\n        }\n\n        switch ($normalizedLang = strtolower($lang)) {\n            case 'uni':\n            case 'neutral':\n                self::$language = $normalizedLang;\n\n                return true;\n        }\n\n        if (80000 > \\PHP_VERSION_ID) {\n            return false;\n        }\n\n        throw new \\ValueError(\\sprintf('Argument #1 ($language) must be a valid language, \"%s\" given', $lang));\n    }\n\n    public static function mb_list_encodings()\n    {\n        return ['UTF-8'];\n    }\n\n    public static function mb_encoding_aliases($encoding)\n    {\n        switch (strtoupper($encoding)) {\n            case 'UTF8':\n            case 'UTF-8':\n                return ['utf8'];\n        }\n\n        return false;\n    }\n\n    public static function mb_check_encoding($var = null, $encoding = null)\n    {\n        if (null === $encoding) {\n            if (null === $var) {\n                return false;\n            }\n            $encoding = self::$internalEncoding;\n        }\n\n        if (!\\is_array($var)) {\n            return self::mb_detect_encoding($var, [$encoding]) || false !== @iconv($encoding, $encoding, $var);\n        }\n\n        foreach ($var as $key => $value) {\n            if (!self::mb_check_encoding($key, $encoding)) {\n                return false;\n            }\n            if (!self::mb_check_encoding($value, $encoding)) {\n                return false;\n            }\n        }\n\n        return true;\n    }\n\n    public static function mb_detect_encoding($str, $encodingList = null, $strict = false)\n    {\n        if (null === $encodingList) {\n            $encodingList = self::$encodingList;\n        } else {\n            if (!\\is_array($encodingList)) {\n                $encodingList = array_map('trim', explode(',', $encodingList));\n            }\n            $encodingList = array_map('strtoupper', $encodingList);\n        }\n\n        foreach ($encodingList as $enc) {\n            switch ($enc) {\n                case 'ASCII':\n                    if (!preg_match('/[\\x80-\\xFF]/', $str)) {\n                        return $enc;\n                    }\n                    break;\n\n                case 'UTF8':\n                case 'UTF-8':\n                    if (preg_match('//u', $str)) {\n                        return 'UTF-8';\n                    }\n                    break;\n\n                default:\n                    if (0 === strncmp($enc, 'ISO-8859-', 9)) {\n                        return $enc;\n                    }\n            }\n        }\n\n        return false;\n    }\n\n    public static function mb_detect_order($encodingList = null)\n    {\n        if (null === $encodingList) {\n            return self::$encodingList;\n        }\n\n        if (!\\is_array($encodingList)) {\n            $encodingList = array_map('trim', explode(',', $encodingList));\n        }\n        $encodingList = array_map('strtoupper', $encodingList);\n\n        foreach ($encodingList as $enc) {\n            switch ($enc) {\n                default:\n                    if (strncmp($enc, 'ISO-8859-', 9)) {\n                        return false;\n                    }\n                    // no break\n                case 'ASCII':\n                case 'UTF8':\n                case 'UTF-8':\n            }\n        }\n\n        self::$encodingList = $encodingList;\n\n        return true;\n    }\n\n    public static function mb_strlen($s, $encoding = null)\n    {\n        $encoding = self::getEncoding($encoding);\n        if ('CP850' === $encoding || 'ASCII' === $encoding) {\n            return \\strlen($s);\n        }\n\n        if (false !== $len = @iconv_strlen($s, $encoding)) {\n            return $len;\n        }\n\n        if ('UTF-8' !== $encoding) {\n            return $len;\n        }\n\n        return preg_match_all('/[\\x00-\\x7F]|[\\xC0-\\xDF][\\x80-\\xBF]?|[\\xE0-\\xEF][\\x80-\\xBF]{0,2}|[\\xF0-\\xF7][\\x80-\\xBF]{0,3}|[\\xF8-\\xFB][\\x80-\\xBF]{0,4}|[\\xFC-\\xFD][\\x80-\\xBF]{0,5}|[\\x80-\\xBF\\xFE\\xFF]/s', $s);\n    }\n\n    public static function mb_strpos($haystack, $needle, $offset = 0, $encoding = null)\n    {\n        $encoding = self::getEncoding($encoding);\n        if ('CP850' === $encoding || 'ASCII' === $encoding) {\n            return strpos($haystack, $needle, $offset);\n        }\n\n        $needle = (string) $needle;\n        if ('' === $needle) {\n            if (80000 > \\PHP_VERSION_ID) {\n                trigger_error(__METHOD__.': Empty delimiter', \\E_USER_WARNING);\n\n                return false;\n            }\n\n            return 0;\n        }\n\n        return iconv_strpos($haystack, $needle, $offset, $encoding);\n    }\n\n    public static function mb_strrpos($haystack, $needle, $offset = 0, $encoding = null)\n    {\n        $encoding = self::getEncoding($encoding);\n        if ('CP850' === $encoding || 'ASCII' === $encoding) {\n            return strrpos($haystack, $needle, $offset);\n        }\n\n        if ($offset != (int) $offset) {\n            $offset = 0;\n        } elseif ($offset = (int) $offset) {\n            if ($offset < 0) {\n                if (0 > $offset += self::mb_strlen($needle)) {\n                    $haystack = self::mb_substr($haystack, 0, $offset, $encoding);\n                }\n                $offset = 0;\n            } else {\n                $haystack = self::mb_substr($haystack, $offset, 2147483647, $encoding);\n            }\n        }\n\n        $pos = '' !== $needle || 80000 > \\PHP_VERSION_ID\n            ? iconv_strrpos($haystack, $needle, $encoding)\n            : self::mb_strlen($haystack, $encoding);\n\n        return false !== $pos ? $offset + $pos : false;\n    }\n\n    public static function mb_str_split($string, $split_length = 1, $encoding = null)\n    {\n        if (null !== $string && !\\is_scalar($string) && !(\\is_object($string) && method_exists($string, '__toString'))) {\n            trigger_error('mb_str_split() expects parameter 1 to be string, '.\\gettype($string).' given', \\E_USER_WARNING);\n\n            return null;\n        }\n\n        if (1 > $split_length = (int) $split_length) {\n            if (80000 > \\PHP_VERSION_ID) {\n                trigger_error('The length of each segment must be greater than zero', \\E_USER_WARNING);\n\n                return false;\n            }\n\n            throw new \\ValueError('Argument #2 ($length) must be greater than 0');\n        }\n\n        if (null === $encoding) {\n            $encoding = mb_internal_encoding();\n        }\n\n        if ('UTF-8' === $encoding = self::getEncoding($encoding)) {\n            $rx = '/(';\n            while (65535 < $split_length) {\n                $rx .= '.{65535}';\n                $split_length -= 65535;\n            }\n            $rx .= '.{'.$split_length.'})/us';\n\n            return preg_split($rx, $string, -1, \\PREG_SPLIT_DELIM_CAPTURE | \\PREG_SPLIT_NO_EMPTY);\n        }\n\n        $result = [];\n        $length = mb_strlen($string, $encoding);\n\n        for ($i = 0; $i < $length; $i += $split_length) {\n            $result[] = mb_substr($string, $i, $split_length, $encoding);\n        }\n\n        return $result;\n    }\n\n    public static function mb_strtolower($s, $encoding = null)\n    {\n        return self::mb_convert_case($s, \\MB_CASE_LOWER, $encoding);\n    }\n\n    public static function mb_strtoupper($s, $encoding = null)\n    {\n        return self::mb_convert_case($s, \\MB_CASE_UPPER, $encoding);\n    }\n\n    public static function mb_substitute_character($c = null)\n    {\n        if (null === $c) {\n            return 'none';\n        }\n        if (0 === strcasecmp($c, 'none')) {\n            return true;\n        }\n        if (80000 > \\PHP_VERSION_ID) {\n            return false;\n        }\n        if (\\is_int($c) || 'long' === $c || 'entity' === $c) {\n            return false;\n        }\n\n        throw new \\ValueError('Argument #1 ($substitute_character) must be \"none\", \"long\", \"entity\" or a valid codepoint');\n    }\n\n    public static function mb_substr($s, $start, $length = null, $encoding = null)\n    {\n        $encoding = self::getEncoding($encoding);\n        if ('CP850' === $encoding || 'ASCII' === $encoding) {\n            return (string) substr($s, $start, null === $length ? 2147483647 : $length);\n        }\n\n        if ($start < 0) {\n            $start = iconv_strlen($s, $encoding) + $start;\n            if ($start < 0) {\n                $start = 0;\n            }\n        }\n\n        if (null === $length) {\n            $length = 2147483647;\n        } elseif ($length < 0) {\n            $length = iconv_strlen($s, $encoding) + $length - $start;\n            if ($length < 0) {\n                return '';\n            }\n        }\n\n        return (string) iconv_substr($s, $start, $length, $encoding);\n    }\n\n    public static function mb_stripos($haystack, $needle, $offset = 0, $encoding = null)\n    {\n        [$haystack, $needle] = str_replace(self::SIMPLE_CASE_FOLD[0], self::SIMPLE_CASE_FOLD[1], [\n            self::mb_convert_case($haystack, \\MB_CASE_LOWER, $encoding),\n            self::mb_convert_case($needle, \\MB_CASE_LOWER, $encoding),\n        ]);\n\n        return self::mb_strpos($haystack, $needle, $offset, $encoding);\n    }\n\n    public static function mb_stristr($haystack, $needle, $part = false, $encoding = null)\n    {\n        $pos = self::mb_stripos($haystack, $needle, 0, $encoding);\n\n        return self::getSubpart($pos, $part, $haystack, $encoding);\n    }\n\n    public static function mb_strrchr($haystack, $needle, $part = false, $encoding = null)\n    {\n        $encoding = self::getEncoding($encoding);\n        if ('CP850' === $encoding || 'ASCII' === $encoding) {\n            $pos = strrpos($haystack, $needle);\n        } else {\n            $needle = self::mb_substr($needle, 0, 1, $encoding);\n            $pos = iconv_strrpos($haystack, $needle, $encoding);\n        }\n\n        return self::getSubpart($pos, $part, $haystack, $encoding);\n    }\n\n    public static function mb_strrichr($haystack, $needle, $part = false, $encoding = null)\n    {\n        $needle = self::mb_substr($needle, 0, 1, $encoding);\n        $pos = self::mb_strripos($haystack, $needle, $encoding);\n\n        return self::getSubpart($pos, $part, $haystack, $encoding);\n    }\n\n    public static function mb_strripos($haystack, $needle, $offset = 0, $encoding = null)\n    {\n        $haystack = self::mb_convert_case($haystack, \\MB_CASE_LOWER, $encoding);\n        $needle = self::mb_convert_case($needle, \\MB_CASE_LOWER, $encoding);\n\n        $haystack = str_replace(self::SIMPLE_CASE_FOLD[0], self::SIMPLE_CASE_FOLD[1], $haystack);\n        $needle = str_replace(self::SIMPLE_CASE_FOLD[0], self::SIMPLE_CASE_FOLD[1], $needle);\n\n        return self::mb_strrpos($haystack, $needle, $offset, $encoding);\n    }\n\n    public static function mb_strstr($haystack, $needle, $part = false, $encoding = null)\n    {\n        $pos = strpos($haystack, $needle);\n        if (false === $pos) {\n            return false;\n        }\n        if ($part) {\n            return substr($haystack, 0, $pos);\n        }\n\n        return substr($haystack, $pos);\n    }\n\n    public static function mb_get_info($type = 'all')\n    {\n        $info = [\n            'internal_encoding' => self::$internalEncoding,\n            'http_output' => 'pass',\n            'http_output_conv_mimetypes' => '^(text/|application/xhtml\\+xml)',\n            'func_overload' => 0,\n            'func_overload_list' => 'no overload',\n            'mail_charset' => 'UTF-8',\n            'mail_header_encoding' => 'BASE64',\n            'mail_body_encoding' => 'BASE64',\n            'illegal_chars' => 0,\n            'encoding_translation' => 'Off',\n            'language' => self::$language,\n            'detect_order' => self::$encodingList,\n            'substitute_character' => 'none',\n            'strict_detection' => 'Off',\n        ];\n\n        if ('all' === $type) {\n            return $info;\n        }\n        if (isset($info[$type])) {\n            return $info[$type];\n        }\n\n        return false;\n    }\n\n    public static function mb_http_input($type = '')\n    {\n        return false;\n    }\n\n    public static function mb_http_output($encoding = null)\n    {\n        return null !== $encoding ? 'pass' === $encoding : 'pass';\n    }\n\n    public static function mb_strwidth($s, $encoding = null)\n    {\n        $encoding = self::getEncoding($encoding);\n\n        if ('UTF-8' !== $encoding) {\n            $s = self::iconv($encoding, 'UTF-8', $s);\n        }\n\n        $s = preg_replace('/[\\x{1100}-\\x{115F}\\x{2329}\\x{232A}\\x{2E80}-\\x{303E}\\x{3040}-\\x{A4CF}\\x{AC00}-\\x{D7A3}\\x{F900}-\\x{FAFF}\\x{FE10}-\\x{FE19}\\x{FE30}-\\x{FE6F}\\x{FF00}-\\x{FF60}\\x{FFE0}-\\x{FFE6}\\x{20000}-\\x{2FFFD}\\x{30000}-\\x{3FFFD}]/u', '', $s, -1, $wide);\n\n        return ($wide << 1) + iconv_strlen($s, 'UTF-8');\n    }\n\n    public static function mb_substr_count($haystack, $needle, $encoding = null)\n    {\n        return substr_count($haystack, $needle);\n    }\n\n    public static function mb_output_handler($contents, $status)\n    {\n        return $contents;\n    }\n\n    public static function mb_chr($code, $encoding = null)\n    {\n        if (0x80 > $code %= 0x200000) {\n            $s = \\chr($code);\n        } elseif (0x800 > $code) {\n            $s = \\chr(0xC0 | $code >> 6).\\chr(0x80 | $code & 0x3F);\n        } elseif (0x10000 > $code) {\n            $s = \\chr(0xE0 | $code >> 12).\\chr(0x80 | $code >> 6 & 0x3F).\\chr(0x80 | $code & 0x3F);\n        } else {\n            $s = \\chr(0xF0 | $code >> 18).\\chr(0x80 | $code >> 12 & 0x3F).\\chr(0x80 | $code >> 6 & 0x3F).\\chr(0x80 | $code & 0x3F);\n        }\n\n        if ('UTF-8' !== $encoding = self::getEncoding($encoding)) {\n            $s = mb_convert_encoding($s, $encoding, 'UTF-8');\n        }\n\n        return $s;\n    }\n\n    public static function mb_ord($s, $encoding = null)\n    {\n        if ('UTF-8' !== $encoding = self::getEncoding($encoding)) {\n            $s = mb_convert_encoding($s, 'UTF-8', $encoding);\n        }\n\n        if (1 === \\strlen($s)) {\n            return \\ord($s);\n        }\n\n        $code = ($s = unpack('C*', substr($s, 0, 4))) ? $s[1] : 0;\n        if (0xF0 <= $code) {\n            return (($code - 0xF0) << 18) + (($s[2] - 0x80) << 12) + (($s[3] - 0x80) << 6) + $s[4] - 0x80;\n        }\n        if (0xE0 <= $code) {\n            return (($code - 0xE0) << 12) + (($s[2] - 0x80) << 6) + $s[3] - 0x80;\n        }\n        if (0xC0 <= $code) {\n            return (($code - 0xC0) << 6) + $s[2] - 0x80;\n        }\n\n        return $code;\n    }\n\n    /** @return string|false */\n    public static function mb_scrub(?string $string, ?string $encoding = null): string\n    {\n        if (null === $encoding) {\n            $encoding = self::mb_internal_encoding();\n        } elseif (!self::assertEncoding($encoding, 'mb_scrub(): Argument #2 ($encoding) must be a valid encoding, \"%s\" given')) {\n            return false;\n        }\n\n        return self::mb_convert_encoding((string) $string, $encoding, $encoding);\n    }\n\n    /** @return string|false */\n    public static function mb_str_pad(string $string, int $length, string $pad_string = ' ', int $pad_type = \\STR_PAD_RIGHT, ?string $encoding = null)\n    {\n        if (null === $encoding) {\n            $encoding = self::mb_internal_encoding();\n        } elseif (!self::assertEncoding($encoding, 'mb_str_pad(): Argument #5 ($encoding) must be a valid encoding, \"%s\" given')) {\n            return false;\n        }\n\n        if (self::mb_strlen($pad_string, $encoding) <= 0) {\n            if (\\PHP_VERSION_ID < 80000) {\n                trigger_error('mb_str_pad(): Argument #3 ($pad_string) must be a non-empty string', \\E_USER_WARNING);\n\n                return false;\n            }\n\n            throw new \\ValueError('mb_str_pad(): Argument #3 ($pad_string) must be a non-empty string');\n        }\n\n        if (!\\in_array($pad_type, [\\STR_PAD_RIGHT, \\STR_PAD_LEFT, \\STR_PAD_BOTH], true)) {\n            if (\\PHP_VERSION_ID < 80000) {\n                trigger_error('mb_str_pad(): Argument #4 ($pad_type) must be STR_PAD_LEFT, STR_PAD_RIGHT, or STR_PAD_BOTH', \\E_USER_WARNING);\n\n                return false;\n            }\n\n            throw new \\ValueError('mb_str_pad(): Argument #4 ($pad_type) must be STR_PAD_LEFT, STR_PAD_RIGHT, or STR_PAD_BOTH');\n        }\n\n        $paddingRequired = $length - self::mb_strlen($string, $encoding);\n\n        if ($paddingRequired < 1) {\n            return $string;\n        }\n\n        switch ($pad_type) {\n            case \\STR_PAD_LEFT:\n                return self::mb_substr(str_repeat($pad_string, $paddingRequired), 0, $paddingRequired, $encoding).$string;\n            case \\STR_PAD_RIGHT:\n                return $string.self::mb_substr(str_repeat($pad_string, $paddingRequired), 0, $paddingRequired, $encoding);\n            default:\n                $leftPaddingLength = floor($paddingRequired / 2);\n                $rightPaddingLength = $paddingRequired - $leftPaddingLength;\n\n                return self::mb_substr(str_repeat($pad_string, $leftPaddingLength), 0, $leftPaddingLength, $encoding).$string.self::mb_substr(str_repeat($pad_string, $rightPaddingLength), 0, $rightPaddingLength, $encoding);\n        }\n    }\n\n    /** @return string|false */\n    public static function mb_ucfirst(string $string, ?string $encoding = null)\n    {\n        if (null === $encoding) {\n            $encoding = self::mb_internal_encoding();\n        } elseif (!self::assertEncoding($encoding, 'mb_ucfirst(): Argument #2 ($encoding) must be a valid encoding, \"%s\" given')) {\n            return false;\n        }\n\n        $firstChar = mb_substr($string, 0, 1, $encoding);\n        $firstChar = mb_convert_case($firstChar, \\MB_CASE_TITLE, $encoding);\n\n        return $firstChar.mb_substr($string, 1, null, $encoding);\n    }\n\n    /** @return string|false */\n    public static function mb_lcfirst(string $string, ?string $encoding = null)\n    {\n        if (null === $encoding) {\n            $encoding = self::mb_internal_encoding();\n        } elseif (!self::assertEncoding($encoding, 'mb_lcfirst(): Argument #2 ($encoding) must be a valid encoding, \"%s\" given')) {\n            return false;\n        }\n\n        $firstChar = mb_substr($string, 0, 1, $encoding);\n        $firstChar = mb_convert_case($firstChar, \\MB_CASE_LOWER, $encoding);\n\n        return $firstChar.mb_substr($string, 1, null, $encoding);\n    }\n\n    /** @return string|false */\n    public static function mb_trim(string $string, ?string $characters = null, ?string $encoding = null)\n    {\n        return self::mb_internal_trim('{^[%s]+|[%1$s]+$}Du', $string, $characters, $encoding, __FUNCTION__);\n    }\n\n    /** @return string|false */\n    public static function mb_ltrim(string $string, ?string $characters = null, ?string $encoding = null)\n    {\n        return self::mb_internal_trim('{^[%s]+}Du', $string, $characters, $encoding, __FUNCTION__);\n    }\n\n    /** @return string|false */\n    public static function mb_rtrim(string $string, ?string $characters = null, ?string $encoding = null)\n    {\n        return self::mb_internal_trim('{[%s]+$}Du', $string, $characters, $encoding, __FUNCTION__);\n    }\n\n    private static function getSubpart($pos, $part, $haystack, $encoding)\n    {\n        if (false === $pos) {\n            return false;\n        }\n        if ($part) {\n            return self::mb_substr($haystack, 0, $pos, $encoding);\n        }\n\n        return self::mb_substr($haystack, $pos, null, $encoding);\n    }\n\n    private static function html_encoding_callback(array $m)\n    {\n        $i = 1;\n        $entities = '';\n        $m = unpack('C*', htmlentities($m[0], \\ENT_COMPAT, 'UTF-8'));\n\n        while (isset($m[$i])) {\n            if (0x80 > $m[$i]) {\n                $entities .= \\chr($m[$i++]);\n                continue;\n            }\n            if (0xF0 <= $m[$i]) {\n                $c = (($m[$i++] - 0xF0) << 18) + (($m[$i++] - 0x80) << 12) + (($m[$i++] - 0x80) << 6) + $m[$i++] - 0x80;\n            } elseif (0xE0 <= $m[$i]) {\n                $c = (($m[$i++] - 0xE0) << 12) + (($m[$i++] - 0x80) << 6) + $m[$i++] - 0x80;\n            } else {\n                $c = (($m[$i++] - 0xC0) << 6) + $m[$i++] - 0x80;\n            }\n\n            $entities .= '&#'.$c.';';\n        }\n\n        return $entities;\n    }\n\n    private static function title_case(array $s)\n    {\n        return self::mb_convert_case($s[1], \\MB_CASE_UPPER, 'UTF-8').self::mb_convert_case($s[2], \\MB_CASE_LOWER, 'UTF-8');\n    }\n\n    private static function getData($file)\n    {\n        if (file_exists($file = __DIR__.'/Resources/unidata/'.$file.'.php')) {\n            return require $file;\n        }\n\n        return false;\n    }\n\n    private static function getEncoding($encoding)\n    {\n        if (null === $encoding) {\n            return self::$internalEncoding;\n        }\n\n        if ('UTF-8' === $encoding) {\n            return 'UTF-8';\n        }\n\n        $encoding = strtoupper($encoding);\n\n        if ('8BIT' === $encoding || 'BINARY' === $encoding) {\n            return 'CP850';\n        }\n\n        if ('UTF8' === $encoding) {\n            return 'UTF-8';\n        }\n\n        if ('UTF-32' === $encoding) {\n            return 'UTF-32BE';\n        }\n\n        if ('UTF-16' === $encoding) {\n            return 'UTF-16BE';\n        }\n\n        return $encoding;\n    }\n\n    private static function iconv($fromEncoding, $toEncoding, $s)\n    {\n        if (null === self::$iconvSupportsIgnore) {\n            self::$iconvSupportsIgnore = false !== @iconv('UTF-8', 'UTF-8//IGNORE', '');\n        }\n\n        return self::$iconvSupportsIgnore\n            ? iconv($fromEncoding, $toEncoding.'//IGNORE', $s)\n            : iconv($fromEncoding, $toEncoding, $s);\n    }\n\n    /** @return string|false */\n    private static function mb_internal_trim(string $regex, string $string, ?string $characters, ?string $encoding, string $function)\n    {\n        if (null === $encoding) {\n            $encoding = self::mb_internal_encoding();\n        } elseif (!self::assertEncoding($encoding, $function.'(): Argument #3 ($encoding) must be a valid encoding, \"%s\" given')) {\n            return false;\n        }\n\n        if ('' === $characters) {\n            return null === $encoding ? $string : self::mb_convert_encoding($string, $encoding);\n        }\n\n        if ('UTF-8' === $encoding) {\n            $encoding = null;\n            if (!preg_match('//u', $string)) {\n                $string = @self::iconv('UTF-8', 'UTF-8', $string);\n            }\n            if (null !== $characters && !preg_match('//u', $characters)) {\n                $characters = @self::iconv('UTF-8', 'UTF-8', $characters);\n            }\n        } else {\n            $string = self::iconv($encoding, 'UTF-8', $string);\n\n            if (null !== $characters) {\n                $characters = self::iconv($encoding, 'UTF-8', $characters);\n            }\n        }\n\n        if (null === $characters) {\n            $characters = \"\\\\0 \\f\\n\\r\\t\\v\\u{00A0}\\u{1680}\\u{2000}\\u{2001}\\u{2002}\\u{2003}\\u{2004}\\u{2005}\\u{2006}\\u{2007}\\u{2008}\\u{2009}\\u{200A}\\u{2028}\\u{2029}\\u{202F}\\u{205F}\\u{3000}\\u{0085}\\u{180E}\";\n        } else {\n            $characters = preg_quote($characters);\n        }\n\n        $string = preg_replace(\\sprintf($regex, $characters), '', $string);\n\n        if (null === $encoding) {\n            return $string;\n        }\n\n        return self::iconv('UTF-8', $encoding, $string);\n    }\n\n    private static function assertEncoding(string $encoding, string $errorFormat): bool\n    {\n        try {\n            $validEncoding = @self::mb_check_encoding('', $encoding);\n        } catch (\\ValueError $e) {\n            throw new \\ValueError(\\sprintf($errorFormat, $encoding));\n        }\n\n        if (!$validEncoding) {\n            if (80000 > \\PHP_VERSION_ID) {\n                trigger_error(\\sprintf($errorFormat, $encoding), \\E_USER_WARNING);\n            } else {\n                throw new \\ValueError(\\sprintf($errorFormat, $encoding));\n            }\n        }\n\n        return $validEncoding;\n    }\n}\n","vendor/symfony/polyfill-mbstring/README.md":"Symfony Polyfill / Mbstring\n===========================\n\nThis component provides a partial, native PHP implementation for the\n[Mbstring](https://php.net/mbstring) extension.\n\nMore information can be found in the\n[main Polyfill README](https://github.com/symfony/polyfill/blob/main/README.md).\n\nLicense\n=======\n\nThis library is released under the [MIT license](LICENSE).\n","vendor/symfony/polyfill-mbstring/Resources/unidata/caseFolding.php":"<?php\n\nreturn [\n    'İ' => 'i̇',\n    'µ' => 'μ',\n    'ſ' => 's',\n    'ͅ' => 'ι',\n    'ς' => 'σ',\n    'ϐ' => 'β',\n    'ϑ' => 'θ',\n    'ϕ' => 'φ',\n    'ϖ' => 'π',\n    'ϰ' => 'κ',\n    'ϱ' => 'ρ',\n    'ϵ' => 'ε',\n    'ẛ' => 'ṡ',\n    'ι' => 'ι',\n    'ß' => 'ss',\n    'ŉ' => 'ʼn',\n    'ǰ' => 'ǰ',\n    'ΐ' => 'ΐ',\n    'ΰ' => 'ΰ',\n    'և' => 'եւ',\n    'ẖ' => 'ẖ',\n    'ẗ' => 'ẗ',\n    'ẘ' => 'ẘ',\n    'ẙ' => 'ẙ',\n    'ẚ' => 'aʾ',\n    'ẞ' => 'ss',\n    'ὐ' => 'ὐ',\n    'ὒ' => 'ὒ',\n    'ὔ' => 'ὔ',\n    'ὖ' => 'ὖ',\n    'ᾀ' => 'ἀι',\n    'ᾁ' => 'ἁι',\n    'ᾂ' => 'ἂι',\n    'ᾃ' => 'ἃι',\n    'ᾄ' => 'ἄι',\n    'ᾅ' => 'ἅι',\n    'ᾆ' => 'ἆι',\n    'ᾇ' => 'ἇι',\n    'ᾈ' => 'ἀι',\n    'ᾉ' => 'ἁι',\n    'ᾊ' => 'ἂι',\n    'ᾋ' => 'ἃι',\n    'ᾌ' => 'ἄι',\n    'ᾍ' => 'ἅι',\n    'ᾎ' => 'ἆι',\n    'ᾏ' => 'ἇι',\n    'ᾐ' => 'ἠι',\n    'ᾑ' => 'ἡι',\n    'ᾒ' => 'ἢι',\n    'ᾓ' => 'ἣι',\n    'ᾔ' => 'ἤι',\n    'ᾕ' => 'ἥι',\n    'ᾖ' => 'ἦι',\n    'ᾗ' => 'ἧι',\n    'ᾘ' => 'ἠι',\n    'ᾙ' => 'ἡι',\n    'ᾚ' => 'ἢι',\n    'ᾛ' => 'ἣι',\n    'ᾜ' => 'ἤι',\n    'ᾝ' => 'ἥι',\n    'ᾞ' => 'ἦι',\n    'ᾟ' => 'ἧι',\n    'ᾠ' => 'ὠι',\n    'ᾡ' => 'ὡι',\n    'ᾢ' => 'ὢι',\n    'ᾣ' => 'ὣι',\n    'ᾤ' => 'ὤι',\n    'ᾥ' => 'ὥι',\n    'ᾦ' => 'ὦι',\n    'ᾧ' => 'ὧι',\n    'ᾨ' => 'ὠι',\n    'ᾩ' => 'ὡι',\n    'ᾪ' => 'ὢι',\n    'ᾫ' => 'ὣι',\n    'ᾬ' => 'ὤι',\n    'ᾭ' => 'ὥι',\n    'ᾮ' => 'ὦι',\n    'ᾯ' => 'ὧι',\n    'ᾲ' => 'ὰι',\n    'ᾳ' => 'αι',\n    'ᾴ' => 'άι',\n    'ᾶ' => 'ᾶ',\n    'ᾷ' => 'ᾶι',\n    'ᾼ' => 'αι',\n    'ῂ' => 'ὴι',\n    'ῃ' => 'ηι',\n    'ῄ' => 'ήι',\n    'ῆ' => 'ῆ',\n    'ῇ' => 'ῆι',\n    'ῌ' => 'ηι',\n    'ῒ' => 'ῒ',\n    'ῖ' => 'ῖ',\n    'ῗ' => 'ῗ',\n    'ῢ' => 'ῢ',\n    'ῤ' => 'ῤ',\n    'ῦ' => 'ῦ',\n    'ῧ' => 'ῧ',\n    'ῲ' => 'ὼι',\n    'ῳ' => 'ωι',\n    'ῴ' => 'ώι',\n    'ῶ' => 'ῶ',\n    'ῷ' => 'ῶι',\n    'ῼ' => 'ωι',\n    'ﬀ' => 'ff',\n    'ﬁ' => 'fi',\n    'ﬂ' => 'fl',\n    'ﬃ' => 'ffi',\n    'ﬄ' => 'ffl',\n    'ﬅ' => 'st',\n    'ﬆ' => 'st',\n    'ﬓ' => 'մն',\n    'ﬔ' => 'մե',\n    'ﬕ' => 'մի',\n    'ﬖ' => 'վն',\n    'ﬗ' => 'մխ',\n];\n","vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php":"<?php\n\nreturn array (\n  'A' => 'a',\n  'B' => 'b',\n  'C' => 'c',\n  'D' => 'd',\n  'E' => 'e',\n  'F' => 'f',\n  'G' => 'g',\n  'H' => 'h',\n  'I' => 'i',\n  'J' => 'j',\n  'K' => 'k',\n  'L' => 'l',\n  'M' => 'm',\n  'N' => 'n',\n  'O' => 'o',\n  'P' => 'p',\n  'Q' => 'q',\n  'R' => 'r',\n  'S' => 's',\n  'T' => 't',\n  'U' => 'u',\n  'V' => 'v',\n  'W' => 'w',\n  'X' => 'x',\n  'Y' => 'y',\n  'Z' => 'z',\n  'À' => 'à',\n  'Á' => 'á',\n  'Â' => 'â',\n  'Ã' => 'ã',\n  'Ä' => 'ä',\n  'Å' => 'å',\n  'Æ' => 'æ',\n  'Ç' => 'ç',\n  'È' => 'è',\n  'É' => 'é',\n  'Ê' => 'ê',\n  'Ë' => 'ë',\n  'Ì' => 'ì',\n  'Í' => 'í',\n  'Î' => 'î',\n  'Ï' => 'ï',\n  'Ð' => 'ð',\n  'Ñ' => 'ñ',\n  'Ò' => 'ò',\n  'Ó' => 'ó',\n  'Ô' => 'ô',\n  'Õ' => 'õ',\n  'Ö' => 'ö',\n  'Ø' => 'ø',\n  'Ù' => 'ù',\n  'Ú' => 'ú',\n  'Û' => 'û',\n  'Ü' => 'ü',\n  'Ý' => 'ý',\n  'Þ' => 'þ',\n  'Ā' => 'ā',\n  'Ă' => 'ă',\n  'Ą' => 'ą',\n  'Ć' => 'ć',\n  'Ĉ' => 'ĉ',\n  'Ċ' => 'ċ',\n  'Č' => 'č',\n  'Ď' => 'ď',\n  'Đ' => 'đ',\n  'Ē' => 'ē',\n  'Ĕ' => 'ĕ',\n  'Ė' => 'ė',\n  'Ę' => 'ę',\n  'Ě' => 'ě',\n  'Ĝ' => 'ĝ',\n  'Ğ' => 'ğ',\n  'Ġ' => 'ġ',\n  'Ģ' => 'ģ',\n  'Ĥ' => 'ĥ',\n  'Ħ' => 'ħ',\n  'Ĩ' => 'ĩ',\n  'Ī' => 'ī',\n  'Ĭ' => 'ĭ',\n  'Į' => 'į',\n  'İ' => 'i̇',\n  'Ĳ' => 'ĳ',\n  'Ĵ' => 'ĵ',\n  'Ķ' => 'ķ',\n  'Ĺ' => 'ĺ',\n  'Ļ' => 'ļ',\n  'Ľ' => 'ľ',\n  'Ŀ' => 'ŀ',\n  'Ł' => 'ł',\n  'Ń' => 'ń',\n  'Ņ' => 'ņ',\n  'Ň' => 'ň',\n  'Ŋ' => 'ŋ',\n  'Ō' => 'ō',\n  'Ŏ' => 'ŏ',\n  'Ő' => 'ő',\n  'Œ' => 'œ',\n  'Ŕ' => 'ŕ',\n  'Ŗ' => 'ŗ',\n  'Ř' => 'ř',\n  'Ś' => 'ś',\n  'Ŝ' => 'ŝ',\n  'Ş' => 'ş',\n  'Š' => 'š',\n  'Ţ' => 'ţ',\n  'Ť' => 'ť',\n  'Ŧ' => 'ŧ',\n  'Ũ' => 'ũ',\n  'Ū' => 'ū',\n  'Ŭ' => 'ŭ',\n  'Ů' => 'ů',\n  'Ű' => 'ű',\n  'Ų' => 'ų',\n  'Ŵ' => 'ŵ',\n  'Ŷ' => 'ŷ',\n  'Ÿ' => 'ÿ',\n  'Ź' => 'ź',\n  'Ż' => 'ż',\n  'Ž' => 'ž',\n  'Ɓ' => 'ɓ',\n  'Ƃ' => 'ƃ',\n  'Ƅ' => 'ƅ',\n  'Ɔ' => 'ɔ',\n  'Ƈ' => 'ƈ',\n  'Ɖ' => 'ɖ',\n  'Ɗ' => 'ɗ',\n  'Ƌ' => 'ƌ',\n  'Ǝ' => 'ǝ',\n  'Ə' => 'ə',\n  'Ɛ' => 'ɛ',\n  'Ƒ' => 'ƒ',\n  'Ɠ' => 'ɠ',\n  'Ɣ' => 'ɣ',\n  'Ɩ' => 'ɩ',\n  'Ɨ' => 'ɨ',\n  'Ƙ' => 'ƙ',\n  'Ɯ' => 'ɯ',\n  'Ɲ' => 'ɲ',\n  'Ɵ' => 'ɵ',\n  'Ơ' => 'ơ',\n  'Ƣ' => 'ƣ',\n  'Ƥ' => 'ƥ',\n  'Ʀ' => 'ʀ',\n  'Ƨ' => 'ƨ',\n  'Ʃ' => 'ʃ',\n  'Ƭ' => 'ƭ',\n  'Ʈ' => 'ʈ',\n  'Ư' => 'ư',\n  'Ʊ' => 'ʊ',\n  'Ʋ' => 'ʋ',\n  'Ƴ' => 'ƴ',\n  'Ƶ' => 'ƶ',\n  'Ʒ' => 'ʒ',\n  'Ƹ' => 'ƹ',\n  'Ƽ' => 'ƽ',\n  'Ǆ' => 'ǆ',\n  'ǅ' => 'ǆ',\n  'Ǉ' => 'ǉ',\n  'ǈ' => 'ǉ',\n  'Ǌ' => 'ǌ',\n  'ǋ' => 'ǌ',\n  'Ǎ' => 'ǎ',\n  'Ǐ' => 'ǐ',\n  'Ǒ' => 'ǒ',\n  'Ǔ' => 'ǔ',\n  'Ǖ' => 'ǖ',\n  'Ǘ' => 'ǘ',\n  'Ǚ' => 'ǚ',\n  'Ǜ' => 'ǜ',\n  'Ǟ' => 'ǟ',\n  'Ǡ' => 'ǡ',\n  'Ǣ' => 'ǣ',\n  'Ǥ' => 'ǥ',\n  'Ǧ' => 'ǧ',\n  'Ǩ' => 'ǩ',\n  'Ǫ' => 'ǫ',\n  'Ǭ' => 'ǭ',\n  'Ǯ' => 'ǯ',\n  'Ǳ' => 'ǳ',\n  'ǲ' => 'ǳ',\n  'Ǵ' => 'ǵ',\n  'Ƕ' => 'ƕ',\n  'Ƿ' => 'ƿ',\n  'Ǹ' => 'ǹ',\n  'Ǻ' => 'ǻ',\n  'Ǽ' => 'ǽ',\n  'Ǿ' => 'ǿ',\n  'Ȁ' => 'ȁ',\n  'Ȃ' => 'ȃ',\n  'Ȅ' => 'ȅ',\n  'Ȇ' => 'ȇ',\n  'Ȉ' => 'ȉ',\n  'Ȋ' => 'ȋ',\n  'Ȍ' => 'ȍ',\n  'Ȏ' => 'ȏ',\n  'Ȑ' => 'ȑ',\n  'Ȓ' => 'ȓ',\n  'Ȕ' => 'ȕ',\n  'Ȗ' => 'ȗ',\n  'Ș' => 'ș',\n  'Ț' => 'ț',\n  'Ȝ' => 'ȝ',\n  'Ȟ' => 'ȟ',\n  'Ƞ' => 'ƞ',\n  'Ȣ' => 'ȣ',\n  'Ȥ' => 'ȥ',\n  'Ȧ' => 'ȧ',\n  'Ȩ' => 'ȩ',\n  'Ȫ' => 'ȫ',\n  'Ȭ' => 'ȭ',\n  'Ȯ' => 'ȯ',\n  'Ȱ' => 'ȱ',\n  'Ȳ' => 'ȳ',\n  'Ⱥ' => 'ⱥ',\n  'Ȼ' => 'ȼ',\n  'Ƚ' => 'ƚ',\n  'Ⱦ' => 'ⱦ',\n  'Ɂ' => 'ɂ',\n  'Ƀ' => 'ƀ',\n  'Ʉ' => 'ʉ',\n  'Ʌ' => 'ʌ',\n  'Ɇ' => 'ɇ',\n  'Ɉ' => 'ɉ',\n  'Ɋ' => 'ɋ',\n  'Ɍ' => 'ɍ',\n  'Ɏ' => 'ɏ',\n  'Ͱ' => 'ͱ',\n  'Ͳ' => 'ͳ',\n  'Ͷ' => 'ͷ',\n  'Ϳ' => 'ϳ',\n  'Ά' => 'ά',\n  'Έ' => 'έ',\n  'Ή' => 'ή',\n  'Ί' => 'ί',\n  'Ό' => 'ό',\n  'Ύ' => 'ύ',\n  'Ώ' => 'ώ',\n  'Α' => 'α',\n  'Β' => 'β',\n  'Γ' => 'γ',\n  'Δ' => 'δ',\n  'Ε' => 'ε',\n  'Ζ' => 'ζ',\n  'Η' => 'η',\n  'Θ' => 'θ',\n  'Ι' => 'ι',\n  'Κ' => 'κ',\n  'Λ' => 'λ',\n  'Μ' => 'μ',\n  'Ν' => 'ν',\n  'Ξ' => 'ξ',\n  'Ο' => 'ο',\n  'Π' => 'π',\n  'Ρ' => 'ρ',\n  'Σ' => 'σ',\n  'Τ' => 'τ',\n  'Υ' => 'υ',\n  'Φ' => 'φ',\n  'Χ' => 'χ',\n  'Ψ' => 'ψ',\n  'Ω' => 'ω',\n  'Ϊ' => 'ϊ',\n  'Ϋ' => 'ϋ',\n  'Ϗ' => 'ϗ',\n  'Ϙ' => 'ϙ',\n  'Ϛ' => 'ϛ',\n  'Ϝ' => 'ϝ',\n  'Ϟ' => 'ϟ',\n  'Ϡ' => 'ϡ',\n  'Ϣ' => 'ϣ',\n  'Ϥ' => 'ϥ',\n  'Ϧ' => 'ϧ',\n  'Ϩ' => 'ϩ',\n  'Ϫ' => 'ϫ',\n  'Ϭ' => 'ϭ',\n  'Ϯ' => 'ϯ',\n  'ϴ' => 'θ',\n  'Ϸ' => 'ϸ',\n  'Ϲ' => 'ϲ',\n  'Ϻ' => 'ϻ',\n  'Ͻ' => 'ͻ',\n  'Ͼ' => 'ͼ',\n  'Ͽ' => 'ͽ',\n  'Ѐ' => 'ѐ',\n  'Ё' => 'ё',\n  'Ђ' => 'ђ',\n  'Ѓ' => 'ѓ',\n  'Є' => 'є',\n  'Ѕ' => 'ѕ',\n  'І' => 'і',\n  'Ї' => 'ї',\n  'Ј' => 'ј',\n  'Љ' => 'љ',\n  'Њ' => 'њ',\n  'Ћ' => 'ћ',\n  'Ќ' => 'ќ',\n  'Ѝ' => 'ѝ',\n  'Ў' => 'ў',\n  'Џ' => 'џ',\n  'А' => 'а',\n  'Б' => 'б',\n  'В' => 'в',\n  'Г' => 'г',\n  'Д' => 'д',\n  'Е' => 'е',\n  'Ж' => 'ж',\n  'З' => 'з',\n  'И' => 'и',\n  'Й' => 'й',\n  'К' => 'к',\n  'Л' => 'л',\n  'М' => 'м',\n  'Н' => 'н',\n  'О' => 'о',\n  'П' => 'п',\n  'Р' => 'р',\n  'С' => 'с',\n  'Т' => 'т',\n  'У' => 'у',\n  'Ф' => 'ф',\n  'Х' => 'х',\n  'Ц' => 'ц',\n  'Ч' => 'ч',\n  'Ш' => 'ш',\n  'Щ' => 'щ',\n  'Ъ' => 'ъ',\n  'Ы' => 'ы',\n  'Ь' => 'ь',\n  'Э' => 'э',\n  'Ю' => 'ю',\n  'Я' => 'я',\n  'Ѡ' => 'ѡ',\n  'Ѣ' => 'ѣ',\n  'Ѥ' => 'ѥ',\n  'Ѧ' => 'ѧ',\n  'Ѩ' => 'ѩ',\n  'Ѫ' => 'ѫ',\n  'Ѭ' => 'ѭ',\n  'Ѯ' => 'ѯ',\n  'Ѱ' => 'ѱ',\n  'Ѳ' => 'ѳ',\n  'Ѵ' => 'ѵ',\n  'Ѷ' => 'ѷ',\n  'Ѹ' => 'ѹ',\n  'Ѻ' => 'ѻ',\n  'Ѽ' => 'ѽ',\n  'Ѿ' => 'ѿ',\n  'Ҁ' => 'ҁ',\n  'Ҋ' => 'ҋ',\n  'Ҍ' => 'ҍ',\n  'Ҏ' => 'ҏ',\n  'Ґ' => 'ґ',\n  'Ғ' => 'ғ',\n  'Ҕ' => 'ҕ',\n  'Җ' => 'җ',\n  'Ҙ' => 'ҙ',\n  'Қ' => 'қ',\n  'Ҝ' => 'ҝ',\n  'Ҟ' => 'ҟ',\n  'Ҡ' => 'ҡ',\n  'Ң' => 'ң',\n  'Ҥ' => 'ҥ',\n  'Ҧ' => 'ҧ',\n  'Ҩ' => 'ҩ',\n  'Ҫ' => 'ҫ',\n  'Ҭ' => 'ҭ',\n  'Ү' => 'ү',\n  'Ұ' => 'ұ',\n  'Ҳ' => 'ҳ',\n  'Ҵ' => 'ҵ',\n  'Ҷ' => 'ҷ',\n  'Ҹ' => 'ҹ',\n  'Һ' => 'һ',\n  'Ҽ' => 'ҽ',\n  'Ҿ' => 'ҿ',\n  'Ӏ' => 'ӏ',\n  'Ӂ' => 'ӂ',\n  'Ӄ' => 'ӄ',\n  'Ӆ' => 'ӆ',\n  'Ӈ' => 'ӈ',\n  'Ӊ' => 'ӊ',\n  'Ӌ' => 'ӌ',\n  'Ӎ' => 'ӎ',\n  'Ӑ' => 'ӑ',\n  'Ӓ' => 'ӓ',\n  'Ӕ' => 'ӕ',\n  'Ӗ' => 'ӗ',\n  'Ә' => 'ә',\n  'Ӛ' => 'ӛ',\n  'Ӝ' => 'ӝ',\n  'Ӟ' => 'ӟ',\n  'Ӡ' => 'ӡ',\n  'Ӣ' => 'ӣ',\n  'Ӥ' => 'ӥ',\n  'Ӧ' => 'ӧ',\n  'Ө' => 'ө',\n  'Ӫ' => 'ӫ',\n  'Ӭ' => 'ӭ',\n  'Ӯ' => 'ӯ',\n  'Ӱ' => 'ӱ',\n  'Ӳ' => 'ӳ',\n  'Ӵ' => 'ӵ',\n  'Ӷ' => 'ӷ',\n  'Ӹ' => 'ӹ',\n  'Ӻ' => 'ӻ',\n  'Ӽ' => 'ӽ',\n  'Ӿ' => 'ӿ',\n  'Ԁ' => 'ԁ',\n  'Ԃ' => 'ԃ',\n  'Ԅ' => 'ԅ',\n  'Ԇ' => 'ԇ',\n  'Ԉ' => 'ԉ',\n  'Ԋ' => 'ԋ',\n  'Ԍ' => 'ԍ',\n  'Ԏ' => 'ԏ',\n  'Ԑ' => 'ԑ',\n  'Ԓ' => 'ԓ',\n  'Ԕ' => 'ԕ',\n  'Ԗ' => 'ԗ',\n  'Ԙ' => 'ԙ',\n  'Ԛ' => 'ԛ',\n  'Ԝ' => 'ԝ',\n  'Ԟ' => 'ԟ',\n  'Ԡ' => 'ԡ',\n  'Ԣ' => 'ԣ',\n  'Ԥ' => 'ԥ',\n  'Ԧ' => 'ԧ',\n  'Ԩ' => 'ԩ',\n  'Ԫ' => 'ԫ',\n  'Ԭ' => 'ԭ',\n  'Ԯ' => 'ԯ',\n  'Ա' => 'ա',\n  'Բ' => 'բ',\n  'Գ' => 'գ',\n  'Դ' => 'դ',\n  'Ե' => 'ե',\n  'Զ' => 'զ',\n  'Է' => 'է',\n  'Ը' => 'ը',\n  'Թ' => 'թ',\n  'Ժ' => 'ժ',\n  'Ի' => 'ի',\n  'Լ' => 'լ',\n  'Խ' => 'խ',\n  'Ծ' => 'ծ',\n  'Կ' => 'կ',\n  'Հ' => 'հ',\n  'Ձ' => 'ձ',\n  'Ղ' => 'ղ',\n  'Ճ' => 'ճ',\n  'Մ' => 'մ',\n  'Յ' => 'յ',\n  'Ն' => 'ն',\n  'Շ' => 'շ',\n  'Ո' => 'ո',\n  'Չ' => 'չ',\n  'Պ' => 'պ',\n  'Ջ' => 'ջ',\n  'Ռ' => 'ռ',\n  'Ս' => 'ս',\n  'Վ' => 'վ',\n  'Տ' => 'տ',\n  'Ր' => 'ր',\n  'Ց' => 'ց',\n  'Ւ' => 'ւ',\n  'Փ' => 'փ',\n  'Ք' => 'ք',\n  'Օ' => 'օ',\n  'Ֆ' => 'ֆ',\n  'Ⴀ' => 'ⴀ',\n  'Ⴁ' => 'ⴁ',\n  'Ⴂ' => 'ⴂ',\n  'Ⴃ' => 'ⴃ',\n  'Ⴄ' => 'ⴄ',\n  'Ⴅ' => 'ⴅ',\n  'Ⴆ' => 'ⴆ',\n  'Ⴇ' => 'ⴇ',\n  'Ⴈ' => 'ⴈ',\n  'Ⴉ' => 'ⴉ',\n  'Ⴊ' => 'ⴊ',\n  'Ⴋ' => 'ⴋ',\n  'Ⴌ' => 'ⴌ',\n  'Ⴍ' => 'ⴍ',\n  'Ⴎ' => 'ⴎ',\n  'Ⴏ' => 'ⴏ',\n  'Ⴐ' => 'ⴐ',\n  'Ⴑ' => 'ⴑ',\n  'Ⴒ' => 'ⴒ',\n  'Ⴓ' => 'ⴓ',\n  'Ⴔ' => 'ⴔ',\n  'Ⴕ' => 'ⴕ',\n  'Ⴖ' => 'ⴖ',\n  'Ⴗ' => 'ⴗ',\n  'Ⴘ' => 'ⴘ',\n  'Ⴙ' => 'ⴙ',\n  'Ⴚ' => 'ⴚ',\n  'Ⴛ' => 'ⴛ',\n  'Ⴜ' => 'ⴜ',\n  'Ⴝ' => 'ⴝ',\n  'Ⴞ' => 'ⴞ',\n  'Ⴟ' => 'ⴟ',\n  'Ⴠ' => 'ⴠ',\n  'Ⴡ' => 'ⴡ',\n  'Ⴢ' => 'ⴢ',\n  'Ⴣ' => 'ⴣ',\n  'Ⴤ' => 'ⴤ',\n  'Ⴥ' => 'ⴥ',\n  'Ⴧ' => 'ⴧ',\n  'Ⴭ' => 'ⴭ',\n  'Ꭰ' => 'ꭰ',\n  'Ꭱ' => 'ꭱ',\n  'Ꭲ' => 'ꭲ',\n  'Ꭳ' => 'ꭳ',\n  'Ꭴ' => 'ꭴ',\n  'Ꭵ' => 'ꭵ',\n  'Ꭶ' => 'ꭶ',\n  'Ꭷ' => 'ꭷ',\n  'Ꭸ' => 'ꭸ',\n  'Ꭹ' => 'ꭹ',\n  'Ꭺ' => 'ꭺ',\n  'Ꭻ' => 'ꭻ',\n  'Ꭼ' => 'ꭼ',\n  'Ꭽ' => 'ꭽ',\n  'Ꭾ' => 'ꭾ',\n  'Ꭿ' => 'ꭿ',\n  'Ꮀ' => 'ꮀ',\n  'Ꮁ' => 'ꮁ',\n  'Ꮂ' => 'ꮂ',\n  'Ꮃ' => 'ꮃ',\n  'Ꮄ' => 'ꮄ',\n  'Ꮅ' => 'ꮅ',\n  'Ꮆ' => 'ꮆ',\n  'Ꮇ' => 'ꮇ',\n  'Ꮈ' => 'ꮈ',\n  'Ꮉ' => 'ꮉ',\n  'Ꮊ' => 'ꮊ',\n  'Ꮋ' => 'ꮋ',\n  'Ꮌ' => 'ꮌ',\n  'Ꮍ' => 'ꮍ',\n  'Ꮎ' => 'ꮎ',\n  'Ꮏ' => 'ꮏ',\n  'Ꮐ' => 'ꮐ',\n  'Ꮑ' => 'ꮑ',\n  'Ꮒ' => 'ꮒ',\n  'Ꮓ' => 'ꮓ',\n  'Ꮔ' => 'ꮔ',\n  'Ꮕ' => 'ꮕ',\n  'Ꮖ' => 'ꮖ',\n  'Ꮗ' => 'ꮗ',\n  'Ꮘ' => 'ꮘ',\n  'Ꮙ' => 'ꮙ',\n  'Ꮚ' => 'ꮚ',\n  'Ꮛ' => 'ꮛ',\n  'Ꮜ' => 'ꮜ',\n  'Ꮝ' => 'ꮝ',\n  'Ꮞ' => 'ꮞ',\n  'Ꮟ' => 'ꮟ',\n  'Ꮠ' => 'ꮠ',\n  'Ꮡ' => 'ꮡ',\n  'Ꮢ' => 'ꮢ',\n  'Ꮣ' => 'ꮣ',\n  'Ꮤ' => 'ꮤ',\n  'Ꮥ' => 'ꮥ',\n  'Ꮦ' => 'ꮦ',\n  'Ꮧ' => 'ꮧ',\n  'Ꮨ' => 'ꮨ',\n  'Ꮩ' => 'ꮩ',\n  'Ꮪ' => 'ꮪ',\n  'Ꮫ' => 'ꮫ',\n  'Ꮬ' => 'ꮬ',\n  'Ꮭ' => 'ꮭ',\n  'Ꮮ' => 'ꮮ',\n  'Ꮯ' => 'ꮯ',\n  'Ꮰ' => 'ꮰ',\n  'Ꮱ' => 'ꮱ',\n  'Ꮲ' => 'ꮲ',\n  'Ꮳ' => 'ꮳ',\n  'Ꮴ' => 'ꮴ',\n  'Ꮵ' => 'ꮵ',\n  'Ꮶ' => 'ꮶ',\n  'Ꮷ' => 'ꮷ',\n  'Ꮸ' => 'ꮸ',\n  'Ꮹ' => 'ꮹ',\n  'Ꮺ' => 'ꮺ',\n  'Ꮻ' => 'ꮻ',\n  'Ꮼ' => 'ꮼ',\n  'Ꮽ' => 'ꮽ',\n  'Ꮾ' => 'ꮾ',\n  'Ꮿ' => 'ꮿ',\n  'Ᏸ' => 'ᏸ',\n  'Ᏹ' => 'ᏹ',\n  'Ᏺ' => 'ᏺ',\n  'Ᏻ' => 'ᏻ',\n  'Ᏼ' => 'ᏼ',\n  'Ᏽ' => 'ᏽ',\n  'Ა' => 'ა',\n  'Ბ' => 'ბ',\n  'Გ' => 'გ',\n  'Დ' => 'დ',\n  'Ე' => 'ე',\n  'Ვ' => 'ვ',\n  'Ზ' => 'ზ',\n  'Თ' => 'თ',\n  'Ი' => 'ი',\n  'Კ' => 'კ',\n  'Ლ' => 'ლ',\n  'Მ' => 'მ',\n  'Ნ' => 'ნ',\n  'Ო' => 'ო',\n  'Პ' => 'პ',\n  'Ჟ' => 'ჟ',\n  'Რ' => 'რ',\n  'Ს' => 'ს',\n  'Ტ' => 'ტ',\n  'Უ' => 'უ',\n  'Ფ' => 'ფ',\n  'Ქ' => 'ქ',\n  'Ღ' => 'ღ',\n  'Ყ' => 'ყ',\n  'Შ' => 'შ',\n  'Ჩ' => 'ჩ',\n  'Ც' => 'ც',\n  'Ძ' => 'ძ',\n  'Წ' => 'წ',\n  'Ჭ' => 'ჭ',\n  'Ხ' => 'ხ',\n  'Ჯ' => 'ჯ',\n  'Ჰ' => 'ჰ',\n  'Ჱ' => 'ჱ',\n  'Ჲ' => 'ჲ',\n  'Ჳ' => 'ჳ',\n  'Ჴ' => 'ჴ',\n  'Ჵ' => 'ჵ',\n  'Ჶ' => 'ჶ',\n  'Ჷ' => 'ჷ',\n  'Ჸ' => 'ჸ',\n  'Ჹ' => 'ჹ',\n  'Ჺ' => 'ჺ',\n  'Ჽ' => 'ჽ',\n  'Ჾ' => 'ჾ',\n  'Ჿ' => 'ჿ',\n  'Ḁ' => 'ḁ',\n  'Ḃ' => 'ḃ',\n  'Ḅ' => 'ḅ',\n  'Ḇ' => 'ḇ',\n  'Ḉ' => 'ḉ',\n  'Ḋ' => 'ḋ',\n  'Ḍ' => 'ḍ',\n  'Ḏ' => 'ḏ',\n  'Ḑ' => 'ḑ',\n  'Ḓ' => 'ḓ',\n  'Ḕ' => 'ḕ',\n  'Ḗ' => 'ḗ',\n  'Ḙ' => 'ḙ',\n  'Ḛ' => 'ḛ',\n  'Ḝ' => 'ḝ',\n  'Ḟ' => 'ḟ',\n  'Ḡ' => 'ḡ',\n  'Ḣ' => 'ḣ',\n  'Ḥ' => 'ḥ',\n  'Ḧ' => 'ḧ',\n  'Ḩ' => 'ḩ',\n  'Ḫ' => 'ḫ',\n  'Ḭ' => 'ḭ',\n  'Ḯ' => 'ḯ',\n  'Ḱ' => 'ḱ',\n  'Ḳ' => 'ḳ',\n  'Ḵ' => 'ḵ',\n  'Ḷ' => 'ḷ',\n  'Ḹ' => 'ḹ',\n  'Ḻ' => 'ḻ',\n  'Ḽ' => 'ḽ',\n  'Ḿ' => 'ḿ',\n  'Ṁ' => 'ṁ',\n  'Ṃ' => 'ṃ',\n  'Ṅ' => 'ṅ',\n  'Ṇ' => 'ṇ',\n  'Ṉ' => 'ṉ',\n  'Ṋ' => 'ṋ',\n  'Ṍ' => 'ṍ',\n  'Ṏ' => 'ṏ',\n  'Ṑ' => 'ṑ',\n  'Ṓ' => 'ṓ',\n  'Ṕ' => 'ṕ',\n  'Ṗ' => 'ṗ',\n  'Ṙ' => 'ṙ',\n  'Ṛ' => 'ṛ',\n  'Ṝ' => 'ṝ',\n  'Ṟ' => 'ṟ',\n  'Ṡ' => 'ṡ',\n  'Ṣ' => 'ṣ',\n  'Ṥ' => 'ṥ',\n  'Ṧ' => 'ṧ',\n  'Ṩ' => 'ṩ',\n  'Ṫ' => 'ṫ',\n  'Ṭ' => 'ṭ',\n  'Ṯ' => 'ṯ',\n  'Ṱ' => 'ṱ',\n  'Ṳ' => 'ṳ',\n  'Ṵ' => 'ṵ',\n  'Ṷ' => 'ṷ',\n  'Ṹ' => 'ṹ',\n  'Ṻ' => 'ṻ',\n  'Ṽ' => 'ṽ',\n  'Ṿ' => 'ṿ',\n  'Ẁ' => 'ẁ',\n  'Ẃ' => 'ẃ',\n  'Ẅ' => 'ẅ',\n  'Ẇ' => 'ẇ',\n  'Ẉ' => 'ẉ',\n  'Ẋ' => 'ẋ',\n  'Ẍ' => 'ẍ',\n  'Ẏ' => 'ẏ',\n  'Ẑ' => 'ẑ',\n  'Ẓ' => 'ẓ',\n  'Ẕ' => 'ẕ',\n  'ẞ' => 'ß',\n  'Ạ' => 'ạ',\n  'Ả' => 'ả',\n  'Ấ' => 'ấ',\n  'Ầ' => 'ầ',\n  'Ẩ' => 'ẩ',\n  'Ẫ' => 'ẫ',\n  'Ậ' => 'ậ',\n  'Ắ' => 'ắ',\n  'Ằ' => 'ằ',\n  'Ẳ' => 'ẳ',\n  'Ẵ' => 'ẵ',\n  'Ặ' => 'ặ',\n  'Ẹ' => 'ẹ',\n  'Ẻ' => 'ẻ',\n  'Ẽ' => 'ẽ',\n  'Ế' => 'ế',\n  'Ề' => 'ề',\n  'Ể' => 'ể',\n  'Ễ' => 'ễ',\n  'Ệ' => 'ệ',\n  'Ỉ' => 'ỉ',\n  'Ị' => 'ị',\n  'Ọ' => 'ọ',\n  'Ỏ' => 'ỏ',\n  'Ố' => 'ố',\n  'Ồ' => 'ồ',\n  'Ổ' => 'ổ',\n  'Ỗ' => 'ỗ',\n  'Ộ' => 'ộ',\n  'Ớ' => 'ớ',\n  'Ờ' => 'ờ',\n  'Ở' => 'ở',\n  'Ỡ' => 'ỡ',\n  'Ợ' => 'ợ',\n  'Ụ' => 'ụ',\n  'Ủ' => 'ủ',\n  'Ứ' => 'ứ',\n  'Ừ' => 'ừ',\n  'Ử' => 'ử',\n  'Ữ' => 'ữ',\n  'Ự' => 'ự',\n  'Ỳ' => 'ỳ',\n  'Ỵ' => 'ỵ',\n  'Ỷ' => 'ỷ',\n  'Ỹ' => 'ỹ',\n  'Ỻ' => 'ỻ',\n  'Ỽ' => 'ỽ',\n  'Ỿ' => 'ỿ',\n  'Ἀ' => 'ἀ',\n  'Ἁ' => 'ἁ',\n  'Ἂ' => 'ἂ',\n  'Ἃ' => 'ἃ',\n  'Ἄ' => 'ἄ',\n  'Ἅ' => 'ἅ',\n  'Ἆ' => 'ἆ',\n  'Ἇ' => 'ἇ',\n  'Ἐ' => 'ἐ',\n  'Ἑ' => 'ἑ',\n  'Ἒ' => 'ἒ',\n  'Ἓ' => 'ἓ',\n  'Ἔ' => 'ἔ',\n  'Ἕ' => 'ἕ',\n  'Ἠ' => 'ἠ',\n  'Ἡ' => 'ἡ',\n  'Ἢ' => 'ἢ',\n  'Ἣ' => 'ἣ',\n  'Ἤ' => 'ἤ',\n  'Ἥ' => 'ἥ',\n  'Ἦ' => 'ἦ',\n  'Ἧ' => 'ἧ',\n  'Ἰ' => 'ἰ',\n  'Ἱ' => 'ἱ',\n  'Ἲ' => 'ἲ',\n  'Ἳ' => 'ἳ',\n  'Ἴ' => 'ἴ',\n  'Ἵ' => 'ἵ',\n  'Ἶ' => 'ἶ',\n  'Ἷ' => 'ἷ',\n  'Ὀ' => 'ὀ',\n  'Ὁ' => 'ὁ',\n  'Ὂ' => 'ὂ',\n  'Ὃ' => 'ὃ',\n  'Ὄ' => 'ὄ',\n  'Ὅ' => 'ὅ',\n  'Ὑ' => 'ὑ',\n  'Ὓ' => 'ὓ',\n  'Ὕ' => 'ὕ',\n  'Ὗ' => 'ὗ',\n  'Ὠ' => 'ὠ',\n  'Ὡ' => 'ὡ',\n  'Ὢ' => 'ὢ',\n  'Ὣ' => 'ὣ',\n  'Ὤ' => 'ὤ',\n  'Ὥ' => 'ὥ',\n  'Ὦ' => 'ὦ',\n  'Ὧ' => 'ὧ',\n  'ᾈ' => 'ᾀ',\n  'ᾉ' => 'ᾁ',\n  'ᾊ' => 'ᾂ',\n  'ᾋ' => 'ᾃ',\n  'ᾌ' => 'ᾄ',\n  'ᾍ' => 'ᾅ',\n  'ᾎ' => 'ᾆ',\n  'ᾏ' => 'ᾇ',\n  'ᾘ' => 'ᾐ',\n  'ᾙ' => 'ᾑ',\n  'ᾚ' => 'ᾒ',\n  'ᾛ' => 'ᾓ',\n  'ᾜ' => 'ᾔ',\n  'ᾝ' => 'ᾕ',\n  'ᾞ' => 'ᾖ',\n  'ᾟ' => 'ᾗ',\n  'ᾨ' => 'ᾠ',\n  'ᾩ' => 'ᾡ',\n  'ᾪ' => 'ᾢ',\n  'ᾫ' => 'ᾣ',\n  'ᾬ' => 'ᾤ',\n  'ᾭ' => 'ᾥ',\n  'ᾮ' => 'ᾦ',\n  'ᾯ' => 'ᾧ',\n  'Ᾰ' => 'ᾰ',\n  'Ᾱ' => 'ᾱ',\n  'Ὰ' => 'ὰ',\n  'Ά' => 'ά',\n  'ᾼ' => 'ᾳ',\n  'Ὲ' => 'ὲ',\n  'Έ' => 'έ',\n  'Ὴ' => 'ὴ',\n  'Ή' => 'ή',\n  'ῌ' => 'ῃ',\n  'Ῐ' => 'ῐ',\n  'Ῑ' => 'ῑ',\n  'Ὶ' => 'ὶ',\n  'Ί' => 'ί',\n  'Ῠ' => 'ῠ',\n  'Ῡ' => 'ῡ',\n  'Ὺ' => 'ὺ',\n  'Ύ' => 'ύ',\n  'Ῥ' => 'ῥ',\n  'Ὸ' => 'ὸ',\n  'Ό' => 'ό',\n  'Ὼ' => 'ὼ',\n  'Ώ' => 'ώ',\n  'ῼ' => 'ῳ',\n  'Ω' => 'ω',\n  'K' => 'k',\n  'Å' => 'å',\n  'Ⅎ' => 'ⅎ',\n  'Ⅰ' => 'ⅰ',\n  'Ⅱ' => 'ⅱ',\n  'Ⅲ' => 'ⅲ',\n  'Ⅳ' => 'ⅳ',\n  'Ⅴ' => 'ⅴ',\n  'Ⅵ' => 'ⅵ',\n  'Ⅶ' => 'ⅶ',\n  'Ⅷ' => 'ⅷ',\n  'Ⅸ' => 'ⅸ',\n  'Ⅹ' => 'ⅹ',\n  'Ⅺ' => 'ⅺ',\n  'Ⅻ' => 'ⅻ',\n  'Ⅼ' => 'ⅼ',\n  'Ⅽ' => 'ⅽ',\n  'Ⅾ' => 'ⅾ',\n  'Ⅿ' => 'ⅿ',\n  'Ↄ' => 'ↄ',\n  'Ⓐ' => 'ⓐ',\n  'Ⓑ' => 'ⓑ',\n  'Ⓒ' => 'ⓒ',\n  'Ⓓ' => 'ⓓ',\n  'Ⓔ' => 'ⓔ',\n  'Ⓕ' => 'ⓕ',\n  'Ⓖ' => 'ⓖ',\n  'Ⓗ' => 'ⓗ',\n  'Ⓘ' => 'ⓘ',\n  'Ⓙ' => 'ⓙ',\n  'Ⓚ' => 'ⓚ',\n  'Ⓛ' => 'ⓛ',\n  'Ⓜ' => 'ⓜ',\n  'Ⓝ' => 'ⓝ',\n  'Ⓞ' => 'ⓞ',\n  'Ⓟ' => 'ⓟ',\n  'Ⓠ' => 'ⓠ',\n  'Ⓡ' => 'ⓡ',\n  'Ⓢ' => 'ⓢ',\n  'Ⓣ' => 'ⓣ',\n  'Ⓤ' => 'ⓤ',\n  'Ⓥ' => 'ⓥ',\n  'Ⓦ' => 'ⓦ',\n  'Ⓧ' => 'ⓧ',\n  'Ⓨ' => 'ⓨ',\n  'Ⓩ' => 'ⓩ',\n  'Ⰰ' => 'ⰰ',\n  'Ⰱ' => 'ⰱ',\n  'Ⰲ' => 'ⰲ',\n  'Ⰳ' => 'ⰳ',\n  'Ⰴ' => 'ⰴ',\n  'Ⰵ' => 'ⰵ',\n  'Ⰶ' => 'ⰶ',\n  'Ⰷ' => 'ⰷ',\n  'Ⰸ' => 'ⰸ',\n  'Ⰹ' => 'ⰹ',\n  'Ⰺ' => 'ⰺ',\n  'Ⰻ' => 'ⰻ',\n  'Ⰼ' => 'ⰼ',\n  'Ⰽ' => 'ⰽ',\n  'Ⰾ' => 'ⰾ',\n  'Ⰿ' => 'ⰿ',\n  'Ⱀ' => 'ⱀ',\n  'Ⱁ' => 'ⱁ',\n  'Ⱂ' => 'ⱂ',\n  'Ⱃ' => 'ⱃ',\n  'Ⱄ' => 'ⱄ',\n  'Ⱅ' => 'ⱅ',\n  'Ⱆ' => 'ⱆ',\n  'Ⱇ' => 'ⱇ',\n  'Ⱈ' => 'ⱈ',\n  'Ⱉ' => 'ⱉ',\n  'Ⱊ' => 'ⱊ',\n  'Ⱋ' => 'ⱋ',\n  'Ⱌ' => 'ⱌ',\n  'Ⱍ' => 'ⱍ',\n  'Ⱎ' => 'ⱎ',\n  'Ⱏ' => 'ⱏ',\n  'Ⱐ' => 'ⱐ',\n  'Ⱑ' => 'ⱑ',\n  'Ⱒ' => 'ⱒ',\n  'Ⱓ' => 'ⱓ',\n  'Ⱔ' => 'ⱔ',\n  'Ⱕ' => 'ⱕ',\n  'Ⱖ' => 'ⱖ',\n  'Ⱗ' => 'ⱗ',\n  'Ⱘ' => 'ⱘ',\n  'Ⱙ' => 'ⱙ',\n  'Ⱚ' => 'ⱚ',\n  'Ⱛ' => 'ⱛ',\n  'Ⱜ' => 'ⱜ',\n  'Ⱝ' => 'ⱝ',\n  'Ⱞ' => 'ⱞ',\n  'Ⱡ' => 'ⱡ',\n  'Ɫ' => 'ɫ',\n  'Ᵽ' => 'ᵽ',\n  'Ɽ' => 'ɽ',\n  'Ⱨ' => 'ⱨ',\n  'Ⱪ' => 'ⱪ',\n  'Ⱬ' => 'ⱬ',\n  'Ɑ' => 'ɑ',\n  'Ɱ' => 'ɱ',\n  'Ɐ' => 'ɐ',\n  'Ɒ' => 'ɒ',\n  'Ⱳ' => 'ⱳ',\n  'Ⱶ' => 'ⱶ',\n  'Ȿ' => 'ȿ',\n  'Ɀ' => 'ɀ',\n  'Ⲁ' => 'ⲁ',\n  'Ⲃ' => 'ⲃ',\n  'Ⲅ' => 'ⲅ',\n  'Ⲇ' => 'ⲇ',\n  'Ⲉ' => 'ⲉ',\n  'Ⲋ' => 'ⲋ',\n  'Ⲍ' => 'ⲍ',\n  'Ⲏ' => 'ⲏ',\n  'Ⲑ' => 'ⲑ',\n  'Ⲓ' => 'ⲓ',\n  'Ⲕ' => 'ⲕ',\n  'Ⲗ' => 'ⲗ',\n  'Ⲙ' => 'ⲙ',\n  'Ⲛ' => 'ⲛ',\n  'Ⲝ' => 'ⲝ',\n  'Ⲟ' => 'ⲟ',\n  'Ⲡ' => 'ⲡ',\n  'Ⲣ' => 'ⲣ',\n  'Ⲥ' => 'ⲥ',\n  'Ⲧ' => 'ⲧ',\n  'Ⲩ' => 'ⲩ',\n  'Ⲫ' => 'ⲫ',\n  'Ⲭ' => 'ⲭ',\n  'Ⲯ' => 'ⲯ',\n  'Ⲱ' => 'ⲱ',\n  'Ⲳ' => 'ⲳ',\n  'Ⲵ' => 'ⲵ',\n  'Ⲷ' => 'ⲷ',\n  'Ⲹ' => 'ⲹ',\n  'Ⲻ' => 'ⲻ',\n  'Ⲽ' => 'ⲽ',\n  'Ⲿ' => 'ⲿ',\n  'Ⳁ' => 'ⳁ',\n  'Ⳃ' => 'ⳃ',\n  'Ⳅ' => 'ⳅ',\n  'Ⳇ' => 'ⳇ',\n  'Ⳉ' => 'ⳉ',\n  'Ⳋ' => 'ⳋ',\n  'Ⳍ' => 'ⳍ',\n  'Ⳏ' => 'ⳏ',\n  'Ⳑ' => 'ⳑ',\n  'Ⳓ' => 'ⳓ',\n  'Ⳕ' => 'ⳕ',\n  'Ⳗ' => 'ⳗ',\n  'Ⳙ' => 'ⳙ',\n  'Ⳛ' => 'ⳛ',\n  'Ⳝ' => 'ⳝ',\n  'Ⳟ' => 'ⳟ',\n  'Ⳡ' => 'ⳡ',\n  'Ⳣ' => 'ⳣ',\n  'Ⳬ' => 'ⳬ',\n  'Ⳮ' => 'ⳮ',\n  'Ⳳ' => 'ⳳ',\n  'Ꙁ' => 'ꙁ',\n  'Ꙃ' => 'ꙃ',\n  'Ꙅ' => 'ꙅ',\n  'Ꙇ' => 'ꙇ',\n  'Ꙉ' => 'ꙉ',\n  'Ꙋ' => 'ꙋ',\n  'Ꙍ' => 'ꙍ',\n  'Ꙏ' => 'ꙏ',\n  'Ꙑ' => 'ꙑ',\n  'Ꙓ' => 'ꙓ',\n  'Ꙕ' => 'ꙕ',\n  'Ꙗ' => 'ꙗ',\n  'Ꙙ' => 'ꙙ',\n  'Ꙛ' => 'ꙛ',\n  'Ꙝ' => 'ꙝ',\n  'Ꙟ' => 'ꙟ',\n  'Ꙡ' => 'ꙡ',\n  'Ꙣ' => 'ꙣ',\n  'Ꙥ' => 'ꙥ',\n  'Ꙧ' => 'ꙧ',\n  'Ꙩ' => 'ꙩ',\n  'Ꙫ' => 'ꙫ',\n  'Ꙭ' => 'ꙭ',\n  'Ꚁ' => 'ꚁ',\n  'Ꚃ' => 'ꚃ',\n  'Ꚅ' => 'ꚅ',\n  'Ꚇ' => 'ꚇ',\n  'Ꚉ' => 'ꚉ',\n  'Ꚋ' => 'ꚋ',\n  'Ꚍ' => 'ꚍ',\n  'Ꚏ' => 'ꚏ',\n  'Ꚑ' => 'ꚑ',\n  'Ꚓ' => 'ꚓ',\n  'Ꚕ' => 'ꚕ',\n  'Ꚗ' => 'ꚗ',\n  'Ꚙ' => 'ꚙ',\n  'Ꚛ' => 'ꚛ',\n  'Ꜣ' => 'ꜣ',\n  'Ꜥ' => 'ꜥ',\n  'Ꜧ' => 'ꜧ',\n  'Ꜩ' => 'ꜩ',\n  'Ꜫ' => 'ꜫ',\n  'Ꜭ' => 'ꜭ',\n  'Ꜯ' => 'ꜯ',\n  'Ꜳ' => 'ꜳ',\n  'Ꜵ' => 'ꜵ',\n  'Ꜷ' => 'ꜷ',\n  'Ꜹ' => 'ꜹ',\n  'Ꜻ' => 'ꜻ',\n  'Ꜽ' => 'ꜽ',\n  'Ꜿ' => 'ꜿ',\n  'Ꝁ' => 'ꝁ',\n  'Ꝃ' => 'ꝃ',\n  'Ꝅ' => 'ꝅ',\n  'Ꝇ' => 'ꝇ',\n  'Ꝉ' => 'ꝉ',\n  'Ꝋ' => 'ꝋ',\n  'Ꝍ' => 'ꝍ',\n  'Ꝏ' => 'ꝏ',\n  'Ꝑ' => 'ꝑ',\n  'Ꝓ' => 'ꝓ',\n  'Ꝕ' => 'ꝕ',\n  'Ꝗ' => 'ꝗ',\n  'Ꝙ' => 'ꝙ',\n  'Ꝛ' => 'ꝛ',\n  'Ꝝ' => 'ꝝ',\n  'Ꝟ' => 'ꝟ',\n  'Ꝡ' => 'ꝡ',\n  'Ꝣ' => 'ꝣ',\n  'Ꝥ' => 'ꝥ',\n  'Ꝧ' => 'ꝧ',\n  'Ꝩ' => 'ꝩ',\n  'Ꝫ' => 'ꝫ',\n  'Ꝭ' => 'ꝭ',\n  'Ꝯ' => 'ꝯ',\n  'Ꝺ' => 'ꝺ',\n  'Ꝼ' => 'ꝼ',\n  'Ᵹ' => 'ᵹ',\n  'Ꝿ' => 'ꝿ',\n  'Ꞁ' => 'ꞁ',\n  'Ꞃ' => 'ꞃ',\n  'Ꞅ' => 'ꞅ',\n  'Ꞇ' => 'ꞇ',\n  'Ꞌ' => 'ꞌ',\n  'Ɥ' => 'ɥ',\n  'Ꞑ' => 'ꞑ',\n  'Ꞓ' => 'ꞓ',\n  'Ꞗ' => 'ꞗ',\n  'Ꞙ' => 'ꞙ',\n  'Ꞛ' => 'ꞛ',\n  'Ꞝ' => 'ꞝ',\n  'Ꞟ' => 'ꞟ',\n  'Ꞡ' => 'ꞡ',\n  'Ꞣ' => 'ꞣ',\n  'Ꞥ' => 'ꞥ',\n  'Ꞧ' => 'ꞧ',\n  'Ꞩ' => 'ꞩ',\n  'Ɦ' => 'ɦ',\n  'Ɜ' => 'ɜ',\n  'Ɡ' => 'ɡ',\n  'Ɬ' => 'ɬ',\n  'Ɪ' => 'ɪ',\n  'Ʞ' => 'ʞ',\n  'Ʇ' => 'ʇ',\n  'Ʝ' => 'ʝ',\n  'Ꭓ' => 'ꭓ',\n  'Ꞵ' => 'ꞵ',\n  'Ꞷ' => 'ꞷ',\n  'Ꞹ' => 'ꞹ',\n  'Ꞻ' => 'ꞻ',\n  'Ꞽ' => 'ꞽ',\n  'Ꞿ' => 'ꞿ',\n  'Ꟃ' => 'ꟃ',\n  'Ꞔ' => 'ꞔ',\n  'Ʂ' => 'ʂ',\n  'Ᶎ' => 'ᶎ',\n  'Ꟈ' => 'ꟈ',\n  'Ꟊ' => 'ꟊ',\n  'Ꟶ' => 'ꟶ',\n  'Ａ' => 'ａ',\n  'Ｂ' => 'ｂ',\n  'Ｃ' => 'ｃ',\n  'Ｄ' => 'ｄ',\n  'Ｅ' => 'ｅ',\n  'Ｆ' => 'ｆ',\n  'Ｇ' => 'ｇ',\n  'Ｈ' => 'ｈ',\n  'Ｉ' => 'ｉ',\n  'Ｊ' => 'ｊ',\n  'Ｋ' => 'ｋ',\n  'Ｌ' => 'ｌ',\n  'Ｍ' => 'ｍ',\n  'Ｎ' => 'ｎ',\n  'Ｏ' => 'ｏ',\n  'Ｐ' => 'ｐ',\n  'Ｑ' => 'ｑ',\n  'Ｒ' => 'ｒ',\n  'Ｓ' => 'ｓ',\n  'Ｔ' => 'ｔ',\n  'Ｕ' => 'ｕ',\n  'Ｖ' => 'ｖ',\n  'Ｗ' => 'ｗ',\n  'Ｘ' => 'ｘ',\n  'Ｙ' => 'ｙ',\n  'Ｚ' => 'ｚ',\n  '𐐀' => '𐐨',\n  '𐐁' => '𐐩',\n  '𐐂' => '𐐪',\n  '𐐃' => '𐐫',\n  '𐐄' => '𐐬',\n  '𐐅' => '𐐭',\n  '𐐆' => '𐐮',\n  '𐐇' => '𐐯',\n  '𐐈' => '𐐰',\n  '𐐉' => '𐐱',\n  '𐐊' => '𐐲',\n  '𐐋' => '𐐳',\n  '𐐌' => '𐐴',\n  '𐐍' => '𐐵',\n  '𐐎' => '𐐶',\n  '𐐏' => '𐐷',\n  '𐐐' => '𐐸',\n  '𐐑' => '𐐹',\n  '𐐒' => '𐐺',\n  '𐐓' => '𐐻',\n  '𐐔' => '𐐼',\n  '𐐕' => '𐐽',\n  '𐐖' => '𐐾',\n  '𐐗' => '𐐿',\n  '𐐘' => '𐑀',\n  '𐐙' => '𐑁',\n  '𐐚' => '𐑂',\n  '𐐛' => '𐑃',\n  '𐐜' => '𐑄',\n  '𐐝' => '𐑅',\n  '𐐞' => '𐑆',\n  '𐐟' => '𐑇',\n  '𐐠' => '𐑈',\n  '𐐡' => '𐑉',\n  '𐐢' => '𐑊',\n  '𐐣' => '𐑋',\n  '𐐤' => '𐑌',\n  '𐐥' => '𐑍',\n  '𐐦' => '𐑎',\n  '𐐧' => '𐑏',\n  '𐒰' => '𐓘',\n  '𐒱' => '𐓙',\n  '𐒲' => '𐓚',\n  '𐒳' => '𐓛',\n  '𐒴' => '𐓜',\n  '𐒵' => '𐓝',\n  '𐒶' => '𐓞',\n  '𐒷' => '𐓟',\n  '𐒸' => '𐓠',\n  '𐒹' => '𐓡',\n  '𐒺' => '𐓢',\n  '𐒻' => '𐓣',\n  '𐒼' => '𐓤',\n  '𐒽' => '𐓥',\n  '𐒾' => '𐓦',\n  '𐒿' => '𐓧',\n  '𐓀' => '𐓨',\n  '𐓁' => '𐓩',\n  '𐓂' => '𐓪',\n  '𐓃' => '𐓫',\n  '𐓄' => '𐓬',\n  '𐓅' => '𐓭',\n  '𐓆' => '𐓮',\n  '𐓇' => '𐓯',\n  '𐓈' => '𐓰',\n  '𐓉' => '𐓱',\n  '𐓊' => '𐓲',\n  '𐓋' => '𐓳',\n  '𐓌' => '𐓴',\n  '𐓍' => '𐓵',\n  '𐓎' => '𐓶',\n  '𐓏' => '𐓷',\n  '𐓐' => '𐓸',\n  '𐓑' => '𐓹',\n  '𐓒' => '𐓺',\n  '𐓓' => '𐓻',\n  '𐲀' => '𐳀',\n  '𐲁' => '𐳁',\n  '𐲂' => '𐳂',\n  '𐲃' => '𐳃',\n  '𐲄' => '𐳄',\n  '𐲅' => '𐳅',\n  '𐲆' => '𐳆',\n  '𐲇' => '𐳇',\n  '𐲈' => '𐳈',\n  '𐲉' => '𐳉',\n  '𐲊' => '𐳊',\n  '𐲋' => '𐳋',\n  '𐲌' => '𐳌',\n  '𐲍' => '𐳍',\n  '𐲎' => '𐳎',\n  '𐲏' => '𐳏',\n  '𐲐' => '𐳐',\n  '𐲑' => '𐳑',\n  '𐲒' => '𐳒',\n  '𐲓' => '𐳓',\n  '𐲔' => '𐳔',\n  '𐲕' => '𐳕',\n  '𐲖' => '𐳖',\n  '𐲗' => '𐳗',\n  '𐲘' => '𐳘',\n  '𐲙' => '𐳙',\n  '𐲚' => '𐳚',\n  '𐲛' => '𐳛',\n  '𐲜' => '𐳜',\n  '𐲝' => '𐳝',\n  '𐲞' => '𐳞',\n  '𐲟' => '𐳟',\n  '𐲠' => '𐳠',\n  '𐲡' => '𐳡',\n  '𐲢' => '𐳢',\n  '𐲣' => '𐳣',\n  '𐲤' => '𐳤',\n  '𐲥' => '𐳥',\n  '𐲦' => '𐳦',\n  '𐲧' => '𐳧',\n  '𐲨' => '𐳨',\n  '𐲩' => '𐳩',\n  '𐲪' => '𐳪',\n  '𐲫' => '𐳫',\n  '𐲬' => '𐳬',\n  '𐲭' => '𐳭',\n  '𐲮' => '𐳮',\n  '𐲯' => '𐳯',\n  '𐲰' => '𐳰',\n  '𐲱' => '𐳱',\n  '𐲲' => '𐳲',\n  '𑢠' => '𑣀',\n  '𑢡' => '𑣁',\n  '𑢢' => '𑣂',\n  '𑢣' => '𑣃',\n  '𑢤' => '𑣄',\n  '𑢥' => '𑣅',\n  '𑢦' => '𑣆',\n  '𑢧' => '𑣇',\n  '𑢨' => '𑣈',\n  '𑢩' => '𑣉',\n  '𑢪' => '𑣊',\n  '𑢫' => '𑣋',\n  '𑢬' => '𑣌',\n  '𑢭' => '𑣍',\n  '𑢮' => '𑣎',\n  '𑢯' => '𑣏',\n  '𑢰' => '𑣐',\n  '𑢱' => '𑣑',\n  '𑢲' => '𑣒',\n  '𑢳' => '𑣓',\n  '𑢴' => '𑣔',\n  '𑢵' => '𑣕',\n  '𑢶' => '𑣖',\n  '𑢷' => '𑣗',\n  '𑢸' => '𑣘',\n  '𑢹' => '𑣙',\n  '𑢺' => '𑣚',\n  '𑢻' => '𑣛',\n  '𑢼' => '𑣜',\n  '𑢽' => '𑣝',\n  '𑢾' => '𑣞',\n  '𑢿' => '𑣟',\n  '𖹀' => '𖹠',\n  '𖹁' => '𖹡',\n  '𖹂' => '𖹢',\n  '𖹃' => '𖹣',\n  '𖹄' => '𖹤',\n  '𖹅' => '𖹥',\n  '𖹆' => '𖹦',\n  '𖹇' => '𖹧',\n  '𖹈' => '𖹨',\n  '𖹉' => '𖹩',\n  '𖹊' => '𖹪',\n  '𖹋' => '𖹫',\n  '𖹌' => '𖹬',\n  '𖹍' => '𖹭',\n  '𖹎' => '𖹮',\n  '𖹏' => '𖹯',\n  '𖹐' => '𖹰',\n  '𖹑' => '𖹱',\n  '𖹒' => '𖹲',\n  '𖹓' => '𖹳',\n  '𖹔' => '𖹴',\n  '𖹕' => '𖹵',\n  '𖹖' => '𖹶',\n  '𖹗' => '𖹷',\n  '𖹘' => '𖹸',\n  '𖹙' => '𖹹',\n  '𖹚' => '𖹺',\n  '𖹛' => '𖹻',\n  '𖹜' => '𖹼',\n  '𖹝' => '𖹽',\n  '𖹞' => '𖹾',\n  '𖹟' => '𖹿',\n  '𞤀' => '𞤢',\n  '𞤁' => '𞤣',\n  '𞤂' => '𞤤',\n  '𞤃' => '𞤥',\n  '𞤄' => '𞤦',\n  '𞤅' => '𞤧',\n  '𞤆' => '𞤨',\n  '𞤇' => '𞤩',\n  '𞤈' => '𞤪',\n  '𞤉' => '𞤫',\n  '𞤊' => '𞤬',\n  '𞤋' => '𞤭',\n  '𞤌' => '𞤮',\n  '𞤍' => '𞤯',\n  '𞤎' => '𞤰',\n  '𞤏' => '𞤱',\n  '𞤐' => '𞤲',\n  '𞤑' => '𞤳',\n  '𞤒' => '𞤴',\n  '𞤓' => '𞤵',\n  '𞤔' => '𞤶',\n  '𞤕' => '𞤷',\n  '𞤖' => '𞤸',\n  '𞤗' => '𞤹',\n  '𞤘' => '𞤺',\n  '𞤙' => '𞤻',\n  '𞤚' => '𞤼',\n  '𞤛' => '𞤽',\n  '𞤜' => '𞤾',\n  '𞤝' => '𞤿',\n  '𞤞' => '𞥀',\n  '𞤟' => '𞥁',\n  '𞤠' => '𞥂',\n  '𞤡' => '𞥃',\n);\n","vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php":"<?php\n\n// from Case_Ignorable in https://unicode.org/Public/UNIDATA/DerivedCoreProperties.txt\n\nreturn '/(?<![\\x{0027}\\x{002E}\\x{003A}\\x{005E}\\x{0060}\\x{00A8}\\x{00AD}\\x{00AF}\\x{00B4}\\x{00B7}\\x{00B8}\\x{02B0}-\\x{02C1}\\x{02C2}-\\x{02C5}\\x{02C6}-\\x{02D1}\\x{02D2}-\\x{02DF}\\x{02E0}-\\x{02E4}\\x{02E5}-\\x{02EB}\\x{02EC}\\x{02ED}\\x{02EE}\\x{02EF}-\\x{02FF}\\x{0300}-\\x{036F}\\x{0374}\\x{0375}\\x{037A}\\x{0384}-\\x{0385}\\x{0387}\\x{0483}-\\x{0487}\\x{0488}-\\x{0489}\\x{0559}\\x{0591}-\\x{05BD}\\x{05BF}\\x{05C1}-\\x{05C2}\\x{05C4}-\\x{05C5}\\x{05C7}\\x{05F4}\\x{0600}-\\x{0605}\\x{0610}-\\x{061A}\\x{061C}\\x{0640}\\x{064B}-\\x{065F}\\x{0670}\\x{06D6}-\\x{06DC}\\x{06DD}\\x{06DF}-\\x{06E4}\\x{06E5}-\\x{06E6}\\x{06E7}-\\x{06E8}\\x{06EA}-\\x{06ED}\\x{070F}\\x{0711}\\x{0730}-\\x{074A}\\x{07A6}-\\x{07B0}\\x{07EB}-\\x{07F3}\\x{07F4}-\\x{07F5}\\x{07FA}\\x{07FD}\\x{0816}-\\x{0819}\\x{081A}\\x{081B}-\\x{0823}\\x{0824}\\x{0825}-\\x{0827}\\x{0828}\\x{0829}-\\x{082D}\\x{0859}-\\x{085B}\\x{08D3}-\\x{08E1}\\x{08E2}\\x{08E3}-\\x{0902}\\x{093A}\\x{093C}\\x{0941}-\\x{0948}\\x{094D}\\x{0951}-\\x{0957}\\x{0962}-\\x{0963}\\x{0971}\\x{0981}\\x{09BC}\\x{09C1}-\\x{09C4}\\x{09CD}\\x{09E2}-\\x{09E3}\\x{09FE}\\x{0A01}-\\x{0A02}\\x{0A3C}\\x{0A41}-\\x{0A42}\\x{0A47}-\\x{0A48}\\x{0A4B}-\\x{0A4D}\\x{0A51}\\x{0A70}-\\x{0A71}\\x{0A75}\\x{0A81}-\\x{0A82}\\x{0ABC}\\x{0AC1}-\\x{0AC5}\\x{0AC7}-\\x{0AC8}\\x{0ACD}\\x{0AE2}-\\x{0AE3}\\x{0AFA}-\\x{0AFF}\\x{0B01}\\x{0B3C}\\x{0B3F}\\x{0B41}-\\x{0B44}\\x{0B4D}\\x{0B56}\\x{0B62}-\\x{0B63}\\x{0B82}\\x{0BC0}\\x{0BCD}\\x{0C00}\\x{0C04}\\x{0C3E}-\\x{0C40}\\x{0C46}-\\x{0C48}\\x{0C4A}-\\x{0C4D}\\x{0C55}-\\x{0C56}\\x{0C62}-\\x{0C63}\\x{0C81}\\x{0CBC}\\x{0CBF}\\x{0CC6}\\x{0CCC}-\\x{0CCD}\\x{0CE2}-\\x{0CE3}\\x{0D00}-\\x{0D01}\\x{0D3B}-\\x{0D3C}\\x{0D41}-\\x{0D44}\\x{0D4D}\\x{0D62}-\\x{0D63}\\x{0DCA}\\x{0DD2}-\\x{0DD4}\\x{0DD6}\\x{0E31}\\x{0E34}-\\x{0E3A}\\x{0E46}\\x{0E47}-\\x{0E4E}\\x{0EB1}\\x{0EB4}-\\x{0EB9}\\x{0EBB}-\\x{0EBC}\\x{0EC6}\\x{0EC8}-\\x{0ECD}\\x{0F18}-\\x{0F19}\\x{0F35}\\x{0F37}\\x{0F39}\\x{0F71}-\\x{0F7E}\\x{0F80}-\\x{0F84}\\x{0F86}-\\x{0F87}\\x{0F8D}-\\x{0F97}\\x{0F99}-\\x{0FBC}\\x{0FC6}\\x{102D}-\\x{1030}\\x{1032}-\\x{1037}\\x{1039}-\\x{103A}\\x{103D}-\\x{103E}\\x{1058}-\\x{1059}\\x{105E}-\\x{1060}\\x{1071}-\\x{1074}\\x{1082}\\x{1085}-\\x{1086}\\x{108D}\\x{109D}\\x{10FC}\\x{135D}-\\x{135F}\\x{1712}-\\x{1714}\\x{1732}-\\x{1734}\\x{1752}-\\x{1753}\\x{1772}-\\x{1773}\\x{17B4}-\\x{17B5}\\x{17B7}-\\x{17BD}\\x{17C6}\\x{17C9}-\\x{17D3}\\x{17D7}\\x{17DD}\\x{180B}-\\x{180D}\\x{180E}\\x{1843}\\x{1885}-\\x{1886}\\x{18A9}\\x{1920}-\\x{1922}\\x{1927}-\\x{1928}\\x{1932}\\x{1939}-\\x{193B}\\x{1A17}-\\x{1A18}\\x{1A1B}\\x{1A56}\\x{1A58}-\\x{1A5E}\\x{1A60}\\x{1A62}\\x{1A65}-\\x{1A6C}\\x{1A73}-\\x{1A7C}\\x{1A7F}\\x{1AA7}\\x{1AB0}-\\x{1ABD}\\x{1ABE}\\x{1B00}-\\x{1B03}\\x{1B34}\\x{1B36}-\\x{1B3A}\\x{1B3C}\\x{1B42}\\x{1B6B}-\\x{1B73}\\x{1B80}-\\x{1B81}\\x{1BA2}-\\x{1BA5}\\x{1BA8}-\\x{1BA9}\\x{1BAB}-\\x{1BAD}\\x{1BE6}\\x{1BE8}-\\x{1BE9}\\x{1BED}\\x{1BEF}-\\x{1BF1}\\x{1C2C}-\\x{1C33}\\x{1C36}-\\x{1C37}\\x{1C78}-\\x{1C7D}\\x{1CD0}-\\x{1CD2}\\x{1CD4}-\\x{1CE0}\\x{1CE2}-\\x{1CE8}\\x{1CED}\\x{1CF4}\\x{1CF8}-\\x{1CF9}\\x{1D2C}-\\x{1D6A}\\x{1D78}\\x{1D9B}-\\x{1DBF}\\x{1DC0}-\\x{1DF9}\\x{1DFB}-\\x{1DFF}\\x{1FBD}\\x{1FBF}-\\x{1FC1}\\x{1FCD}-\\x{1FCF}\\x{1FDD}-\\x{1FDF}\\x{1FED}-\\x{1FEF}\\x{1FFD}-\\x{1FFE}\\x{200B}-\\x{200F}\\x{2018}\\x{2019}\\x{2024}\\x{2027}\\x{202A}-\\x{202E}\\x{2060}-\\x{2064}\\x{2066}-\\x{206F}\\x{2071}\\x{207F}\\x{2090}-\\x{209C}\\x{20D0}-\\x{20DC}\\x{20DD}-\\x{20E0}\\x{20E1}\\x{20E2}-\\x{20E4}\\x{20E5}-\\x{20F0}\\x{2C7C}-\\x{2C7D}\\x{2CEF}-\\x{2CF1}\\x{2D6F}\\x{2D7F}\\x{2DE0}-\\x{2DFF}\\x{2E2F}\\x{3005}\\x{302A}-\\x{302D}\\x{3031}-\\x{3035}\\x{303B}\\x{3099}-\\x{309A}\\x{309B}-\\x{309C}\\x{309D}-\\x{309E}\\x{30FC}-\\x{30FE}\\x{A015}\\x{A4F8}-\\x{A4FD}\\x{A60C}\\x{A66F}\\x{A670}-\\x{A672}\\x{A674}-\\x{A67D}\\x{A67F}\\x{A69C}-\\x{A69D}\\x{A69E}-\\x{A69F}\\x{A6F0}-\\x{A6F1}\\x{A700}-\\x{A716}\\x{A717}-\\x{A71F}\\x{A720}-\\x{A721}\\x{A770}\\x{A788}\\x{A789}-\\x{A78A}\\x{A7F8}-\\x{A7F9}\\x{A802}\\x{A806}\\x{A80B}\\x{A825}-\\x{A826}\\x{A8C4}-\\x{A8C5}\\x{A8E0}-\\x{A8F1}\\x{A8FF}\\x{A926}-\\x{A92D}\\x{A947}-\\x{A951}\\x{A980}-\\x{A982}\\x{A9B3}\\x{A9B6}-\\x{A9B9}\\x{A9BC}\\x{A9CF}\\x{A9E5}\\x{A9E6}\\x{AA29}-\\x{AA2E}\\x{AA31}-\\x{AA32}\\x{AA35}-\\x{AA36}\\x{AA43}\\x{AA4C}\\x{AA70}\\x{AA7C}\\x{AAB0}\\x{AAB2}-\\x{AAB4}\\x{AAB7}-\\x{AAB8}\\x{AABE}-\\x{AABF}\\x{AAC1}\\x{AADD}\\x{AAEC}-\\x{AAED}\\x{AAF3}-\\x{AAF4}\\x{AAF6}\\x{AB5B}\\x{AB5C}-\\x{AB5F}\\x{ABE5}\\x{ABE8}\\x{ABED}\\x{FB1E}\\x{FBB2}-\\x{FBC1}\\x{FE00}-\\x{FE0F}\\x{FE13}\\x{FE20}-\\x{FE2F}\\x{FE52}\\x{FE55}\\x{FEFF}\\x{FF07}\\x{FF0E}\\x{FF1A}\\x{FF3E}\\x{FF40}\\x{FF70}\\x{FF9E}-\\x{FF9F}\\x{FFE3}\\x{FFF9}-\\x{FFFB}\\x{101FD}\\x{102E0}\\x{10376}-\\x{1037A}\\x{10A01}-\\x{10A03}\\x{10A05}-\\x{10A06}\\x{10A0C}-\\x{10A0F}\\x{10A38}-\\x{10A3A}\\x{10A3F}\\x{10AE5}-\\x{10AE6}\\x{10D24}-\\x{10D27}\\x{10F46}-\\x{10F50}\\x{11001}\\x{11038}-\\x{11046}\\x{1107F}-\\x{11081}\\x{110B3}-\\x{110B6}\\x{110B9}-\\x{110BA}\\x{110BD}\\x{110CD}\\x{11100}-\\x{11102}\\x{11127}-\\x{1112B}\\x{1112D}-\\x{11134}\\x{11173}\\x{11180}-\\x{11181}\\x{111B6}-\\x{111BE}\\x{111C9}-\\x{111CC}\\x{1122F}-\\x{11231}\\x{11234}\\x{11236}-\\x{11237}\\x{1123E}\\x{112DF}\\x{112E3}-\\x{112EA}\\x{11300}-\\x{11301}\\x{1133B}-\\x{1133C}\\x{11340}\\x{11366}-\\x{1136C}\\x{11370}-\\x{11374}\\x{11438}-\\x{1143F}\\x{11442}-\\x{11444}\\x{11446}\\x{1145E}\\x{114B3}-\\x{114B8}\\x{114BA}\\x{114BF}-\\x{114C0}\\x{114C2}-\\x{114C3}\\x{115B2}-\\x{115B5}\\x{115BC}-\\x{115BD}\\x{115BF}-\\x{115C0}\\x{115DC}-\\x{115DD}\\x{11633}-\\x{1163A}\\x{1163D}\\x{1163F}-\\x{11640}\\x{116AB}\\x{116AD}\\x{116B0}-\\x{116B5}\\x{116B7}\\x{1171D}-\\x{1171F}\\x{11722}-\\x{11725}\\x{11727}-\\x{1172B}\\x{1182F}-\\x{11837}\\x{11839}-\\x{1183A}\\x{11A01}-\\x{11A0A}\\x{11A33}-\\x{11A38}\\x{11A3B}-\\x{11A3E}\\x{11A47}\\x{11A51}-\\x{11A56}\\x{11A59}-\\x{11A5B}\\x{11A8A}-\\x{11A96}\\x{11A98}-\\x{11A99}\\x{11C30}-\\x{11C36}\\x{11C38}-\\x{11C3D}\\x{11C3F}\\x{11C92}-\\x{11CA7}\\x{11CAA}-\\x{11CB0}\\x{11CB2}-\\x{11CB3}\\x{11CB5}-\\x{11CB6}\\x{11D31}-\\x{11D36}\\x{11D3A}\\x{11D3C}-\\x{11D3D}\\x{11D3F}-\\x{11D45}\\x{11D47}\\x{11D90}-\\x{11D91}\\x{11D95}\\x{11D97}\\x{11EF3}-\\x{11EF4}\\x{16AF0}-\\x{16AF4}\\x{16B30}-\\x{16B36}\\x{16B40}-\\x{16B43}\\x{16F8F}-\\x{16F92}\\x{16F93}-\\x{16F9F}\\x{16FE0}-\\x{16FE1}\\x{1BC9D}-\\x{1BC9E}\\x{1BCA0}-\\x{1BCA3}\\x{1D167}-\\x{1D169}\\x{1D173}-\\x{1D17A}\\x{1D17B}-\\x{1D182}\\x{1D185}-\\x{1D18B}\\x{1D1AA}-\\x{1D1AD}\\x{1D242}-\\x{1D244}\\x{1DA00}-\\x{1DA36}\\x{1DA3B}-\\x{1DA6C}\\x{1DA75}\\x{1DA84}\\x{1DA9B}-\\x{1DA9F}\\x{1DAA1}-\\x{1DAAF}\\x{1E000}-\\x{1E006}\\x{1E008}-\\x{1E018}\\x{1E01B}-\\x{1E021}\\x{1E023}-\\x{1E024}\\x{1E026}-\\x{1E02A}\\x{1E8D0}-\\x{1E8D6}\\x{1E944}-\\x{1E94A}\\x{1F3FB}-\\x{1F3FF}\\x{E0001}\\x{E0020}-\\x{E007F}\\x{E0100}-\\x{E01EF}])(\\pL)(\\pL*+)/u';\n","vendor/symfony/polyfill-mbstring/Resources/unidata/upperCase.php":"<?php\n\nreturn array (\n  'a' => 'A',\n  'b' => 'B',\n  'c' => 'C',\n  'd' => 'D',\n  'e' => 'E',\n  'f' => 'F',\n  'g' => 'G',\n  'h' => 'H',\n  'i' => 'I',\n  'j' => 'J',\n  'k' => 'K',\n  'l' => 'L',\n  'm' => 'M',\n  'n' => 'N',\n  'o' => 'O',\n  'p' => 'P',\n  'q' => 'Q',\n  'r' => 'R',\n  's' => 'S',\n  't' => 'T',\n  'u' => 'U',\n  'v' => 'V',\n  'w' => 'W',\n  'x' => 'X',\n  'y' => 'Y',\n  'z' => 'Z',\n  'µ' => 'Μ',\n  'à' => 'À',\n  'á' => 'Á',\n  'â' => 'Â',\n  'ã' => 'Ã',\n  'ä' => 'Ä',\n  'å' => 'Å',\n  'æ' => 'Æ',\n  'ç' => 'Ç',\n  'è' => 'È',\n  'é' => 'É',\n  'ê' => 'Ê',\n  'ë' => 'Ë',\n  'ì' => 'Ì',\n  'í' => 'Í',\n  'î' => 'Î',\n  'ï' => 'Ï',\n  'ð' => 'Ð',\n  'ñ' => 'Ñ',\n  'ò' => 'Ò',\n  'ó' => 'Ó',\n  'ô' => 'Ô',\n  'õ' => 'Õ',\n  'ö' => 'Ö',\n  'ø' => 'Ø',\n  'ù' => 'Ù',\n  'ú' => 'Ú',\n  'û' => 'Û',\n  'ü' => 'Ü',\n  'ý' => 'Ý',\n  'þ' => 'Þ',\n  'ÿ' => 'Ÿ',\n  'ā' => 'Ā',\n  'ă' => 'Ă',\n  'ą' => 'Ą',\n  'ć' => 'Ć',\n  'ĉ' => 'Ĉ',\n  'ċ' => 'Ċ',\n  'č' => 'Č',\n  'ď' => 'Ď',\n  'đ' => 'Đ',\n  'ē' => 'Ē',\n  'ĕ' => 'Ĕ',\n  'ė' => 'Ė',\n  'ę' => 'Ę',\n  'ě' => 'Ě',\n  'ĝ' => 'Ĝ',\n  'ğ' => 'Ğ',\n  'ġ' => 'Ġ',\n  'ģ' => 'Ģ',\n  'ĥ' => 'Ĥ',\n  'ħ' => 'Ħ',\n  'ĩ' => 'Ĩ',\n  'ī' => 'Ī',\n  'ĭ' => 'Ĭ',\n  'į' => 'Į',\n  'ı' => 'I',\n  'ĳ' => 'Ĳ',\n  'ĵ' => 'Ĵ',\n  'ķ' => 'Ķ',\n  'ĺ' => 'Ĺ',\n  'ļ' => 'Ļ',\n  'ľ' => 'Ľ',\n  'ŀ' => 'Ŀ',\n  'ł' => 'Ł',\n  'ń' => 'Ń',\n  'ņ' => 'Ņ',\n  'ň' => 'Ň',\n  'ŋ' => 'Ŋ',\n  'ō' => 'Ō',\n  'ŏ' => 'Ŏ',\n  'ő' => 'Ő',\n  'œ' => 'Œ',\n  'ŕ' => 'Ŕ',\n  'ŗ' => 'Ŗ',\n  'ř' => 'Ř',\n  'ś' => 'Ś',\n  'ŝ' => 'Ŝ',\n  'ş' => 'Ş',\n  'š' => 'Š',\n  'ţ' => 'Ţ',\n  'ť' => 'Ť',\n  'ŧ' => 'Ŧ',\n  'ũ' => 'Ũ',\n  'ū' => 'Ū',\n  'ŭ' => 'Ŭ',\n  'ů' => 'Ů',\n  'ű' => 'Ű',\n  'ų' => 'Ų',\n  'ŵ' => 'Ŵ',\n  'ŷ' => 'Ŷ',\n  'ź' => 'Ź',\n  'ż' => 'Ż',\n  'ž' => 'Ž',\n  'ſ' => 'S',\n  'ƀ' => 'Ƀ',\n  'ƃ' => 'Ƃ',\n  'ƅ' => 'Ƅ',\n  'ƈ' => 'Ƈ',\n  'ƌ' => 'Ƌ',\n  'ƒ' => 'Ƒ',\n  'ƕ' => 'Ƕ',\n  'ƙ' => 'Ƙ',\n  'ƚ' => 'Ƚ',\n  'ƞ' => 'Ƞ',\n  'ơ' => 'Ơ',\n  'ƣ' => 'Ƣ',\n  'ƥ' => 'Ƥ',\n  'ƨ' => 'Ƨ',\n  'ƭ' => 'Ƭ',\n  'ư' => 'Ư',\n  'ƴ' => 'Ƴ',\n  'ƶ' => 'Ƶ',\n  'ƹ' => 'Ƹ',\n  'ƽ' => 'Ƽ',\n  'ƿ' => 'Ƿ',\n  'ǅ' => 'Ǆ',\n  'ǆ' => 'Ǆ',\n  'ǈ' => 'Ǉ',\n  'ǉ' => 'Ǉ',\n  'ǋ' => 'Ǌ',\n  'ǌ' => 'Ǌ',\n  'ǎ' => 'Ǎ',\n  'ǐ' => 'Ǐ',\n  'ǒ' => 'Ǒ',\n  'ǔ' => 'Ǔ',\n  'ǖ' => 'Ǖ',\n  'ǘ' => 'Ǘ',\n  'ǚ' => 'Ǚ',\n  'ǜ' => 'Ǜ',\n  'ǝ' => 'Ǝ',\n  'ǟ' => 'Ǟ',\n  'ǡ' => 'Ǡ',\n  'ǣ' => 'Ǣ',\n  'ǥ' => 'Ǥ',\n  'ǧ' => 'Ǧ',\n  'ǩ' => 'Ǩ',\n  'ǫ' => 'Ǫ',\n  'ǭ' => 'Ǭ',\n  'ǯ' => 'Ǯ',\n  'ǲ' => 'Ǳ',\n  'ǳ' => 'Ǳ',\n  'ǵ' => 'Ǵ',\n  'ǹ' => 'Ǹ',\n  'ǻ' => 'Ǻ',\n  'ǽ' => 'Ǽ',\n  'ǿ' => 'Ǿ',\n  'ȁ' => 'Ȁ',\n  'ȃ' => 'Ȃ',\n  'ȅ' => 'Ȅ',\n  'ȇ' => 'Ȇ',\n  'ȉ' => 'Ȉ',\n  'ȋ' => 'Ȋ',\n  'ȍ' => 'Ȍ',\n  'ȏ' => 'Ȏ',\n  'ȑ' => 'Ȑ',\n  'ȓ' => 'Ȓ',\n  'ȕ' => 'Ȕ',\n  'ȗ' => 'Ȗ',\n  'ș' => 'Ș',\n  'ț' => 'Ț',\n  'ȝ' => 'Ȝ',\n  'ȟ' => 'Ȟ',\n  'ȣ' => 'Ȣ',\n  'ȥ' => 'Ȥ',\n  'ȧ' => 'Ȧ',\n  'ȩ' => 'Ȩ',\n  'ȫ' => 'Ȫ',\n  'ȭ' => 'Ȭ',\n  'ȯ' => 'Ȯ',\n  'ȱ' => 'Ȱ',\n  'ȳ' => 'Ȳ',\n  'ȼ' => 'Ȼ',\n  'ȿ' => 'Ȿ',\n  'ɀ' => 'Ɀ',\n  'ɂ' => 'Ɂ',\n  'ɇ' => 'Ɇ',\n  'ɉ' => 'Ɉ',\n  'ɋ' => 'Ɋ',\n  'ɍ' => 'Ɍ',\n  'ɏ' => 'Ɏ',\n  'ɐ' => 'Ɐ',\n  'ɑ' => 'Ɑ',\n  'ɒ' => 'Ɒ',\n  'ɓ' => 'Ɓ',\n  'ɔ' => 'Ɔ',\n  'ɖ' => 'Ɖ',\n  'ɗ' => 'Ɗ',\n  'ə' => 'Ə',\n  'ɛ' => 'Ɛ',\n  'ɜ' => 'Ɜ',\n  'ɠ' => 'Ɠ',\n  'ɡ' => 'Ɡ',\n  'ɣ' => 'Ɣ',\n  'ɥ' => 'Ɥ',\n  'ɦ' => 'Ɦ',\n  'ɨ' => 'Ɨ',\n  'ɩ' => 'Ɩ',\n  'ɪ' => 'Ɪ',\n  'ɫ' => 'Ɫ',\n  'ɬ' => 'Ɬ',\n  'ɯ' => 'Ɯ',\n  'ɱ' => 'Ɱ',\n  'ɲ' => 'Ɲ',\n  'ɵ' => 'Ɵ',\n  'ɽ' => 'Ɽ',\n  'ʀ' => 'Ʀ',\n  'ʂ' => 'Ʂ',\n  'ʃ' => 'Ʃ',\n  'ʇ' => 'Ʇ',\n  'ʈ' => 'Ʈ',\n  'ʉ' => 'Ʉ',\n  'ʊ' => 'Ʊ',\n  'ʋ' => 'Ʋ',\n  'ʌ' => 'Ʌ',\n  'ʒ' => 'Ʒ',\n  'ʝ' => 'Ʝ',\n  'ʞ' => 'Ʞ',\n  'ͅ' => 'Ι',\n  'ͱ' => 'Ͱ',\n  'ͳ' => 'Ͳ',\n  'ͷ' => 'Ͷ',\n  'ͻ' => 'Ͻ',\n  'ͼ' => 'Ͼ',\n  'ͽ' => 'Ͽ',\n  'ά' => 'Ά',\n  'έ' => 'Έ',\n  'ή' => 'Ή',\n  'ί' => 'Ί',\n  'α' => 'Α',\n  'β' => 'Β',\n  'γ' => 'Γ',\n  'δ' => 'Δ',\n  'ε' => 'Ε',\n  'ζ' => 'Ζ',\n  'η' => 'Η',\n  'θ' => 'Θ',\n  'ι' => 'Ι',\n  'κ' => 'Κ',\n  'λ' => 'Λ',\n  'μ' => 'Μ',\n  'ν' => 'Ν',\n  'ξ' => 'Ξ',\n  'ο' => 'Ο',\n  'π' => 'Π',\n  'ρ' => 'Ρ',\n  'ς' => 'Σ',\n  'σ' => 'Σ',\n  'τ' => 'Τ',\n  'υ' => 'Υ',\n  'φ' => 'Φ',\n  'χ' => 'Χ',\n  'ψ' => 'Ψ',\n  'ω' => 'Ω',\n  'ϊ' => 'Ϊ',\n  'ϋ' => 'Ϋ',\n  'ό' => 'Ό',\n  'ύ' => 'Ύ',\n  'ώ' => 'Ώ',\n  'ϐ' => 'Β',\n  'ϑ' => 'Θ',\n  'ϕ' => 'Φ',\n  'ϖ' => 'Π',\n  'ϗ' => 'Ϗ',\n  'ϙ' => 'Ϙ',\n  'ϛ' => 'Ϛ',\n  'ϝ' => 'Ϝ',\n  'ϟ' => 'Ϟ',\n  'ϡ' => 'Ϡ',\n  'ϣ' => 'Ϣ',\n  'ϥ' => 'Ϥ',\n  'ϧ' => 'Ϧ',\n  'ϩ' => 'Ϩ',\n  'ϫ' => 'Ϫ',\n  'ϭ' => 'Ϭ',\n  'ϯ' => 'Ϯ',\n  'ϰ' => 'Κ',\n  'ϱ' => 'Ρ',\n  'ϲ' => 'Ϲ',\n  'ϳ' => 'Ϳ',\n  'ϵ' => 'Ε',\n  'ϸ' => 'Ϸ',\n  'ϻ' => 'Ϻ',\n  'а' => 'А',\n  'б' => 'Б',\n  'в' => 'В',\n  'г' => 'Г',\n  'д' => 'Д',\n  'е' => 'Е',\n  'ж' => 'Ж',\n  'з' => 'З',\n  'и' => 'И',\n  'й' => 'Й',\n  'к' => 'К',\n  'л' => 'Л',\n  'м' => 'М',\n  'н' => 'Н',\n  'о' => 'О',\n  'п' => 'П',\n  'р' => 'Р',\n  'с' => 'С',\n  'т' => 'Т',\n  'у' => 'У',\n  'ф' => 'Ф',\n  'х' => 'Х',\n  'ц' => 'Ц',\n  'ч' => 'Ч',\n  'ш' => 'Ш',\n  'щ' => 'Щ',\n  'ъ' => 'Ъ',\n  'ы' => 'Ы',\n  'ь' => 'Ь',\n  'э' => 'Э',\n  'ю' => 'Ю',\n  'я' => 'Я',\n  'ѐ' => 'Ѐ',\n  'ё' => 'Ё',\n  'ђ' => 'Ђ',\n  'ѓ' => 'Ѓ',\n  'є' => 'Є',\n  'ѕ' => 'Ѕ',\n  'і' => 'І',\n  'ї' => 'Ї',\n  'ј' => 'Ј',\n  'љ' => 'Љ',\n  'њ' => 'Њ',\n  'ћ' => 'Ћ',\n  'ќ' => 'Ќ',\n  'ѝ' => 'Ѝ',\n  'ў' => 'Ў',\n  'џ' => 'Џ',\n  'ѡ' => 'Ѡ',\n  'ѣ' => 'Ѣ',\n  'ѥ' => 'Ѥ',\n  'ѧ' => 'Ѧ',\n  'ѩ' => 'Ѩ',\n  'ѫ' => 'Ѫ',\n  'ѭ' => 'Ѭ',\n  'ѯ' => 'Ѯ',\n  'ѱ' => 'Ѱ',\n  'ѳ' => 'Ѳ',\n  'ѵ' => 'Ѵ',\n  'ѷ' => 'Ѷ',\n  'ѹ' => 'Ѹ',\n  'ѻ' => 'Ѻ',\n  'ѽ' => 'Ѽ',\n  'ѿ' => 'Ѿ',\n  'ҁ' => 'Ҁ',\n  'ҋ' => 'Ҋ',\n  'ҍ' => 'Ҍ',\n  'ҏ' => 'Ҏ',\n  'ґ' => 'Ґ',\n  'ғ' => 'Ғ',\n  'ҕ' => 'Ҕ',\n  'җ' => 'Җ',\n  'ҙ' => 'Ҙ',\n  'қ' => 'Қ',\n  'ҝ' => 'Ҝ',\n  'ҟ' => 'Ҟ',\n  'ҡ' => 'Ҡ',\n  'ң' => 'Ң',\n  'ҥ' => 'Ҥ',\n  'ҧ' => 'Ҧ',\n  'ҩ' => 'Ҩ',\n  'ҫ' => 'Ҫ',\n  'ҭ' => 'Ҭ',\n  'ү' => 'Ү',\n  'ұ' => 'Ұ',\n  'ҳ' => 'Ҳ',\n  'ҵ' => 'Ҵ',\n  'ҷ' => 'Ҷ',\n  'ҹ' => 'Ҹ',\n  'һ' => 'Һ',\n  'ҽ' => 'Ҽ',\n  'ҿ' => 'Ҿ',\n  'ӂ' => 'Ӂ',\n  'ӄ' => 'Ӄ',\n  'ӆ' => 'Ӆ',\n  'ӈ' => 'Ӈ',\n  'ӊ' => 'Ӊ',\n  'ӌ' => 'Ӌ',\n  'ӎ' => 'Ӎ',\n  'ӏ' => 'Ӏ',\n  'ӑ' => 'Ӑ',\n  'ӓ' => 'Ӓ',\n  'ӕ' => 'Ӕ',\n  'ӗ' => 'Ӗ',\n  'ә' => 'Ә',\n  'ӛ' => 'Ӛ',\n  'ӝ' => 'Ӝ',\n  'ӟ' => 'Ӟ',\n  'ӡ' => 'Ӡ',\n  'ӣ' => 'Ӣ',\n  'ӥ' => 'Ӥ',\n  'ӧ' => 'Ӧ',\n  'ө' => 'Ө',\n  'ӫ' => 'Ӫ',\n  'ӭ' => 'Ӭ',\n  'ӯ' => 'Ӯ',\n  'ӱ' => 'Ӱ',\n  'ӳ' => 'Ӳ',\n  'ӵ' => 'Ӵ',\n  'ӷ' => 'Ӷ',\n  'ӹ' => 'Ӹ',\n  'ӻ' => 'Ӻ',\n  'ӽ' => 'Ӽ',\n  'ӿ' => 'Ӿ',\n  'ԁ' => 'Ԁ',\n  'ԃ' => 'Ԃ',\n  'ԅ' => 'Ԅ',\n  'ԇ' => 'Ԇ',\n  'ԉ' => 'Ԉ',\n  'ԋ' => 'Ԋ',\n  'ԍ' => 'Ԍ',\n  'ԏ' => 'Ԏ',\n  'ԑ' => 'Ԑ',\n  'ԓ' => 'Ԓ',\n  'ԕ' => 'Ԕ',\n  'ԗ' => 'Ԗ',\n  'ԙ' => 'Ԙ',\n  'ԛ' => 'Ԛ',\n  'ԝ' => 'Ԝ',\n  'ԟ' => 'Ԟ',\n  'ԡ' => 'Ԡ',\n  'ԣ' => 'Ԣ',\n  'ԥ' => 'Ԥ',\n  'ԧ' => 'Ԧ',\n  'ԩ' => 'Ԩ',\n  'ԫ' => 'Ԫ',\n  'ԭ' => 'Ԭ',\n  'ԯ' => 'Ԯ',\n  'ա' => 'Ա',\n  'բ' => 'Բ',\n  'գ' => 'Գ',\n  'դ' => 'Դ',\n  'ե' => 'Ե',\n  'զ' => 'Զ',\n  'է' => 'Է',\n  'ը' => 'Ը',\n  'թ' => 'Թ',\n  'ժ' => 'Ժ',\n  'ի' => 'Ի',\n  'լ' => 'Լ',\n  'խ' => 'Խ',\n  'ծ' => 'Ծ',\n  'կ' => 'Կ',\n  'հ' => 'Հ',\n  'ձ' => 'Ձ',\n  'ղ' => 'Ղ',\n  'ճ' => 'Ճ',\n  'մ' => 'Մ',\n  'յ' => 'Յ',\n  'ն' => 'Ն',\n  'շ' => 'Շ',\n  'ո' => 'Ո',\n  'չ' => 'Չ',\n  'պ' => 'Պ',\n  'ջ' => 'Ջ',\n  'ռ' => 'Ռ',\n  'ս' => 'Ս',\n  'վ' => 'Վ',\n  'տ' => 'Տ',\n  'ր' => 'Ր',\n  'ց' => 'Ց',\n  'ւ' => 'Ւ',\n  'փ' => 'Փ',\n  'ք' => 'Ք',\n  'օ' => 'Օ',\n  'ֆ' => 'Ֆ',\n  'ა' => 'Ა',\n  'ბ' => 'Ბ',\n  'გ' => 'Გ',\n  'დ' => 'Დ',\n  'ე' => 'Ე',\n  'ვ' => 'Ვ',\n  'ზ' => 'Ზ',\n  'თ' => 'Თ',\n  'ი' => 'Ი',\n  'კ' => 'Კ',\n  'ლ' => 'Ლ',\n  'მ' => 'Მ',\n  'ნ' => 'Ნ',\n  'ო' => 'Ო',\n  'პ' => 'Პ',\n  'ჟ' => 'Ჟ',\n  'რ' => 'Რ',\n  'ს' => 'Ს',\n  'ტ' => 'Ტ',\n  'უ' => 'Უ',\n  'ფ' => 'Ფ',\n  'ქ' => 'Ქ',\n  'ღ' => 'Ღ',\n  'ყ' => 'Ყ',\n  'შ' => 'Შ',\n  'ჩ' => 'Ჩ',\n  'ც' => 'Ც',\n  'ძ' => 'Ძ',\n  'წ' => 'Წ',\n  'ჭ' => 'Ჭ',\n  'ხ' => 'Ხ',\n  'ჯ' => 'Ჯ',\n  'ჰ' => 'Ჰ',\n  'ჱ' => 'Ჱ',\n  'ჲ' => 'Ჲ',\n  'ჳ' => 'Ჳ',\n  'ჴ' => 'Ჴ',\n  'ჵ' => 'Ჵ',\n  'ჶ' => 'Ჶ',\n  'ჷ' => 'Ჷ',\n  'ჸ' => 'Ჸ',\n  'ჹ' => 'Ჹ',\n  'ჺ' => 'Ჺ',\n  'ჽ' => 'Ჽ',\n  'ჾ' => 'Ჾ',\n  'ჿ' => 'Ჿ',\n  'ᏸ' => 'Ᏸ',\n  'ᏹ' => 'Ᏹ',\n  'ᏺ' => 'Ᏺ',\n  'ᏻ' => 'Ᏻ',\n  'ᏼ' => 'Ᏼ',\n  'ᏽ' => 'Ᏽ',\n  'ᲀ' => 'В',\n  'ᲁ' => 'Д',\n  'ᲂ' => 'О',\n  'ᲃ' => 'С',\n  'ᲄ' => 'Т',\n  'ᲅ' => 'Т',\n  'ᲆ' => 'Ъ',\n  'ᲇ' => 'Ѣ',\n  'ᲈ' => 'Ꙋ',\n  'ᵹ' => 'Ᵹ',\n  'ᵽ' => 'Ᵽ',\n  'ᶎ' => 'Ᶎ',\n  'ḁ' => 'Ḁ',\n  'ḃ' => 'Ḃ',\n  'ḅ' => 'Ḅ',\n  'ḇ' => 'Ḇ',\n  'ḉ' => 'Ḉ',\n  'ḋ' => 'Ḋ',\n  'ḍ' => 'Ḍ',\n  'ḏ' => 'Ḏ',\n  'ḑ' => 'Ḑ',\n  'ḓ' => 'Ḓ',\n  'ḕ' => 'Ḕ',\n  'ḗ' => 'Ḗ',\n  'ḙ' => 'Ḙ',\n  'ḛ' => 'Ḛ',\n  'ḝ' => 'Ḝ',\n  'ḟ' => 'Ḟ',\n  'ḡ' => 'Ḡ',\n  'ḣ' => 'Ḣ',\n  'ḥ' => 'Ḥ',\n  'ḧ' => 'Ḧ',\n  'ḩ' => 'Ḩ',\n  'ḫ' => 'Ḫ',\n  'ḭ' => 'Ḭ',\n  'ḯ' => 'Ḯ',\n  'ḱ' => 'Ḱ',\n  'ḳ' => 'Ḳ',\n  'ḵ' => 'Ḵ',\n  'ḷ' => 'Ḷ',\n  'ḹ' => 'Ḹ',\n  'ḻ' => 'Ḻ',\n  'ḽ' => 'Ḽ',\n  'ḿ' => 'Ḿ',\n  'ṁ' => 'Ṁ',\n  'ṃ' => 'Ṃ',\n  'ṅ' => 'Ṅ',\n  'ṇ' => 'Ṇ',\n  'ṉ' => 'Ṉ',\n  'ṋ' => 'Ṋ',\n  'ṍ' => 'Ṍ',\n  'ṏ' => 'Ṏ',\n  'ṑ' => 'Ṑ',\n  'ṓ' => 'Ṓ',\n  'ṕ' => 'Ṕ',\n  'ṗ' => 'Ṗ',\n  'ṙ' => 'Ṙ',\n  'ṛ' => 'Ṛ',\n  'ṝ' => 'Ṝ',\n  'ṟ' => 'Ṟ',\n  'ṡ' => 'Ṡ',\n  'ṣ' => 'Ṣ',\n  'ṥ' => 'Ṥ',\n  'ṧ' => 'Ṧ',\n  'ṩ' => 'Ṩ',\n  'ṫ' => 'Ṫ',\n  'ṭ' => 'Ṭ',\n  'ṯ' => 'Ṯ',\n  'ṱ' => 'Ṱ',\n  'ṳ' => 'Ṳ',\n  'ṵ' => 'Ṵ',\n  'ṷ' => 'Ṷ',\n  'ṹ' => 'Ṹ',\n  'ṻ' => 'Ṻ',\n  'ṽ' => 'Ṽ',\n  'ṿ' => 'Ṿ',\n  'ẁ' => 'Ẁ',\n  'ẃ' => 'Ẃ',\n  'ẅ' => 'Ẅ',\n  'ẇ' => 'Ẇ',\n  'ẉ' => 'Ẉ',\n  'ẋ' => 'Ẋ',\n  'ẍ' => 'Ẍ',\n  'ẏ' => 'Ẏ',\n  'ẑ' => 'Ẑ',\n  'ẓ' => 'Ẓ',\n  'ẕ' => 'Ẕ',\n  'ẛ' => 'Ṡ',\n  'ạ' => 'Ạ',\n  'ả' => 'Ả',\n  'ấ' => 'Ấ',\n  'ầ' => 'Ầ',\n  'ẩ' => 'Ẩ',\n  'ẫ' => 'Ẫ',\n  'ậ' => 'Ậ',\n  'ắ' => 'Ắ',\n  'ằ' => 'Ằ',\n  'ẳ' => 'Ẳ',\n  'ẵ' => 'Ẵ',\n  'ặ' => 'Ặ',\n  'ẹ' => 'Ẹ',\n  'ẻ' => 'Ẻ',\n  'ẽ' => 'Ẽ',\n  'ế' => 'Ế',\n  'ề' => 'Ề',\n  'ể' => 'Ể',\n  'ễ' => 'Ễ',\n  'ệ' => 'Ệ',\n  'ỉ' => 'Ỉ',\n  'ị' => 'Ị',\n  'ọ' => 'Ọ',\n  'ỏ' => 'Ỏ',\n  'ố' => 'Ố',\n  'ồ' => 'Ồ',\n  'ổ' => 'Ổ',\n  'ỗ' => 'Ỗ',\n  'ộ' => 'Ộ',\n  'ớ' => 'Ớ',\n  'ờ' => 'Ờ',\n  'ở' => 'Ở',\n  'ỡ' => 'Ỡ',\n  'ợ' => 'Ợ',\n  'ụ' => 'Ụ',\n  'ủ' => 'Ủ',\n  'ứ' => 'Ứ',\n  'ừ' => 'Ừ',\n  'ử' => 'Ử',\n  'ữ' => 'Ữ',\n  'ự' => 'Ự',\n  'ỳ' => 'Ỳ',\n  'ỵ' => 'Ỵ',\n  'ỷ' => 'Ỷ',\n  'ỹ' => 'Ỹ',\n  'ỻ' => 'Ỻ',\n  'ỽ' => 'Ỽ',\n  'ỿ' => 'Ỿ',\n  'ἀ' => 'Ἀ',\n  'ἁ' => 'Ἁ',\n  'ἂ' => 'Ἂ',\n  'ἃ' => 'Ἃ',\n  'ἄ' => 'Ἄ',\n  'ἅ' => 'Ἅ',\n  'ἆ' => 'Ἆ',\n  'ἇ' => 'Ἇ',\n  'ἐ' => 'Ἐ',\n  'ἑ' => 'Ἑ',\n  'ἒ' => 'Ἒ',\n  'ἓ' => 'Ἓ',\n  'ἔ' => 'Ἔ',\n  'ἕ' => 'Ἕ',\n  'ἠ' => 'Ἠ',\n  'ἡ' => 'Ἡ',\n  'ἢ' => 'Ἢ',\n  'ἣ' => 'Ἣ',\n  'ἤ' => 'Ἤ',\n  'ἥ' => 'Ἥ',\n  'ἦ' => 'Ἦ',\n  'ἧ' => 'Ἧ',\n  'ἰ' => 'Ἰ',\n  'ἱ' => 'Ἱ',\n  'ἲ' => 'Ἲ',\n  'ἳ' => 'Ἳ',\n  'ἴ' => 'Ἴ',\n  'ἵ' => 'Ἵ',\n  'ἶ' => 'Ἶ',\n  'ἷ' => 'Ἷ',\n  'ὀ' => 'Ὀ',\n  'ὁ' => 'Ὁ',\n  'ὂ' => 'Ὂ',\n  'ὃ' => 'Ὃ',\n  'ὄ' => 'Ὄ',\n  'ὅ' => 'Ὅ',\n  'ὑ' => 'Ὑ',\n  'ὓ' => 'Ὓ',\n  'ὕ' => 'Ὕ',\n  'ὗ' => 'Ὗ',\n  'ὠ' => 'Ὠ',\n  'ὡ' => 'Ὡ',\n  'ὢ' => 'Ὢ',\n  'ὣ' => 'Ὣ',\n  'ὤ' => 'Ὤ',\n  'ὥ' => 'Ὥ',\n  'ὦ' => 'Ὦ',\n  'ὧ' => 'Ὧ',\n  'ὰ' => 'Ὰ',\n  'ά' => 'Ά',\n  'ὲ' => 'Ὲ',\n  'έ' => 'Έ',\n  'ὴ' => 'Ὴ',\n  'ή' => 'Ή',\n  'ὶ' => 'Ὶ',\n  'ί' => 'Ί',\n  'ὸ' => 'Ὸ',\n  'ό' => 'Ό',\n  'ὺ' => 'Ὺ',\n  'ύ' => 'Ύ',\n  'ὼ' => 'Ὼ',\n  'ώ' => 'Ώ',\n  'ᾀ' => 'ἈΙ',\n  'ᾁ' => 'ἉΙ',\n  'ᾂ' => 'ἊΙ',\n  'ᾃ' => 'ἋΙ',\n  'ᾄ' => 'ἌΙ',\n  'ᾅ' => 'ἍΙ',\n  'ᾆ' => 'ἎΙ',\n  'ᾇ' => 'ἏΙ',\n  'ᾐ' => 'ἨΙ',\n  'ᾑ' => 'ἩΙ',\n  'ᾒ' => 'ἪΙ',\n  'ᾓ' => 'ἫΙ',\n  'ᾔ' => 'ἬΙ',\n  'ᾕ' => 'ἭΙ',\n  'ᾖ' => 'ἮΙ',\n  'ᾗ' => 'ἯΙ',\n  'ᾠ' => 'ὨΙ',\n  'ᾡ' => 'ὩΙ',\n  'ᾢ' => 'ὪΙ',\n  'ᾣ' => 'ὫΙ',\n  'ᾤ' => 'ὬΙ',\n  'ᾥ' => 'ὭΙ',\n  'ᾦ' => 'ὮΙ',\n  'ᾧ' => 'ὯΙ',\n  'ᾰ' => 'Ᾰ',\n  'ᾱ' => 'Ᾱ',\n  'ᾳ' => 'ΑΙ',\n  'ι' => 'Ι',\n  'ῃ' => 'ΗΙ',\n  'ῐ' => 'Ῐ',\n  'ῑ' => 'Ῑ',\n  'ῠ' => 'Ῠ',\n  'ῡ' => 'Ῡ',\n  'ῥ' => 'Ῥ',\n  'ῳ' => 'ΩΙ',\n  'ⅎ' => 'Ⅎ',\n  'ⅰ' => 'Ⅰ',\n  'ⅱ' => 'Ⅱ',\n  'ⅲ' => 'Ⅲ',\n  'ⅳ' => 'Ⅳ',\n  'ⅴ' => 'Ⅴ',\n  'ⅵ' => 'Ⅵ',\n  'ⅶ' => 'Ⅶ',\n  'ⅷ' => 'Ⅷ',\n  'ⅸ' => 'Ⅸ',\n  'ⅹ' => 'Ⅹ',\n  'ⅺ' => 'Ⅺ',\n  'ⅻ' => 'Ⅻ',\n  'ⅼ' => 'Ⅼ',\n  'ⅽ' => 'Ⅽ',\n  'ⅾ' => 'Ⅾ',\n  'ⅿ' => 'Ⅿ',\n  'ↄ' => 'Ↄ',\n  'ⓐ' => 'Ⓐ',\n  'ⓑ' => 'Ⓑ',\n  'ⓒ' => 'Ⓒ',\n  'ⓓ' => 'Ⓓ',\n  'ⓔ' => 'Ⓔ',\n  'ⓕ' => 'Ⓕ',\n  'ⓖ' => 'Ⓖ',\n  'ⓗ' => 'Ⓗ',\n  'ⓘ' => 'Ⓘ',\n  'ⓙ' => 'Ⓙ',\n  'ⓚ' => 'Ⓚ',\n  'ⓛ' => 'Ⓛ',\n  'ⓜ' => 'Ⓜ',\n  'ⓝ' => 'Ⓝ',\n  'ⓞ' => 'Ⓞ',\n  'ⓟ' => 'Ⓟ',\n  'ⓠ' => 'Ⓠ',\n  'ⓡ' => 'Ⓡ',\n  'ⓢ' => 'Ⓢ',\n  'ⓣ' => 'Ⓣ',\n  'ⓤ' => 'Ⓤ',\n  'ⓥ' => 'Ⓥ',\n  'ⓦ' => 'Ⓦ',\n  'ⓧ' => 'Ⓧ',\n  'ⓨ' => 'Ⓨ',\n  'ⓩ' => 'Ⓩ',\n  'ⰰ' => 'Ⰰ',\n  'ⰱ' => 'Ⰱ',\n  'ⰲ' => 'Ⰲ',\n  'ⰳ' => 'Ⰳ',\n  'ⰴ' => 'Ⰴ',\n  'ⰵ' => 'Ⰵ',\n  'ⰶ' => 'Ⰶ',\n  'ⰷ' => 'Ⰷ',\n  'ⰸ' => 'Ⰸ',\n  'ⰹ' => 'Ⰹ',\n  'ⰺ' => 'Ⰺ',\n  'ⰻ' => 'Ⰻ',\n  'ⰼ' => 'Ⰼ',\n  'ⰽ' => 'Ⰽ',\n  'ⰾ' => 'Ⰾ',\n  'ⰿ' => 'Ⰿ',\n  'ⱀ' => 'Ⱀ',\n  'ⱁ' => 'Ⱁ',\n  'ⱂ' => 'Ⱂ',\n  'ⱃ' => 'Ⱃ',\n  'ⱄ' => 'Ⱄ',\n  'ⱅ' => 'Ⱅ',\n  'ⱆ' => 'Ⱆ',\n  'ⱇ' => 'Ⱇ',\n  'ⱈ' => 'Ⱈ',\n  'ⱉ' => 'Ⱉ',\n  'ⱊ' => 'Ⱊ',\n  'ⱋ' => 'Ⱋ',\n  'ⱌ' => 'Ⱌ',\n  'ⱍ' => 'Ⱍ',\n  'ⱎ' => 'Ⱎ',\n  'ⱏ' => 'Ⱏ',\n  'ⱐ' => 'Ⱐ',\n  'ⱑ' => 'Ⱑ',\n  'ⱒ' => 'Ⱒ',\n  'ⱓ' => 'Ⱓ',\n  'ⱔ' => 'Ⱔ',\n  'ⱕ' => 'Ⱕ',\n  'ⱖ' => 'Ⱖ',\n  'ⱗ' => 'Ⱗ',\n  'ⱘ' => 'Ⱘ',\n  'ⱙ' => 'Ⱙ',\n  'ⱚ' => 'Ⱚ',\n  'ⱛ' => 'Ⱛ',\n  'ⱜ' => 'Ⱜ',\n  'ⱝ' => 'Ⱝ',\n  'ⱞ' => 'Ⱞ',\n  'ⱡ' => 'Ⱡ',\n  'ⱥ' => 'Ⱥ',\n  'ⱦ' => 'Ⱦ',\n  'ⱨ' => 'Ⱨ',\n  'ⱪ' => 'Ⱪ',\n  'ⱬ' => 'Ⱬ',\n  'ⱳ' => 'Ⱳ',\n  'ⱶ' => 'Ⱶ',\n  'ⲁ' => 'Ⲁ',\n  'ⲃ' => 'Ⲃ',\n  'ⲅ' => 'Ⲅ',\n  'ⲇ' => 'Ⲇ',\n  'ⲉ' => 'Ⲉ',\n  'ⲋ' => 'Ⲋ',\n  'ⲍ' => 'Ⲍ',\n  'ⲏ' => 'Ⲏ',\n  'ⲑ' => 'Ⲑ',\n  'ⲓ' => 'Ⲓ',\n  'ⲕ' => 'Ⲕ',\n  'ⲗ' => 'Ⲗ',\n  'ⲙ' => 'Ⲙ',\n  'ⲛ' => 'Ⲛ',\n  'ⲝ' => 'Ⲝ',\n  'ⲟ' => 'Ⲟ',\n  'ⲡ' => 'Ⲡ',\n  'ⲣ' => 'Ⲣ',\n  'ⲥ' => 'Ⲥ',\n  'ⲧ' => 'Ⲧ',\n  'ⲩ' => 'Ⲩ',\n  'ⲫ' => 'Ⲫ',\n  'ⲭ' => 'Ⲭ',\n  'ⲯ' => 'Ⲯ',\n  'ⲱ' => 'Ⲱ',\n  'ⲳ' => 'Ⲳ',\n  'ⲵ' => 'Ⲵ',\n  'ⲷ' => 'Ⲷ',\n  'ⲹ' => 'Ⲹ',\n  'ⲻ' => 'Ⲻ',\n  'ⲽ' => 'Ⲽ',\n  'ⲿ' => 'Ⲿ',\n  'ⳁ' => 'Ⳁ',\n  'ⳃ' => 'Ⳃ',\n  'ⳅ' => 'Ⳅ',\n  'ⳇ' => 'Ⳇ',\n  'ⳉ' => 'Ⳉ',\n  'ⳋ' => 'Ⳋ',\n  'ⳍ' => 'Ⳍ',\n  'ⳏ' => 'Ⳏ',\n  'ⳑ' => 'Ⳑ',\n  'ⳓ' => 'Ⳓ',\n  'ⳕ' => 'Ⳕ',\n  'ⳗ' => 'Ⳗ',\n  'ⳙ' => 'Ⳙ',\n  'ⳛ' => 'Ⳛ',\n  'ⳝ' => 'Ⳝ',\n  'ⳟ' => 'Ⳟ',\n  'ⳡ' => 'Ⳡ',\n  'ⳣ' => 'Ⳣ',\n  'ⳬ' => 'Ⳬ',\n  'ⳮ' => 'Ⳮ',\n  'ⳳ' => 'Ⳳ',\n  'ⴀ' => 'Ⴀ',\n  'ⴁ' => 'Ⴁ',\n  'ⴂ' => 'Ⴂ',\n  'ⴃ' => 'Ⴃ',\n  'ⴄ' => 'Ⴄ',\n  'ⴅ' => 'Ⴅ',\n  'ⴆ' => 'Ⴆ',\n  'ⴇ' => 'Ⴇ',\n  'ⴈ' => 'Ⴈ',\n  'ⴉ' => 'Ⴉ',\n  'ⴊ' => 'Ⴊ',\n  'ⴋ' => 'Ⴋ',\n  'ⴌ' => 'Ⴌ',\n  'ⴍ' => 'Ⴍ',\n  'ⴎ' => 'Ⴎ',\n  'ⴏ' => 'Ⴏ',\n  'ⴐ' => 'Ⴐ',\n  'ⴑ' => 'Ⴑ',\n  'ⴒ' => 'Ⴒ',\n  'ⴓ' => 'Ⴓ',\n  'ⴔ' => 'Ⴔ',\n  'ⴕ' => 'Ⴕ',\n  'ⴖ' => 'Ⴖ',\n  'ⴗ' => 'Ⴗ',\n  'ⴘ' => 'Ⴘ',\n  'ⴙ' => 'Ⴙ',\n  'ⴚ' => 'Ⴚ',\n  'ⴛ' => 'Ⴛ',\n  'ⴜ' => 'Ⴜ',\n  'ⴝ' => 'Ⴝ',\n  'ⴞ' => 'Ⴞ',\n  'ⴟ' => 'Ⴟ',\n  'ⴠ' => 'Ⴠ',\n  'ⴡ' => 'Ⴡ',\n  'ⴢ' => 'Ⴢ',\n  'ⴣ' => 'Ⴣ',\n  'ⴤ' => 'Ⴤ',\n  'ⴥ' => 'Ⴥ',\n  'ⴧ' => 'Ⴧ',\n  'ⴭ' => 'Ⴭ',\n  'ꙁ' => 'Ꙁ',\n  'ꙃ' => 'Ꙃ',\n  'ꙅ' => 'Ꙅ',\n  'ꙇ' => 'Ꙇ',\n  'ꙉ' => 'Ꙉ',\n  'ꙋ' => 'Ꙋ',\n  'ꙍ' => 'Ꙍ',\n  'ꙏ' => 'Ꙏ',\n  'ꙑ' => 'Ꙑ',\n  'ꙓ' => 'Ꙓ',\n  'ꙕ' => 'Ꙕ',\n  'ꙗ' => 'Ꙗ',\n  'ꙙ' => 'Ꙙ',\n  'ꙛ' => 'Ꙛ',\n  'ꙝ' => 'Ꙝ',\n  'ꙟ' => 'Ꙟ',\n  'ꙡ' => 'Ꙡ',\n  'ꙣ' => 'Ꙣ',\n  'ꙥ' => 'Ꙥ',\n  'ꙧ' => 'Ꙧ',\n  'ꙩ' => 'Ꙩ',\n  'ꙫ' => 'Ꙫ',\n  'ꙭ' => 'Ꙭ',\n  'ꚁ' => 'Ꚁ',\n  'ꚃ' => 'Ꚃ',\n  'ꚅ' => 'Ꚅ',\n  'ꚇ' => 'Ꚇ',\n  'ꚉ' => 'Ꚉ',\n  'ꚋ' => 'Ꚋ',\n  'ꚍ' => 'Ꚍ',\n  'ꚏ' => 'Ꚏ',\n  'ꚑ' => 'Ꚑ',\n  'ꚓ' => 'Ꚓ',\n  'ꚕ' => 'Ꚕ',\n  'ꚗ' => 'Ꚗ',\n  'ꚙ' => 'Ꚙ',\n  'ꚛ' => 'Ꚛ',\n  'ꜣ' => 'Ꜣ',\n  'ꜥ' => 'Ꜥ',\n  'ꜧ' => 'Ꜧ',\n  'ꜩ' => 'Ꜩ',\n  'ꜫ' => 'Ꜫ',\n  'ꜭ' => 'Ꜭ',\n  'ꜯ' => 'Ꜯ',\n  'ꜳ' => 'Ꜳ',\n  'ꜵ' => 'Ꜵ',\n  'ꜷ' => 'Ꜷ',\n  'ꜹ' => 'Ꜹ',\n  'ꜻ' => 'Ꜻ',\n  'ꜽ' => 'Ꜽ',\n  'ꜿ' => 'Ꜿ',\n  'ꝁ' => 'Ꝁ',\n  'ꝃ' => 'Ꝃ',\n  'ꝅ' => 'Ꝅ',\n  'ꝇ' => 'Ꝇ',\n  'ꝉ' => 'Ꝉ',\n  'ꝋ' => 'Ꝋ',\n  'ꝍ' => 'Ꝍ',\n  'ꝏ' => 'Ꝏ',\n  'ꝑ' => 'Ꝑ',\n  'ꝓ' => 'Ꝓ',\n  'ꝕ' => 'Ꝕ',\n  'ꝗ' => 'Ꝗ',\n  'ꝙ' => 'Ꝙ',\n  'ꝛ' => 'Ꝛ',\n  'ꝝ' => 'Ꝝ',\n  'ꝟ' => 'Ꝟ',\n  'ꝡ' => 'Ꝡ',\n  'ꝣ' => 'Ꝣ',\n  'ꝥ' => 'Ꝥ',\n  'ꝧ' => 'Ꝧ',\n  'ꝩ' => 'Ꝩ',\n  'ꝫ' => 'Ꝫ',\n  'ꝭ' => 'Ꝭ',\n  'ꝯ' => 'Ꝯ',\n  'ꝺ' => 'Ꝺ',\n  'ꝼ' => 'Ꝼ',\n  'ꝿ' => 'Ꝿ',\n  'ꞁ' => 'Ꞁ',\n  'ꞃ' => 'Ꞃ',\n  'ꞅ' => 'Ꞅ',\n  'ꞇ' => 'Ꞇ',\n  'ꞌ' => 'Ꞌ',\n  'ꞑ' => 'Ꞑ',\n  'ꞓ' => 'Ꞓ',\n  'ꞔ' => 'Ꞔ',\n  'ꞗ' => 'Ꞗ',\n  'ꞙ' => 'Ꞙ',\n  'ꞛ' => 'Ꞛ',\n  'ꞝ' => 'Ꞝ',\n  'ꞟ' => 'Ꞟ',\n  'ꞡ' => 'Ꞡ',\n  'ꞣ' => 'Ꞣ',\n  'ꞥ' => 'Ꞥ',\n  'ꞧ' => 'Ꞧ',\n  'ꞩ' => 'Ꞩ',\n  'ꞵ' => 'Ꞵ',\n  'ꞷ' => 'Ꞷ',\n  'ꞹ' => 'Ꞹ',\n  'ꞻ' => 'Ꞻ',\n  'ꞽ' => 'Ꞽ',\n  'ꞿ' => 'Ꞿ',\n  'ꟃ' => 'Ꟃ',\n  'ꟈ' => 'Ꟈ',\n  'ꟊ' => 'Ꟊ',\n  'ꟶ' => 'Ꟶ',\n  'ꭓ' => 'Ꭓ',\n  'ꭰ' => 'Ꭰ',\n  'ꭱ' => 'Ꭱ',\n  'ꭲ' => 'Ꭲ',\n  'ꭳ' => 'Ꭳ',\n  'ꭴ' => 'Ꭴ',\n  'ꭵ' => 'Ꭵ',\n  'ꭶ' => 'Ꭶ',\n  'ꭷ' => 'Ꭷ',\n  'ꭸ' => 'Ꭸ',\n  'ꭹ' => 'Ꭹ',\n  'ꭺ' => 'Ꭺ',\n  'ꭻ' => 'Ꭻ',\n  'ꭼ' => 'Ꭼ',\n  'ꭽ' => 'Ꭽ',\n  'ꭾ' => 'Ꭾ',\n  'ꭿ' => 'Ꭿ',\n  'ꮀ' => 'Ꮀ',\n  'ꮁ' => 'Ꮁ',\n  'ꮂ' => 'Ꮂ',\n  'ꮃ' => 'Ꮃ',\n  'ꮄ' => 'Ꮄ',\n  'ꮅ' => 'Ꮅ',\n  'ꮆ' => 'Ꮆ',\n  'ꮇ' => 'Ꮇ',\n  'ꮈ' => 'Ꮈ',\n  'ꮉ' => 'Ꮉ',\n  'ꮊ' => 'Ꮊ',\n  'ꮋ' => 'Ꮋ',\n  'ꮌ' => 'Ꮌ',\n  'ꮍ' => 'Ꮍ',\n  'ꮎ' => 'Ꮎ',\n  'ꮏ' => 'Ꮏ',\n  'ꮐ' => 'Ꮐ',\n  'ꮑ' => 'Ꮑ',\n  'ꮒ' => 'Ꮒ',\n  'ꮓ' => 'Ꮓ',\n  'ꮔ' => 'Ꮔ',\n  'ꮕ' => 'Ꮕ',\n  'ꮖ' => 'Ꮖ',\n  'ꮗ' => 'Ꮗ',\n  'ꮘ' => 'Ꮘ',\n  'ꮙ' => 'Ꮙ',\n  'ꮚ' => 'Ꮚ',\n  'ꮛ' => 'Ꮛ',\n  'ꮜ' => 'Ꮜ',\n  'ꮝ' => 'Ꮝ',\n  'ꮞ' => 'Ꮞ',\n  'ꮟ' => 'Ꮟ',\n  'ꮠ' => 'Ꮠ',\n  'ꮡ' => 'Ꮡ',\n  'ꮢ' => 'Ꮢ',\n  'ꮣ' => 'Ꮣ',\n  'ꮤ' => 'Ꮤ',\n  'ꮥ' => 'Ꮥ',\n  'ꮦ' => 'Ꮦ',\n  'ꮧ' => 'Ꮧ',\n  'ꮨ' => 'Ꮨ',\n  'ꮩ' => 'Ꮩ',\n  'ꮪ' => 'Ꮪ',\n  'ꮫ' => 'Ꮫ',\n  'ꮬ' => 'Ꮬ',\n  'ꮭ' => 'Ꮭ',\n  'ꮮ' => 'Ꮮ',\n  'ꮯ' => 'Ꮯ',\n  'ꮰ' => 'Ꮰ',\n  'ꮱ' => 'Ꮱ',\n  'ꮲ' => 'Ꮲ',\n  'ꮳ' => 'Ꮳ',\n  'ꮴ' => 'Ꮴ',\n  'ꮵ' => 'Ꮵ',\n  'ꮶ' => 'Ꮶ',\n  'ꮷ' => 'Ꮷ',\n  'ꮸ' => 'Ꮸ',\n  'ꮹ' => 'Ꮹ',\n  'ꮺ' => 'Ꮺ',\n  'ꮻ' => 'Ꮻ',\n  'ꮼ' => 'Ꮼ',\n  'ꮽ' => 'Ꮽ',\n  'ꮾ' => 'Ꮾ',\n  'ꮿ' => 'Ꮿ',\n  'ａ' => 'Ａ',\n  'ｂ' => 'Ｂ',\n  'ｃ' => 'Ｃ',\n  'ｄ' => 'Ｄ',\n  'ｅ' => 'Ｅ',\n  'ｆ' => 'Ｆ',\n  'ｇ' => 'Ｇ',\n  'ｈ' => 'Ｈ',\n  'ｉ' => 'Ｉ',\n  'ｊ' => 'Ｊ',\n  'ｋ' => 'Ｋ',\n  'ｌ' => 'Ｌ',\n  'ｍ' => 'Ｍ',\n  'ｎ' => 'Ｎ',\n  'ｏ' => 'Ｏ',\n  'ｐ' => 'Ｐ',\n  'ｑ' => 'Ｑ',\n  'ｒ' => 'Ｒ',\n  'ｓ' => 'Ｓ',\n  'ｔ' => 'Ｔ',\n  'ｕ' => 'Ｕ',\n  'ｖ' => 'Ｖ',\n  'ｗ' => 'Ｗ',\n  'ｘ' => 'Ｘ',\n  'ｙ' => 'Ｙ',\n  'ｚ' => 'Ｚ',\n  '𐐨' => '𐐀',\n  '𐐩' => '𐐁',\n  '𐐪' => '𐐂',\n  '𐐫' => '𐐃',\n  '𐐬' => '𐐄',\n  '𐐭' => '𐐅',\n  '𐐮' => '𐐆',\n  '𐐯' => '𐐇',\n  '𐐰' => '𐐈',\n  '𐐱' => '𐐉',\n  '𐐲' => '𐐊',\n  '𐐳' => '𐐋',\n  '𐐴' => '𐐌',\n  '𐐵' => '𐐍',\n  '𐐶' => '𐐎',\n  '𐐷' => '𐐏',\n  '𐐸' => '𐐐',\n  '𐐹' => '𐐑',\n  '𐐺' => '𐐒',\n  '𐐻' => '𐐓',\n  '𐐼' => '𐐔',\n  '𐐽' => '𐐕',\n  '𐐾' => '𐐖',\n  '𐐿' => '𐐗',\n  '𐑀' => '𐐘',\n  '𐑁' => '𐐙',\n  '𐑂' => '𐐚',\n  '𐑃' => '𐐛',\n  '𐑄' => '𐐜',\n  '𐑅' => '𐐝',\n  '𐑆' => '𐐞',\n  '𐑇' => '𐐟',\n  '𐑈' => '𐐠',\n  '𐑉' => '𐐡',\n  '𐑊' => '𐐢',\n  '𐑋' => '𐐣',\n  '𐑌' => '𐐤',\n  '𐑍' => '𐐥',\n  '𐑎' => '𐐦',\n  '𐑏' => '𐐧',\n  '𐓘' => '𐒰',\n  '𐓙' => '𐒱',\n  '𐓚' => '𐒲',\n  '𐓛' => '𐒳',\n  '𐓜' => '𐒴',\n  '𐓝' => '𐒵',\n  '𐓞' => '𐒶',\n  '𐓟' => '𐒷',\n  '𐓠' => '𐒸',\n  '𐓡' => '𐒹',\n  '𐓢' => '𐒺',\n  '𐓣' => '𐒻',\n  '𐓤' => '𐒼',\n  '𐓥' => '𐒽',\n  '𐓦' => '𐒾',\n  '𐓧' => '𐒿',\n  '𐓨' => '𐓀',\n  '𐓩' => '𐓁',\n  '𐓪' => '𐓂',\n  '𐓫' => '𐓃',\n  '𐓬' => '𐓄',\n  '𐓭' => '𐓅',\n  '𐓮' => '𐓆',\n  '𐓯' => '𐓇',\n  '𐓰' => '𐓈',\n  '𐓱' => '𐓉',\n  '𐓲' => '𐓊',\n  '𐓳' => '𐓋',\n  '𐓴' => '𐓌',\n  '𐓵' => '𐓍',\n  '𐓶' => '𐓎',\n  '𐓷' => '𐓏',\n  '𐓸' => '𐓐',\n  '𐓹' => '𐓑',\n  '𐓺' => '𐓒',\n  '𐓻' => '𐓓',\n  '𐳀' => '𐲀',\n  '𐳁' => '𐲁',\n  '𐳂' => '𐲂',\n  '𐳃' => '𐲃',\n  '𐳄' => '𐲄',\n  '𐳅' => '𐲅',\n  '𐳆' => '𐲆',\n  '𐳇' => '𐲇',\n  '𐳈' => '𐲈',\n  '𐳉' => '𐲉',\n  '𐳊' => '𐲊',\n  '𐳋' => '𐲋',\n  '𐳌' => '𐲌',\n  '𐳍' => '𐲍',\n  '𐳎' => '𐲎',\n  '𐳏' => '𐲏',\n  '𐳐' => '𐲐',\n  '𐳑' => '𐲑',\n  '𐳒' => '𐲒',\n  '𐳓' => '𐲓',\n  '𐳔' => '𐲔',\n  '𐳕' => '𐲕',\n  '𐳖' => '𐲖',\n  '𐳗' => '𐲗',\n  '𐳘' => '𐲘',\n  '𐳙' => '𐲙',\n  '𐳚' => '𐲚',\n  '𐳛' => '𐲛',\n  '𐳜' => '𐲜',\n  '𐳝' => '𐲝',\n  '𐳞' => '𐲞',\n  '𐳟' => '𐲟',\n  '𐳠' => '𐲠',\n  '𐳡' => '𐲡',\n  '𐳢' => '𐲢',\n  '𐳣' => '𐲣',\n  '𐳤' => '𐲤',\n  '𐳥' => '𐲥',\n  '𐳦' => '𐲦',\n  '𐳧' => '𐲧',\n  '𐳨' => '𐲨',\n  '𐳩' => '𐲩',\n  '𐳪' => '𐲪',\n  '𐳫' => '𐲫',\n  '𐳬' => '𐲬',\n  '𐳭' => '𐲭',\n  '𐳮' => '𐲮',\n  '𐳯' => '𐲯',\n  '𐳰' => '𐲰',\n  '𐳱' => '𐲱',\n  '𐳲' => '𐲲',\n  '𑣀' => '𑢠',\n  '𑣁' => '𑢡',\n  '𑣂' => '𑢢',\n  '𑣃' => '𑢣',\n  '𑣄' => '𑢤',\n  '𑣅' => '𑢥',\n  '𑣆' => '𑢦',\n  '𑣇' => '𑢧',\n  '𑣈' => '𑢨',\n  '𑣉' => '𑢩',\n  '𑣊' => '𑢪',\n  '𑣋' => '𑢫',\n  '𑣌' => '𑢬',\n  '𑣍' => '𑢭',\n  '𑣎' => '𑢮',\n  '𑣏' => '𑢯',\n  '𑣐' => '𑢰',\n  '𑣑' => '𑢱',\n  '𑣒' => '𑢲',\n  '𑣓' => '𑢳',\n  '𑣔' => '𑢴',\n  '𑣕' => '𑢵',\n  '𑣖' => '𑢶',\n  '𑣗' => '𑢷',\n  '𑣘' => '𑢸',\n  '𑣙' => '𑢹',\n  '𑣚' => '𑢺',\n  '𑣛' => '𑢻',\n  '𑣜' => '𑢼',\n  '𑣝' => '𑢽',\n  '𑣞' => '𑢾',\n  '𑣟' => '𑢿',\n  '𖹠' => '𖹀',\n  '𖹡' => '𖹁',\n  '𖹢' => '𖹂',\n  '𖹣' => '𖹃',\n  '𖹤' => '𖹄',\n  '𖹥' => '𖹅',\n  '𖹦' => '𖹆',\n  '𖹧' => '𖹇',\n  '𖹨' => '𖹈',\n  '𖹩' => '𖹉',\n  '𖹪' => '𖹊',\n  '𖹫' => '𖹋',\n  '𖹬' => '𖹌',\n  '𖹭' => '𖹍',\n  '𖹮' => '𖹎',\n  '𖹯' => '𖹏',\n  '𖹰' => '𖹐',\n  '𖹱' => '𖹑',\n  '𖹲' => '𖹒',\n  '𖹳' => '𖹓',\n  '𖹴' => '𖹔',\n  '𖹵' => '𖹕',\n  '𖹶' => '𖹖',\n  '𖹷' => '𖹗',\n  '𖹸' => '𖹘',\n  '𖹹' => '𖹙',\n  '𖹺' => '𖹚',\n  '𖹻' => '𖹛',\n  '𖹼' => '𖹜',\n  '𖹽' => '𖹝',\n  '𖹾' => '𖹞',\n  '𖹿' => '𖹟',\n  '𞤢' => '𞤀',\n  '𞤣' => '𞤁',\n  '𞤤' => '𞤂',\n  '𞤥' => '𞤃',\n  '𞤦' => '𞤄',\n  '𞤧' => '𞤅',\n  '𞤨' => '𞤆',\n  '𞤩' => '𞤇',\n  '𞤪' => '𞤈',\n  '𞤫' => '𞤉',\n  '𞤬' => '𞤊',\n  '𞤭' => '𞤋',\n  '𞤮' => '𞤌',\n  '𞤯' => '𞤍',\n  '𞤰' => '𞤎',\n  '𞤱' => '𞤏',\n  '𞤲' => '𞤐',\n  '𞤳' => '𞤑',\n  '𞤴' => '𞤒',\n  '𞤵' => '𞤓',\n  '𞤶' => '𞤔',\n  '𞤷' => '𞤕',\n  '𞤸' => '𞤖',\n  '𞤹' => '𞤗',\n  '𞤺' => '𞤘',\n  '𞤻' => '𞤙',\n  '𞤼' => '𞤚',\n  '𞤽' => '𞤛',\n  '𞤾' => '𞤜',\n  '𞤿' => '𞤝',\n  '𞥀' => '𞤞',\n  '𞥁' => '𞤟',\n  '𞥂' => '𞤠',\n  '𞥃' => '𞤡',\n  'ß' => 'SS',\n  'ﬀ' => 'FF',\n  'ﬁ' => 'FI',\n  'ﬂ' => 'FL',\n  'ﬃ' => 'FFI',\n  'ﬄ' => 'FFL',\n  'ﬅ' => 'ST',\n  'ﬆ' => 'ST',\n  'և' => 'ԵՒ',\n  'ﬓ' => 'ՄՆ',\n  'ﬔ' => 'ՄԵ',\n  'ﬕ' => 'ՄԻ',\n  'ﬖ' => 'ՎՆ',\n  'ﬗ' => 'ՄԽ',\n  'ŉ' => 'ʼN',\n  'ΐ' => 'Ϊ́',\n  'ΰ' => 'Ϋ́',\n  'ǰ' => 'J̌',\n  'ẖ' => 'H̱',\n  'ẗ' => 'T̈',\n  'ẘ' => 'W̊',\n  'ẙ' => 'Y̊',\n  'ẚ' => 'Aʾ',\n  'ὐ' => 'Υ̓',\n  'ὒ' => 'Υ̓̀',\n  'ὔ' => 'Υ̓́',\n  'ὖ' => 'Υ̓͂',\n  'ᾶ' => 'Α͂',\n  'ῆ' => 'Η͂',\n  'ῒ' => 'Ϊ̀',\n  'ΐ' => 'Ϊ́',\n  'ῖ' => 'Ι͂',\n  'ῗ' => 'Ϊ͂',\n  'ῢ' => 'Ϋ̀',\n  'ΰ' => 'Ϋ́',\n  'ῤ' => 'Ρ̓',\n  'ῦ' => 'Υ͂',\n  'ῧ' => 'Ϋ͂',\n  'ῶ' => 'Ω͂',\n  'ᾈ' => 'ἈΙ',\n  'ᾉ' => 'ἉΙ',\n  'ᾊ' => 'ἊΙ',\n  'ᾋ' => 'ἋΙ',\n  'ᾌ' => 'ἌΙ',\n  'ᾍ' => 'ἍΙ',\n  'ᾎ' => 'ἎΙ',\n  'ᾏ' => 'ἏΙ',\n  'ᾘ' => 'ἨΙ',\n  'ᾙ' => 'ἩΙ',\n  'ᾚ' => 'ἪΙ',\n  'ᾛ' => 'ἫΙ',\n  'ᾜ' => 'ἬΙ',\n  'ᾝ' => 'ἭΙ',\n  'ᾞ' => 'ἮΙ',\n  'ᾟ' => 'ἯΙ',\n  'ᾨ' => 'ὨΙ',\n  'ᾩ' => 'ὩΙ',\n  'ᾪ' => 'ὪΙ',\n  'ᾫ' => 'ὫΙ',\n  'ᾬ' => 'ὬΙ',\n  'ᾭ' => 'ὭΙ',\n  'ᾮ' => 'ὮΙ',\n  'ᾯ' => 'ὯΙ',\n  'ᾼ' => 'ΑΙ',\n  'ῌ' => 'ΗΙ',\n  'ῼ' => 'ΩΙ',\n  'ᾲ' => 'ᾺΙ',\n  'ᾴ' => 'ΆΙ',\n  'ῂ' => 'ῊΙ',\n  'ῄ' => 'ΉΙ',\n  'ῲ' => 'ῺΙ',\n  'ῴ' => 'ΏΙ',\n  'ᾷ' => 'Α͂Ι',\n  'ῇ' => 'Η͂Ι',\n  'ῷ' => 'Ω͂Ι',\n);\n","vendor/symfony/polyfill-mbstring/bootstrap.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nif (\\PHP_VERSION_ID >= 80000) {\n    return require __DIR__.'/bootstrap80.php';\n}\n\nreturn require __DIR__.'/bootstrap72.php';\n","vendor/symfony/polyfill-mbstring/bootstrap72.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nuse Symfony\\Polyfill\\Mbstring as p;\n\nif (!function_exists('mb_convert_encoding')) {\n    function mb_convert_encoding($string, $to_encoding, $from_encoding = null) { return p\\Mbstring::mb_convert_encoding($string, $to_encoding, $from_encoding); }\n}\nif (!function_exists('mb_decode_mimeheader')) {\n    function mb_decode_mimeheader($string) { return p\\Mbstring::mb_decode_mimeheader($string); }\n}\nif (!function_exists('mb_encode_mimeheader')) {\n    function mb_encode_mimeheader($string, $charset = null, $transfer_encoding = null, $newline = \"\\r\\n\", $indent = 0) { return p\\Mbstring::mb_encode_mimeheader($string, $charset, $transfer_encoding, $newline, $indent); }\n}\nif (!function_exists('mb_decode_numericentity')) {\n    function mb_decode_numericentity($string, $map, $encoding = null) { return p\\Mbstring::mb_decode_numericentity($string, $map, $encoding); }\n}\nif (!function_exists('mb_encode_numericentity')) {\n    function mb_encode_numericentity($string, $map, $encoding = null, $hex = false) { return p\\Mbstring::mb_encode_numericentity($string, $map, $encoding, $hex); }\n}\nif (!function_exists('mb_convert_case')) {\n    function mb_convert_case($string, $mode, $encoding = null) { return p\\Mbstring::mb_convert_case($string, $mode, $encoding); }\n}\nif (!function_exists('mb_internal_encoding')) {\n    function mb_internal_encoding($encoding = null) { return p\\Mbstring::mb_internal_encoding($encoding); }\n}\nif (!function_exists('mb_language')) {\n    function mb_language($language = null) { return p\\Mbstring::mb_language($language); }\n}\nif (!function_exists('mb_list_encodings')) {\n    function mb_list_encodings() { return p\\Mbstring::mb_list_encodings(); }\n}\nif (!function_exists('mb_encoding_aliases')) {\n    function mb_encoding_aliases($encoding) { return p\\Mbstring::mb_encoding_aliases($encoding); }\n}\nif (!function_exists('mb_check_encoding')) {\n    function mb_check_encoding($value = null, $encoding = null) { return p\\Mbstring::mb_check_encoding($value, $encoding); }\n}\nif (!function_exists('mb_detect_encoding')) {\n    function mb_detect_encoding($string, $encodings = null, $strict = false) { return p\\Mbstring::mb_detect_encoding($string, $encodings, $strict); }\n}\nif (!function_exists('mb_detect_order')) {\n    function mb_detect_order($encoding = null) { return p\\Mbstring::mb_detect_order($encoding); }\n}\nif (!function_exists('mb_parse_str')) {\n    function mb_parse_str($string, &$result = []) { parse_str($string, $result); return (bool) $result; }\n}\nif (!function_exists('mb_strlen')) {\n    function mb_strlen($string, $encoding = null) { return p\\Mbstring::mb_strlen($string, $encoding); }\n}\nif (!function_exists('mb_strpos')) {\n    function mb_strpos($haystack, $needle, $offset = 0, $encoding = null) { return p\\Mbstring::mb_strpos($haystack, $needle, $offset, $encoding); }\n}\nif (!function_exists('mb_strtolower')) {\n    function mb_strtolower($string, $encoding = null) { return p\\Mbstring::mb_strtolower($string, $encoding); }\n}\nif (!function_exists('mb_strtoupper')) {\n    function mb_strtoupper($string, $encoding = null) { return p\\Mbstring::mb_strtoupper($string, $encoding); }\n}\nif (!function_exists('mb_substitute_character')) {\n    function mb_substitute_character($substitute_character = null) { return p\\Mbstring::mb_substitute_character($substitute_character); }\n}\nif (!function_exists('mb_substr')) {\n    function mb_substr($string, $start, $length = 2147483647, $encoding = null) { return p\\Mbstring::mb_substr($string, $start, $length, $encoding); }\n}\nif (!function_exists('mb_stripos')) {\n    function mb_stripos($haystack, $needle, $offset = 0, $encoding = null) { return p\\Mbstring::mb_stripos($haystack, $needle, $offset, $encoding); }\n}\nif (!function_exists('mb_stristr')) {\n    function mb_stristr($haystack, $needle, $before_needle = false, $encoding = null) { return p\\Mbstring::mb_stristr($haystack, $needle, $before_needle, $encoding); }\n}\nif (!function_exists('mb_strrchr')) {\n    function mb_strrchr($haystack, $needle, $before_needle = false, $encoding = null) { return p\\Mbstring::mb_strrchr($haystack, $needle, $before_needle, $encoding); }\n}\nif (!function_exists('mb_strrichr')) {\n    function mb_strrichr($haystack, $needle, $before_needle = false, $encoding = null) { return p\\Mbstring::mb_strrichr($haystack, $needle, $before_needle, $encoding); }\n}\nif (!function_exists('mb_strripos')) {\n    function mb_strripos($haystack, $needle, $offset = 0, $encoding = null) { return p\\Mbstring::mb_strripos($haystack, $needle, $offset, $encoding); }\n}\nif (!function_exists('mb_strrpos')) {\n    function mb_strrpos($haystack, $needle, $offset = 0, $encoding = null) { return p\\Mbstring::mb_strrpos($haystack, $needle, $offset, $encoding); }\n}\nif (!function_exists('mb_strstr')) {\n    function mb_strstr($haystack, $needle, $before_needle = false, $encoding = null) { return p\\Mbstring::mb_strstr($haystack, $needle, $before_needle, $encoding); }\n}\nif (!function_exists('mb_get_info')) {\n    function mb_get_info($type = 'all') { return p\\Mbstring::mb_get_info($type); }\n}\nif (!function_exists('mb_http_output')) {\n    function mb_http_output($encoding = null) { return p\\Mbstring::mb_http_output($encoding); }\n}\nif (!function_exists('mb_strwidth')) {\n    function mb_strwidth($string, $encoding = null) { return p\\Mbstring::mb_strwidth($string, $encoding); }\n}\nif (!function_exists('mb_substr_count')) {\n    function mb_substr_count($haystack, $needle, $encoding = null) { return p\\Mbstring::mb_substr_count($haystack, $needle, $encoding); }\n}\nif (!function_exists('mb_output_handler')) {\n    function mb_output_handler($string, $status) { return p\\Mbstring::mb_output_handler($string, $status); }\n}\nif (!function_exists('mb_http_input')) {\n    function mb_http_input($type = null) { return p\\Mbstring::mb_http_input($type); }\n}\n\nif (!function_exists('mb_convert_variables')) {\n    function mb_convert_variables($to_encoding, $from_encoding, &...$vars) { return p\\Mbstring::mb_convert_variables($to_encoding, $from_encoding, ...$vars); }\n}\n\nif (!function_exists('mb_ord')) {\n    function mb_ord($string, $encoding = null) { return p\\Mbstring::mb_ord($string, $encoding); }\n}\nif (!function_exists('mb_chr')) {\n    function mb_chr($codepoint, $encoding = null) { return p\\Mbstring::mb_chr($codepoint, $encoding); }\n}\nif (!function_exists('mb_scrub')) {\n    function mb_scrub($string, $encoding = null) { return p\\Mbstring::mb_scrub($string, $encoding); }\n}\nif (!function_exists('mb_str_split')) {\n    function mb_str_split($string, $length = 1, $encoding = null) { return p\\Mbstring::mb_str_split($string, $length, $encoding); }\n}\n\nif (!function_exists('mb_str_pad')) {\n    /** @return string|false */\n    function mb_str_pad(?string $string, ?int $length, ?string $pad_string = ' ', ?int $pad_type = STR_PAD_RIGHT, ?string $encoding = null) { return p\\Mbstring::mb_str_pad((string) $string, (int) $length, (string) $pad_string, (int) $pad_type, $encoding); }\n}\n\nif (!function_exists('mb_ucfirst')) {\n    /** @return string|false */\n    function mb_ucfirst(?string $string, ?string $encoding = null) { return p\\Mbstring::mb_ucfirst((string) $string, $encoding); }\n}\n\nif (!function_exists('mb_lcfirst')) {\n    /** @return string|false */\n    function mb_lcfirst(?string $string, ?string $encoding = null) { return p\\Mbstring::mb_lcfirst((string) $string, $encoding); }\n}\n\nif (!function_exists('mb_trim')) {\n    /** @return string|false */\n    function mb_trim(?string $string, ?string $characters = null, ?string $encoding = null) { return p\\Mbstring::mb_trim((string) $string, $characters, $encoding); }\n}\n\nif (!function_exists('mb_ltrim')) {\n    /** @return string|false */\n    function mb_ltrim(?string $string, ?string $characters = null, ?string $encoding = null) { return p\\Mbstring::mb_ltrim((string) $string, $characters, $encoding); }\n}\n\nif (!function_exists('mb_rtrim')) {\n    /** @return string|false */\n    function mb_rtrim(?string $string, ?string $characters = null, ?string $encoding = null) { return p\\Mbstring::mb_rtrim((string) $string, $characters, $encoding); }\n}\n\nif (extension_loaded('mbstring')) {\n    return;\n}\n\nif (!defined('MB_CASE_UPPER')) {\n    define('MB_CASE_UPPER', 0);\n}\nif (!defined('MB_CASE_LOWER')) {\n    define('MB_CASE_LOWER', 1);\n}\nif (!defined('MB_CASE_TITLE')) {\n    define('MB_CASE_TITLE', 2);\n}\n","vendor/symfony/polyfill-mbstring/bootstrap80.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nuse Symfony\\Polyfill\\Mbstring as p;\n\nif (!function_exists('mb_convert_encoding')) {\n    function mb_convert_encoding(array|string|null $string, ?string $to_encoding, array|string|null $from_encoding = null): array|string|false { return p\\Mbstring::mb_convert_encoding($string ?? '', (string) $to_encoding, $from_encoding); }\n}\nif (!function_exists('mb_decode_mimeheader')) {\n    function mb_decode_mimeheader(?string $string): string { return p\\Mbstring::mb_decode_mimeheader((string) $string); }\n}\nif (!function_exists('mb_encode_mimeheader')) {\n    function mb_encode_mimeheader(?string $string, ?string $charset = null, ?string $transfer_encoding = null, ?string $newline = \"\\r\\n\", ?int $indent = 0): string { return p\\Mbstring::mb_encode_mimeheader((string) $string, $charset, $transfer_encoding, (string) $newline, (int) $indent); }\n}\nif (!function_exists('mb_decode_numericentity')) {\n    function mb_decode_numericentity(?string $string, array $map, ?string $encoding = null): string { return p\\Mbstring::mb_decode_numericentity((string) $string, $map, $encoding); }\n}\nif (!function_exists('mb_encode_numericentity')) {\n    function mb_encode_numericentity(?string $string, array $map, ?string $encoding = null, ?bool $hex = false): string { return p\\Mbstring::mb_encode_numericentity((string) $string, $map, $encoding, (bool) $hex); }\n}\nif (!function_exists('mb_convert_case')) {\n    function mb_convert_case(?string $string, ?int $mode, ?string $encoding = null): string { return p\\Mbstring::mb_convert_case((string) $string, (int) $mode, $encoding); }\n}\nif (!function_exists('mb_internal_encoding')) {\n    function mb_internal_encoding(?string $encoding = null): string|bool { return p\\Mbstring::mb_internal_encoding($encoding); }\n}\nif (!function_exists('mb_language')) {\n    function mb_language(?string $language = null): string|bool { return p\\Mbstring::mb_language($language); }\n}\nif (!function_exists('mb_list_encodings')) {\n    function mb_list_encodings(): array { return p\\Mbstring::mb_list_encodings(); }\n}\nif (!function_exists('mb_encoding_aliases')) {\n    function mb_encoding_aliases(?string $encoding): array { return p\\Mbstring::mb_encoding_aliases((string) $encoding); }\n}\nif (!function_exists('mb_check_encoding')) {\n    function mb_check_encoding(array|string|null $value = null, ?string $encoding = null): bool { return p\\Mbstring::mb_check_encoding($value, $encoding); }\n}\nif (!function_exists('mb_detect_encoding')) {\n    function mb_detect_encoding(?string $string, array|string|null $encodings = null, ?bool $strict = false): string|false { return p\\Mbstring::mb_detect_encoding((string) $string, $encodings, (bool) $strict); }\n}\nif (!function_exists('mb_detect_order')) {\n    function mb_detect_order(array|string|null $encoding = null): array|bool { return p\\Mbstring::mb_detect_order($encoding); }\n}\nif (!function_exists('mb_parse_str')) {\n    function mb_parse_str(?string $string, &$result = []): bool { parse_str((string) $string, $result); return (bool) $result; }\n}\nif (!function_exists('mb_strlen')) {\n    function mb_strlen(?string $string, ?string $encoding = null): int { return p\\Mbstring::mb_strlen((string) $string, $encoding); }\n}\nif (!function_exists('mb_strpos')) {\n    function mb_strpos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null): int|false { return p\\Mbstring::mb_strpos((string) $haystack, (string) $needle, (int) $offset, $encoding); }\n}\nif (!function_exists('mb_strtolower')) {\n    function mb_strtolower(?string $string, ?string $encoding = null): string { return p\\Mbstring::mb_strtolower((string) $string, $encoding); }\n}\nif (!function_exists('mb_strtoupper')) {\n    function mb_strtoupper(?string $string, ?string $encoding = null): string { return p\\Mbstring::mb_strtoupper((string) $string, $encoding); }\n}\nif (!function_exists('mb_substitute_character')) {\n    function mb_substitute_character(string|int|null $substitute_character = null): string|int|bool { return p\\Mbstring::mb_substitute_character($substitute_character); }\n}\nif (!function_exists('mb_substr')) {\n    function mb_substr(?string $string, ?int $start, ?int $length = null, ?string $encoding = null): string { return p\\Mbstring::mb_substr((string) $string, (int) $start, $length, $encoding); }\n}\nif (!function_exists('mb_stripos')) {\n    function mb_stripos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null): int|false { return p\\Mbstring::mb_stripos((string) $haystack, (string) $needle, (int) $offset, $encoding); }\n}\nif (!function_exists('mb_stristr')) {\n    function mb_stristr(?string $haystack, ?string $needle, ?bool $before_needle = false, ?string $encoding = null): string|false { return p\\Mbstring::mb_stristr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); }\n}\nif (!function_exists('mb_strrchr')) {\n    function mb_strrchr(?string $haystack, ?string $needle, ?bool $before_needle = false, ?string $encoding = null): string|false { return p\\Mbstring::mb_strrchr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); }\n}\nif (!function_exists('mb_strrichr')) {\n    function mb_strrichr(?string $haystack, ?string $needle, ?bool $before_needle = false, ?string $encoding = null): string|false { return p\\Mbstring::mb_strrichr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); }\n}\nif (!function_exists('mb_strripos')) {\n    function mb_strripos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null): int|false { return p\\Mbstring::mb_strripos((string) $haystack, (string) $needle, (int) $offset, $encoding); }\n}\nif (!function_exists('mb_strrpos')) {\n    function mb_strrpos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null): int|false { return p\\Mbstring::mb_strrpos((string) $haystack, (string) $needle, (int) $offset, $encoding); }\n}\nif (!function_exists('mb_strstr')) {\n    function mb_strstr(?string $haystack, ?string $needle, ?bool $before_needle = false, ?string $encoding = null): string|false { return p\\Mbstring::mb_strstr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); }\n}\nif (!function_exists('mb_get_info')) {\n    function mb_get_info(?string $type = 'all'): array|string|int|false|null { return p\\Mbstring::mb_get_info((string) $type); }\n}\nif (!function_exists('mb_http_output')) {\n    function mb_http_output(?string $encoding = null): string|bool { return p\\Mbstring::mb_http_output($encoding); }\n}\nif (!function_exists('mb_strwidth')) {\n    function mb_strwidth(?string $string, ?string $encoding = null): int { return p\\Mbstring::mb_strwidth((string) $string, $encoding); }\n}\nif (!function_exists('mb_substr_count')) {\n    function mb_substr_count(?string $haystack, ?string $needle, ?string $encoding = null): int { return p\\Mbstring::mb_substr_count((string) $haystack, (string) $needle, $encoding); }\n}\nif (!function_exists('mb_output_handler')) {\n    function mb_output_handler(?string $string, ?int $status): string { return p\\Mbstring::mb_output_handler((string) $string, (int) $status); }\n}\nif (!function_exists('mb_http_input')) {\n    function mb_http_input(?string $type = null): array|string|false { return p\\Mbstring::mb_http_input($type); }\n}\n\nif (!function_exists('mb_convert_variables')) {\n    function mb_convert_variables(?string $to_encoding, array|string|null $from_encoding, mixed &$var, mixed &...$vars): string|false { return p\\Mbstring::mb_convert_variables((string) $to_encoding, $from_encoding ?? '', $var, ...$vars); }\n}\n\nif (!function_exists('mb_ord')) {\n    function mb_ord(?string $string, ?string $encoding = null): int|false { return p\\Mbstring::mb_ord((string) $string, $encoding); }\n}\nif (!function_exists('mb_chr')) {\n    function mb_chr(?int $codepoint, ?string $encoding = null): string|false { return p\\Mbstring::mb_chr((int) $codepoint, $encoding); }\n}\nif (!function_exists('mb_scrub')) {\n    function mb_scrub(?string $string, ?string $encoding = null): string { return p\\Mbstring::mb_scrub($string, $encoding); }\n}\nif (!function_exists('mb_str_split')) {\n    function mb_str_split(?string $string, ?int $length = 1, ?string $encoding = null): array { return p\\Mbstring::mb_str_split((string) $string, (int) $length, $encoding); }\n}\n\nif (!function_exists('mb_str_pad')) {\n    function mb_str_pad(?string $string, ?int $length, ?string $pad_string = ' ', ?int $pad_type = STR_PAD_RIGHT, ?string $encoding = null): string { return p\\Mbstring::mb_str_pad((string) $string, (int) $length, (string) $pad_string, (int) $pad_type, $encoding); }\n}\n\nif (!function_exists('mb_ucfirst')) {\n    function mb_ucfirst(?string $string, ?string $encoding = null): string { return p\\Mbstring::mb_ucfirst((string) $string, $encoding); }\n}\n\nif (!function_exists('mb_lcfirst')) {\n    function mb_lcfirst(?string $string, ?string $encoding = null): string { return p\\Mbstring::mb_lcfirst((string) $string, $encoding); }\n}\n\nif (!function_exists('mb_trim')) {\n    function mb_trim(?string $string, ?string $characters = null, ?string $encoding = null): string { return p\\Mbstring::mb_trim((string) $string, $characters, $encoding); }\n}\n\nif (!function_exists('mb_ltrim')) {\n    function mb_ltrim(?string $string, ?string $characters = null, ?string $encoding = null): string { return p\\Mbstring::mb_ltrim((string) $string, $characters, $encoding); }\n}\n\nif (!function_exists('mb_rtrim')) {\n    function mb_rtrim(?string $string, ?string $characters = null, ?string $encoding = null): string { return p\\Mbstring::mb_rtrim((string) $string, $characters, $encoding); }\n}\n\nif (extension_loaded('mbstring')) {\n    return;\n}\n\nif (!defined('MB_CASE_UPPER')) {\n    define('MB_CASE_UPPER', 0);\n}\nif (!defined('MB_CASE_LOWER')) {\n    define('MB_CASE_LOWER', 1);\n}\nif (!defined('MB_CASE_TITLE')) {\n    define('MB_CASE_TITLE', 2);\n}\n","vendor/symfony/polyfill-mbstring/composer.json":"{\n    \"name\": \"symfony/polyfill-mbstring\",\n    \"type\": \"library\",\n    \"description\": \"Symfony polyfill for the Mbstring extension\",\n    \"keywords\": [\"polyfill\", \"shim\", \"compatibility\", \"portable\", \"mbstring\"],\n    \"homepage\": \"https://symfony.com\",\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"Nicolas Grekas\",\n            \"email\": \"p@tchwork.com\"\n        },\n        {\n            \"name\": \"Symfony Community\",\n            \"homepage\": \"https://symfony.com/contributors\"\n        }\n    ],\n    \"require\": {\n        \"php\": \">=7.2\",\n        \"ext-iconv\": \"*\"\n    },\n    \"provide\": {\n        \"ext-mbstring\": \"*\"\n    },\n    \"autoload\": {\n        \"psr-4\": { \"Symfony\\\\Polyfill\\\\Mbstring\\\\\": \"\" },\n        \"files\": [ \"bootstrap.php\" ]\n    },\n    \"suggest\": {\n        \"ext-mbstring\": \"For best performance\"\n    },\n    \"minimum-stability\": \"dev\",\n    \"extra\": {\n        \"thanks\": {\n            \"name\": \"symfony/polyfill\",\n            \"url\": \"https://github.com/symfony/polyfill\"\n        }\n    }\n}\n","vendor/symfony/service-contracts/Attribute/Required.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Contracts\\Service\\Attribute;\n\n/**\n * A required dependency.\n *\n * This attribute indicates that a property holds a required dependency. The annotated property or method should be\n * considered during the instantiation process of the containing class.\n *\n * @author Alexander M. Turek <me@derrabus.de>\n */\n#[\\Attribute(\\Attribute::TARGET_METHOD | \\Attribute::TARGET_PROPERTY)]\nfinal class Required\n{\n    /**\n     * @param int $priority The priority of the method call when the class declares several required methods; the higher the sooner it's called\n     */\n    public function __construct(\n        public int $priority = 0,\n    ) {\n    }\n}\n","vendor/symfony/service-contracts/Attribute/SubscribedService.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Contracts\\Service\\Attribute;\n\nuse Symfony\\Contracts\\Service\\ServiceMethodsSubscriberTrait;\nuse Symfony\\Contracts\\Service\\ServiceSubscriberInterface;\n\n/**\n * For use as the return value for {@see ServiceSubscriberInterface}.\n *\n * @example new SubscribedService('http_client', HttpClientInterface::class, false, new Target('githubApi'))\n *\n * Use with {@see ServiceMethodsSubscriberTrait} to mark a method's return type\n * as a subscribed service.\n *\n * @author Kevin Bond <kevinbond@gmail.com>\n */\n#[\\Attribute(\\Attribute::TARGET_METHOD | \\Attribute::TARGET_PROPERTY)]\nfinal class SubscribedService\n{\n    /** @var object[] */\n    public array $attributes;\n\n    /**\n     * @param string|null     $key        The key to use for the service\n     * @param string|null     $type       The service type (a class name, \"string\", \"iterable\", etc.)\n     * @param bool            $nullable   Whether the service is optional\n     * @param object|object[] $attributes One or more dependency injection attributes to use\n     */\n    public function __construct(\n        public ?string $key = null,\n        public ?string $type = null,\n        public bool $nullable = false,\n        array|object $attributes = [],\n    ) {\n        $this->attributes = \\is_array($attributes) ? $attributes : [$attributes];\n    }\n}\n","vendor/symfony/service-contracts/CHANGELOG.md":"CHANGELOG\n=========\n\nThe changelog is maintained for all Symfony contracts at the following URL:\nhttps://github.com/symfony/contracts/blob/main/CHANGELOG.md\n","vendor/symfony/service-contracts/ContainerAwareInterface.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Contracts\\Service;\n\n/**\n * @deprecated use ContainerProviderInterface instead\n */\ninterface ContainerAwareInterface extends ContainerProviderInterface\n{\n}\n","vendor/symfony/service-contracts/ContainerProviderInterface.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Contracts\\Service;\n\nuse Psr\\Container\\ContainerInterface;\n\n/**\n * Implemented by objects that expose a service container.\n */\ninterface ContainerProviderInterface\n{\n    public function getContainer(): ContainerInterface;\n}\n","vendor/symfony/service-contracts/LICENSE":"Copyright (c) 2018-present Fabien Potencier\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is furnished\nto do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n","vendor/symfony/service-contracts/README.md":"Symfony Service Contracts\n=========================\n\nA set of abstractions extracted out of the Symfony components.\n\nCan be used to build on semantics that the Symfony components proved useful and\nthat already have battle tested implementations.\n\nSee https://github.com/symfony/contracts/blob/main/README.md for more information.\n","vendor/symfony/service-contracts/ResetInterface.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Contracts\\Service;\n\n/**\n * Provides a way to reset an object to its initial state.\n *\n * When calling the \"reset()\" method on an object, it should be put back to its\n * initial state. This usually means clearing any internal buffers and forwarding\n * the call to internal dependencies. All properties of the object should be put\n * back to the same state it had when it was first ready to use.\n *\n * This method could be called, for example, to recycle objects that are used as\n * services, so that they can be used to handle several requests in the same\n * process loop (note that we advise making your services stateless instead of\n * implementing this interface when possible.)\n */\ninterface ResetInterface\n{\n    /**\n     * @return void\n     */\n    public function reset();\n}\n","vendor/symfony/service-contracts/ServiceCollectionInterface.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Contracts\\Service;\n\n/**\n * A ServiceProviderInterface that is also countable and iterable.\n *\n * @author Kevin Bond <kevinbond@gmail.com>\n *\n * @template-covariant T of mixed\n *\n * @extends ServiceProviderInterface<T>\n * @extends \\IteratorAggregate<string, T>\n */\ninterface ServiceCollectionInterface extends ServiceProviderInterface, \\Countable, \\IteratorAggregate\n{\n}\n","vendor/symfony/service-contracts/ServiceLocatorTrait.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Contracts\\Service;\n\nuse Psr\\Container\\ContainerExceptionInterface;\nuse Psr\\Container\\NotFoundExceptionInterface;\n\n// Help opcache.preload discover always-needed symbols\nclass_exists(ContainerExceptionInterface::class);\nclass_exists(NotFoundExceptionInterface::class);\n\n/**\n * A trait to help implement ServiceProviderInterface.\n *\n * @author Robin Chalas <robin.chalas@gmail.com>\n * @author Nicolas Grekas <p@tchwork.com>\n */\ntrait ServiceLocatorTrait\n{\n    private array $loading = [];\n    private array $providedTypes;\n\n    /**\n     * @param array<string, callable> $factories\n     */\n    public function __construct(\n        private array $factories,\n    ) {\n    }\n\n    public function has(string $id): bool\n    {\n        return isset($this->factories[$id]);\n    }\n\n    public function get(string $id): mixed\n    {\n        if (!isset($this->factories[$id])) {\n            throw $this->createNotFoundException($id);\n        }\n\n        if (isset($this->loading[$id])) {\n            $ids = array_values($this->loading);\n            $ids = \\array_slice($this->loading, array_search($id, $ids));\n            $ids[] = $id;\n\n            throw $this->createCircularReferenceException($id, $ids);\n        }\n\n        $this->loading[$id] = $id;\n        try {\n            return $this->factories[$id]($this);\n        } finally {\n            unset($this->loading[$id]);\n        }\n    }\n\n    public function getProvidedServices(): array\n    {\n        if (!isset($this->providedTypes)) {\n            $this->providedTypes = [];\n\n            foreach ($this->factories as $name => $factory) {\n                if (!\\is_callable($factory)) {\n                    $this->providedTypes[$name] = '?';\n                } else {\n                    $type = (new \\ReflectionFunction($factory))->getReturnType();\n\n                    $this->providedTypes[$name] = $type ? ($type->allowsNull() ? '?' : '').($type instanceof \\ReflectionNamedType ? $type->getName() : $type) : '?';\n                }\n            }\n        }\n\n        return $this->providedTypes;\n    }\n\n    private function createNotFoundException(string $id): NotFoundExceptionInterface\n    {\n        if (!$alternatives = array_keys($this->factories)) {\n            $message = 'is empty...';\n        } else {\n            $last = array_pop($alternatives);\n            if ($alternatives) {\n                $message = \\sprintf('only knows about the \"%s\" and \"%s\" services.', implode('\", \"', $alternatives), $last);\n            } else {\n                $message = \\sprintf('only knows about the \"%s\" service.', $last);\n            }\n        }\n\n        if ($this->loading) {\n            $message = \\sprintf('The service \"%s\" has a dependency on a non-existent service \"%s\". This locator %s', end($this->loading), $id, $message);\n        } else {\n            $message = \\sprintf('Service \"%s\" not found: the current service locator %s', $id, $message);\n        }\n\n        return new class($message) extends \\InvalidArgumentException implements NotFoundExceptionInterface {\n        };\n    }\n\n    private function createCircularReferenceException(string $id, array $path): ContainerExceptionInterface\n    {\n        return new class(\\sprintf('Circular reference detected for service \"%s\", path: \"%s\".', $id, implode(' -> ', $path))) extends \\RuntimeException implements ContainerExceptionInterface {\n        };\n    }\n}\n","vendor/symfony/service-contracts/ServiceMethodsSubscriberTrait.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Contracts\\Service;\n\nuse Psr\\Container\\ContainerInterface;\nuse Symfony\\Contracts\\Service\\Attribute\\Required;\nuse Symfony\\Contracts\\Service\\Attribute\\SubscribedService;\n\n/**\n * Implementation of ServiceSubscriberInterface that determines subscribed services\n * from methods that have the #[SubscribedService] attribute.\n *\n * Service ids are available as \"ClassName::methodName\" so that the implementation\n * of subscriber methods can be just `return $this->container->get(__METHOD__);`.\n *\n * @author Kevin Bond <kevinbond@gmail.com>\n */\ntrait ServiceMethodsSubscriberTrait\n{\n    protected ContainerInterface $container;\n\n    public static function getSubscribedServices(): array\n    {\n        $services = method_exists(get_parent_class(self::class) ?: '', __FUNCTION__) ? parent::getSubscribedServices() : [];\n\n        $reflectors = [\n            ...(new \\ReflectionClass(self::class))->getMethods(),\n            ...(new \\ReflectionClass(self::class))->getProperties(),\n        ];\n\n        foreach ($reflectors as $reflector) {\n            if (self::class !== $reflector->class) {\n                continue;\n            }\n\n            if (!$reflectionAttribute = $reflector->getAttributes(SubscribedService::class)[0] ?? null) {\n                continue;\n            }\n\n            if ($reflector instanceof \\ReflectionMethod) {\n                if ($reflector->isStatic() || $reflector->isAbstract() || $reflector->isGenerator() || $reflector->isInternal() || $reflector->getNumberOfRequiredParameters()) {\n                    throw new \\LogicException(\\sprintf('Cannot use \"%s\" on method \"%s::%s()\" (can only be used on non-static, non-abstract methods with no parameters).', SubscribedService::class, self::class, $reflector->name));\n                }\n\n                if (!$autowireType = $reflector->getReturnType()) {\n                    throw new \\LogicException(\\sprintf('Cannot use \"%s\" on methods without a return type in \"%s::%s()\".', SubscribedService::class, $reflector->name, self::class));\n                }\n\n                $defaultKey = self::class.'::'.$reflector->name;\n            } elseif ($reflector instanceof \\ReflectionProperty) {\n                if (\\PHP_VERSION_ID < 80400 || !$reflector->hasHook(\\PropertyHookType::Get)) {\n                    throw new \\LogicException(\\sprintf('Cannot use \"%s\" on property \"%s::$%s\" (can only be used on properties with a get hook).', SubscribedService::class, self::class, $reflector->name));\n                }\n\n                if (!$autowireType = $reflector->getType()) {\n                    throw new \\LogicException(\\sprintf('Cannot use \"%s\" on properties without a type in \"%s::$%s\".', SubscribedService::class, $reflector->name, self::class));\n                }\n\n                $defaultKey = self::class.'::$'.$reflector->name.'::get';\n            } else {\n                throw new \\LogicException('Unexpected reflector: '.get_debug_type($reflector));\n            }\n\n            /* @var SubscribedService $attribute */\n            $attribute = $reflectionAttribute->newInstance();\n            $attribute->key ??= $defaultKey;\n            $attribute->type ??= $autowireType instanceof \\ReflectionNamedType ? $autowireType->getName() : (string) $autowireType;\n            $attribute->nullable = $attribute->nullable ?: $autowireType->allowsNull();\n\n            if ($attribute->attributes) {\n                $services[] = $attribute;\n            } else {\n                $services[$attribute->key] = ($attribute->nullable ? '?' : '').$attribute->type;\n            }\n        }\n\n        return $services;\n    }\n\n    #[Required]\n    public function setContainer(ContainerInterface $container): ?ContainerInterface\n    {\n        $ret = null;\n        if (method_exists(get_parent_class(self::class) ?: '', __FUNCTION__)) {\n            $ret = parent::setContainer($container);\n        }\n\n        $this->container = $container;\n\n        return $ret;\n    }\n}\n","vendor/symfony/service-contracts/ServiceProviderInterface.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Contracts\\Service;\n\nuse Psr\\Container\\ContainerInterface;\n\n/**\n * A ServiceProviderInterface exposes the identifiers and the types of services provided by a container.\n *\n * @author Nicolas Grekas <p@tchwork.com>\n * @author Mateusz Sip <mateusz.sip@gmail.com>\n *\n * @template-covariant T of mixed\n */\ninterface ServiceProviderInterface extends ContainerInterface\n{\n    /**\n     * @return T\n     */\n    public function get(string $id): mixed;\n\n    public function has(string $id): bool;\n\n    /**\n     * Returns an associative array of service types keyed by the identifiers provided by the current container.\n     *\n     * Examples:\n     *\n     *  * ['logger' => 'Psr\\Log\\LoggerInterface'] means the object provides a service named \"logger\" that implements Psr\\Log\\LoggerInterface\n     *  * ['foo' => '?'] means the container provides service name \"foo\" of unspecified type\n     *  * ['bar' => '?Bar\\Baz'] means the container provides a service \"bar\" of type Bar\\Baz|null\n     *\n     * @return array<string, string> The provided service types, keyed by service names\n     */\n    public function getProvidedServices(): array;\n}\n","vendor/symfony/service-contracts/ServiceSubscriberInterface.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Contracts\\Service;\n\nuse Symfony\\Contracts\\Service\\Attribute\\SubscribedService;\n\n/**\n * A ServiceSubscriber exposes its dependencies via the static {@link getSubscribedServices} method.\n *\n * The getSubscribedServices method returns an array of service types required by such instances,\n * optionally keyed by the service names used internally. Service types that start with an interrogation\n * mark \"?\" are optional, while the other ones are mandatory service dependencies.\n *\n * The injected service locators SHOULD NOT allow access to any other services not specified by the method.\n *\n * It is expected that ServiceSubscriber instances consume PSR-11-based service locators internally.\n * This interface does not dictate any injection method for these service locators, although constructor\n * injection is recommended.\n *\n * @author Nicolas Grekas <p@tchwork.com>\n */\ninterface ServiceSubscriberInterface\n{\n    /**\n     * Returns an array of service types (or {@see SubscribedService} objects) required\n     * by such instances, optionally keyed by the service names used internally.\n     *\n     * For mandatory dependencies:\n     *\n     *  * ['logger' => 'Psr\\Log\\LoggerInterface'] means the objects use the \"logger\" name\n     *    internally to fetch a service which must implement Psr\\Log\\LoggerInterface.\n     *  * ['loggers' => 'Psr\\Log\\LoggerInterface[]'] means the objects use the \"loggers\" name\n     *    internally to fetch an iterable of Psr\\Log\\LoggerInterface instances.\n     *  * ['Psr\\Log\\LoggerInterface'] is a shortcut for\n     *  * ['Psr\\Log\\LoggerInterface' => 'Psr\\Log\\LoggerInterface']\n     *\n     * otherwise:\n     *\n     *  * ['logger' => '?Psr\\Log\\LoggerInterface'] denotes an optional dependency\n     *  * ['loggers' => '?Psr\\Log\\LoggerInterface[]'] denotes an optional iterable dependency\n     *  * ['?Psr\\Log\\LoggerInterface'] is a shortcut for\n     *  * ['Psr\\Log\\LoggerInterface' => '?Psr\\Log\\LoggerInterface']\n     *\n     * additionally, an array of {@see SubscribedService}'s can be returned:\n     *\n     *  * [new SubscribedService('logger', Psr\\Log\\LoggerInterface::class)]\n     *  * [new SubscribedService(type: Psr\\Log\\LoggerInterface::class, nullable: true)]\n     *  * [new SubscribedService('http_client', HttpClientInterface::class, attributes: new Target('githubApi'))]\n     *\n     * @return string[]|SubscribedService[] The required service types, optionally keyed by service names\n     */\n    public static function getSubscribedServices(): array;\n}\n","vendor/symfony/service-contracts/ServiceSubscriberTrait.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Contracts\\Service;\n\nuse Psr\\Container\\ContainerInterface;\nuse Symfony\\Contracts\\Service\\Attribute\\Required;\nuse Symfony\\Contracts\\Service\\Attribute\\SubscribedService;\n\ntrigger_deprecation('symfony/contracts', 'v3.5', '\"%s\" is deprecated, use \"ServiceMethodsSubscriberTrait\" instead.', ServiceSubscriberTrait::class);\n\n/**\n * Implementation of ServiceSubscriberInterface that determines subscribed services\n * from methods that have the #[SubscribedService] attribute.\n *\n * Service ids are available as \"ClassName::methodName\" so that the implementation\n * of subscriber methods can be just `return $this->container->get(__METHOD__);`.\n *\n * @property ContainerInterface $container\n *\n * @author Kevin Bond <kevinbond@gmail.com>\n *\n * @deprecated since symfony/contracts v3.5, use ServiceMethodsSubscriberTrait instead\n */\ntrait ServiceSubscriberTrait\n{\n    public static function getSubscribedServices(): array\n    {\n        $services = method_exists(get_parent_class(self::class) ?: '', __FUNCTION__) ? parent::getSubscribedServices() : [];\n\n        foreach ((new \\ReflectionClass(self::class))->getMethods() as $method) {\n            if (self::class !== $method->class) {\n                continue;\n            }\n\n            if (!$attribute = $method->getAttributes(SubscribedService::class)[0] ?? null) {\n                continue;\n            }\n\n            if ($method->isStatic() || $method->isAbstract() || $method->isGenerator() || $method->isInternal() || $method->getNumberOfRequiredParameters()) {\n                throw new \\LogicException(\\sprintf('Cannot use \"%s\" on method \"%s::%s()\" (can only be used on non-static, non-abstract methods with no parameters).', SubscribedService::class, self::class, $method->name));\n            }\n\n            if (!$returnType = $method->getReturnType()) {\n                throw new \\LogicException(\\sprintf('Cannot use \"%s\" on methods without a return type in \"%s::%s()\".', SubscribedService::class, $method->name, self::class));\n            }\n\n            /** @var SubscribedService $attribute */\n            $attribute = $attribute->newInstance();\n            $attribute->key ??= self::class.'::'.$method->name;\n            $attribute->type ??= $returnType instanceof \\ReflectionNamedType ? $returnType->getName() : (string) $returnType;\n            $attribute->nullable = $attribute->nullable ?: $returnType->allowsNull();\n\n            if ($attribute->attributes) {\n                $services[] = $attribute;\n            } else {\n                $services[$attribute->key] = ($attribute->nullable ? '?' : '').$attribute->type;\n            }\n        }\n\n        return $services;\n    }\n\n    #[Required]\n    public function setContainer(ContainerInterface $container): ?ContainerInterface\n    {\n        $ret = null;\n        if (method_exists(get_parent_class(self::class) ?: '', __FUNCTION__)) {\n            $ret = parent::setContainer($container);\n        }\n\n        $this->container = $container;\n\n        return $ret;\n    }\n}\n","vendor/symfony/service-contracts/Test/ServiceLocatorTest.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Contracts\\Service\\Test;\n\n/**\n * @deprecated since PHPUnit 9.6\n */\nclass ServiceLocatorTest extends ServiceLocatorTestCase\n{\n}\n","vendor/symfony/service-contracts/Test/ServiceLocatorTestCase.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Contracts\\Service\\Test;\n\nuse PHPUnit\\Framework\\TestCase;\nuse Psr\\Container\\ContainerExceptionInterface;\nuse Psr\\Container\\ContainerInterface;\nuse Psr\\Container\\NotFoundExceptionInterface;\nuse Symfony\\Contracts\\Service\\ServiceLocatorTrait;\n\nabstract class ServiceLocatorTestCase extends TestCase\n{\n    /**\n     * @param array<string, callable> $factories\n     */\n    protected function getServiceLocator(array $factories): ContainerInterface\n    {\n        return new class($factories) implements ContainerInterface {\n            use ServiceLocatorTrait;\n        };\n    }\n\n    public function testHas()\n    {\n        $locator = $this->getServiceLocator([\n            'foo' => static fn () => 'bar',\n            'bar' => static fn () => 'baz',\n            static fn () => 'dummy',\n        ]);\n\n        $this->assertTrue($locator->has('foo'));\n        $this->assertTrue($locator->has('bar'));\n        $this->assertFalse($locator->has('dummy'));\n    }\n\n    public function testGet()\n    {\n        $locator = $this->getServiceLocator([\n            'foo' => static fn () => 'bar',\n            'bar' => static fn () => 'baz',\n        ]);\n\n        $this->assertSame('bar', $locator->get('foo'));\n        $this->assertSame('baz', $locator->get('bar'));\n    }\n\n    public function testGetDoesNotMemoize()\n    {\n        $i = 0;\n        $locator = $this->getServiceLocator([\n            'foo' => static function () use (&$i) {\n                ++$i;\n\n                return 'bar';\n            },\n        ]);\n\n        $this->assertSame('bar', $locator->get('foo'));\n        $this->assertSame('bar', $locator->get('foo'));\n        $this->assertSame(2, $i);\n    }\n\n    public function testThrowsOnUndefinedInternalService()\n    {\n        $locator = $this->getServiceLocator([\n            'foo' => static function () use (&$locator) { return $locator->get('bar'); },\n        ]);\n\n        $this->expectException(NotFoundExceptionInterface::class);\n        $this->expectExceptionMessage('The service \"foo\" has a dependency on a non-existent service \"bar\". This locator only knows about the \"foo\" service.');\n\n        $locator->get('foo');\n    }\n\n    public function testThrowsOnCircularReference()\n    {\n        $locator = $this->getServiceLocator([\n            'foo' => static function () use (&$locator) { return $locator->get('bar'); },\n            'bar' => static function () use (&$locator) { return $locator->get('baz'); },\n            'baz' => static function () use (&$locator) { return $locator->get('bar'); },\n        ]);\n\n        $this->expectException(ContainerExceptionInterface::class);\n        $this->expectExceptionMessage('Circular reference detected for service \"bar\", path: \"bar -> baz -> bar\".');\n\n        $locator->get('foo');\n    }\n}\n","vendor/symfony/service-contracts/composer.json":"{\n    \"name\": \"symfony/service-contracts\",\n    \"type\": \"library\",\n    \"description\": \"Generic abstractions related to writing services\",\n    \"keywords\": [\"abstractions\", \"contracts\", \"decoupling\", \"interfaces\", \"interoperability\", \"standards\"],\n    \"homepage\": \"https://symfony.com\",\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"Nicolas Grekas\",\n            \"email\": \"p@tchwork.com\"\n        },\n        {\n            \"name\": \"Symfony Community\",\n            \"homepage\": \"https://symfony.com/contributors\"\n        }\n    ],\n    \"require\": {\n        \"php\": \">=8.1\",\n        \"psr/container\": \"^1.1|^2.0\",\n        \"symfony/deprecation-contracts\": \"^2.5|^3\"\n    },\n    \"conflict\": {\n        \"ext-psr\": \"<1.1|>=2\"\n    },\n    \"autoload\": {\n        \"psr-4\": { \"Symfony\\\\Contracts\\\\Service\\\\\": \"\" },\n        \"exclude-from-classmap\": [\n            \"/Test/\"\n        ]\n    },\n    \"minimum-stability\": \"dev\",\n    \"extra\": {\n        \"branch-alias\": {\n            \"dev-main\": \"3.7-dev\"\n        },\n        \"thanks\": {\n            \"name\": \"symfony/contracts\",\n            \"url\": \"https://github.com/symfony/contracts\"\n        }\n    }\n}\n","vendor/symfony/string/AbstractString.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\String;\n\nuse Symfony\\Component\\String\\Exception\\ExceptionInterface;\nuse Symfony\\Component\\String\\Exception\\InvalidArgumentException;\nuse Symfony\\Component\\String\\Exception\\RuntimeException;\n\n/**\n * Represents a string of abstract characters.\n *\n * Unicode defines 3 types of \"characters\" (bytes, code points and grapheme clusters).\n * This class is the abstract type to use as a type-hint when the logic you want to\n * implement doesn't care about the exact variant it deals with.\n *\n * @author Nicolas Grekas <p@tchwork.com>\n * @author Hugo Hamon <hugohamon@neuf.fr>\n *\n * @throws ExceptionInterface\n */\nabstract class AbstractString implements \\Stringable, \\JsonSerializable\n{\n    public const PREG_PATTERN_ORDER = \\PREG_PATTERN_ORDER;\n    public const PREG_SET_ORDER = \\PREG_SET_ORDER;\n    public const PREG_OFFSET_CAPTURE = \\PREG_OFFSET_CAPTURE;\n    public const PREG_UNMATCHED_AS_NULL = \\PREG_UNMATCHED_AS_NULL;\n\n    public const PREG_SPLIT = 0;\n    public const PREG_SPLIT_NO_EMPTY = \\PREG_SPLIT_NO_EMPTY;\n    public const PREG_SPLIT_DELIM_CAPTURE = \\PREG_SPLIT_DELIM_CAPTURE;\n    public const PREG_SPLIT_OFFSET_CAPTURE = \\PREG_SPLIT_OFFSET_CAPTURE;\n\n    protected string $string = '';\n    protected ?bool $ignoreCase = false;\n\n    abstract public function __construct(string $string = '');\n\n    /**\n     * Unwraps instances of AbstractString back to strings.\n     *\n     * @return string[]|array\n     */\n    public static function unwrap(array $values): array\n    {\n        foreach ($values as $k => $v) {\n            if ($v instanceof self) {\n                $values[$k] = $v->__toString();\n            } elseif (\\is_array($v) && $values[$k] !== $v = static::unwrap($v)) {\n                $values[$k] = $v;\n            }\n        }\n\n        return $values;\n    }\n\n    /**\n     * Wraps (and normalizes) strings in instances of AbstractString.\n     *\n     * @return static[]|array\n     */\n    public static function wrap(array $values): array\n    {\n        $i = 0;\n        $keys = null;\n\n        foreach ($values as $k => $v) {\n            if (\\is_string($k) && '' !== $k && $k !== $j = (string) new static($k)) {\n                $keys ??= array_keys($values);\n                $keys[$i] = $j;\n            }\n\n            if (\\is_string($v)) {\n                $values[$k] = new static($v);\n            } elseif (\\is_array($v) && $values[$k] !== $v = static::wrap($v)) {\n                $values[$k] = $v;\n            }\n\n            ++$i;\n        }\n\n        return null !== $keys ? array_combine($keys, $values) : $values;\n    }\n\n    /**\n     * @param string|string[] $needle\n     */\n    public function after(string|iterable $needle, bool $includeNeedle = false, int $offset = 0): static\n    {\n        $str = clone $this;\n        $i = \\PHP_INT_MAX;\n\n        if (\\is_string($needle)) {\n            $needle = [$needle];\n        }\n\n        foreach ($needle as $n) {\n            $n = (string) $n;\n            $j = $this->indexOf($n, $offset);\n\n            if (null !== $j && $j < $i) {\n                $i = $j;\n                $str->string = $n;\n            }\n        }\n\n        if (\\PHP_INT_MAX === $i) {\n            return $str;\n        }\n\n        if (!$includeNeedle) {\n            $i += $str->length();\n        }\n\n        return $this->slice($i);\n    }\n\n    /**\n     * @param string|string[] $needle\n     */\n    public function afterLast(string|iterable $needle, bool $includeNeedle = false, int $offset = 0): static\n    {\n        $str = clone $this;\n        $i = null;\n\n        if (\\is_string($needle)) {\n            $needle = [$needle];\n        }\n\n        foreach ($needle as $n) {\n            $n = (string) $n;\n            $j = $this->indexOfLast($n, $offset);\n\n            if (null !== $j && $j >= $i) {\n                $i = $offset = $j;\n                $str->string = $n;\n            }\n        }\n\n        if (null === $i) {\n            return $str;\n        }\n\n        if (!$includeNeedle) {\n            $i += $str->length();\n        }\n\n        return $this->slice($i);\n    }\n\n    abstract public function append(string ...$suffix): static;\n\n    /**\n     * @param string|string[] $needle\n     */\n    public function before(string|iterable $needle, bool $includeNeedle = false, int $offset = 0): static\n    {\n        $str = clone $this;\n        $i = \\PHP_INT_MAX;\n\n        if (\\is_string($needle)) {\n            $needle = [$needle];\n        }\n\n        foreach ($needle as $n) {\n            $n = (string) $n;\n            $j = $this->indexOf($n, $offset);\n\n            if (null !== $j && $j < $i) {\n                $i = $j;\n                $str->string = $n;\n            }\n        }\n\n        if (\\PHP_INT_MAX === $i) {\n            return $str;\n        }\n\n        if ($includeNeedle) {\n            $i += $str->length();\n        }\n\n        return $this->slice(0, $i);\n    }\n\n    /**\n     * @param string|string[] $needle\n     */\n    public function beforeLast(string|iterable $needle, bool $includeNeedle = false, int $offset = 0): static\n    {\n        $str = clone $this;\n        $i = null;\n\n        if (\\is_string($needle)) {\n            $needle = [$needle];\n        }\n\n        foreach ($needle as $n) {\n            $n = (string) $n;\n            $j = $this->indexOfLast($n, $offset);\n\n            if (null !== $j && $j >= $i) {\n                $i = $offset = $j;\n                $str->string = $n;\n            }\n        }\n\n        if (null === $i) {\n            return $str;\n        }\n\n        if ($includeNeedle) {\n            $i += $str->length();\n        }\n\n        return $this->slice(0, $i);\n    }\n\n    /**\n     * @return int[]\n     */\n    public function bytesAt(int $offset): array\n    {\n        $str = $this->slice($offset, 1);\n\n        return '' === $str->string ? [] : array_values(unpack('C*', $str->string));\n    }\n\n    abstract public function camel(): static;\n\n    /**\n     * @return static[]\n     */\n    abstract public function chunk(int $length = 1): array;\n\n    public function collapseWhitespace(): static\n    {\n        $str = clone $this;\n        $str->string = trim(preg_replace(\"/(?:[ \\n\\r\\t\\x0C]{2,}+|[\\n\\r\\t\\x0C])/\", ' ', $str->string), \" \\n\\r\\t\\x0C\");\n\n        return $str;\n    }\n\n    /**\n     * @param string|string[] $needle\n     */\n    public function containsAny(string|iterable $needle): bool\n    {\n        return null !== $this->indexOf($needle);\n    }\n\n    /**\n     * @param string|string[] $suffix\n     */\n    public function endsWith(string|iterable $suffix): bool\n    {\n        if (\\is_string($suffix)) {\n            throw new \\TypeError(\\sprintf('Method \"%s()\" must be overridden by class \"%s\" to deal with non-iterable values.', __FUNCTION__, static::class));\n        }\n\n        foreach ($suffix as $s) {\n            if ($this->endsWith((string) $s)) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n\n    public function ensureEnd(string $suffix): static\n    {\n        if (!$this->endsWith($suffix)) {\n            return $this->append($suffix);\n        }\n\n        $suffix = preg_quote($suffix);\n        $regex = '{('.$suffix.')(?:'.$suffix.')++$}D';\n\n        return $this->replaceMatches($regex.($this->ignoreCase ? 'i' : ''), '$1');\n    }\n\n    public function ensureStart(string $prefix): static\n    {\n        $prefix = new static($prefix);\n\n        if (!$this->startsWith($prefix)) {\n            return $this->prepend($prefix);\n        }\n\n        $str = clone $this;\n        $i = $prefixLen = $prefix->length();\n\n        while ($this->indexOf($prefix, $i) === $i) {\n            $str = $str->slice($prefixLen);\n            $i += $prefixLen;\n        }\n\n        return $str;\n    }\n\n    /**\n     * @param string|string[] $string\n     */\n    public function equalsTo(string|iterable $string): bool\n    {\n        if (\\is_string($string)) {\n            throw new \\TypeError(\\sprintf('Method \"%s()\" must be overridden by class \"%s\" to deal with non-iterable values.', __FUNCTION__, static::class));\n        }\n\n        foreach ($string as $s) {\n            if ($this->equalsTo((string) $s)) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n\n    abstract public function folded(): static;\n\n    public function ignoreCase(): static\n    {\n        $str = clone $this;\n        $str->ignoreCase = true;\n\n        return $str;\n    }\n\n    /**\n     * @param string|string[] $needle\n     */\n    public function indexOf(string|iterable $needle, int $offset = 0): ?int\n    {\n        if (\\is_string($needle)) {\n            throw new \\TypeError(\\sprintf('Method \"%s()\" must be overridden by class \"%s\" to deal with non-iterable values.', __FUNCTION__, static::class));\n        }\n\n        $i = \\PHP_INT_MAX;\n\n        foreach ($needle as $n) {\n            $j = $this->indexOf((string) $n, $offset);\n\n            if (null !== $j && $j < $i) {\n                $i = $j;\n            }\n        }\n\n        return \\PHP_INT_MAX === $i ? null : $i;\n    }\n\n    /**\n     * @param string|string[] $needle\n     */\n    public function indexOfLast(string|iterable $needle, int $offset = 0): ?int\n    {\n        if (\\is_string($needle)) {\n            throw new \\TypeError(\\sprintf('Method \"%s()\" must be overridden by class \"%s\" to deal with non-iterable values.', __FUNCTION__, static::class));\n        }\n\n        $i = null;\n\n        foreach ($needle as $n) {\n            $j = $this->indexOfLast((string) $n, $offset);\n\n            if (null !== $j && $j >= $i) {\n                $i = $offset = $j;\n            }\n        }\n\n        return $i;\n    }\n\n    public function isEmpty(): bool\n    {\n        return '' === $this->string;\n    }\n\n    abstract public function join(array $strings, ?string $lastGlue = null): static;\n\n    public function jsonSerialize(): string\n    {\n        return $this->string;\n    }\n\n    abstract public function length(): int;\n\n    abstract public function lower(): static;\n\n    /**\n     * Matches the string using a regular expression.\n     *\n     * Pass PREG_PATTERN_ORDER or PREG_SET_ORDER as $flags to get all occurrences matching the regular expression.\n     *\n     * @return array All matches in a multi-dimensional array ordered according to flags\n     */\n    abstract public function match(string $regexp, int $flags = 0, int $offset = 0): array;\n\n    abstract public function padBoth(int $length, string $padStr = ' '): static;\n\n    abstract public function padEnd(int $length, string $padStr = ' '): static;\n\n    abstract public function padStart(int $length, string $padStr = ' '): static;\n\n    abstract public function prepend(string ...$prefix): static;\n\n    public function repeat(int $multiplier): static\n    {\n        if (0 > $multiplier) {\n            throw new InvalidArgumentException(\\sprintf('Multiplier must be positive, %d given.', $multiplier));\n        }\n\n        $str = clone $this;\n        $str->string = str_repeat($str->string, $multiplier);\n\n        return $str;\n    }\n\n    abstract public function replace(string $from, string $to): static;\n\n    abstract public function replaceMatches(string $fromRegexp, string|callable $to): static;\n\n    abstract public function reverse(): static;\n\n    abstract public function slice(int $start = 0, ?int $length = null): static;\n\n    abstract public function snake(): static;\n\n    public function kebab(): static\n    {\n        return $this->snake()->replace('_', '-');\n    }\n\n    public function pascal(): static\n    {\n        return $this->camel()->title();\n    }\n\n    abstract public function splice(string $replacement, int $start = 0, ?int $length = null): static;\n\n    /**\n     * @return static[]\n     */\n    public function split(string $delimiter, ?int $limit = null, ?int $flags = null): array\n    {\n        if (null === $flags) {\n            throw new \\TypeError('Split behavior when $flags is null must be implemented by child classes.');\n        }\n\n        if ($this->ignoreCase) {\n            $delimiter .= 'i';\n        }\n\n        set_error_handler(static fn ($t, $m) => throw new InvalidArgumentException($m));\n\n        try {\n            if (false === $chunks = preg_split($delimiter, $this->string, $limit, $flags)) {\n                throw new RuntimeException('Splitting failed with error: '.preg_last_error_msg());\n            }\n        } finally {\n            restore_error_handler();\n        }\n\n        $str = clone $this;\n\n        if (self::PREG_SPLIT_OFFSET_CAPTURE & $flags) {\n            foreach ($chunks as &$chunk) {\n                $str->string = $chunk[0];\n                $chunk[0] = clone $str;\n            }\n        } else {\n            foreach ($chunks as &$chunk) {\n                $str->string = $chunk;\n                $chunk = clone $str;\n            }\n        }\n\n        return $chunks;\n    }\n\n    /**\n     * @param string|string[] $prefix\n     */\n    public function startsWith(string|iterable $prefix): bool\n    {\n        if (\\is_string($prefix)) {\n            throw new \\TypeError(\\sprintf('Method \"%s()\" must be overridden by class \"%s\" to deal with non-iterable values.', __FUNCTION__, static::class));\n        }\n\n        foreach ($prefix as $prefix) {\n            if ($this->startsWith((string) $prefix)) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n\n    abstract public function title(bool $allWords = false): static;\n\n    public function toByteString(?string $toEncoding = null): ByteString\n    {\n        $b = new ByteString();\n\n        $toEncoding = \\in_array($toEncoding, ['utf8', 'utf-8', 'UTF8'], true) ? 'UTF-8' : $toEncoding;\n\n        if (null === $toEncoding || $toEncoding === $fromEncoding = $this instanceof AbstractUnicodeString || preg_match('//u', $b->string) ? 'UTF-8' : 'Windows-1252') {\n            $b->string = $this->string;\n\n            return $b;\n        }\n\n        try {\n            $b->string = mb_convert_encoding($this->string, $toEncoding, 'UTF-8');\n        } catch (\\ValueError $e) {\n            if (!\\function_exists('iconv')) {\n                throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e);\n            }\n\n            $b->string = iconv('UTF-8', $toEncoding, $this->string);\n        }\n\n        return $b;\n    }\n\n    public function toCodePointString(): CodePointString\n    {\n        return new CodePointString($this->string);\n    }\n\n    public function toString(): string\n    {\n        return $this->string;\n    }\n\n    public function toUnicodeString(): UnicodeString\n    {\n        return new UnicodeString($this->string);\n    }\n\n    abstract public function trim(string $chars = \" \\t\\n\\r\\0\\x0B\\x0C\\u{A0}\\u{FEFF}\"): static;\n\n    abstract public function trimEnd(string $chars = \" \\t\\n\\r\\0\\x0B\\x0C\\u{A0}\\u{FEFF}\"): static;\n\n    /**\n     * @param string|string[] $prefix\n     */\n    public function trimPrefix($prefix): static\n    {\n        if (\\is_array($prefix) || $prefix instanceof \\Traversable) { // don't use is_iterable(), it's slow\n            foreach ($prefix as $s) {\n                $t = $this->trimPrefix($s);\n\n                if ($t->string !== $this->string) {\n                    return $t;\n                }\n            }\n\n            return clone $this;\n        }\n\n        $str = clone $this;\n\n        if ($prefix instanceof self) {\n            $prefix = $prefix->string;\n        } else {\n            $prefix = (string) $prefix;\n        }\n\n        if ('' !== $prefix && \\strlen($this->string) >= \\strlen($prefix) && 0 === substr_compare($this->string, $prefix, 0, \\strlen($prefix), $this->ignoreCase)) {\n            $str->string = substr($this->string, \\strlen($prefix));\n        }\n\n        return $str;\n    }\n\n    abstract public function trimStart(string $chars = \" \\t\\n\\r\\0\\x0B\\x0C\\u{A0}\\u{FEFF}\"): static;\n\n    /**\n     * @param string|string[] $suffix\n     */\n    public function trimSuffix($suffix): static\n    {\n        if (\\is_array($suffix) || $suffix instanceof \\Traversable) { // don't use is_iterable(), it's slow\n            foreach ($suffix as $s) {\n                $t = $this->trimSuffix($s);\n\n                if ($t->string !== $this->string) {\n                    return $t;\n                }\n            }\n\n            return clone $this;\n        }\n\n        $str = clone $this;\n\n        if ($suffix instanceof self) {\n            $suffix = $suffix->string;\n        } else {\n            $suffix = (string) $suffix;\n        }\n\n        if ('' !== $suffix && \\strlen($this->string) >= \\strlen($suffix) && 0 === substr_compare($this->string, $suffix, -\\strlen($suffix), null, $this->ignoreCase)) {\n            $str->string = substr($this->string, 0, -\\strlen($suffix));\n        }\n\n        return $str;\n    }\n\n    public function truncate(int $length, string $ellipsis = '', bool|TruncateMode $cut = TruncateMode::Char): static\n    {\n        $stringLength = $this->length();\n\n        if ($stringLength <= $length) {\n            return clone $this;\n        }\n\n        $ellipsisLength = '' !== $ellipsis ? (new static($ellipsis))->length() : 0;\n\n        if ($length < $ellipsisLength) {\n            $ellipsisLength = 0;\n        }\n\n        $desiredLength = $length;\n        if (TruncateMode::WordAfter === $cut || !$cut) {\n            if (null === $length = $this->indexOf([' ', \"\\r\", \"\\n\", \"\\t\"], ($length ?: 1) - 1)) {\n                return clone $this;\n            }\n\n            $length += $ellipsisLength;\n        } elseif (TruncateMode::WordBefore === $cut && null !== $this->indexOf([' ', \"\\r\", \"\\n\", \"\\t\"], ($length ?: 1) - 1)) {\n            $length += $ellipsisLength;\n        }\n\n        $str = $this->slice(0, $length - $ellipsisLength);\n\n        if (TruncateMode::WordBefore === $cut) {\n            if (0 === $ellipsisLength && $desiredLength === $this->indexOf([' ', \"\\r\", \"\\n\", \"\\t\"], $length)) {\n                return $str;\n            }\n\n            $str = $str->beforeLast([' ', \"\\r\", \"\\n\", \"\\t\"]);\n        }\n\n        return $ellipsisLength ? $str->trimEnd()->append($ellipsis) : $str;\n    }\n\n    abstract public function upper(): static;\n\n    /**\n     * Returns the printable length on a terminal.\n     */\n    abstract public function width(bool $ignoreAnsiDecoration = true): int;\n\n    public function wordwrap(int $width = 75, string $break = \"\\n\", bool $cut = false): static\n    {\n        $lines = '' !== $break ? $this->split($break) : [clone $this];\n        $chars = [];\n        $mask = '';\n\n        if (1 === \\count($lines) && '' === $lines[0]->string) {\n            return $lines[0];\n        }\n\n        foreach ($lines as $i => $line) {\n            if ($i) {\n                $chars[] = $break;\n                $mask .= '#';\n            }\n\n            foreach ($line->chunk() as $char) {\n                $chars[] = $char->string;\n                $mask .= ' ' === $char->string ? ' ' : '?';\n            }\n        }\n\n        $string = '';\n        $j = 0;\n        $b = $i = -1;\n        $mask = wordwrap($mask, $width, '#', $cut);\n\n        while (false !== $b = strpos($mask, '#', $b + 1)) {\n            for (++$i; $i < $b; ++$i) {\n                $string .= $chars[$j];\n                unset($chars[$j++]);\n            }\n\n            if ($break === $chars[$j] || ' ' === $chars[$j]) {\n                unset($chars[$j++]);\n            }\n\n            $string .= $break;\n        }\n\n        $str = clone $this;\n        $str->string = $string.implode('', $chars);\n\n        return $str;\n    }\n\n    public function __serialize(): array\n    {\n        if (self::class === (new \\ReflectionMethod($this, '__sleep'))->class || self::class !== (new \\ReflectionMethod($this, '__serialize'))->class) {\n            return ['string' => $this->string];\n        }\n\n        trigger_deprecation('symfony/string', '7.4', 'Implementing \"%s::__sleep()\" is deprecated, use \"__serialize()\" instead.', get_debug_type($this));\n\n        $data = [];\n        foreach ($this->__sleep() as $key) {\n            try {\n                if (($r = new \\ReflectionProperty($this, $key))->isInitialized($this)) {\n                    $data[$key] = $r->getValue($this);\n                }\n            } catch (\\ReflectionException) {\n                $data[$key] = $this->$key;\n            }\n        }\n\n        return $data;\n    }\n\n    /**\n     * @deprecated since Symfony 7.4, will be replaced by `__unserialize()` in 8.0\n     */\n    public function __sleep(): array\n    {\n        trigger_deprecation('symfony/string', '7.4', 'Calling \"%s::__sleep()\" is deprecated, use \"__serialize()\" instead.', get_debug_type($this));\n\n        return ['string'];\n    }\n\n    public function __clone()\n    {\n        $this->ignoreCase = false;\n    }\n\n    public function __toString(): string\n    {\n        return $this->string;\n    }\n}\n","vendor/symfony/string/AbstractUnicodeString.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\String;\n\nuse Symfony\\Component\\String\\Exception\\ExceptionInterface;\nuse Symfony\\Component\\String\\Exception\\InvalidArgumentException;\nuse Symfony\\Component\\String\\Exception\\RuntimeException;\n\n/**\n * Represents a string of abstract Unicode characters.\n *\n * Unicode defines 3 types of \"characters\" (bytes, code points and grapheme clusters).\n * This class is the abstract type to use as a type-hint when the logic you want to\n * implement is Unicode-aware but doesn't care about code points vs grapheme clusters.\n *\n * @author Nicolas Grekas <p@tchwork.com>\n *\n * @throws ExceptionInterface\n */\nabstract class AbstractUnicodeString extends AbstractString\n{\n    public const NFC = \\Normalizer::NFC;\n    public const NFD = \\Normalizer::NFD;\n    public const NFKC = \\Normalizer::NFKC;\n    public const NFKD = \\Normalizer::NFKD;\n\n    // all ASCII letters sorted by typical frequency of occurrence\n    private const ASCII = \"\\x20\\x65\\x69\\x61\\x73\\x6E\\x74\\x72\\x6F\\x6C\\x75\\x64\\x5D\\x5B\\x63\\x6D\\x70\\x27\\x0A\\x67\\x7C\\x68\\x76\\x2E\\x66\\x62\\x2C\\x3A\\x3D\\x2D\\x71\\x31\\x30\\x43\\x32\\x2A\\x79\\x78\\x29\\x28\\x4C\\x39\\x41\\x53\\x2F\\x50\\x22\\x45\\x6A\\x4D\\x49\\x6B\\x33\\x3E\\x35\\x54\\x3C\\x44\\x34\\x7D\\x42\\x7B\\x38\\x46\\x77\\x52\\x36\\x37\\x55\\x47\\x4E\\x3B\\x4A\\x7A\\x56\\x23\\x48\\x4F\\x57\\x5F\\x26\\x21\\x4B\\x3F\\x58\\x51\\x25\\x59\\x5C\\x09\\x5A\\x2B\\x7E\\x5E\\x24\\x40\\x60\\x7F\\x00\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\x08\\x0B\\x0C\\x0D\\x0E\\x0F\\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17\\x18\\x19\\x1A\\x1B\\x1C\\x1D\\x1E\\x1F\";\n\n    // the subset of folded case mappings that is not in lower case mappings\n    private const FOLD_FROM = ['İ', 'µ', 'ſ', \"\\xCD\\x85\", 'ς', 'ϐ', 'ϑ', 'ϕ', 'ϖ', 'ϰ', 'ϱ', 'ϵ', 'ẛ', \"\\xE1\\xBE\\xBE\", 'ß', 'ŉ', 'ǰ', 'ΐ', 'ΰ', 'և', 'ẖ', 'ẗ', 'ẘ', 'ẙ', 'ẚ', 'ẞ', 'ὐ', 'ὒ', 'ὔ', 'ὖ', 'ᾀ', 'ᾁ', 'ᾂ', 'ᾃ', 'ᾄ', 'ᾅ', 'ᾆ', 'ᾇ', 'ᾈ', 'ᾉ', 'ᾊ', 'ᾋ', 'ᾌ', 'ᾍ', 'ᾎ', 'ᾏ', 'ᾐ', 'ᾑ', 'ᾒ', 'ᾓ', 'ᾔ', 'ᾕ', 'ᾖ', 'ᾗ', 'ᾘ', 'ᾙ', 'ᾚ', 'ᾛ', 'ᾜ', 'ᾝ', 'ᾞ', 'ᾟ', 'ᾠ', 'ᾡ', 'ᾢ', 'ᾣ', 'ᾤ', 'ᾥ', 'ᾦ', 'ᾧ', 'ᾨ', 'ᾩ', 'ᾪ', 'ᾫ', 'ᾬ', 'ᾭ', 'ᾮ', 'ᾯ', 'ᾲ', 'ᾳ', 'ᾴ', 'ᾶ', 'ᾷ', 'ᾼ', 'ῂ', 'ῃ', 'ῄ', 'ῆ', 'ῇ', 'ῌ', 'ῒ', 'ῖ', 'ῗ', 'ῢ', 'ῤ', 'ῦ', 'ῧ', 'ῲ', 'ῳ', 'ῴ', 'ῶ', 'ῷ', 'ῼ', 'ﬀ', 'ﬁ', 'ﬂ', 'ﬃ', 'ﬄ', 'ﬅ', 'ﬆ', 'ﬓ', 'ﬔ', 'ﬕ', 'ﬖ', 'ﬗ'];\n    private const FOLD_TO = ['i̇', 'μ', 's', 'ι', 'σ', 'β', 'θ', 'φ', 'π', 'κ', 'ρ', 'ε', 'ṡ', 'ι', 'ss', 'ʼn', 'ǰ', 'ΐ', 'ΰ', 'եւ', 'ẖ', 'ẗ', 'ẘ', 'ẙ', 'aʾ', 'ss', 'ὐ', 'ὒ', 'ὔ', 'ὖ', 'ἀι', 'ἁι', 'ἂι', 'ἃι', 'ἄι', 'ἅι', 'ἆι', 'ἇι', 'ἀι', 'ἁι', 'ἂι', 'ἃι', 'ἄι', 'ἅι', 'ἆι', 'ἇι', 'ἠι', 'ἡι', 'ἢι', 'ἣι', 'ἤι', 'ἥι', 'ἦι', 'ἧι', 'ἠι', 'ἡι', 'ἢι', 'ἣι', 'ἤι', 'ἥι', 'ἦι', 'ἧι', 'ὠι', 'ὡι', 'ὢι', 'ὣι', 'ὤι', 'ὥι', 'ὦι', 'ὧι', 'ὠι', 'ὡι', 'ὢι', 'ὣι', 'ὤι', 'ὥι', 'ὦι', 'ὧι', 'ὰι', 'αι', 'άι', 'ᾶ', 'ᾶι', 'αι', 'ὴι', 'ηι', 'ήι', 'ῆ', 'ῆι', 'ηι', 'ῒ', 'ῖ', 'ῗ', 'ῢ', 'ῤ', 'ῦ', 'ῧ', 'ὼι', 'ωι', 'ώι', 'ῶ', 'ῶι', 'ωι', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'st', 'st', 'մն', 'մե', 'մի', 'վն', 'մխ'];\n\n    // the subset of https://github.com/unicode-org/cldr/blob/master/common/transforms/Latin-ASCII.xml that is not in NFKD\n    private const TRANSLIT_FROM = ['Æ', 'Ð', 'Ø', 'Þ', 'ß', 'æ', 'ð', 'ø', 'þ', 'Đ', 'đ', 'Ħ', 'ħ', 'ı', 'ĸ', 'Ŀ', 'ŀ', 'Ł', 'ł', 'ŉ', 'Ŋ', 'ŋ', 'Œ', 'œ', 'Ŧ', 'ŧ', 'ƀ', 'Ɓ', 'Ƃ', 'ƃ', 'Ƈ', 'ƈ', 'Ɖ', 'Ɗ', 'Ƌ', 'ƌ', 'Ɛ', 'Ƒ', 'ƒ', 'Ɠ', 'ƕ', 'Ɩ', 'Ɨ', 'Ƙ', 'ƙ', 'ƚ', 'Ɲ', 'ƞ', 'Ƣ', 'ƣ', 'Ƥ', 'ƥ', 'ƫ', 'Ƭ', 'ƭ', 'Ʈ', 'Ʋ', 'Ƴ', 'ƴ', 'Ƶ', 'ƶ', 'Ǆ', 'ǅ', 'ǆ', 'Ǥ', 'ǥ', 'ȡ', 'Ȥ', 'ȥ', 'ȴ', 'ȵ', 'ȶ', 'ȷ', 'ȸ', 'ȹ', 'Ⱥ', 'Ȼ', 'ȼ', 'Ƚ', 'Ⱦ', 'ȿ', 'ɀ', 'Ƀ', 'Ʉ', 'Ɇ', 'ɇ', 'Ɉ', 'ɉ', 'Ɍ', 'ɍ', 'Ɏ', 'ɏ', 'ɓ', 'ɕ', 'ɖ', 'ɗ', 'ɛ', 'ɟ', 'ɠ', 'ɡ', 'ɢ', 'ɦ', 'ɧ', 'ɨ', 'ɪ', 'ɫ', 'ɬ', 'ɭ', 'ɱ', 'ɲ', 'ɳ', 'ɴ', 'ɶ', 'ɼ', 'ɽ', 'ɾ', 'ʀ', 'ʂ', 'ʈ', 'ʉ', 'ʋ', 'ʏ', 'ʐ', 'ʑ', 'ʙ', 'ʛ', 'ʜ', 'ʝ', 'ʟ', 'ʠ', 'ʣ', 'ʥ', 'ʦ', 'ʪ', 'ʫ', 'ᴀ', 'ᴁ', 'ᴃ', 'ᴄ', 'ᴅ', 'ᴆ', 'ᴇ', 'ᴊ', 'ᴋ', 'ᴌ', 'ᴍ', 'ᴏ', 'ᴘ', 'ᴛ', 'ᴜ', 'ᴠ', 'ᴡ', 'ᴢ', 'ᵫ', 'ᵬ', 'ᵭ', 'ᵮ', 'ᵯ', 'ᵰ', 'ᵱ', 'ᵲ', 'ᵳ', 'ᵴ', 'ᵵ', 'ᵶ', 'ᵺ', 'ᵻ', 'ᵽ', 'ᵾ', 'ᶀ', 'ᶁ', 'ᶂ', 'ᶃ', 'ᶄ', 'ᶅ', 'ᶆ', 'ᶇ', 'ᶈ', 'ᶉ', 'ᶊ', 'ᶌ', 'ᶍ', 'ᶎ', 'ᶏ', 'ᶑ', 'ᶒ', 'ᶓ', 'ᶖ', 'ᶙ', 'ẚ', 'ẜ', 'ẝ', 'ẞ', 'Ỻ', 'ỻ', 'Ỽ', 'ỽ', 'Ỿ', 'ỿ', '©', '®', '₠', '₢', '₣', '₤', '₧', '₺', '₹', 'ℌ', '℞', '㎧', '㎮', '㏆', '㏗', '㏞', '㏟', '¼', '½', '¾', '⅓', '⅔', '⅕', '⅖', '⅗', '⅘', '⅙', '⅚', '⅛', '⅜', '⅝', '⅞', '⅟', '〇', '‘', '’', '‚', '‛', '“', '”', '„', '‟', '′', '″', '〝', '〞', '«', '»', '‹', '›', '‐', '‑', '‒', '–', '—', '―', '︱', '︲', '﹘', '‖', '⁄', '⁅', '⁆', '⁎', '、', '。', '〈', '〉', '《', '》', '〔', '〕', '〘', '〙', '〚', '〛', '︑', '︒', '︹', '︺', '︽', '︾', '︿', '﹀', '﹑', '﹝', '﹞', '｟', '｠', '｡', '､', '×', '÷', '−', '∕', '∖', '∣', '∥', '≪', '≫', '⦅', '⦆'];\n    private const TRANSLIT_TO = ['AE', 'D', 'O', 'TH', 'ss', 'ae', 'd', 'o', 'th', 'D', 'd', 'H', 'h', 'i', 'q', 'L', 'l', 'L', 'l', '\\'n', 'N', 'n', 'OE', 'oe', 'T', 't', 'b', 'B', 'B', 'b', 'C', 'c', 'D', 'D', 'D', 'd', 'E', 'F', 'f', 'G', 'hv', 'I', 'I', 'K', 'k', 'l', 'N', 'n', 'OI', 'oi', 'P', 'p', 't', 'T', 't', 'T', 'V', 'Y', 'y', 'Z', 'z', 'DZ', 'Dz', 'dz', 'G', 'g', 'd', 'Z', 'z', 'l', 'n', 't', 'j', 'db', 'qp', 'A', 'C', 'c', 'L', 'T', 's', 'z', 'B', 'U', 'E', 'e', 'J', 'j', 'R', 'r', 'Y', 'y', 'b', 'c', 'd', 'd', 'e', 'j', 'g', 'g', 'G', 'h', 'h', 'i', 'I', 'l', 'l', 'l', 'm', 'n', 'n', 'N', 'OE', 'r', 'r', 'r', 'R', 's', 't', 'u', 'v', 'Y', 'z', 'z', 'B', 'G', 'H', 'j', 'L', 'q', 'dz', 'dz', 'ts', 'ls', 'lz', 'A', 'AE', 'B', 'C', 'D', 'D', 'E', 'J', 'K', 'L', 'M', 'O', 'P', 'T', 'U', 'V', 'W', 'Z', 'ue', 'b', 'd', 'f', 'm', 'n', 'p', 'r', 'r', 's', 't', 'z', 'th', 'I', 'p', 'U', 'b', 'd', 'f', 'g', 'k', 'l', 'm', 'n', 'p', 'r', 's', 'v', 'x', 'z', 'a', 'd', 'e', 'e', 'i', 'u', 'a', 's', 's', 'SS', 'LL', 'll', 'V', 'v', 'Y', 'y', '(C)', '(R)', 'CE', 'Cr', 'Fr.', 'L.', 'Pts', 'TL', 'Rs', 'x', 'Rx', 'm/s', 'rad/s', 'C/kg', 'pH', 'V/m', 'A/m', ' 1/4', ' 1/2', ' 3/4', ' 1/3', ' 2/3', ' 1/5', ' 2/5', ' 3/5', ' 4/5', ' 1/6', ' 5/6', ' 1/8', ' 3/8', ' 5/8', ' 7/8', ' 1/', '0', '\\'', '\\'', ',', '\\'', '\"', '\"', ',,', '\"', '\\'', '\"', '\"', '\"', '<<', '>>', '<', '>', '-', '-', '-', '-', '-', '-', '-', '-', '-', '||', '/', '[', ']', '*', ',', '.', '<', '>', '<<', '>>', '[', ']', '[', ']', '[', ']', ',', '.', '[', ']', '<<', '>>', '<', '>', ',', '[', ']', '((', '))', '.', ',', '*', '/', '-', '/', '\\\\', '|', '||', '<<', '>>', '((', '))'];\n\n    private static array $transliterators = [];\n    private static array $tableZero;\n    private static array $tableWide;\n\n    public static function fromCodePoints(int ...$codes): static\n    {\n        $string = '';\n\n        foreach ($codes as $code) {\n            if (0x80 > $code %= 0x200000) {\n                $string .= \\chr($code);\n            } elseif (0x800 > $code) {\n                $string .= \\chr(0xC0 | $code >> 6).\\chr(0x80 | $code & 0x3F);\n            } elseif (0x10000 > $code) {\n                $string .= \\chr(0xE0 | $code >> 12).\\chr(0x80 | $code >> 6 & 0x3F).\\chr(0x80 | $code & 0x3F);\n            } else {\n                $string .= \\chr(0xF0 | $code >> 18).\\chr(0x80 | $code >> 12 & 0x3F).\\chr(0x80 | $code >> 6 & 0x3F).\\chr(0x80 | $code & 0x3F);\n            }\n        }\n\n        return new static($string);\n    }\n\n    /**\n     * Generic UTF-8 to ASCII transliteration.\n     *\n     * Install the intl extension for best results.\n     *\n     * @param string[]|\\Transliterator[]|\\Closure[] $rules See \"*-Latin\" rules from Transliterator::listIDs()\n     */\n    public function ascii(array $rules = []): self\n    {\n        $str = clone $this;\n        $s = $str->string;\n        $str->string = '';\n\n        array_unshift($rules, 'nfd');\n        $rules[] = 'latin-ascii';\n\n        if (\\function_exists('transliterator_transliterate')) {\n            $rules[] = 'any-latin/bgn';\n        }\n\n        $rules[] = 'nfkd';\n        $rules[] = '[:nonspacing mark:] remove';\n\n        while (\\strlen($s) - 1 > $i = strspn($s, self::ASCII)) {\n            if (0 < --$i) {\n                $str->string .= substr($s, 0, $i);\n                $s = substr($s, $i);\n            }\n\n            if (!$rule = array_shift($rules)) {\n                $rules = []; // An empty rule interrupts the next ones\n            }\n\n            if ($rule instanceof \\Transliterator) {\n                $s = $rule->transliterate($s);\n            } elseif ($rule instanceof \\Closure) {\n                $s = $rule($s);\n            } elseif ($rule) {\n                if ('nfd' === $rule = strtolower($rule)) {\n                    normalizer_is_normalized($s, self::NFD) ?: $s = normalizer_normalize($s, self::NFD);\n                } elseif ('nfkd' === $rule) {\n                    normalizer_is_normalized($s, self::NFKD) ?: $s = normalizer_normalize($s, self::NFKD);\n                } elseif ('[:nonspacing mark:] remove' === $rule) {\n                    $s = preg_replace('/\\p{Mn}++/u', '', $s);\n                } elseif ('latin-ascii' === $rule) {\n                    $s = str_replace(self::TRANSLIT_FROM, self::TRANSLIT_TO, $s);\n                } elseif ('de-ascii' === $rule) {\n                    $s = preg_replace(\"/([AUO])\\u{0308}(?=\\p{Ll})/u\", '$1e', $s);\n                    $s = str_replace([\"a\\u{0308}\", \"o\\u{0308}\", \"u\\u{0308}\", \"A\\u{0308}\", \"O\\u{0308}\", \"U\\u{0308}\"], ['ae', 'oe', 'ue', 'AE', 'OE', 'UE'], $s);\n                } elseif (\\function_exists('transliterator_transliterate')) {\n                    if (null === $transliterator = self::$transliterators[$rule] ??= \\Transliterator::create($rule)) {\n                        if ('any-latin/bgn' === $rule) {\n                            $rule = 'any-latin';\n                            $transliterator = self::$transliterators[$rule] ??= \\Transliterator::create($rule);\n                        }\n\n                        if (null === $transliterator) {\n                            throw new InvalidArgumentException(\\sprintf('Unknown transliteration rule \"%s\".', $rule));\n                        }\n\n                        self::$transliterators['any-latin/bgn'] = $transliterator;\n                    }\n\n                    $s = $transliterator->transliterate($s);\n                }\n            } elseif (!\\function_exists('iconv')) {\n                $s = preg_replace('/[^\\x00-\\x7F]/u', '?', $s);\n            } else {\n                $previousLocale = setlocale(\\LC_CTYPE, 0);\n                try {\n                    setlocale(\\LC_CTYPE, 'C');\n                    $s = @preg_replace_callback('/[^\\x00-\\x7F]/u', static function ($c) {\n                        $c = (string) iconv('UTF-8', 'ASCII//TRANSLIT', $c[0]);\n\n                        if ('' === $c && '' === iconv('UTF-8', 'ASCII//TRANSLIT', '²')) {\n                            throw new \\LogicException(\\sprintf('\"%s\" requires a translit-able iconv implementation, try installing \"gnu-libiconv\" if you\\'re using Alpine Linux.', static::class));\n                        }\n\n                        return 1 < \\strlen($c) ? ltrim($c, '\\'`\"^~') : ('' !== $c ? $c : '?');\n                    }, $s);\n                } finally {\n                    setlocale(\\LC_CTYPE, $previousLocale);\n                }\n            }\n        }\n\n        $str->string .= $s;\n\n        return $str;\n    }\n\n    public function camel(): static\n    {\n        $str = clone $this;\n        $str->string = str_replace(' ', '', preg_replace_callback('/\\b.(?!\\p{Lu})/u', static function ($m) {\n            static $i = 0;\n\n            return 1 === ++$i ? ('İ' === $m[0] ? 'i̇' : mb_strtolower($m[0], 'UTF-8')) : mb_convert_case($m[0], \\MB_CASE_TITLE, 'UTF-8');\n        }, preg_replace('/[^\\pL0-9]++/u', ' ', $this->string)));\n\n        return $str;\n    }\n\n    /**\n     * @return int[]\n     */\n    public function codePointsAt(int $offset): array\n    {\n        $str = $this->slice($offset, 1);\n\n        if ('' === $str->string) {\n            return [];\n        }\n\n        $codePoints = [];\n\n        foreach (preg_split('//u', $str->string, -1, \\PREG_SPLIT_NO_EMPTY) as $c) {\n            $codePoints[] = mb_ord($c, 'UTF-8');\n        }\n\n        return $codePoints;\n    }\n\n    public function folded(bool $compat = true): static\n    {\n        $str = clone $this;\n\n        if (!$compat || !\\defined('Normalizer::NFKC_CF')) {\n            $str->string = normalizer_normalize($str->string, $compat ? \\Normalizer::NFKC : \\Normalizer::NFC);\n            $str->string = mb_strtolower(str_replace(self::FOLD_FROM, self::FOLD_TO, $str->string), 'UTF-8');\n        } else {\n            $str->string = normalizer_normalize($str->string, \\Normalizer::NFKC_CF);\n        }\n\n        return $str;\n    }\n\n    public function join(array $strings, ?string $lastGlue = null): static\n    {\n        $str = clone $this;\n\n        $tail = null !== $lastGlue && 1 < \\count($strings) ? $lastGlue.array_pop($strings) : '';\n        $str->string = implode($this->string, $strings).$tail;\n\n        if (!preg_match('//u', $str->string)) {\n            throw new InvalidArgumentException('Invalid UTF-8 string.');\n        }\n\n        return $str;\n    }\n\n    public function lower(): static\n    {\n        $str = clone $this;\n        $str->string = mb_strtolower(str_replace('İ', 'i̇', $str->string), 'UTF-8');\n\n        return $str;\n    }\n\n    /**\n     * @param string $locale In the format language_region (e.g. tr_TR)\n     */\n    public function localeLower(string $locale): static\n    {\n        if (null !== $transliterator = $this->getLocaleTransliterator($locale, 'Lower')) {\n            $str = clone $this;\n            $str->string = $transliterator->transliterate($str->string);\n\n            return $str;\n        }\n\n        return $this->lower();\n    }\n\n    public function match(string $regexp, int $flags = 0, int $offset = 0): array\n    {\n        $match = ((\\PREG_PATTERN_ORDER | \\PREG_SET_ORDER) & $flags) ? 'preg_match_all' : 'preg_match';\n\n        if ($this->ignoreCase) {\n            $regexp .= 'i';\n        }\n\n        set_error_handler(static fn ($t, $m) => throw new InvalidArgumentException($m));\n\n        try {\n            if (false === $match($regexp.'u', $this->string, $matches, $flags | \\PREG_UNMATCHED_AS_NULL, $offset)) {\n                throw new RuntimeException('Matching failed with error: '.preg_last_error_msg());\n            }\n        } finally {\n            restore_error_handler();\n        }\n\n        return $matches;\n    }\n\n    public function normalize(int $form = self::NFC): static\n    {\n        if (!\\in_array($form, [self::NFC, self::NFD, self::NFKC, self::NFKD], true)) {\n            throw new InvalidArgumentException('Unsupported normalization form.');\n        }\n\n        $str = clone $this;\n        normalizer_is_normalized($str->string, $form) ?: $str->string = normalizer_normalize($str->string, $form);\n\n        return $str;\n    }\n\n    public function padBoth(int $length, string $padStr = ' '): static\n    {\n        if ('' === $padStr || !preg_match('//u', $padStr)) {\n            throw new InvalidArgumentException('Invalid UTF-8 string.');\n        }\n\n        $pad = clone $this;\n        $pad->string = $padStr;\n\n        return $this->pad($length, $pad, \\STR_PAD_BOTH);\n    }\n\n    public function padEnd(int $length, string $padStr = ' '): static\n    {\n        if ('' === $padStr || !preg_match('//u', $padStr)) {\n            throw new InvalidArgumentException('Invalid UTF-8 string.');\n        }\n\n        $pad = clone $this;\n        $pad->string = $padStr;\n\n        return $this->pad($length, $pad, \\STR_PAD_RIGHT);\n    }\n\n    public function padStart(int $length, string $padStr = ' '): static\n    {\n        if ('' === $padStr || !preg_match('//u', $padStr)) {\n            throw new InvalidArgumentException('Invalid UTF-8 string.');\n        }\n\n        $pad = clone $this;\n        $pad->string = $padStr;\n\n        return $this->pad($length, $pad, \\STR_PAD_LEFT);\n    }\n\n    public function replaceMatches(string $fromRegexp, string|callable $to): static\n    {\n        if ($this->ignoreCase) {\n            $fromRegexp .= 'i';\n        }\n\n        if (\\is_array($to) || $to instanceof \\Closure) {\n            $replace = 'preg_replace_callback';\n            $to = static function (array $m) use ($to): string {\n                $to = $to($m);\n\n                if ('' !== $to && (!\\is_string($to) || !preg_match('//u', $to))) {\n                    throw new InvalidArgumentException('Replace callback must return a valid UTF-8 string.');\n                }\n\n                return $to;\n            };\n        } elseif ('' !== $to && !preg_match('//u', $to)) {\n            throw new InvalidArgumentException('Invalid UTF-8 string.');\n        } else {\n            $replace = 'preg_replace';\n        }\n\n        set_error_handler(static fn ($t, $m) => throw new InvalidArgumentException($m));\n\n        try {\n            if (null === $string = $replace($fromRegexp.'u', $to, $this->string)) {\n                $lastError = preg_last_error();\n\n                foreach (get_defined_constants(true)['pcre'] as $k => $v) {\n                    if ($lastError === $v && str_ends_with($k, '_ERROR')) {\n                        throw new RuntimeException('Matching failed with '.$k.'.');\n                    }\n                }\n\n                throw new RuntimeException('Matching failed with unknown error code.');\n            }\n        } finally {\n            restore_error_handler();\n        }\n\n        $str = clone $this;\n        $str->string = $string;\n\n        return $str;\n    }\n\n    public function reverse(): static\n    {\n        $str = clone $this;\n        $str->string = implode('', array_reverse(grapheme_str_split($str->string)));\n\n        return $str;\n    }\n\n    public function snake(): static\n    {\n        $str = $this->camel();\n        $str->string = mb_strtolower(preg_replace(['/(\\p{Lu}+)(\\p{Lu}\\p{Ll})/u', '/([\\p{Ll}0-9])(\\p{Lu})/u'], '\\1_\\2', $str->string), 'UTF-8');\n\n        return $str;\n    }\n\n    public function title(bool $allWords = false): static\n    {\n        $str = clone $this;\n\n        $limit = $allWords ? -1 : 1;\n\n        $str->string = preg_replace_callback('/\\b./u', static fn (array $m): string => mb_convert_case($m[0], \\MB_CASE_TITLE, 'UTF-8'), $str->string, $limit);\n\n        return $str;\n    }\n\n    /**\n     * @param string $locale In the format language_region (e.g. tr_TR)\n     */\n    public function localeTitle(string $locale): static\n    {\n        if (null !== $transliterator = $this->getLocaleTransliterator($locale, 'Title')) {\n            $str = clone $this;\n            $str->string = $transliterator->transliterate($str->string);\n\n            return $str;\n        }\n\n        return $this->title();\n    }\n\n    public function trim(string $chars = \" \\t\\n\\r\\0\\x0B\\x0C\\u{A0}\\u{FEFF}\"): static\n    {\n        if (\" \\t\\n\\r\\0\\x0B\\x0C\\u{A0}\\u{FEFF}\" !== $chars && !preg_match('//u', $chars)) {\n            throw new InvalidArgumentException('Invalid UTF-8 chars.');\n        }\n        $chars = preg_quote($chars);\n\n        $str = clone $this;\n        $str->string = preg_replace(\"{^[$chars]++|[$chars]++$}uD\", '', $str->string);\n\n        return $str;\n    }\n\n    public function trimEnd(string $chars = \" \\t\\n\\r\\0\\x0B\\x0C\\u{A0}\\u{FEFF}\"): static\n    {\n        if (\" \\t\\n\\r\\0\\x0B\\x0C\\u{A0}\\u{FEFF}\" !== $chars && !preg_match('//u', $chars)) {\n            throw new InvalidArgumentException('Invalid UTF-8 chars.');\n        }\n        $chars = preg_quote($chars);\n\n        $str = clone $this;\n        $str->string = preg_replace(\"{[$chars]++$}uD\", '', $str->string);\n\n        return $str;\n    }\n\n    public function trimPrefix($prefix): static\n    {\n        if (!$this->ignoreCase) {\n            return parent::trimPrefix($prefix);\n        }\n\n        $str = clone $this;\n\n        if ($prefix instanceof \\Traversable) {\n            $prefix = iterator_to_array($prefix, false);\n        } elseif ($prefix instanceof parent) {\n            $prefix = $prefix->string;\n        }\n\n        $prefix = implode('|', array_map('preg_quote', (array) $prefix));\n        $str->string = preg_replace(\"{^(?:$prefix)}iuD\", '', $this->string);\n\n        return $str;\n    }\n\n    public function trimStart(string $chars = \" \\t\\n\\r\\0\\x0B\\x0C\\u{A0}\\u{FEFF}\"): static\n    {\n        if (\" \\t\\n\\r\\0\\x0B\\x0C\\u{A0}\\u{FEFF}\" !== $chars && !preg_match('//u', $chars)) {\n            throw new InvalidArgumentException('Invalid UTF-8 chars.');\n        }\n        $chars = preg_quote($chars);\n\n        $str = clone $this;\n        $str->string = preg_replace(\"{^[$chars]++}uD\", '', $str->string);\n\n        return $str;\n    }\n\n    public function trimSuffix($suffix): static\n    {\n        if (!$this->ignoreCase) {\n            return parent::trimSuffix($suffix);\n        }\n\n        $str = clone $this;\n\n        if ($suffix instanceof \\Traversable) {\n            $suffix = iterator_to_array($suffix, false);\n        } elseif ($suffix instanceof parent) {\n            $suffix = $suffix->string;\n        }\n\n        $suffix = implode('|', array_map('preg_quote', (array) $suffix));\n        $str->string = preg_replace(\"{(?:$suffix)$}iuD\", '', $this->string);\n\n        return $str;\n    }\n\n    public function upper(): static\n    {\n        $str = clone $this;\n        $str->string = mb_strtoupper($str->string, 'UTF-8');\n\n        return $str;\n    }\n\n    /**\n     * @param string $locale In the format language_region (e.g. tr_TR)\n     */\n    public function localeUpper(string $locale): static\n    {\n        if (null !== $transliterator = $this->getLocaleTransliterator($locale, 'Upper')) {\n            $str = clone $this;\n            $str->string = $transliterator->transliterate($str->string);\n\n            return $str;\n        }\n\n        return $this->upper();\n    }\n\n    public function width(bool $ignoreAnsiDecoration = true): int\n    {\n        $width = 0;\n        $s = str_replace([\"\\x00\", \"\\x05\", \"\\x07\"], '', $this->string);\n\n        if (str_contains($s, \"\\r\")) {\n            $s = str_replace([\"\\r\\n\", \"\\r\"], \"\\n\", $s);\n        }\n\n        if (!$ignoreAnsiDecoration) {\n            $s = preg_replace('/[\\p{Cc}\\x7F]++/u', '', $s);\n        }\n\n        foreach (explode(\"\\n\", $s) as $s) {\n            if ($ignoreAnsiDecoration) {\n                $s = preg_replace('/(?:\\x1B(?:\n                    \\[ [\\x30-\\x3F]*+ [\\x20-\\x2F]*+ [\\x40-\\x7E]\n                    | [P\\]X^_] .*? \\x1B\\\\\\\\\n                    | [\\x41-\\x7E]\n                )|[\\p{Cc}\\x7F]++)/xu', '', $s);\n            }\n\n            $lineWidth = $this->wcswidth($s);\n\n            if ($lineWidth > $width) {\n                $width = $lineWidth;\n            }\n        }\n\n        return $width;\n    }\n\n    private function pad(int $len, self $pad, int $type): static\n    {\n        $sLen = $this->length();\n\n        if ($len <= $sLen) {\n            return clone $this;\n        }\n\n        $padLen = $pad->length();\n        $freeLen = $len - $sLen;\n        $len = $freeLen % $padLen;\n\n        switch ($type) {\n            case \\STR_PAD_RIGHT:\n                return $this->append(str_repeat($pad->string, intdiv($freeLen, $padLen)).($len ? $pad->slice(0, $len) : ''));\n\n            case \\STR_PAD_LEFT:\n                return $this->prepend(str_repeat($pad->string, intdiv($freeLen, $padLen)).($len ? $pad->slice(0, $len) : ''));\n\n            case \\STR_PAD_BOTH:\n                $freeLen /= 2;\n\n                $rightLen = ceil($freeLen);\n                $len = $rightLen % $padLen;\n                $str = $this->append(str_repeat($pad->string, intdiv($rightLen, $padLen)).($len ? $pad->slice(0, $len) : ''));\n\n                $leftLen = floor($freeLen);\n                $len = $leftLen % $padLen;\n\n                return $str->prepend(str_repeat($pad->string, intdiv($leftLen, $padLen)).($len ? $pad->slice(0, $len) : ''));\n\n            default:\n                throw new InvalidArgumentException('Invalid padding type.');\n        }\n    }\n\n    /**\n     * Based on https://github.com/jquast/wcwidth, a Python implementation of https://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c.\n     */\n    private function wcswidth(string $string): int\n    {\n        $width = 0;\n        $lastChar = null;\n        $lastWidth = null;\n\n        foreach (preg_split('//u', $string, -1, \\PREG_SPLIT_NO_EMPTY) as $c) {\n            $codePoint = mb_ord($c, 'UTF-8');\n\n            if (0 === $codePoint // NULL\n                || 0x034F === $codePoint // COMBINING GRAPHEME JOINER\n                || (0x200B <= $codePoint && 0x200F >= $codePoint) // ZERO WIDTH SPACE to RIGHT-TO-LEFT MARK\n                || 0x2028 === $codePoint // LINE SEPARATOR\n                || 0x2029 === $codePoint // PARAGRAPH SEPARATOR\n                || (0x202A <= $codePoint && 0x202E >= $codePoint) // LEFT-TO-RIGHT EMBEDDING to RIGHT-TO-LEFT OVERRIDE\n                || (0x2060 <= $codePoint && 0x2063 >= $codePoint) // WORD JOINER to INVISIBLE SEPARATOR\n            ) {\n                continue;\n            }\n\n            // Non printable characters\n            if (32 > $codePoint // C0 control characters\n                || (0x07F <= $codePoint && 0x0A0 > $codePoint) // C1 control characters and DEL\n            ) {\n                return -1;\n            }\n\n            if (0xFE0F === $codePoint) {\n                if (\\PCRE_VERSION_MAJOR < 10 || \\PCRE_VERSION_MAJOR === 10 && \\PCRE_VERSION_MINOR < 40) {\n                    $regex = '/\\p{So}/u';\n                } else {\n                    $regex = '/\\p{Emoji}/u';\n                }\n                if (null !== $lastChar && 1 === $lastWidth && preg_match($regex, $lastChar)) {\n                    ++$width;\n                    $lastWidth = 2;\n                }\n\n                continue;\n            }\n\n            self::$tableZero ??= require __DIR__.'/Resources/data/wcswidth_table_zero.php';\n\n            if ($codePoint >= self::$tableZero[0][0] && $codePoint <= self::$tableZero[$ubound = \\count(self::$tableZero) - 1][1]) {\n                $lbound = 0;\n                while ($ubound >= $lbound) {\n                    $mid = floor(($lbound + $ubound) / 2);\n\n                    if ($codePoint > self::$tableZero[$mid][1]) {\n                        $lbound = $mid + 1;\n                    } elseif ($codePoint < self::$tableZero[$mid][0]) {\n                        $ubound = $mid - 1;\n                    } else {\n                        continue 2;\n                    }\n                }\n            }\n\n            self::$tableWide ??= require __DIR__.'/Resources/data/wcswidth_table_wide.php';\n\n            if ($codePoint >= self::$tableWide[0][0] && $codePoint <= self::$tableWide[$ubound = \\count(self::$tableWide) - 1][1]) {\n                $lbound = 0;\n                while ($ubound >= $lbound) {\n                    $mid = floor(($lbound + $ubound) / 2);\n\n                    if ($codePoint > self::$tableWide[$mid][1]) {\n                        $lbound = $mid + 1;\n                    } elseif ($codePoint < self::$tableWide[$mid][0]) {\n                        $ubound = $mid - 1;\n                    } else {\n                        $width += 2;\n                        $lastChar = $c;\n                        $lastWidth = 2;\n\n                        continue 2;\n                    }\n                }\n            }\n\n            ++$width;\n            $lastChar = $c;\n            $lastWidth = 1;\n        }\n\n        return $width;\n    }\n\n    private function getLocaleTransliterator(string $locale, string $id): ?\\Transliterator\n    {\n        $rule = $locale.'-'.$id;\n        if (\\array_key_exists($rule, self::$transliterators)) {\n            return self::$transliterators[$rule];\n        }\n\n        if (null !== $transliterator = self::$transliterators[$rule] = \\Transliterator::create($rule)) {\n            return $transliterator;\n        }\n\n        // Try to find a parent locale (nl_BE -> nl)\n        if (false === $i = strpos($locale, '_')) {\n            return null;\n        }\n\n        $parentRule = substr_replace($locale, '-'.$id, $i);\n\n        // Parent locale was already cached, return and store as current locale\n        if (\\array_key_exists($parentRule, self::$transliterators)) {\n            return self::$transliterators[$rule] = self::$transliterators[$parentRule];\n        }\n\n        // Create transliterator based on parent locale and cache the result on both initial and parent locale values\n        $transliterator = \\Transliterator::create($parentRule);\n\n        return self::$transliterators[$rule] = self::$transliterators[$parentRule] = $transliterator;\n    }\n}\n","vendor/symfony/string/ByteString.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\String;\n\nuse Random\\Randomizer;\nuse Symfony\\Component\\String\\Exception\\ExceptionInterface;\nuse Symfony\\Component\\String\\Exception\\InvalidArgumentException;\nuse Symfony\\Component\\String\\Exception\\RuntimeException;\n\n/**\n * Represents a binary-safe string of bytes.\n *\n * @author Nicolas Grekas <p@tchwork.com>\n * @author Hugo Hamon <hugohamon@neuf.fr>\n *\n * @throws ExceptionInterface\n */\nclass ByteString extends AbstractString\n{\n    private const ALPHABET_ALPHANUMERIC = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';\n\n    public function __construct(string $string = '')\n    {\n        $this->string = $string;\n    }\n\n    /*\n     * The following method was derived from code of the Hack Standard Library (v4.40 - 2020-05-03)\n     *\n     * https://github.com/hhvm/hsl/blob/80a42c02f036f72a42f0415e80d6b847f4bf62d5/src/random/private.php#L16\n     *\n     * Code subject to the MIT license (https://github.com/hhvm/hsl/blob/master/LICENSE).\n     *\n     * Copyright (c) 2004-2020, Facebook, Inc. (https://www.facebook.com/)\n     */\n\n    public static function fromRandom(int $length = 16, ?string $alphabet = null): self\n    {\n        if ($length <= 0) {\n            throw new InvalidArgumentException(\\sprintf('A strictly positive length is expected, \"%d\" given.', $length));\n        }\n\n        $alphabet ??= self::ALPHABET_ALPHANUMERIC;\n        $alphabetSize = \\strlen($alphabet);\n        $bits = (int) ceil(log($alphabetSize, 2.0));\n        if ($bits <= 0 || $bits > 56) {\n            throw new InvalidArgumentException('The length of the alphabet must in the [2^1, 2^56] range.');\n        }\n\n        if (\\PHP_VERSION_ID >= 80300) {\n            return new static((new Randomizer())->getBytesFromString($alphabet, $length));\n        }\n\n        $ret = '';\n        while ($length > 0) {\n            $urandomLength = (int) ceil(2 * $length * $bits / 8.0);\n            $data = random_bytes($urandomLength);\n            $unpackedData = 0;\n            $unpackedBits = 0;\n            for ($i = 0; $i < $urandomLength && $length > 0; ++$i) {\n                // Unpack 8 bits\n                $unpackedData = ($unpackedData << 8) | \\ord($data[$i]);\n                $unpackedBits += 8;\n\n                // While we have enough bits to select a character from the alphabet, keep\n                // consuming the random data\n                for (; $unpackedBits >= $bits && $length > 0; $unpackedBits -= $bits) {\n                    $index = ($unpackedData & ((1 << $bits) - 1));\n                    $unpackedData >>= $bits;\n                    // Unfortunately, the alphabet size is not necessarily a power of two.\n                    // Worst case, it is 2^k + 1, which means we need (k+1) bits and we\n                    // have around a 50% chance of missing as k gets larger\n                    if ($index < $alphabetSize) {\n                        $ret .= $alphabet[$index];\n                        --$length;\n                    }\n                }\n            }\n        }\n\n        return new static($ret);\n    }\n\n    public function bytesAt(int $offset): array\n    {\n        $str = $this->string[$offset] ?? '';\n\n        return '' === $str ? [] : [\\ord($str)];\n    }\n\n    public function append(string ...$suffix): static\n    {\n        $str = clone $this;\n        $str->string .= 1 >= \\count($suffix) ? ($suffix[0] ?? '') : implode('', $suffix);\n\n        return $str;\n    }\n\n    public function camel(): static\n    {\n        $str = clone $this;\n\n        $parts = explode(' ', trim(ucwords(preg_replace('/[^a-zA-Z0-9\\x7f-\\xff]++/', ' ', $this->string))));\n        $parts[0] = 1 !== \\strlen($parts[0]) && ctype_upper($parts[0]) ? $parts[0] : lcfirst($parts[0]);\n        $str->string = implode('', $parts);\n\n        return $str;\n    }\n\n    public function chunk(int $length = 1): array\n    {\n        if (1 > $length) {\n            throw new InvalidArgumentException('The chunk length must be greater than zero.');\n        }\n\n        if ('' === $this->string) {\n            return [];\n        }\n\n        $str = clone $this;\n        $chunks = [];\n\n        foreach (str_split($this->string, $length) as $chunk) {\n            $str->string = $chunk;\n            $chunks[] = clone $str;\n        }\n\n        return $chunks;\n    }\n\n    public function endsWith(string|iterable|AbstractString $suffix): bool\n    {\n        if ($suffix instanceof AbstractString) {\n            $suffix = $suffix->string;\n        } elseif (!\\is_string($suffix)) {\n            return parent::endsWith($suffix);\n        }\n\n        return '' !== $suffix && \\strlen($this->string) >= \\strlen($suffix) && 0 === substr_compare($this->string, $suffix, -\\strlen($suffix), null, $this->ignoreCase);\n    }\n\n    public function equalsTo(string|iterable|AbstractString $string): bool\n    {\n        if ($string instanceof AbstractString) {\n            $string = $string->string;\n        } elseif (!\\is_string($string)) {\n            return parent::equalsTo($string);\n        }\n\n        if ('' !== $string && $this->ignoreCase) {\n            return 0 === strcasecmp($string, $this->string);\n        }\n\n        return $string === $this->string;\n    }\n\n    public function folded(): static\n    {\n        $str = clone $this;\n        $str->string = strtolower($str->string);\n\n        return $str;\n    }\n\n    public function indexOf(string|iterable|AbstractString $needle, int $offset = 0): ?int\n    {\n        if ($needle instanceof AbstractString) {\n            $needle = $needle->string;\n        } elseif (!\\is_string($needle)) {\n            return parent::indexOf($needle, $offset);\n        }\n\n        if ('' === $needle) {\n            return null;\n        }\n\n        try {\n            $i = $this->ignoreCase ? stripos($this->string, $needle, $offset) : strpos($this->string, $needle, $offset);\n        } catch (\\ValueError) {\n            return null;\n        }\n\n        return false === $i ? null : $i;\n    }\n\n    public function indexOfLast(string|iterable|AbstractString $needle, int $offset = 0): ?int\n    {\n        if ($needle instanceof AbstractString) {\n            $needle = $needle->string;\n        } elseif (!\\is_string($needle)) {\n            return parent::indexOfLast($needle, $offset);\n        }\n\n        if ('' === $needle) {\n            return null;\n        }\n\n        try {\n            $i = $this->ignoreCase ? strripos($this->string, $needle, $offset) : strrpos($this->string, $needle, $offset);\n        } catch (\\ValueError) {\n            return null;\n        }\n\n        return false === $i ? null : $i;\n    }\n\n    public function isUtf8(): bool\n    {\n        return '' === $this->string || preg_match('//u', $this->string);\n    }\n\n    public function join(array $strings, ?string $lastGlue = null): static\n    {\n        $str = clone $this;\n\n        $tail = null !== $lastGlue && 1 < \\count($strings) ? $lastGlue.array_pop($strings) : '';\n        $str->string = implode($this->string, $strings).$tail;\n\n        return $str;\n    }\n\n    public function length(): int\n    {\n        return \\strlen($this->string);\n    }\n\n    public function lower(): static\n    {\n        $str = clone $this;\n        $str->string = strtolower($str->string);\n\n        return $str;\n    }\n\n    public function match(string $regexp, int $flags = 0, int $offset = 0): array\n    {\n        $match = ((\\PREG_PATTERN_ORDER | \\PREG_SET_ORDER) & $flags) ? 'preg_match_all' : 'preg_match';\n\n        if ($this->ignoreCase) {\n            $regexp .= 'i';\n        }\n\n        set_error_handler(static fn ($t, $m) => throw new InvalidArgumentException($m));\n\n        try {\n            if (false === $match($regexp, $this->string, $matches, $flags | \\PREG_UNMATCHED_AS_NULL, $offset)) {\n                throw new RuntimeException('Matching failed with error: '.preg_last_error_msg());\n            }\n        } finally {\n            restore_error_handler();\n        }\n\n        return $matches;\n    }\n\n    public function padBoth(int $length, string $padStr = ' '): static\n    {\n        $str = clone $this;\n        $str->string = str_pad($this->string, $length, $padStr, \\STR_PAD_BOTH);\n\n        return $str;\n    }\n\n    public function padEnd(int $length, string $padStr = ' '): static\n    {\n        $str = clone $this;\n        $str->string = str_pad($this->string, $length, $padStr, \\STR_PAD_RIGHT);\n\n        return $str;\n    }\n\n    public function padStart(int $length, string $padStr = ' '): static\n    {\n        $str = clone $this;\n        $str->string = str_pad($this->string, $length, $padStr, \\STR_PAD_LEFT);\n\n        return $str;\n    }\n\n    public function prepend(string ...$prefix): static\n    {\n        $str = clone $this;\n        $str->string = (1 >= \\count($prefix) ? ($prefix[0] ?? '') : implode('', $prefix)).$str->string;\n\n        return $str;\n    }\n\n    public function replace(string $from, string $to): static\n    {\n        $str = clone $this;\n\n        if ('' !== $from) {\n            $str->string = $this->ignoreCase ? str_ireplace($from, $to, $this->string) : str_replace($from, $to, $this->string);\n        }\n\n        return $str;\n    }\n\n    public function replaceMatches(string $fromRegexp, string|callable $to): static\n    {\n        if ($this->ignoreCase) {\n            $fromRegexp .= 'i';\n        }\n\n        $replace = \\is_array($to) || $to instanceof \\Closure ? 'preg_replace_callback' : 'preg_replace';\n\n        set_error_handler(static fn ($t, $m) => throw new InvalidArgumentException($m));\n\n        try {\n            if (null === $string = $replace($fromRegexp, $to, $this->string)) {\n                $lastError = preg_last_error();\n\n                foreach (get_defined_constants(true)['pcre'] as $k => $v) {\n                    if ($lastError === $v && str_ends_with($k, '_ERROR')) {\n                        throw new RuntimeException('Matching failed with '.$k.'.');\n                    }\n                }\n\n                throw new RuntimeException('Matching failed with unknown error code.');\n            }\n        } finally {\n            restore_error_handler();\n        }\n\n        $str = clone $this;\n        $str->string = $string;\n\n        return $str;\n    }\n\n    public function reverse(): static\n    {\n        $str = clone $this;\n        $str->string = strrev($str->string);\n\n        return $str;\n    }\n\n    public function slice(int $start = 0, ?int $length = null): static\n    {\n        $str = clone $this;\n        $str->string = substr($this->string, $start, $length ?? \\PHP_INT_MAX);\n\n        return $str;\n    }\n\n    public function snake(): static\n    {\n        $str = $this->camel();\n        $str->string = strtolower(preg_replace(['/([A-Z]+)([A-Z][a-z])/', '/([a-z\\d])([A-Z])/'], '\\1_\\2', $str->string));\n\n        return $str;\n    }\n\n    public function splice(string $replacement, int $start = 0, ?int $length = null): static\n    {\n        $str = clone $this;\n        $str->string = substr_replace($this->string, $replacement, $start, $length ?? \\PHP_INT_MAX);\n\n        return $str;\n    }\n\n    public function split(string $delimiter, ?int $limit = null, ?int $flags = null): array\n    {\n        if (1 > $limit ??= \\PHP_INT_MAX) {\n            throw new InvalidArgumentException('Split limit must be a positive integer.');\n        }\n\n        if ('' === $delimiter) {\n            throw new InvalidArgumentException('Split delimiter is empty.');\n        }\n\n        if (null !== $flags) {\n            return parent::split($delimiter, $limit, $flags);\n        }\n\n        $str = clone $this;\n        $chunks = $this->ignoreCase\n            ? preg_split('{'.preg_quote($delimiter).'}iD', $this->string, $limit)\n            : explode($delimiter, $this->string, $limit);\n\n        foreach ($chunks as &$chunk) {\n            $str->string = $chunk;\n            $chunk = clone $str;\n        }\n\n        return $chunks;\n    }\n\n    public function startsWith(string|iterable|AbstractString $prefix): bool\n    {\n        if ($prefix instanceof AbstractString) {\n            $prefix = $prefix->string;\n        } elseif (!\\is_string($prefix)) {\n            return parent::startsWith($prefix);\n        }\n\n        return '' !== $prefix && 0 === ($this->ignoreCase ? strncasecmp($this->string, $prefix, \\strlen($prefix)) : strncmp($this->string, $prefix, \\strlen($prefix)));\n    }\n\n    public function title(bool $allWords = false): static\n    {\n        $str = clone $this;\n        $str->string = $allWords ? ucwords($str->string) : ucfirst($str->string);\n\n        return $str;\n    }\n\n    public function toUnicodeString(?string $fromEncoding = null): UnicodeString\n    {\n        return new UnicodeString($this->toCodePointString($fromEncoding)->string);\n    }\n\n    public function toCodePointString(?string $fromEncoding = null): CodePointString\n    {\n        $u = new CodePointString();\n\n        if (\\in_array($fromEncoding, [null, 'utf8', 'utf-8', 'UTF8', 'UTF-8'], true) && preg_match('//u', $this->string)) {\n            $u->string = $this->string;\n\n            return $u;\n        }\n\n        set_error_handler(static fn ($t, $m) => throw new InvalidArgumentException($m));\n\n        try {\n            try {\n                $validEncoding = false !== mb_detect_encoding($this->string, $fromEncoding ?? 'Windows-1252', true);\n            } catch (InvalidArgumentException $e) {\n                if (!\\function_exists('iconv')) {\n                    throw $e;\n                }\n\n                $u->string = iconv($fromEncoding ?? 'Windows-1252', 'UTF-8', $this->string);\n\n                return $u;\n            }\n        } finally {\n            restore_error_handler();\n        }\n\n        if (!$validEncoding) {\n            throw new InvalidArgumentException(\\sprintf('Invalid \"%s\" string.', $fromEncoding ?? 'Windows-1252'));\n        }\n\n        $u->string = mb_convert_encoding($this->string, 'UTF-8', $fromEncoding ?? 'Windows-1252');\n\n        return $u;\n    }\n\n    public function trim(string $chars = \" \\t\\n\\r\\0\\x0B\\x0C\"): static\n    {\n        $str = clone $this;\n        $str->string = trim($str->string, $chars);\n\n        return $str;\n    }\n\n    public function trimEnd(string $chars = \" \\t\\n\\r\\0\\x0B\\x0C\"): static\n    {\n        $str = clone $this;\n        $str->string = rtrim($str->string, $chars);\n\n        return $str;\n    }\n\n    public function trimStart(string $chars = \" \\t\\n\\r\\0\\x0B\\x0C\"): static\n    {\n        $str = clone $this;\n        $str->string = ltrim($str->string, $chars);\n\n        return $str;\n    }\n\n    public function upper(): static\n    {\n        $str = clone $this;\n        $str->string = strtoupper($str->string);\n\n        return $str;\n    }\n\n    public function width(bool $ignoreAnsiDecoration = true): int\n    {\n        $string = preg_match('//u', $this->string) ? $this->string : preg_replace('/[\\x80-\\xFF]/', '?', $this->string);\n\n        return (new CodePointString($string))->width($ignoreAnsiDecoration);\n    }\n}\n","vendor/symfony/string/CHANGELOG.md":"CHANGELOG\n=========\n\n7.4\n---\n\n * Deprecate implementing `__sleep/wakeup()` on string implementations\n\n7.3\n---\n\n * Add the `AbstractString::pascal()` method\n\n7.2\n---\n\n * Add `TruncateMode` enum to handle more truncate methods\n * Add the `AbstractString::kebab()` method\n\n7.1\n---\n\n * Add `localeLower()`, `localeUpper()`, `localeTitle()` methods to `AbstractUnicodeString`\n\n6.2\n---\n\n  * Add support for emoji in `AsciiSlugger`\n\n5.4\n---\n\n * Add `trimSuffix()` and `trimPrefix()` methods\n\n5.3\n---\n\n * Made `AsciiSlugger` fallback to parent locale's symbolsMap\n\n5.2.0\n-----\n\n * added a `FrenchInflector` class\n\n5.1.0\n-----\n\n * added the `AbstractString::reverse()` method\n * made `AbstractString::width()` follow POSIX.1-2001\n * added `LazyString` which provides memoizing stringable objects\n * The component is not marked as `@experimental` anymore\n * added the `s()` helper method to get either an `UnicodeString` or `ByteString` instance,\n   depending of the input string UTF-8 compliance\n * added `$cut` parameter to `Symfony\\Component\\String\\AbstractString::truncate()`\n * added `AbstractString::containsAny()`\n * allow passing a string of custom characters to `ByteString::fromRandom()`\n\n5.0.0\n-----\n\n * added the component as experimental\n","vendor/symfony/string/CodePointString.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\String;\n\nuse Symfony\\Component\\String\\Exception\\ExceptionInterface;\nuse Symfony\\Component\\String\\Exception\\InvalidArgumentException;\n\n/**\n * Represents a string of Unicode code points encoded as UTF-8.\n *\n * @author Nicolas Grekas <p@tchwork.com>\n * @author Hugo Hamon <hugohamon@neuf.fr>\n *\n * @throws ExceptionInterface\n */\nclass CodePointString extends AbstractUnicodeString\n{\n    public function __construct(string $string = '')\n    {\n        if ('' !== $string && !preg_match('//u', $string)) {\n            throw new InvalidArgumentException('Invalid UTF-8 string.');\n        }\n\n        $this->string = $string;\n    }\n\n    public function append(string ...$suffix): static\n    {\n        $str = clone $this;\n        $str->string .= 1 >= \\count($suffix) ? ($suffix[0] ?? '') : implode('', $suffix);\n\n        if (!preg_match('//u', $str->string)) {\n            throw new InvalidArgumentException('Invalid UTF-8 string.');\n        }\n\n        return $str;\n    }\n\n    public function chunk(int $length = 1): array\n    {\n        if (1 > $length) {\n            throw new InvalidArgumentException('The chunk length must be greater than zero.');\n        }\n\n        if ('' === $this->string) {\n            return [];\n        }\n\n        $rx = '/(';\n        while (65535 < $length) {\n            $rx .= '.{65535}';\n            $length -= 65535;\n        }\n        $rx .= '.{'.$length.'})/us';\n\n        $str = clone $this;\n        $chunks = [];\n\n        foreach (preg_split($rx, $this->string, -1, \\PREG_SPLIT_DELIM_CAPTURE | \\PREG_SPLIT_NO_EMPTY) as $chunk) {\n            $str->string = $chunk;\n            $chunks[] = clone $str;\n        }\n\n        return $chunks;\n    }\n\n    public function codePointsAt(int $offset): array\n    {\n        $str = $offset ? $this->slice($offset, 1) : $this;\n\n        return '' === $str->string ? [] : [mb_ord($str->string, 'UTF-8')];\n    }\n\n    public function endsWith(string|iterable|AbstractString $suffix): bool\n    {\n        if ($suffix instanceof AbstractString) {\n            $suffix = $suffix->string;\n        } elseif (!\\is_string($suffix)) {\n            return parent::endsWith($suffix);\n        }\n\n        if ('' === $suffix || !preg_match('//u', $suffix)) {\n            return false;\n        }\n\n        if ($this->ignoreCase) {\n            return preg_match('{'.preg_quote($suffix).'$}iuD', $this->string);\n        }\n\n        return \\strlen($this->string) >= \\strlen($suffix) && 0 === substr_compare($this->string, $suffix, -\\strlen($suffix));\n    }\n\n    public function equalsTo(string|iterable|AbstractString $string): bool\n    {\n        if ($string instanceof AbstractString) {\n            $string = $string->string;\n        } elseif (!\\is_string($string)) {\n            return parent::equalsTo($string);\n        }\n\n        if ('' !== $string && $this->ignoreCase) {\n            return \\strlen($string) === \\strlen($this->string) && 0 === mb_stripos($this->string, $string, 0, 'UTF-8');\n        }\n\n        return $string === $this->string;\n    }\n\n    public function indexOf(string|iterable|AbstractString $needle, int $offset = 0): ?int\n    {\n        if ($needle instanceof AbstractString) {\n            $needle = $needle->string;\n        } elseif (!\\is_string($needle)) {\n            return parent::indexOf($needle, $offset);\n        }\n\n        if ('' === $needle) {\n            return null;\n        }\n\n        try {\n            $i = $this->ignoreCase ? mb_stripos($this->string, $needle, $offset, 'UTF-8') : mb_strpos($this->string, $needle, $offset, 'UTF-8');\n        } catch (\\ValueError) {\n            return null;\n        }\n\n        return false === $i ? null : $i;\n    }\n\n    public function indexOfLast(string|iterable|AbstractString $needle, int $offset = 0): ?int\n    {\n        if ($needle instanceof AbstractString) {\n            $needle = $needle->string;\n        } elseif (!\\is_string($needle)) {\n            return parent::indexOfLast($needle, $offset);\n        }\n\n        if ('' === $needle) {\n            return null;\n        }\n\n        try {\n            $i = $this->ignoreCase ? mb_strripos($this->string, $needle, $offset, 'UTF-8') : mb_strrpos($this->string, $needle, $offset, 'UTF-8');\n        } catch (\\ValueError) {\n            return null;\n        }\n\n        return false === $i ? null : $i;\n    }\n\n    public function length(): int\n    {\n        return mb_strlen($this->string, 'UTF-8');\n    }\n\n    public function prepend(string ...$prefix): static\n    {\n        $str = clone $this;\n        $str->string = (1 >= \\count($prefix) ? ($prefix[0] ?? '') : implode('', $prefix)).$this->string;\n\n        if (!preg_match('//u', $str->string)) {\n            throw new InvalidArgumentException('Invalid UTF-8 string.');\n        }\n\n        return $str;\n    }\n\n    public function replace(string $from, string $to): static\n    {\n        $str = clone $this;\n\n        if ('' === $from || !preg_match('//u', $from)) {\n            return $str;\n        }\n\n        if ('' !== $to && !preg_match('//u', $to)) {\n            throw new InvalidArgumentException('Invalid UTF-8 string.');\n        }\n\n        if ($this->ignoreCase) {\n            $str->string = implode($to, preg_split('{'.preg_quote($from).'}iuD', $this->string));\n        } else {\n            $str->string = str_replace($from, $to, $this->string);\n        }\n\n        return $str;\n    }\n\n    public function slice(int $start = 0, ?int $length = null): static\n    {\n        $str = clone $this;\n        $str->string = mb_substr($this->string, $start, $length, 'UTF-8');\n\n        return $str;\n    }\n\n    public function splice(string $replacement, int $start = 0, ?int $length = null): static\n    {\n        if (!preg_match('//u', $replacement)) {\n            throw new InvalidArgumentException('Invalid UTF-8 string.');\n        }\n\n        $str = clone $this;\n        $start = $start ? \\strlen(mb_substr($this->string, 0, $start, 'UTF-8')) : 0;\n        $length = $length ? \\strlen(mb_substr(substr($this->string, $start), 0, $length, 'UTF-8')) : $length;\n        $str->string = substr_replace($this->string, $replacement, $start, $length ?? \\PHP_INT_MAX);\n\n        return $str;\n    }\n\n    public function split(string $delimiter, ?int $limit = null, ?int $flags = null): array\n    {\n        if (1 > $limit ??= \\PHP_INT_MAX) {\n            throw new InvalidArgumentException('Split limit must be a positive integer.');\n        }\n\n        if ('' === $delimiter) {\n            throw new InvalidArgumentException('Split delimiter is empty.');\n        }\n\n        if (null !== $flags) {\n            return parent::split($delimiter.'u', $limit, $flags);\n        }\n\n        if (!preg_match('//u', $delimiter)) {\n            throw new InvalidArgumentException('Split delimiter is not a valid UTF-8 string.');\n        }\n\n        $str = clone $this;\n        $chunks = $this->ignoreCase\n            ? preg_split('{'.preg_quote($delimiter).'}iuD', $this->string, $limit)\n            : explode($delimiter, $this->string, $limit);\n\n        foreach ($chunks as &$chunk) {\n            $str->string = $chunk;\n            $chunk = clone $str;\n        }\n\n        return $chunks;\n    }\n\n    public function startsWith(string|iterable|AbstractString $prefix): bool\n    {\n        if ($prefix instanceof AbstractString) {\n            $prefix = $prefix->string;\n        } elseif (!\\is_string($prefix)) {\n            return parent::startsWith($prefix);\n        }\n\n        if ('' === $prefix || !preg_match('//u', $prefix)) {\n            return false;\n        }\n\n        if ($this->ignoreCase) {\n            return 0 === mb_stripos($this->string, $prefix, 0, 'UTF-8');\n        }\n\n        return 0 === strncmp($this->string, $prefix, \\strlen($prefix));\n    }\n}\n","vendor/symfony/string/Exception/ExceptionInterface.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\String\\Exception;\n\ninterface ExceptionInterface extends \\Throwable\n{\n}\n","vendor/symfony/string/Exception/InvalidArgumentException.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\String\\Exception;\n\nclass InvalidArgumentException extends \\InvalidArgumentException implements ExceptionInterface\n{\n}\n","vendor/symfony/string/Exception/RuntimeException.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\String\\Exception;\n\nclass RuntimeException extends \\RuntimeException implements ExceptionInterface\n{\n}\n","vendor/symfony/string/Inflector/EnglishInflector.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\String\\Inflector;\n\nfinal class EnglishInflector implements InflectorInterface\n{\n    /**\n     * Map English plural to singular suffixes.\n     *\n     * @see http://english-zone.com/spelling/plurals.html\n     */\n    private const PLURAL_MAP = [\n        // First entry: plural suffix, reversed\n        // Second entry: length of plural suffix\n        // Third entry: Whether the suffix may succeed a vowel\n        // Fourth entry: Whether the suffix may succeed a consonant\n        // Fifth entry: singular suffix, normal\n\n        // insignias (insigne), insignia (insigne)\n        ['saingisni', 9, true, true, 'insigne'],\n        ['aingisni', 8, true, true, 'insigne'],\n\n        // passersby (passerby)\n        ['ybsressap', 9, true, true, 'passerby'],\n\n        // nodes (node)\n        ['sedon', 5, true, true, 'node'],\n\n        // bacteria (bacterium)\n        ['airetcab', 8, true, true, 'bacterium'],\n\n        // issues (issue)\n        ['seussi', 6, true, true, 'issue'],\n\n        // corpora (corpus)\n        ['aroproc', 7, true, true, 'corpus'],\n\n        // criteria (criterion)\n        ['airetirc', 8, true, true, 'criterion'],\n\n        // curricula (curriculum)\n        ['alucirruc', 9, true, true, 'curriculum'],\n\n        // quora (quorum)\n        ['arouq', 5, true, true, 'quorum'],\n\n        // genera (genus)\n        ['areneg', 6, true, true, 'genus'],\n\n        // media (medium)\n        ['aidem', 5, true, true, 'medium'],\n\n        // memoranda (memorandum)\n        ['adnaromem', 9, true, true, 'memorandum'],\n\n        // phenomena (phenomenon)\n        ['anemonehp', 9, true, true, 'phenomenon'],\n\n        // strata (stratum)\n        ['atarts', 6, true, true, 'stratum'],\n\n        // nebulae (nebula)\n        ['ea', 2, true, true, 'a'],\n\n        // services (service)\n        ['secivres', 8, true, true, 'service'],\n\n        // mice (mouse), lice (louse)\n        ['eci', 3, false, true, 'ouse'],\n\n        // geese (goose)\n        ['esee', 4, false, true, 'oose'],\n\n        // fungi (fungus), alumni (alumnus), syllabi (syllabus), radii (radius)\n        ['i', 1, true, true, 'us'],\n\n        // men (man), women (woman)\n        ['nem', 3, true, true, 'man'],\n\n        // children (child)\n        ['nerdlihc', 8, true, true, 'child'],\n\n        // oxen (ox)\n        ['nexo', 4, false, false, 'ox'],\n\n        // indices (index), appendices (appendix), prices (price)\n        ['seci', 4, false, true, ['ex', 'ix', 'ice']],\n\n        // codes (code)\n        ['sedoc', 5, false, true, 'code'],\n\n        // selfies (selfie)\n        ['seifles', 7, true, true, 'selfie'],\n\n        // zombies (zombie)\n        ['seibmoz', 7, true, true, 'zombie'],\n\n        // movies (movie)\n        ['seivom', 6, true, true, 'movie'],\n\n        // names (name)\n        ['seman', 5, true, false, 'name'],\n\n        // conspectuses (conspectus), prospectuses (prospectus)\n        ['sesutcep', 8, true, true, 'pectus'],\n\n        // feet (foot)\n        ['teef', 4, true, true, 'foot'],\n\n        // geese (goose)\n        ['eseeg', 5, true, true, 'goose'],\n\n        // teeth (tooth)\n        ['hteet', 5, true, true, 'tooth'],\n\n        // news (news)\n        ['swen', 4, true, true, 'news'],\n\n        // series (series)\n        ['seires', 6, true, true, 'series'],\n\n        // babies (baby)\n        ['sei', 3, false, true, 'y'],\n\n        // accesses (access), addresses (address), kisses (kiss)\n        ['sess', 4, true, false, 'ss'],\n\n        // statuses (status)\n        ['sesutats', 8, true, true, 'status'],\n\n        // article (articles), ancle (ancles)\n        ['sel', 3, true, true, 'le'],\n\n        // analyses (analysis), ellipses (ellipsis), fungi (fungus),\n        // neuroses (neurosis), theses (thesis), emphases (emphasis),\n        // oases (oasis), crises (crisis), houses (house), bases (base),\n        // atlases (atlas)\n        ['ses', 3, true, true, ['s', 'se', 'sis']],\n\n        // objectives (objective), alternative (alternatives)\n        ['sevit', 5, true, true, 'tive'],\n\n        // drives (drive)\n        ['sevird', 6, false, true, 'drive'],\n\n        // lives (life), wives (wife)\n        ['sevi', 4, false, true, 'ife'],\n\n        // moves (move)\n        ['sevom', 5, true, true, 'move'],\n\n        // hooves (hoof), dwarves (dwarf), elves (elf), leaves (leaf), caves (cave), staves (staff)\n        ['sev', 3, true, true, ['f', 've', 'ff']],\n\n        // axes (axis), axes (ax), axes (axe)\n        ['sexa', 4, false, false, ['ax', 'axe', 'axis']],\n\n        // indexes (index), matrixes (matrix)\n        ['sex', 3, true, false, 'x'],\n\n        // quizzes (quiz)\n        ['sezz', 4, true, false, 'z'],\n\n        // bureaus (bureau)\n        ['suae', 4, false, true, 'eau'],\n\n        // fees (fee), trees (tree), employees (employee)\n        ['see', 3, true, true, 'ee'],\n\n        // edges (edge)\n        ['segd', 4, true, true, 'dge'],\n\n        // outages (outage) - specific fix to avoid 'outag'\n        ['segatuo', 7, true, true, 'outage'],\n\n        // traces (trace), faces (face), places (place), pieces (piece)\n        ['sec', 3, true, true, 'ce'],\n\n        // roses (rose), garages (garage), cassettes (cassette),\n        // waltzes (waltz), heroes (hero), bushes (bush), arches (arch),\n        // shoes (shoe)\n        ['se', 2, true, true, ['', 'e']],\n\n        // status (status)\n        ['sutats', 6, true, true, 'status'],\n\n        // tags (tag)\n        ['s', 1, true, true, ''],\n\n        // chateaux (chateau)\n        ['xuae', 4, false, true, 'eau'],\n\n        // people (person)\n        ['elpoep', 6, true, true, 'person'],\n    ];\n\n    /**\n     * Map English singular to plural suffixes.\n     *\n     * @see http://english-zone.com/spelling/plurals.html\n     */\n    private const SINGULAR_MAP = [\n        // First entry: singular suffix, reversed\n        // Second entry: length of singular suffix\n        // Third entry: Whether the suffix may succeed a vowel\n        // Fourth entry: Whether the suffix may succeed a consonant\n        // Fifth entry: plural suffix, normal\n\n        // passerby (passersby)\n        ['ybressap', 8, true, true, 'passersby'],\n\n        // insigne (insignia, insignias)\n        ['engisni', 7, true, true, ['insignia', 'insignias']],\n\n        // nodes (node)\n        ['edon', 4, true, true, 'nodes'],\n\n        // axes (axis)\n        ['sixa', 4, false, false, 'axes'],\n\n        // criterion (criteria)\n        ['airetirc', 8, false, false, 'criterion'],\n\n        // nebulae (nebula)\n        ['aluben', 6, false, false, 'nebulae'],\n\n        // children (child)\n        ['dlihc', 5, true, true, 'children'],\n\n        // prices (price)\n        ['eci', 3, false, true, 'ices'],\n\n        // services (service)\n        ['ecivres', 7, true, true, 'services'],\n\n        // lives (life), wives (wife)\n        ['efi', 3, false, true, 'ives'],\n\n        // selfies (selfie)\n        ['eifles', 6, true, true, 'selfies'],\n\n        // movies (movie)\n        ['eivom', 5, true, true, 'movies'],\n\n        // lice (louse)\n        ['esuol', 5, false, true, 'lice'],\n\n        // mice (mouse)\n        ['esuom', 5, false, true, 'mice'],\n\n        // geese (goose)\n        ['esoo', 4, false, true, 'eese'],\n\n        // houses (house), bases (base)\n        ['es', 2, true, true, 'ses'],\n\n        // geese (goose)\n        ['esoog', 5, true, true, 'geese'],\n\n        // caves (cave)\n        ['ev', 2, true, true, 'ves'],\n\n        // drives (drive)\n        ['evird', 5, false, true, 'drives'],\n\n        // objectives (objective), alternative (alternatives)\n        ['evit', 4, true, true, 'tives'],\n\n        // moves (move)\n        ['evom', 4, true, true, 'moves'],\n\n        // staves (staff)\n        ['ffats', 5, true, true, 'staves'],\n\n        // hooves (hoof), dwarves (dwarf), elves (elf), leaves (leaf)\n        ['ff', 2, true, true, 'ffs'],\n\n        // hooves (hoof), dwarves (dwarf), elves (elf), leaves (leaf)\n        ['f', 1, true, true, ['fs', 'ves']],\n\n        // arches (arch)\n        ['hc', 2, true, true, 'ches'],\n\n        // bushes (bush)\n        ['hs', 2, true, true, 'shes'],\n\n        // teeth (tooth)\n        ['htoot', 5, true, true, 'teeth'],\n\n        // albums (album)\n        ['mubla', 5, true, true, 'albums'],\n\n        // quorums (quorum)\n        ['murouq', 6, true, true, ['quora', 'quorums']],\n\n        // bacteria (bacterium), curricula (curriculum), media (medium), memoranda (memorandum), phenomena (phenomenon), strata (stratum)\n        ['mu', 2, true, true, 'a'],\n\n        // men (man), women (woman)\n        ['nam', 3, true, true, 'men'],\n\n        // people (person)\n        ['nosrep', 6, true, true, ['persons', 'people']],\n\n        // criteria (criterion)\n        ['noiretirc', 9, true, true, 'criteria'],\n\n        // phenomena (phenomenon)\n        ['nonemonehp', 10, true, true, 'phenomena'],\n\n        // echoes (echo)\n        ['ohce', 4, true, true, 'echoes'],\n\n        // heroes (hero)\n        ['oreh', 4, true, true, 'heroes'],\n\n        // atlases (atlas)\n        ['salta', 5, true, true, 'atlases'],\n\n        // aliases (alias)\n        ['saila', 5, true, true, 'aliases'],\n\n        // irises (iris)\n        ['siri', 4, true, true, 'irises'],\n\n        // analyses (analysis), ellipses (ellipsis), neuroses (neurosis)\n        // theses (thesis), emphases (emphasis), oases (oasis),\n        // crises (crisis)\n        ['sis', 3, true, true, 'ses'],\n\n        // accesses (access), addresses (address), kisses (kiss)\n        ['ss', 2, true, false, 'sses'],\n\n        // syllabi (syllabus)\n        ['suballys', 8, true, true, 'syllabi'],\n\n        // buses (bus)\n        ['sub', 3, true, true, 'buses'],\n\n        // circuses (circus)\n        ['suc', 3, true, true, 'cuses'],\n\n        // hippocampi (hippocampus)\n        ['supmacoppih', 11, false, false, 'hippocampi'],\n\n        // campuses (campus)\n        ['sup', 3, true, true, 'puses'],\n\n        // status (status)\n        ['sutats', 6, true, true, ['status', 'statuses']],\n\n        // conspectuses (conspectus), prospectuses (prospectus)\n        ['sutcep', 6, true, true, 'pectuses'],\n\n        // nexuses (nexus)\n        ['suxen', 5, false, false, 'nexuses'],\n\n        // fungi (fungus), alumni (alumnus), syllabi (syllabus), radii (radius)\n        ['su', 2, true, true, 'i'],\n\n        // news (news)\n        ['swen', 4, true, true, 'news'],\n\n        // feet (foot)\n        ['toof', 4, true, true, 'feet'],\n\n        // chateaux (chateau), bureaus (bureau)\n        ['uae', 3, false, true, ['eaus', 'eaux']],\n\n        // oxen (ox)\n        ['xo', 2, false, false, 'oxen'],\n\n        // hoaxes (hoax)\n        ['xaoh', 4, true, false, 'hoaxes'],\n\n        // indices (index)\n        ['xedni', 5, false, true, ['indicies', 'indexes']],\n\n        // fax (faxes, faxxes)\n        ['xaf', 3, true, true, ['faxes', 'faxxes']],\n\n        // boxes (box)\n        ['xo', 2, false, true, 'oxes'],\n\n        // indexes (index), matrixes (matrix), appendices (appendix)\n        ['x', 1, true, false, ['ces', 'xes']],\n\n        // babies (baby)\n        ['y', 1, false, true, 'ies'],\n\n        // quizzes (quiz)\n        ['ziuq', 4, true, false, 'quizzes'],\n\n        // waltzes (waltz)\n        ['z', 1, true, true, 'zes'],\n    ];\n\n    /**\n     * A list of words which should not be inflected, reversed.\n     */\n    private const UNINFLECTED = [\n        '',\n\n        // data\n        'atad',\n\n        // deer\n        'reed',\n\n        // equipment\n        'tnempiuqe',\n\n        // feedback\n        'kcabdeef',\n\n        // fish\n        'hsif',\n\n        // health\n        'htlaeh',\n\n        // history\n        'yrotsih',\n\n        // info\n        'ofni',\n\n        // information\n        'noitamrofni',\n\n        // money\n        'yenom',\n\n        // moose\n        'esoom',\n\n        // series\n        'seires',\n\n        // sheep\n        'peehs',\n\n        // species\n        'seiceps',\n\n        // traffic\n        'ciffart',\n\n        // aircraft\n        'tfarcria',\n\n        // hardware\n        'erawdrah',\n    ];\n\n    public function singularize(string $plural): array\n    {\n        $pluralRev = strrev($plural);\n        $lowerPluralRev = strtolower($pluralRev);\n        $pluralLength = \\strlen($lowerPluralRev);\n\n        // Check if the word is one which is not inflected, return early if so\n        if (\\in_array($lowerPluralRev, self::UNINFLECTED, true)) {\n            return [$plural];\n        }\n\n        // The outer loop iterates over the entries of the plural table\n        // The inner loop $j iterates over the characters of the plural suffix\n        // in the plural table to compare them with the characters of the actual\n        // given plural suffix\n        foreach (self::PLURAL_MAP as $map) {\n            $suffix = $map[0];\n            $suffixLength = $map[1];\n            $j = 0;\n\n            // Compare characters in the plural table and of the suffix of the\n            // given plural one by one\n            while ($suffix[$j] === $lowerPluralRev[$j]) {\n                // Let $j point to the next character\n                ++$j;\n\n                // Successfully compared the last character\n                // Add an entry with the singular suffix to the singular array\n                if ($j === $suffixLength) {\n                    // Is there any character preceding the suffix in the plural string?\n                    if ($j < $pluralLength) {\n                        $nextIsVowel = str_contains('aeiou', $lowerPluralRev[$j]);\n\n                        if (!$map[2] && $nextIsVowel) {\n                            // suffix may not succeed a vowel but next char is one\n                            break;\n                        }\n\n                        if (!$map[3] && !$nextIsVowel) {\n                            // suffix may not succeed a consonant but next char is one\n                            break;\n                        }\n                    }\n\n                    $newBase = substr($plural, 0, $pluralLength - $suffixLength);\n                    $newSuffix = $map[4];\n\n                    // Check whether the first character in the plural suffix\n                    // is uppercased. If yes, uppercase the first character in\n                    // the singular suffix too\n                    $firstUpper = ctype_upper($pluralRev[$j - 1]);\n\n                    if (\\is_array($newSuffix)) {\n                        $singulars = [];\n\n                        foreach ($newSuffix as $newSuffixEntry) {\n                            $singulars[] = $newBase.($firstUpper ? ucfirst($newSuffixEntry) : $newSuffixEntry);\n                        }\n\n                        return $singulars;\n                    }\n\n                    return [$newBase.($firstUpper ? ucfirst($newSuffix) : $newSuffix)];\n                }\n\n                // Suffix is longer than word\n                if ($j === $pluralLength) {\n                    break;\n                }\n            }\n        }\n\n        // Assume that plural and singular is identical\n        return [$plural];\n    }\n\n    public function pluralize(string $singular): array\n    {\n        $singularRev = strrev($singular);\n        $lowerSingularRev = strtolower($singularRev);\n        $singularLength = \\strlen($lowerSingularRev);\n\n        // Check if the word is one which is not inflected, return early if so\n        if (\\in_array($lowerSingularRev, self::UNINFLECTED, true)) {\n            return [$singular];\n        }\n\n        // The outer loop iterates over the entries of the singular table\n        // The inner loop $j iterates over the characters of the singular suffix\n        // in the singular table to compare them with the characters of the actual\n        // given singular suffix\n        foreach (self::SINGULAR_MAP as $map) {\n            $suffix = $map[0];\n            $suffixLength = $map[1];\n            $j = 0;\n\n            // Compare characters in the singular table and of the suffix of the\n            // given plural one by one\n\n            while ($suffix[$j] === $lowerSingularRev[$j]) {\n                // Let $j point to the next character\n                ++$j;\n\n                // Successfully compared the last character\n                // Add an entry with the plural suffix to the plural array\n                if ($j === $suffixLength) {\n                    // Is there any character preceding the suffix in the plural string?\n                    if ($j < $singularLength) {\n                        $nextIsVowel = str_contains('aeiou', $lowerSingularRev[$j]);\n\n                        if (!$map[2] && $nextIsVowel) {\n                            // suffix may not succeed a vowel but next char is one\n                            break;\n                        }\n\n                        if (!$map[3] && !$nextIsVowel) {\n                            // suffix may not succeed a consonant but next char is one\n                            break;\n                        }\n                    }\n\n                    $newBase = substr($singular, 0, $singularLength - $suffixLength);\n                    $newSuffix = $map[4];\n\n                    // Check whether the first character in the singular suffix\n                    // is uppercased. If yes, uppercase the first character in\n                    // the singular suffix too\n                    $firstUpper = ctype_upper($singularRev[$j - 1]);\n\n                    if (\\is_array($newSuffix)) {\n                        $plurals = [];\n\n                        foreach ($newSuffix as $newSuffixEntry) {\n                            $plurals[] = $newBase.($firstUpper ? ucfirst($newSuffixEntry) : $newSuffixEntry);\n                        }\n\n                        return $plurals;\n                    }\n\n                    return [$newBase.($firstUpper ? ucfirst($newSuffix) : $newSuffix)];\n                }\n\n                // Suffix is longer than word\n                if ($j === $singularLength) {\n                    break;\n                }\n            }\n        }\n\n        // Assume that plural is singular with a trailing `s`\n        return [$singular.'s'];\n    }\n}\n","vendor/symfony/string/Inflector/FrenchInflector.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\String\\Inflector;\n\n/**\n * French inflector.\n *\n * This class does only inflect nouns; not adjectives nor composed words like \"soixante-dix\".\n */\nfinal class FrenchInflector implements InflectorInterface\n{\n    /**\n     * A list of all rules for pluralise.\n     *\n     * @see https://la-conjugaison.nouvelobs.com/regles/grammaire/le-pluriel-des-noms-121.php\n     */\n    private const PLURALIZE_REGEXP = [\n        // First entry: regexp\n        // Second entry: replacement\n\n        // Words finishing with \"s\", \"x\" or \"z\" are invariables\n        // Les mots finissant par \"s\", \"x\" ou \"z\" sont invariables\n        ['/(s|x|z)$/i', '\\1'],\n\n        // Words finishing with \"eau\" are pluralized with a \"x\"\n        // Les mots finissant par \"eau\" prennent tous un \"x\" au pluriel\n        ['/(eau)$/i', '\\1x'],\n\n        // Words finishing with \"au\" are pluralized with a \"x\" excepted \"landau\"\n        // Les mots finissant par \"au\" prennent un \"x\" au pluriel sauf \"landau\"\n        ['/^(landau)$/i', '\\1s'],\n        ['/(au)$/i', '\\1x'],\n\n        // Words finishing with \"eu\" are pluralized with a \"x\" excepted \"pneu\", \"bleu\", \"émeu\"\n        // Les mots finissant en \"eu\" prennent un \"x\" au pluriel sauf \"pneu\", \"bleu\", \"émeu\"\n        ['/^(pneu|bleu|émeu)$/i', '\\1s'],\n        ['/(eu)$/i', '\\1x'],\n\n        // Words finishing with \"al\" are pluralized with a \"aux\" excepted\n        // Les mots finissant en \"al\" se terminent en \"aux\" sauf\n        ['/^(bal|carnaval|caracal|chacal|choral|corral|étal|festival|récital|val)$/i', '\\1s'],\n        ['/al$/i', '\\1aux'],\n\n        // Aspirail, bail, corail, émail, fermail, soupirail, travail, vantail et vitrail font leur pluriel en -aux\n        ['/^(aspir|b|cor|ém|ferm|soupir|trav|vant|vitr)ail$/i', '\\1aux'],\n\n        // Bijou, caillou, chou, genou, hibou, joujou et pou qui prennent un x au pluriel\n        ['/^(bij|caill|ch|gen|hib|jouj|p)ou$/i', '\\1oux'],\n\n        // Invariable words\n        ['/^(cinquante|soixante|mille)$/i', '\\1'],\n\n        // French titles\n        ['/^(mon|ma)(sieur|dame|demoiselle|seigneur)$/', 'mes\\2s'],\n        ['/^(Mon|Ma)(sieur|dame|demoiselle|seigneur)$/', 'Mes\\2s'],\n    ];\n\n    /**\n     * A list of all rules for singularize.\n     */\n    private const SINGULARIZE_REGEXP = [\n        // First entry: regexp\n        // Second entry: replacement\n\n        // Aspirail, bail, corail, émail, fermail, soupirail, travail, vantail et vitrail font leur pluriel en -aux\n        ['/((aspir|b|cor|ém|ferm|soupir|trav|vant|vitr))aux$/i', '\\1ail'],\n\n        // Words finishing with \"eau\" are pluralized with a \"x\"\n        // Les mots finissant par \"eau\" prennent tous un \"x\" au pluriel\n        ['/(eau)x$/i', '\\1'],\n\n        // Words finishing with \"al\" are pluralized with a \"aux\" expected\n        // Les mots finissant en \"al\" se terminent en \"aux\" sauf\n        ['/(amir|anim|arsen|boc|can|capit|capor|chev|crist|génér|hopit|hôpit|idé|journ|littor|loc|m|mét|minér|princip|radic|termin)aux$/i', '\\1al'],\n\n        // Words finishing with \"au\" are pluralized with a \"x\" excepted \"landau\"\n        // Les mots finissant par \"au\" prennent un \"x\" au pluriel sauf \"landau\"\n        ['/(au)x$/i', '\\1'],\n\n        // Words finishing with \"eu\" are pluralized with a \"x\" excepted \"pneu\", \"bleu\", \"émeu\"\n        // Les mots finissant en \"eu\" prennent un \"x\" au pluriel sauf \"pneu\", \"bleu\", \"émeu\"\n        ['/(eu)x$/i', '\\1'],\n\n        //  Words finishing with \"ou\" are pluralized with a \"s\" excepted bijou, caillou, chou, genou, hibou, joujou, pou\n        // Les mots finissant par \"ou\" prennent un \"s\" sauf bijou, caillou, chou, genou, hibou, joujou, pou\n        ['/(bij|caill|ch|gen|hib|jouj|p)oux$/i', '\\1ou'],\n\n        // French titles\n        ['/^mes(dame|demoiselle)s$/', 'ma\\1'],\n        ['/^Mes(dame|demoiselle)s$/', 'Ma\\1'],\n        ['/^mes(sieur|seigneur)s$/', 'mon\\1'],\n        ['/^Mes(sieur|seigneur)s$/', 'Mon\\1'],\n\n        // Default rule\n        ['/s$/i', ''],\n    ];\n\n    /**\n     * A list of words which should not be inflected.\n     * This list is only used by singularize.\n     */\n    private const UNINFLECTED = '/^(abcès|accès|abus|albatros|anchois|anglais|autobus|bois|brebis|carquois|cas|chas|colis|concours|corps|cours|cyprès|décès|devis|discours|dos|embarras|engrais|entrelacs|excès|fils|fois|gâchis|gars|glas|héros|intrus|jars|jus|kermès|lacis|legs|lilas|marais|mars|matelas|mépris|mets|mois|mors|obus|os|palais|paradis|parcours|pardessus|pays|plusieurs|poids|pois|pouls|printemps|processus|progrès|puits|pus|rabais|radis|recors|recours|refus|relais|remords|remous|rictus|rhinocéros|repas|rubis|sans|sas|secours|sens|souris|succès|talus|tapis|tas|taudis|temps|tiers|univers|velours|verglas|vernis|virus)$/i';\n\n    public function singularize(string $plural): array\n    {\n        if ($this->isInflectedWord($plural)) {\n            return [$plural];\n        }\n\n        foreach (self::SINGULARIZE_REGEXP as $rule) {\n            [$regexp, $replace] = $rule;\n\n            if (1 === preg_match($regexp, $plural)) {\n                return [preg_replace($regexp, $replace, $plural)];\n            }\n        }\n\n        return [$plural];\n    }\n\n    public function pluralize(string $singular): array\n    {\n        if ($this->isInflectedWord($singular)) {\n            return [$singular];\n        }\n\n        foreach (self::PLURALIZE_REGEXP as $rule) {\n            [$regexp, $replace] = $rule;\n\n            if (1 === preg_match($regexp, $singular)) {\n                return [preg_replace($regexp, $replace, $singular)];\n            }\n        }\n\n        return [$singular.'s'];\n    }\n\n    private function isInflectedWord(string $word): bool\n    {\n        return 1 === preg_match(self::UNINFLECTED, $word);\n    }\n}\n","vendor/symfony/string/Inflector/InflectorInterface.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\String\\Inflector;\n\ninterface InflectorInterface\n{\n    /**\n     * Returns the singular forms of a string.\n     *\n     * If the method can't determine the form with certainty, several possible singulars are returned.\n     *\n     * @return string[]\n     */\n    public function singularize(string $plural): array;\n\n    /**\n     * Returns the plural forms of a string.\n     *\n     * If the method can't determine the form with certainty, several possible plurals are returned.\n     *\n     * @return string[]\n     */\n    public function pluralize(string $singular): array;\n}\n","vendor/symfony/string/Inflector/SpanishInflector.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\String\\Inflector;\n\nfinal class SpanishInflector implements InflectorInterface\n{\n    /**\n     * A list of all rules for pluralise.\n     *\n     * @see https://www.spanishdict.com/guide/spanish-plural-noun-forms\n     * @see https://www.rae.es/gram%C3%A1tica/morfolog%C3%ADa/la-formaci%C3%B3n-del-plural-plurales-en-s-y-plurales-en-es-reglas-generales\n     */\n    // First entry: regex\n    // Second entry: replacement\n    private const PLURALIZE_REGEXP = [\n        // Specials sí, no\n        ['/(sí|no)$/i', '\\1es'],\n\n        // Words ending with vowel must use -s (RAE 3.2a, 3.2c)\n        ['/(a|e|i|o|u|á|é|í|ó|ú)$/i', '\\1s'],\n\n        // Word ending in s or x and the previous letter is accented (RAE 3.2n)\n        ['/ás$/i', 'ases'],\n        ['/és$/i', 'eses'],\n        ['/ís$/i', 'ises'],\n        ['/ós$/i', 'oses'],\n        ['/ús$/i', 'uses'],\n\n        // Words ending in -ión must changed to -iones\n        ['/ión$/i', '\\1iones'],\n\n        // Words ending in some consonants must use -es (RAE 3.2k)\n        ['/(l|r|n|d|j|s|x|ch|y)$/i', '\\1es'],\n\n        // Word ending in z, must changed to ces\n        ['/(z)$/i', 'ces'],\n    ];\n\n    /**\n     * A list of all rules for singularize.\n     */\n    private const SINGULARIZE_REGEXP = [\n        // Specials sí, no\n        ['/(sí|no)es$/i', '\\1'],\n\n        // Words ending in -ión must changed to -iones\n        ['/iones$/i', '\\1ión'],\n\n        // Word ending in z, must changed to ces\n        ['/ces$/i', 'z'],\n\n        // Word ending in s or x and the previous letter is accented (RAE 3.2n)\n        ['/(\\w)ases$/i', '\\1ás'],\n        ['/eses$/i', 'és'],\n        ['/ises$/i', 'ís'],\n        ['/(\\w{2,})oses$/i', '\\1ós'],\n        ['/(\\w)uses$/i', '\\1ús'],\n\n        // Words ending in some consonants and -es, must be the consonants\n        ['/(l|r|n|d|j|s|x|ch|y)e?s$/i', '\\1'],\n\n        // Words ended with vowel and s, must be vowel\n        ['/(a|e|i|o|u|á|é|ó|í|ú)s$/i', '\\1'],\n    ];\n\n    private const UNINFLECTED_RULES = [\n        // Words ending with pies (RAE 3.2n)\n        '/.*(piés)$/i',\n    ];\n\n    private const UNINFLECTED = '/^(lunes|martes|miércoles|jueves|viernes|análisis|torax|yo|pies)$/i';\n\n    public function singularize(string $plural): array\n    {\n        if ($this->isInflectedWord($plural)) {\n            return [$plural];\n        }\n\n        foreach (self::SINGULARIZE_REGEXP as $rule) {\n            [$regexp, $replace] = $rule;\n\n            if (1 === preg_match($regexp, $plural)) {\n                return [preg_replace($regexp, $replace, $plural)];\n            }\n        }\n\n        return [$plural];\n    }\n\n    public function pluralize(string $singular): array\n    {\n        if ($this->isInflectedWord($singular)) {\n            return [$singular];\n        }\n\n        foreach (self::PLURALIZE_REGEXP as $rule) {\n            [$regexp, $replace] = $rule;\n\n            if (1 === preg_match($regexp, $singular)) {\n                return [preg_replace($regexp, $replace, $singular)];\n            }\n        }\n\n        return [$singular.'s'];\n    }\n\n    private function isInflectedWord(string $word): bool\n    {\n        foreach (self::UNINFLECTED_RULES as $rule) {\n            if (1 === preg_match($rule, $word)) {\n                return true;\n            }\n        }\n\n        return 1 === preg_match(self::UNINFLECTED, $word);\n    }\n}\n","vendor/symfony/string/LICENSE":"Copyright (c) 2019-present Fabien Potencier\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is furnished\nto do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n","vendor/symfony/string/LazyString.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\String;\n\n/**\n * A string whose value is computed lazily by a callback.\n *\n * @author Nicolas Grekas <p@tchwork.com>\n */\nclass LazyString implements \\Stringable, \\JsonSerializable\n{\n    private \\Closure|string $value;\n\n    /**\n     * @param callable|array $callback A callable or a [Closure, method] lazy-callable\n     */\n    public static function fromCallable(callable|array $callback, mixed ...$arguments): static\n    {\n        if (\\is_array($callback) && !\\is_callable($callback) && !(($callback[0] ?? null) instanceof \\Closure || 2 < \\count($callback))) {\n            throw new \\TypeError(\\sprintf('Argument 1 passed to \"%s()\" must be a callable or a [Closure, method] lazy-callable, \"%s\" given.', __METHOD__, '['.implode(', ', array_map('get_debug_type', $callback)).']'));\n        }\n\n        $lazyString = new static();\n        $lazyString->value = static function () use (&$callback, &$arguments): string {\n            static $value;\n\n            if (null !== $arguments) {\n                if (!\\is_callable($callback)) {\n                    $callback[0] = $callback[0]();\n                    $callback[1] ??= '__invoke';\n                }\n                $value = $callback(...$arguments);\n                $callback = !\\is_scalar($value) && !$value instanceof \\Stringable ? self::getPrettyName($callback) : 'callable';\n                $arguments = null;\n            }\n\n            return $value ?? '';\n        };\n\n        return $lazyString;\n    }\n\n    public static function fromStringable(string|int|float|bool|\\Stringable $value): static\n    {\n        if (\\is_object($value)) {\n            return static::fromCallable($value->__toString(...));\n        }\n\n        $lazyString = new static();\n        $lazyString->value = (string) $value;\n\n        return $lazyString;\n    }\n\n    /**\n     * Tells whether the provided value can be cast to string.\n     */\n    final public static function isStringable(mixed $value): bool\n    {\n        return \\is_string($value) || $value instanceof \\Stringable || \\is_scalar($value);\n    }\n\n    /**\n     * Casts scalars and stringable objects to strings.\n     *\n     * @throws \\TypeError When the provided value is not stringable\n     */\n    final public static function resolve(\\Stringable|string|int|float|bool $value): string\n    {\n        return $value;\n    }\n\n    public function __toString(): string\n    {\n        if (\\is_string($this->value)) {\n            return $this->value;\n        }\n\n        try {\n            return $this->value = ($this->value)();\n        } catch (\\Throwable $e) {\n            if (\\TypeError::class === $e::class && __FILE__ === $e->getFile()) {\n                $type = explode(', ', $e->getMessage());\n                $type = substr(array_pop($type), 0, -\\strlen(' returned'));\n                $r = new \\ReflectionFunction($this->value);\n                $callback = $r->getStaticVariables()['callback'];\n\n                $e = new \\TypeError(\\sprintf('Return value of %s() passed to %s::fromCallable() must be of the type string, %s returned.', $callback, static::class, $type));\n            }\n\n            throw $e;\n        }\n    }\n\n    public function __serialize(): array\n    {\n        if (self::class === (new \\ReflectionMethod($this, '__sleep'))->class || self::class !== (new \\ReflectionMethod($this, '__serialize'))->class) {\n            $this->__toString();\n\n            return ['value' => $this->value];\n        }\n\n        trigger_deprecation('symfony/string', '7.4', 'Implementing \"%s::__sleep()\" is deprecated, use \"__serialize()\" instead.', get_debug_type($this));\n\n        $data = [];\n        foreach ($this->__sleep() as $key) {\n            try {\n                if (($r = new \\ReflectionProperty($this, $key))->isInitialized($this)) {\n                    $data[$key] = $r->getValue($this);\n                }\n            } catch (\\ReflectionException) {\n                $data[$key] = $this->$key;\n            }\n        }\n\n        return $data;\n    }\n\n    /**\n     * @deprecated since Symfony 7.4, will be replaced by `__serialize()` in 8.0\n     */\n    public function __sleep(): array\n    {\n        trigger_deprecation('symfony/string', '7.4', 'Calling \"%s::__sleep()\" is deprecated, use \"__serialize()\" instead.', get_debug_type($this));\n\n        $this->__toString();\n\n        return ['value'];\n    }\n\n    public function jsonSerialize(): string\n    {\n        return $this->__toString();\n    }\n\n    private function __construct()\n    {\n    }\n\n    private static function getPrettyName(callable $callback): string\n    {\n        if (\\is_string($callback)) {\n            return $callback;\n        }\n\n        if (\\is_array($callback)) {\n            $class = \\is_object($callback[0]) ? get_debug_type($callback[0]) : $callback[0];\n            $method = $callback[1];\n        } elseif ($callback instanceof \\Closure) {\n            $r = new \\ReflectionFunction($callback);\n\n            if ($r->isAnonymous() || !$class = $r->getClosureCalledClass()) {\n                return $r->name;\n            }\n\n            $class = $class->name;\n            $method = $r->name;\n        } else {\n            $class = get_debug_type($callback);\n            $method = '__invoke';\n        }\n\n        return $class.'::'.$method;\n    }\n}\n","vendor/symfony/string/README.md":"String Component\n================\n\nThe String component provides an object-oriented API to strings and deals\nwith bytes, UTF-8 code points and grapheme clusters in a unified way.\n\nResources\n---------\n\n * [Documentation](https://symfony.com/doc/current/components/string.html)\n * [Contributing](https://symfony.com/doc/current/contributing/index.html)\n * [Report issues](https://github.com/symfony/symfony/issues) and\n   [send Pull Requests](https://github.com/symfony/symfony/pulls)\n   in the [main Symfony repository](https://github.com/symfony/symfony)\n","vendor/symfony/string/Resources/data/wcswidth_table_wide.php":"<?php\n\n/*\n * This file has been auto-generated by the Symfony String Component for internal use.\n *\n * Unicode version: 16.0.0\n * Date: 2024-09-11T08:21:22+00:00\n */\n\nreturn [\n    [\n        4352,\n        4447,\n    ],\n    [\n        8986,\n        8987,\n    ],\n    [\n        9001,\n        9001,\n    ],\n    [\n        9002,\n        9002,\n    ],\n    [\n        9193,\n        9196,\n    ],\n    [\n        9200,\n        9200,\n    ],\n    [\n        9203,\n        9203,\n    ],\n    [\n        9725,\n        9726,\n    ],\n    [\n        9748,\n        9749,\n    ],\n    [\n        9776,\n        9783,\n    ],\n    [\n        9800,\n        9811,\n    ],\n    [\n        9855,\n        9855,\n    ],\n    [\n        9866,\n        9871,\n    ],\n    [\n        9875,\n        9875,\n    ],\n    [\n        9889,\n        9889,\n    ],\n    [\n        9898,\n        9899,\n    ],\n    [\n        9917,\n        9918,\n    ],\n    [\n        9924,\n        9925,\n    ],\n    [\n        9934,\n        9934,\n    ],\n    [\n        9940,\n        9940,\n    ],\n    [\n        9962,\n        9962,\n    ],\n    [\n        9970,\n        9971,\n    ],\n    [\n        9973,\n        9973,\n    ],\n    [\n        9978,\n        9978,\n    ],\n    [\n        9981,\n        9981,\n    ],\n    [\n        9989,\n        9989,\n    ],\n    [\n        9994,\n        9995,\n    ],\n    [\n        10024,\n        10024,\n    ],\n    [\n        10060,\n        10060,\n    ],\n    [\n        10062,\n        10062,\n    ],\n    [\n        10067,\n        10069,\n    ],\n    [\n        10071,\n        10071,\n    ],\n    [\n        10133,\n        10135,\n    ],\n    [\n        10160,\n        10160,\n    ],\n    [\n        10175,\n        10175,\n    ],\n    [\n        11035,\n        11036,\n    ],\n    [\n        11088,\n        11088,\n    ],\n    [\n        11093,\n        11093,\n    ],\n    [\n        11904,\n        11929,\n    ],\n    [\n        11931,\n        12019,\n    ],\n    [\n        12032,\n        12245,\n    ],\n    [\n        12272,\n        12287,\n    ],\n    [\n        12288,\n        12288,\n    ],\n    [\n        12289,\n        12291,\n    ],\n    [\n        12292,\n        12292,\n    ],\n    [\n        12293,\n        12293,\n    ],\n    [\n        12294,\n        12294,\n    ],\n    [\n        12295,\n        12295,\n    ],\n    [\n        12296,\n        12296,\n    ],\n    [\n        12297,\n        12297,\n    ],\n    [\n        12298,\n        12298,\n    ],\n    [\n        12299,\n        12299,\n    ],\n    [\n        12300,\n        12300,\n    ],\n    [\n        12301,\n        12301,\n    ],\n    [\n        12302,\n        12302,\n    ],\n    [\n        12303,\n        12303,\n    ],\n    [\n        12304,\n        12304,\n    ],\n    [\n        12305,\n        12305,\n    ],\n    [\n        12306,\n        12307,\n    ],\n    [\n        12308,\n        12308,\n    ],\n    [\n        12309,\n        12309,\n    ],\n    [\n        12310,\n        12310,\n    ],\n    [\n        12311,\n        12311,\n    ],\n    [\n        12312,\n        12312,\n    ],\n    [\n        12313,\n        12313,\n    ],\n    [\n        12314,\n        12314,\n    ],\n    [\n        12315,\n        12315,\n    ],\n    [\n        12316,\n        12316,\n    ],\n    [\n        12317,\n        12317,\n    ],\n    [\n        12318,\n        12319,\n    ],\n    [\n        12320,\n        12320,\n    ],\n    [\n        12321,\n        12329,\n    ],\n    [\n        12330,\n        12333,\n    ],\n    [\n        12334,\n        12335,\n    ],\n    [\n        12336,\n        12336,\n    ],\n    [\n        12337,\n        12341,\n    ],\n    [\n        12342,\n        12343,\n    ],\n    [\n        12344,\n        12346,\n    ],\n    [\n        12347,\n        12347,\n    ],\n    [\n        12348,\n        12348,\n    ],\n    [\n        12349,\n        12349,\n    ],\n    [\n        12350,\n        12350,\n    ],\n    [\n        12353,\n        12438,\n    ],\n    [\n        12441,\n        12442,\n    ],\n    [\n        12443,\n        12444,\n    ],\n    [\n        12445,\n        12446,\n    ],\n    [\n        12447,\n        12447,\n    ],\n    [\n        12448,\n        12448,\n    ],\n    [\n        12449,\n        12538,\n    ],\n    [\n        12539,\n        12539,\n    ],\n    [\n        12540,\n        12542,\n    ],\n    [\n        12543,\n        12543,\n    ],\n    [\n        12549,\n        12591,\n    ],\n    [\n        12593,\n        12686,\n    ],\n    [\n        12688,\n        12689,\n    ],\n    [\n        12690,\n        12693,\n    ],\n    [\n        12694,\n        12703,\n    ],\n    [\n        12704,\n        12735,\n    ],\n    [\n        12736,\n        12773,\n    ],\n    [\n        12783,\n        12783,\n    ],\n    [\n        12784,\n        12799,\n    ],\n    [\n        12800,\n        12830,\n    ],\n    [\n        12832,\n        12841,\n    ],\n    [\n        12842,\n        12871,\n    ],\n    [\n        12880,\n        12880,\n    ],\n    [\n        12881,\n        12895,\n    ],\n    [\n        12896,\n        12927,\n    ],\n    [\n        12928,\n        12937,\n    ],\n    [\n        12938,\n        12976,\n    ],\n    [\n        12977,\n        12991,\n    ],\n    [\n        12992,\n        13055,\n    ],\n    [\n        13056,\n        13311,\n    ],\n    [\n        13312,\n        19903,\n    ],\n    [\n        19904,\n        19967,\n    ],\n    [\n        19968,\n        40959,\n    ],\n    [\n        40960,\n        40980,\n    ],\n    [\n        40981,\n        40981,\n    ],\n    [\n        40982,\n        42124,\n    ],\n    [\n        42128,\n        42182,\n    ],\n    [\n        43360,\n        43388,\n    ],\n    [\n        44032,\n        55203,\n    ],\n    [\n        63744,\n        64109,\n    ],\n    [\n        64110,\n        64111,\n    ],\n    [\n        64112,\n        64217,\n    ],\n    [\n        64218,\n        64255,\n    ],\n    [\n        65040,\n        65046,\n    ],\n    [\n        65047,\n        65047,\n    ],\n    [\n        65048,\n        65048,\n    ],\n    [\n        65049,\n        65049,\n    ],\n    [\n        65072,\n        65072,\n    ],\n    [\n        65073,\n        65074,\n    ],\n    [\n        65075,\n        65076,\n    ],\n    [\n        65077,\n        65077,\n    ],\n    [\n        65078,\n        65078,\n    ],\n    [\n        65079,\n        65079,\n    ],\n    [\n        65080,\n        65080,\n    ],\n    [\n        65081,\n        65081,\n    ],\n    [\n        65082,\n        65082,\n    ],\n    [\n        65083,\n        65083,\n    ],\n    [\n        65084,\n        65084,\n    ],\n    [\n        65085,\n        65085,\n    ],\n    [\n        65086,\n        65086,\n    ],\n    [\n        65087,\n        65087,\n    ],\n    [\n        65088,\n        65088,\n    ],\n    [\n        65089,\n        65089,\n    ],\n    [\n        65090,\n        65090,\n    ],\n    [\n        65091,\n        65091,\n    ],\n    [\n        65092,\n        65092,\n    ],\n    [\n        65093,\n        65094,\n    ],\n    [\n        65095,\n        65095,\n    ],\n    [\n        65096,\n        65096,\n    ],\n    [\n        65097,\n        65100,\n    ],\n    [\n        65101,\n        65103,\n    ],\n    [\n        65104,\n        65106,\n    ],\n    [\n        65108,\n        65111,\n    ],\n    [\n        65112,\n        65112,\n    ],\n    [\n        65113,\n        65113,\n    ],\n    [\n        65114,\n        65114,\n    ],\n    [\n        65115,\n        65115,\n    ],\n    [\n        65116,\n        65116,\n    ],\n    [\n        65117,\n        65117,\n    ],\n    [\n        65118,\n        65118,\n    ],\n    [\n        65119,\n        65121,\n    ],\n    [\n        65122,\n        65122,\n    ],\n    [\n        65123,\n        65123,\n    ],\n    [\n        65124,\n        65126,\n    ],\n    [\n        65128,\n        65128,\n    ],\n    [\n        65129,\n        65129,\n    ],\n    [\n        65130,\n        65131,\n    ],\n    [\n        65281,\n        65283,\n    ],\n    [\n        65284,\n        65284,\n    ],\n    [\n        65285,\n        65287,\n    ],\n    [\n        65288,\n        65288,\n    ],\n    [\n        65289,\n        65289,\n    ],\n    [\n        65290,\n        65290,\n    ],\n    [\n        65291,\n        65291,\n    ],\n    [\n        65292,\n        65292,\n    ],\n    [\n        65293,\n        65293,\n    ],\n    [\n        65294,\n        65295,\n    ],\n    [\n        65296,\n        65305,\n    ],\n    [\n        65306,\n        65307,\n    ],\n    [\n        65308,\n        65310,\n    ],\n    [\n        65311,\n        65312,\n    ],\n    [\n        65313,\n        65338,\n    ],\n    [\n        65339,\n        65339,\n    ],\n    [\n        65340,\n        65340,\n    ],\n    [\n        65341,\n        65341,\n    ],\n    [\n        65342,\n        65342,\n    ],\n    [\n        65343,\n        65343,\n    ],\n    [\n        65344,\n        65344,\n    ],\n    [\n        65345,\n        65370,\n    ],\n    [\n        65371,\n        65371,\n    ],\n    [\n        65372,\n        65372,\n    ],\n    [\n        65373,\n        65373,\n    ],\n    [\n        65374,\n        65374,\n    ],\n    [\n        65375,\n        65375,\n    ],\n    [\n        65376,\n        65376,\n    ],\n    [\n        65504,\n        65505,\n    ],\n    [\n        65506,\n        65506,\n    ],\n    [\n        65507,\n        65507,\n    ],\n    [\n        65508,\n        65508,\n    ],\n    [\n        65509,\n        65510,\n    ],\n    [\n        94176,\n        94177,\n    ],\n    [\n        94178,\n        94178,\n    ],\n    [\n        94179,\n        94179,\n    ],\n    [\n        94180,\n        94180,\n    ],\n    [\n        94192,\n        94193,\n    ],\n    [\n        94208,\n        100343,\n    ],\n    [\n        100352,\n        101119,\n    ],\n    [\n        101120,\n        101589,\n    ],\n    [\n        101631,\n        101631,\n    ],\n    [\n        101632,\n        101640,\n    ],\n    [\n        110576,\n        110579,\n    ],\n    [\n        110581,\n        110587,\n    ],\n    [\n        110589,\n        110590,\n    ],\n    [\n        110592,\n        110847,\n    ],\n    [\n        110848,\n        110882,\n    ],\n    [\n        110898,\n        110898,\n    ],\n    [\n        110928,\n        110930,\n    ],\n    [\n        110933,\n        110933,\n    ],\n    [\n        110948,\n        110951,\n    ],\n    [\n        110960,\n        111355,\n    ],\n    [\n        119552,\n        119638,\n    ],\n    [\n        119648,\n        119670,\n    ],\n    [\n        126980,\n        126980,\n    ],\n    [\n        127183,\n        127183,\n    ],\n    [\n        127374,\n        127374,\n    ],\n    [\n        127377,\n        127386,\n    ],\n    [\n        127488,\n        127490,\n    ],\n    [\n        127504,\n        127547,\n    ],\n    [\n        127552,\n        127560,\n    ],\n    [\n        127568,\n        127569,\n    ],\n    [\n        127584,\n        127589,\n    ],\n    [\n        127744,\n        127776,\n    ],\n    [\n        127789,\n        127797,\n    ],\n    [\n        127799,\n        127868,\n    ],\n    [\n        127870,\n        127891,\n    ],\n    [\n        127904,\n        127946,\n    ],\n    [\n        127951,\n        127955,\n    ],\n    [\n        127968,\n        127984,\n    ],\n    [\n        127988,\n        127988,\n    ],\n    [\n        127992,\n        127994,\n    ],\n    [\n        127995,\n        127999,\n    ],\n    [\n        128000,\n        128062,\n    ],\n    [\n        128064,\n        128064,\n    ],\n    [\n        128066,\n        128252,\n    ],\n    [\n        128255,\n        128317,\n    ],\n    [\n        128331,\n        128334,\n    ],\n    [\n        128336,\n        128359,\n    ],\n    [\n        128378,\n        128378,\n    ],\n    [\n        128405,\n        128406,\n    ],\n    [\n        128420,\n        128420,\n    ],\n    [\n        128507,\n        128511,\n    ],\n    [\n        128512,\n        128591,\n    ],\n    [\n        128640,\n        128709,\n    ],\n    [\n        128716,\n        128716,\n    ],\n    [\n        128720,\n        128722,\n    ],\n    [\n        128725,\n        128727,\n    ],\n    [\n        128732,\n        128735,\n    ],\n    [\n        128747,\n        128748,\n    ],\n    [\n        128756,\n        128764,\n    ],\n    [\n        128992,\n        129003,\n    ],\n    [\n        129008,\n        129008,\n    ],\n    [\n        129292,\n        129338,\n    ],\n    [\n        129340,\n        129349,\n    ],\n    [\n        129351,\n        129535,\n    ],\n    [\n        129648,\n        129660,\n    ],\n    [\n        129664,\n        129673,\n    ],\n    [\n        129679,\n        129734,\n    ],\n    [\n        129742,\n        129756,\n    ],\n    [\n        129759,\n        129769,\n    ],\n    [\n        129776,\n        129784,\n    ],\n    [\n        131072,\n        173791,\n    ],\n    [\n        173792,\n        173823,\n    ],\n    [\n        173824,\n        177977,\n    ],\n    [\n        177978,\n        177983,\n    ],\n    [\n        177984,\n        178205,\n    ],\n    [\n        178206,\n        178207,\n    ],\n    [\n        178208,\n        183969,\n    ],\n    [\n        183970,\n        183983,\n    ],\n    [\n        183984,\n        191456,\n    ],\n    [\n        191457,\n        191471,\n    ],\n    [\n        191472,\n        192093,\n    ],\n    [\n        192094,\n        194559,\n    ],\n    [\n        194560,\n        195101,\n    ],\n    [\n        195102,\n        195103,\n    ],\n    [\n        195104,\n        196605,\n    ],\n    [\n        196608,\n        201546,\n    ],\n    [\n        201547,\n        201551,\n    ],\n    [\n        201552,\n        205743,\n    ],\n    [\n        205744,\n        262141,\n    ],\n];\n","vendor/symfony/string/Resources/data/wcswidth_table_zero.php":"<?php\n\n/*\n * This file has been auto-generated by the Symfony String Component for internal use.\n *\n * Unicode version: 16.0.0\n * Date: 2024-09-11T08:21:22+00:00\n */\n\nreturn [\n    [\n        768,\n        879,\n    ],\n    [\n        1155,\n        1159,\n    ],\n    [\n        1160,\n        1161,\n    ],\n    [\n        1425,\n        1469,\n    ],\n    [\n        1471,\n        1471,\n    ],\n    [\n        1473,\n        1474,\n    ],\n    [\n        1476,\n        1477,\n    ],\n    [\n        1479,\n        1479,\n    ],\n    [\n        1552,\n        1562,\n    ],\n    [\n        1611,\n        1631,\n    ],\n    [\n        1648,\n        1648,\n    ],\n    [\n        1750,\n        1756,\n    ],\n    [\n        1759,\n        1764,\n    ],\n    [\n        1767,\n        1768,\n    ],\n    [\n        1770,\n        1773,\n    ],\n    [\n        1809,\n        1809,\n    ],\n    [\n        1840,\n        1866,\n    ],\n    [\n        1958,\n        1968,\n    ],\n    [\n        2027,\n        2035,\n    ],\n    [\n        2045,\n        2045,\n    ],\n    [\n        2070,\n        2073,\n    ],\n    [\n        2075,\n        2083,\n    ],\n    [\n        2085,\n        2087,\n    ],\n    [\n        2089,\n        2093,\n    ],\n    [\n        2137,\n        2139,\n    ],\n    [\n        2199,\n        2207,\n    ],\n    [\n        2250,\n        2273,\n    ],\n    [\n        2275,\n        2306,\n    ],\n    [\n        2362,\n        2362,\n    ],\n    [\n        2364,\n        2364,\n    ],\n    [\n        2369,\n        2376,\n    ],\n    [\n        2381,\n        2381,\n    ],\n    [\n        2385,\n        2391,\n    ],\n    [\n        2402,\n        2403,\n    ],\n    [\n        2433,\n        2433,\n    ],\n    [\n        2492,\n        2492,\n    ],\n    [\n        2497,\n        2500,\n    ],\n    [\n        2509,\n        2509,\n    ],\n    [\n        2530,\n        2531,\n    ],\n    [\n        2558,\n        2558,\n    ],\n    [\n        2561,\n        2562,\n    ],\n    [\n        2620,\n        2620,\n    ],\n    [\n        2625,\n        2626,\n    ],\n    [\n        2631,\n        2632,\n    ],\n    [\n        2635,\n        2637,\n    ],\n    [\n        2641,\n        2641,\n    ],\n    [\n        2672,\n        2673,\n    ],\n    [\n        2677,\n        2677,\n    ],\n    [\n        2689,\n        2690,\n    ],\n    [\n        2748,\n        2748,\n    ],\n    [\n        2753,\n        2757,\n    ],\n    [\n        2759,\n        2760,\n    ],\n    [\n        2765,\n        2765,\n    ],\n    [\n        2786,\n        2787,\n    ],\n    [\n        2810,\n        2815,\n    ],\n    [\n        2817,\n        2817,\n    ],\n    [\n        2876,\n        2876,\n    ],\n    [\n        2879,\n        2879,\n    ],\n    [\n        2881,\n        2884,\n    ],\n    [\n        2893,\n        2893,\n    ],\n    [\n        2901,\n        2902,\n    ],\n    [\n        2914,\n        2915,\n    ],\n    [\n        2946,\n        2946,\n    ],\n    [\n        3008,\n        3008,\n    ],\n    [\n        3021,\n        3021,\n    ],\n    [\n        3072,\n        3072,\n    ],\n    [\n        3076,\n        3076,\n    ],\n    [\n        3132,\n        3132,\n    ],\n    [\n        3134,\n        3136,\n    ],\n    [\n        3142,\n        3144,\n    ],\n    [\n        3146,\n        3149,\n    ],\n    [\n        3157,\n        3158,\n    ],\n    [\n        3170,\n        3171,\n    ],\n    [\n        3201,\n        3201,\n    ],\n    [\n        3260,\n        3260,\n    ],\n    [\n        3263,\n        3263,\n    ],\n    [\n        3270,\n        3270,\n    ],\n    [\n        3276,\n        3277,\n    ],\n    [\n        3298,\n        3299,\n    ],\n    [\n        3328,\n        3329,\n    ],\n    [\n        3387,\n        3388,\n    ],\n    [\n        3393,\n        3396,\n    ],\n    [\n        3405,\n        3405,\n    ],\n    [\n        3426,\n        3427,\n    ],\n    [\n        3457,\n        3457,\n    ],\n    [\n        3530,\n        3530,\n    ],\n    [\n        3538,\n        3540,\n    ],\n    [\n        3542,\n        3542,\n    ],\n    [\n        3633,\n        3633,\n    ],\n    [\n        3636,\n        3642,\n    ],\n    [\n        3655,\n        3662,\n    ],\n    [\n        3761,\n        3761,\n    ],\n    [\n        3764,\n        3772,\n    ],\n    [\n        3784,\n        3790,\n    ],\n    [\n        3864,\n        3865,\n    ],\n    [\n        3893,\n        3893,\n    ],\n    [\n        3895,\n        3895,\n    ],\n    [\n        3897,\n        3897,\n    ],\n    [\n        3953,\n        3966,\n    ],\n    [\n        3968,\n        3972,\n    ],\n    [\n        3974,\n        3975,\n    ],\n    [\n        3981,\n        3991,\n    ],\n    [\n        3993,\n        4028,\n    ],\n    [\n        4038,\n        4038,\n    ],\n    [\n        4141,\n        4144,\n    ],\n    [\n        4146,\n        4151,\n    ],\n    [\n        4153,\n        4154,\n    ],\n    [\n        4157,\n        4158,\n    ],\n    [\n        4184,\n        4185,\n    ],\n    [\n        4190,\n        4192,\n    ],\n    [\n        4209,\n        4212,\n    ],\n    [\n        4226,\n        4226,\n    ],\n    [\n        4229,\n        4230,\n    ],\n    [\n        4237,\n        4237,\n    ],\n    [\n        4253,\n        4253,\n    ],\n    [\n        4957,\n        4959,\n    ],\n    [\n        5906,\n        5908,\n    ],\n    [\n        5938,\n        5939,\n    ],\n    [\n        5970,\n        5971,\n    ],\n    [\n        6002,\n        6003,\n    ],\n    [\n        6068,\n        6069,\n    ],\n    [\n        6071,\n        6077,\n    ],\n    [\n        6086,\n        6086,\n    ],\n    [\n        6089,\n        6099,\n    ],\n    [\n        6109,\n        6109,\n    ],\n    [\n        6155,\n        6157,\n    ],\n    [\n        6159,\n        6159,\n    ],\n    [\n        6277,\n        6278,\n    ],\n    [\n        6313,\n        6313,\n    ],\n    [\n        6432,\n        6434,\n    ],\n    [\n        6439,\n        6440,\n    ],\n    [\n        6450,\n        6450,\n    ],\n    [\n        6457,\n        6459,\n    ],\n    [\n        6679,\n        6680,\n    ],\n    [\n        6683,\n        6683,\n    ],\n    [\n        6742,\n        6742,\n    ],\n    [\n        6744,\n        6750,\n    ],\n    [\n        6752,\n        6752,\n    ],\n    [\n        6754,\n        6754,\n    ],\n    [\n        6757,\n        6764,\n    ],\n    [\n        6771,\n        6780,\n    ],\n    [\n        6783,\n        6783,\n    ],\n    [\n        6832,\n        6845,\n    ],\n    [\n        6846,\n        6846,\n    ],\n    [\n        6847,\n        6862,\n    ],\n    [\n        6912,\n        6915,\n    ],\n    [\n        6964,\n        6964,\n    ],\n    [\n        6966,\n        6970,\n    ],\n    [\n        6972,\n        6972,\n    ],\n    [\n        6978,\n        6978,\n    ],\n    [\n        7019,\n        7027,\n    ],\n    [\n        7040,\n        7041,\n    ],\n    [\n        7074,\n        7077,\n    ],\n    [\n        7080,\n        7081,\n    ],\n    [\n        7083,\n        7085,\n    ],\n    [\n        7142,\n        7142,\n    ],\n    [\n        7144,\n        7145,\n    ],\n    [\n        7149,\n        7149,\n    ],\n    [\n        7151,\n        7153,\n    ],\n    [\n        7212,\n        7219,\n    ],\n    [\n        7222,\n        7223,\n    ],\n    [\n        7376,\n        7378,\n    ],\n    [\n        7380,\n        7392,\n    ],\n    [\n        7394,\n        7400,\n    ],\n    [\n        7405,\n        7405,\n    ],\n    [\n        7412,\n        7412,\n    ],\n    [\n        7416,\n        7417,\n    ],\n    [\n        7616,\n        7679,\n    ],\n    [\n        8400,\n        8412,\n    ],\n    [\n        8413,\n        8416,\n    ],\n    [\n        8417,\n        8417,\n    ],\n    [\n        8418,\n        8420,\n    ],\n    [\n        8421,\n        8432,\n    ],\n    [\n        11503,\n        11505,\n    ],\n    [\n        11647,\n        11647,\n    ],\n    [\n        11744,\n        11775,\n    ],\n    [\n        12330,\n        12333,\n    ],\n    [\n        12441,\n        12442,\n    ],\n    [\n        42607,\n        42607,\n    ],\n    [\n        42608,\n        42610,\n    ],\n    [\n        42612,\n        42621,\n    ],\n    [\n        42654,\n        42655,\n    ],\n    [\n        42736,\n        42737,\n    ],\n    [\n        43010,\n        43010,\n    ],\n    [\n        43014,\n        43014,\n    ],\n    [\n        43019,\n        43019,\n    ],\n    [\n        43045,\n        43046,\n    ],\n    [\n        43052,\n        43052,\n    ],\n    [\n        43204,\n        43205,\n    ],\n    [\n        43232,\n        43249,\n    ],\n    [\n        43263,\n        43263,\n    ],\n    [\n        43302,\n        43309,\n    ],\n    [\n        43335,\n        43345,\n    ],\n    [\n        43392,\n        43394,\n    ],\n    [\n        43443,\n        43443,\n    ],\n    [\n        43446,\n        43449,\n    ],\n    [\n        43452,\n        43453,\n    ],\n    [\n        43493,\n        43493,\n    ],\n    [\n        43561,\n        43566,\n    ],\n    [\n        43569,\n        43570,\n    ],\n    [\n        43573,\n        43574,\n    ],\n    [\n        43587,\n        43587,\n    ],\n    [\n        43596,\n        43596,\n    ],\n    [\n        43644,\n        43644,\n    ],\n    [\n        43696,\n        43696,\n    ],\n    [\n        43698,\n        43700,\n    ],\n    [\n        43703,\n        43704,\n    ],\n    [\n        43710,\n        43711,\n    ],\n    [\n        43713,\n        43713,\n    ],\n    [\n        43756,\n        43757,\n    ],\n    [\n        43766,\n        43766,\n    ],\n    [\n        44005,\n        44005,\n    ],\n    [\n        44008,\n        44008,\n    ],\n    [\n        44013,\n        44013,\n    ],\n    [\n        64286,\n        64286,\n    ],\n    [\n        65024,\n        65039,\n    ],\n    [\n        65056,\n        65071,\n    ],\n    [\n        66045,\n        66045,\n    ],\n    [\n        66272,\n        66272,\n    ],\n    [\n        66422,\n        66426,\n    ],\n    [\n        68097,\n        68099,\n    ],\n    [\n        68101,\n        68102,\n    ],\n    [\n        68108,\n        68111,\n    ],\n    [\n        68152,\n        68154,\n    ],\n    [\n        68159,\n        68159,\n    ],\n    [\n        68325,\n        68326,\n    ],\n    [\n        68900,\n        68903,\n    ],\n    [\n        68969,\n        68973,\n    ],\n    [\n        69291,\n        69292,\n    ],\n    [\n        69372,\n        69375,\n    ],\n    [\n        69446,\n        69456,\n    ],\n    [\n        69506,\n        69509,\n    ],\n    [\n        69633,\n        69633,\n    ],\n    [\n        69688,\n        69702,\n    ],\n    [\n        69744,\n        69744,\n    ],\n    [\n        69747,\n        69748,\n    ],\n    [\n        69759,\n        69761,\n    ],\n    [\n        69811,\n        69814,\n    ],\n    [\n        69817,\n        69818,\n    ],\n    [\n        69826,\n        69826,\n    ],\n    [\n        69888,\n        69890,\n    ],\n    [\n        69927,\n        69931,\n    ],\n    [\n        69933,\n        69940,\n    ],\n    [\n        70003,\n        70003,\n    ],\n    [\n        70016,\n        70017,\n    ],\n    [\n        70070,\n        70078,\n    ],\n    [\n        70089,\n        70092,\n    ],\n    [\n        70095,\n        70095,\n    ],\n    [\n        70191,\n        70193,\n    ],\n    [\n        70196,\n        70196,\n    ],\n    [\n        70198,\n        70199,\n    ],\n    [\n        70206,\n        70206,\n    ],\n    [\n        70209,\n        70209,\n    ],\n    [\n        70367,\n        70367,\n    ],\n    [\n        70371,\n        70378,\n    ],\n    [\n        70400,\n        70401,\n    ],\n    [\n        70459,\n        70460,\n    ],\n    [\n        70464,\n        70464,\n    ],\n    [\n        70502,\n        70508,\n    ],\n    [\n        70512,\n        70516,\n    ],\n    [\n        70587,\n        70592,\n    ],\n    [\n        70606,\n        70606,\n    ],\n    [\n        70608,\n        70608,\n    ],\n    [\n        70610,\n        70610,\n    ],\n    [\n        70625,\n        70626,\n    ],\n    [\n        70712,\n        70719,\n    ],\n    [\n        70722,\n        70724,\n    ],\n    [\n        70726,\n        70726,\n    ],\n    [\n        70750,\n        70750,\n    ],\n    [\n        70835,\n        70840,\n    ],\n    [\n        70842,\n        70842,\n    ],\n    [\n        70847,\n        70848,\n    ],\n    [\n        70850,\n        70851,\n    ],\n    [\n        71090,\n        71093,\n    ],\n    [\n        71100,\n        71101,\n    ],\n    [\n        71103,\n        71104,\n    ],\n    [\n        71132,\n        71133,\n    ],\n    [\n        71219,\n        71226,\n    ],\n    [\n        71229,\n        71229,\n    ],\n    [\n        71231,\n        71232,\n    ],\n    [\n        71339,\n        71339,\n    ],\n    [\n        71341,\n        71341,\n    ],\n    [\n        71344,\n        71349,\n    ],\n    [\n        71351,\n        71351,\n    ],\n    [\n        71453,\n        71453,\n    ],\n    [\n        71455,\n        71455,\n    ],\n    [\n        71458,\n        71461,\n    ],\n    [\n        71463,\n        71467,\n    ],\n    [\n        71727,\n        71735,\n    ],\n    [\n        71737,\n        71738,\n    ],\n    [\n        71995,\n        71996,\n    ],\n    [\n        71998,\n        71998,\n    ],\n    [\n        72003,\n        72003,\n    ],\n    [\n        72148,\n        72151,\n    ],\n    [\n        72154,\n        72155,\n    ],\n    [\n        72160,\n        72160,\n    ],\n    [\n        72193,\n        72202,\n    ],\n    [\n        72243,\n        72248,\n    ],\n    [\n        72251,\n        72254,\n    ],\n    [\n        72263,\n        72263,\n    ],\n    [\n        72273,\n        72278,\n    ],\n    [\n        72281,\n        72283,\n    ],\n    [\n        72330,\n        72342,\n    ],\n    [\n        72344,\n        72345,\n    ],\n    [\n        72752,\n        72758,\n    ],\n    [\n        72760,\n        72765,\n    ],\n    [\n        72767,\n        72767,\n    ],\n    [\n        72850,\n        72871,\n    ],\n    [\n        72874,\n        72880,\n    ],\n    [\n        72882,\n        72883,\n    ],\n    [\n        72885,\n        72886,\n    ],\n    [\n        73009,\n        73014,\n    ],\n    [\n        73018,\n        73018,\n    ],\n    [\n        73020,\n        73021,\n    ],\n    [\n        73023,\n        73029,\n    ],\n    [\n        73031,\n        73031,\n    ],\n    [\n        73104,\n        73105,\n    ],\n    [\n        73109,\n        73109,\n    ],\n    [\n        73111,\n        73111,\n    ],\n    [\n        73459,\n        73460,\n    ],\n    [\n        73472,\n        73473,\n    ],\n    [\n        73526,\n        73530,\n    ],\n    [\n        73536,\n        73536,\n    ],\n    [\n        73538,\n        73538,\n    ],\n    [\n        73562,\n        73562,\n    ],\n    [\n        78912,\n        78912,\n    ],\n    [\n        78919,\n        78933,\n    ],\n    [\n        90398,\n        90409,\n    ],\n    [\n        90413,\n        90415,\n    ],\n    [\n        92912,\n        92916,\n    ],\n    [\n        92976,\n        92982,\n    ],\n    [\n        94031,\n        94031,\n    ],\n    [\n        94095,\n        94098,\n    ],\n    [\n        94180,\n        94180,\n    ],\n    [\n        113821,\n        113822,\n    ],\n    [\n        118528,\n        118573,\n    ],\n    [\n        118576,\n        118598,\n    ],\n    [\n        119143,\n        119145,\n    ],\n    [\n        119163,\n        119170,\n    ],\n    [\n        119173,\n        119179,\n    ],\n    [\n        119210,\n        119213,\n    ],\n    [\n        119362,\n        119364,\n    ],\n    [\n        121344,\n        121398,\n    ],\n    [\n        121403,\n        121452,\n    ],\n    [\n        121461,\n        121461,\n    ],\n    [\n        121476,\n        121476,\n    ],\n    [\n        121499,\n        121503,\n    ],\n    [\n        121505,\n        121519,\n    ],\n    [\n        122880,\n        122886,\n    ],\n    [\n        122888,\n        122904,\n    ],\n    [\n        122907,\n        122913,\n    ],\n    [\n        122915,\n        122916,\n    ],\n    [\n        122918,\n        122922,\n    ],\n    [\n        123023,\n        123023,\n    ],\n    [\n        123184,\n        123190,\n    ],\n    [\n        123566,\n        123566,\n    ],\n    [\n        123628,\n        123631,\n    ],\n    [\n        124140,\n        124143,\n    ],\n    [\n        124398,\n        124399,\n    ],\n    [\n        125136,\n        125142,\n    ],\n    [\n        125252,\n        125258,\n    ],\n    [\n        917760,\n        917999,\n    ],\n];\n","vendor/symfony/string/Resources/functions.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\String;\n\nif (!\\function_exists(u::class)) {\n    function u(?string $string = ''): UnicodeString\n    {\n        return new UnicodeString($string ?? '');\n    }\n}\n\nif (!\\function_exists(b::class)) {\n    function b(?string $string = ''): ByteString\n    {\n        return new ByteString($string ?? '');\n    }\n}\n\nif (!\\function_exists(s::class)) {\n    /**\n     * @return UnicodeString|ByteString\n     */\n    function s(?string $string = ''): AbstractString\n    {\n        $string ??= '';\n\n        return preg_match('//u', $string) ? new UnicodeString($string) : new ByteString($string);\n    }\n}\n","vendor/symfony/string/Slugger/AsciiSlugger.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\String\\Slugger;\n\nuse Symfony\\Component\\Emoji\\EmojiTransliterator;\nuse Symfony\\Component\\String\\AbstractUnicodeString;\nuse Symfony\\Component\\String\\UnicodeString;\nuse Symfony\\Contracts\\Translation\\LocaleAwareInterface;\n\nif (!interface_exists(LocaleAwareInterface::class)) {\n    throw new \\LogicException('You cannot use the \"Symfony\\Component\\String\\Slugger\\AsciiSlugger\" as the \"symfony/translation-contracts\" package is not installed. Try running \"composer require symfony/translation-contracts\".');\n}\n\n/**\n * @author Titouan Galopin <galopintitouan@gmail.com>\n */\nclass AsciiSlugger implements SluggerInterface, LocaleAwareInterface\n{\n    private const LOCALE_TO_TRANSLITERATOR_ID = [\n        'am' => 'Amharic-Latin',\n        'ar' => 'Arabic-Latin',\n        'az' => 'Azerbaijani-Latin',\n        'be' => 'Belarusian-Latin',\n        'bg' => 'Bulgarian-Latin',\n        'bn' => 'Bengali-Latin',\n        'de' => 'de-ASCII',\n        'el' => 'Greek-Latin',\n        'fa' => 'Persian-Latin',\n        'he' => 'Hebrew-Latin',\n        'hy' => 'Armenian-Latin',\n        'ka' => 'Georgian-Latin',\n        'kk' => 'Kazakh-Latin',\n        'ky' => 'Kirghiz-Latin',\n        'ko' => 'Korean-Latin',\n        'mk' => 'Macedonian-Latin',\n        'mn' => 'Mongolian-Latin',\n        'or' => 'Oriya-Latin',\n        'ps' => 'Pashto-Latin',\n        'ru' => 'Russian-Latin',\n        'sr' => 'Serbian-Latin',\n        'sr_Cyrl' => 'Serbian-Latin',\n        'th' => 'Thai-Latin',\n        'tk' => 'Turkmen-Latin',\n        'uk' => 'Ukrainian-Latin',\n        'uz' => 'Uzbek-Latin',\n        'zh' => 'Han-Latin',\n    ];\n\n    private \\Closure|array $symbolsMap = [\n        'en' => ['@' => 'at', '&' => 'and'],\n    ];\n    private bool|string $emoji = false;\n\n    /**\n     * Cache of transliterators per locale.\n     *\n     * @var \\Transliterator[]\n     */\n    private array $transliterators = [];\n\n    public function __construct(\n        private ?string $defaultLocale = null,\n        array|\\Closure|null $symbolsMap = null,\n    ) {\n        $this->symbolsMap = $symbolsMap ?? $this->symbolsMap;\n    }\n\n    public function setLocale(string $locale): void\n    {\n        $this->defaultLocale = $locale;\n    }\n\n    public function getLocale(): string\n    {\n        return $this->defaultLocale ?? '';\n    }\n\n    /**\n     * @param bool|string $emoji true will use the same locale,\n     *                           false will disable emoji,\n     *                           and a string to use a specific locale\n     */\n    public function withEmoji(bool|string $emoji = true): static\n    {\n        if (false !== $emoji && !class_exists(EmojiTransliterator::class)) {\n            throw new \\LogicException(\\sprintf('You cannot use the \"%s()\" method as the \"symfony/emoji\" package is not installed. Try running \"composer require symfony/emoji\".', __METHOD__));\n        }\n\n        $new = clone $this;\n        $new->emoji = $emoji;\n\n        return $new;\n    }\n\n    public function slug(string $string, string $separator = '-', ?string $locale = null): AbstractUnicodeString\n    {\n        $locale ??= $this->defaultLocale;\n\n        $transliterator = [];\n        if ($locale && ('de' === $locale || str_starts_with($locale, 'de_'))) {\n            // Use the shortcut for German in UnicodeString::ascii() if possible (faster and no requirement on intl)\n            $transliterator = ['de-ASCII'];\n        } elseif (\\function_exists('transliterator_transliterate') && $locale) {\n            $transliterator = (array) $this->createTransliterator($locale);\n        }\n\n        if ($emojiTransliterator = $this->createEmojiTransliterator($locale)) {\n            $transliterator[] = $emojiTransliterator;\n        }\n\n        if ($this->symbolsMap instanceof \\Closure) {\n            // If the symbols map is passed as a closure, there is no need to fallback to the parent locale\n            // as the closure can just provide substitutions for all locales of interest.\n            $symbolsMap = $this->symbolsMap;\n            array_unshift($transliterator, static fn ($s) => $symbolsMap($s, $locale));\n        }\n\n        $unicodeString = (new UnicodeString($string))->ascii($transliterator);\n\n        if (\\is_array($this->symbolsMap)) {\n            $map = null;\n            if (isset($this->symbolsMap[$locale ?? ''])) {\n                $map = $this->symbolsMap[$locale ?? ''];\n            } else {\n                $parent = self::getParentLocale($locale);\n                if ($parent && isset($this->symbolsMap[$parent])) {\n                    $map = $this->symbolsMap[$parent];\n                }\n            }\n            if ($map) {\n                foreach ($map as $char => $replace) {\n                    $unicodeString = $unicodeString->replace($char, ' '.$replace.' ');\n                }\n            }\n        }\n\n        return $unicodeString\n            ->replaceMatches('/[^A-Za-z0-9]++/', $separator)\n            ->trim($separator)\n        ;\n    }\n\n    private function createTransliterator(string $locale): ?\\Transliterator\n    {\n        if (\\array_key_exists($locale, $this->transliterators)) {\n            return $this->transliterators[$locale];\n        }\n\n        // Exact locale supported, cache and return\n        if ($id = self::LOCALE_TO_TRANSLITERATOR_ID[$locale] ?? null) {\n            return $this->transliterators[$locale] = \\Transliterator::create($id.'/BGN') ?? \\Transliterator::create($id);\n        }\n\n        // Locale not supported and no parent, fallback to any-latin\n        if (!$parent = self::getParentLocale($locale)) {\n            return $this->transliterators[$locale] = null;\n        }\n\n        // Try to use the parent locale (ie. try \"de\" for \"de_AT\") and cache both locales\n        if ($id = self::LOCALE_TO_TRANSLITERATOR_ID[$parent] ?? null) {\n            $transliterator = \\Transliterator::create($id.'/BGN') ?? \\Transliterator::create($id);\n        }\n\n        return $this->transliterators[$locale] = $this->transliterators[$parent] = $transliterator ?? null;\n    }\n\n    private function createEmojiTransliterator(?string $locale): ?EmojiTransliterator\n    {\n        if (\\is_string($this->emoji)) {\n            $locale = $this->emoji;\n        } elseif (!$this->emoji) {\n            return null;\n        }\n\n        while (null !== $locale) {\n            try {\n                return EmojiTransliterator::create(\"emoji-$locale\");\n            } catch (\\IntlException) {\n                $locale = self::getParentLocale($locale);\n            }\n        }\n\n        return null;\n    }\n\n    private static function getParentLocale(?string $locale): ?string\n    {\n        if (!$locale) {\n            return null;\n        }\n        if (false === $str = strrchr($locale, '_')) {\n            // no parent locale\n            return null;\n        }\n\n        return substr($locale, 0, -\\strlen($str));\n    }\n}\n","vendor/symfony/string/Slugger/SluggerInterface.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\String\\Slugger;\n\nuse Symfony\\Component\\String\\AbstractUnicodeString;\n\n/**\n * Creates a URL-friendly slug from a given string.\n *\n * @author Titouan Galopin <galopintitouan@gmail.com>\n */\ninterface SluggerInterface\n{\n    /**\n     * Creates a slug for the given string and locale, using appropriate transliteration when needed.\n     */\n    public function slug(string $string, string $separator = '-', ?string $locale = null): AbstractUnicodeString;\n}\n","vendor/symfony/string/TruncateMode.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\String;\n\nenum TruncateMode\n{\n    /**\n     * Will cut exactly at given length.\n     *\n     * Length: 14\n     * Source: Lorem ipsum dolor sit amet\n     * Output: Lorem ipsum do\n     */\n    case Char;\n\n    /**\n     * Returns the string up to the last complete word containing the specified length.\n     *\n     * Length: 14\n     * Source: Lorem ipsum dolor sit amet\n     * Output: Lorem ipsum\n     */\n    case WordBefore;\n\n    /**\n     * Returns the string up to the complete word after or at the given length.\n     *\n     * Length: 14\n     * Source: Lorem ipsum dolor sit amet\n     * Output: Lorem ipsum dolor\n     */\n    case WordAfter;\n}\n","vendor/symfony/string/UnicodeString.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\String;\n\nuse Symfony\\Component\\String\\Exception\\ExceptionInterface;\nuse Symfony\\Component\\String\\Exception\\InvalidArgumentException;\n\n/**\n * Represents a string of Unicode grapheme clusters encoded as UTF-8.\n *\n * A letter followed by combining characters (accents typically) form what Unicode defines\n * as a grapheme cluster: a character as humans mean it in written texts. This class knows\n * about the concept and won't split a letter apart from its combining accents. It also\n * ensures all string comparisons happen on their canonically-composed representation,\n * ignoring e.g. the order in which accents are listed when a letter has many of them.\n *\n * @see https://unicode.org/reports/tr15/\n *\n * @author Nicolas Grekas <p@tchwork.com>\n * @author Hugo Hamon <hugohamon@neuf.fr>\n *\n * @throws ExceptionInterface\n */\nclass UnicodeString extends AbstractUnicodeString\n{\n    public function __construct(string $string = '')\n    {\n        if ('' === $string || normalizer_is_normalized($this->string = $string)) {\n            return;\n        }\n\n        if (false === $string = normalizer_normalize($string)) {\n            throw new InvalidArgumentException('Invalid UTF-8 string.');\n        }\n\n        $this->string = $string;\n    }\n\n    public function append(string ...$suffix): static\n    {\n        $str = clone $this;\n        $str->string = $this->string.(1 >= \\count($suffix) ? ($suffix[0] ?? '') : implode('', $suffix));\n\n        if (normalizer_is_normalized($str->string)) {\n            return $str;\n        }\n\n        if (false === $string = normalizer_normalize($str->string)) {\n            throw new InvalidArgumentException('Invalid UTF-8 string.');\n        }\n\n        $str->string = $string;\n\n        return $str;\n    }\n\n    public function chunk(int $length = 1): array\n    {\n        if (1 > $length) {\n            throw new InvalidArgumentException('The chunk length must be greater than zero.');\n        }\n\n        if ('' === $this->string) {\n            return [];\n        }\n\n        $rx = '/(';\n        while (65535 < $length) {\n            $rx .= '\\X{65535}';\n            $length -= 65535;\n        }\n        $rx .= '\\X{'.$length.'})/u';\n\n        $str = clone $this;\n        $chunks = [];\n\n        foreach (preg_split($rx, $this->string, -1, \\PREG_SPLIT_DELIM_CAPTURE | \\PREG_SPLIT_NO_EMPTY) as $chunk) {\n            $str->string = $chunk;\n            $chunks[] = clone $str;\n        }\n\n        return $chunks;\n    }\n\n    public function endsWith(string|iterable|AbstractString $suffix): bool\n    {\n        if ($suffix instanceof AbstractString) {\n            $suffix = $suffix->string;\n        } elseif (!\\is_string($suffix)) {\n            return parent::endsWith($suffix);\n        }\n\n        $form = null === $this->ignoreCase ? \\Normalizer::NFD : \\Normalizer::NFC;\n        normalizer_is_normalized($suffix, $form) ?: $suffix = normalizer_normalize($suffix, $form);\n\n        if ('' === $suffix || false === $suffix) {\n            return false;\n        }\n\n        if (false === $grapheme = grapheme_extract($this->string, \\strlen($suffix), \\GRAPHEME_EXTR_MAXBYTES, \\strlen($this->string) - \\strlen($suffix))) {\n            $grapheme = '';\n        }\n\n        if ($this->ignoreCase) {\n            return 0 === mb_stripos($grapheme, $suffix, 0, 'UTF-8');\n        }\n\n        return $suffix === $grapheme;\n    }\n\n    public function equalsTo(string|iterable|AbstractString $string): bool\n    {\n        if ($string instanceof AbstractString) {\n            $string = $string->string;\n        } elseif (!\\is_string($string)) {\n            return parent::equalsTo($string);\n        }\n\n        $form = null === $this->ignoreCase ? \\Normalizer::NFD : \\Normalizer::NFC;\n        normalizer_is_normalized($string, $form) ?: $string = normalizer_normalize($string, $form);\n\n        if ('' !== $string && false !== $string && $this->ignoreCase) {\n            return \\strlen($string) === \\strlen($this->string) && 0 === mb_stripos($this->string, $string, 0, 'UTF-8');\n        }\n\n        return $string === $this->string;\n    }\n\n    public function indexOf(string|iterable|AbstractString $needle, int $offset = 0): ?int\n    {\n        if ($needle instanceof AbstractString) {\n            $needle = $needle->string;\n        } elseif (!\\is_string($needle)) {\n            return parent::indexOf($needle, $offset);\n        }\n\n        $form = null === $this->ignoreCase ? \\Normalizer::NFD : \\Normalizer::NFC;\n        normalizer_is_normalized($needle, $form) ?: $needle = normalizer_normalize($needle, $form);\n\n        if ('' === $needle || false === $needle) {\n            return null;\n        }\n\n        try {\n            $i = $this->ignoreCase ? grapheme_stripos($this->string, $needle, $offset) : grapheme_strpos($this->string, $needle, $offset);\n        } catch (\\ValueError) {\n            return null;\n        }\n\n        return false === $i ? null : $i;\n    }\n\n    public function indexOfLast(string|iterable|AbstractString $needle, int $offset = 0): ?int\n    {\n        if ($needle instanceof AbstractString) {\n            $needle = $needle->string;\n        } elseif (!\\is_string($needle)) {\n            return parent::indexOfLast($needle, $offset);\n        }\n\n        $form = null === $this->ignoreCase ? \\Normalizer::NFD : \\Normalizer::NFC;\n        normalizer_is_normalized($needle, $form) ?: $needle = normalizer_normalize($needle, $form);\n\n        if ('' === $needle || false === $needle) {\n            return null;\n        }\n\n        $string = $this->string;\n\n        if (0 > $offset) {\n            // workaround https://bugs.php.net/74264\n            if (0 > $offset += grapheme_strlen($needle)) {\n                $string = grapheme_substr($string, 0, $offset);\n            }\n            $offset = 0;\n        }\n\n        try {\n            $i = $this->ignoreCase ? grapheme_strripos($string, $needle, $offset) : grapheme_strrpos($string, $needle, $offset);\n        } catch (\\ValueError) {\n            return null;\n        }\n\n        return false === $i ? null : $i;\n    }\n\n    public function join(array $strings, ?string $lastGlue = null): static\n    {\n        $str = parent::join($strings, $lastGlue);\n        normalizer_is_normalized($str->string) ?: $str->string = normalizer_normalize($str->string);\n\n        return $str;\n    }\n\n    public function length(): int\n    {\n        return grapheme_strlen($this->string);\n    }\n\n    public function normalize(int $form = self::NFC): static\n    {\n        $str = clone $this;\n\n        if (\\in_array($form, [self::NFC, self::NFKC], true)) {\n            normalizer_is_normalized($str->string, $form) ?: $str->string = normalizer_normalize($str->string, $form);\n        } elseif (!\\in_array($form, [self::NFD, self::NFKD], true)) {\n            throw new InvalidArgumentException('Unsupported normalization form.');\n        } elseif (!normalizer_is_normalized($str->string, $form)) {\n            $str->string = normalizer_normalize($str->string, $form);\n            $str->ignoreCase = null;\n        }\n\n        return $str;\n    }\n\n    public function prepend(string ...$prefix): static\n    {\n        $str = clone $this;\n        $str->string = (1 >= \\count($prefix) ? ($prefix[0] ?? '') : implode('', $prefix)).$this->string;\n\n        if (normalizer_is_normalized($str->string)) {\n            return $str;\n        }\n\n        if (false === $string = normalizer_normalize($str->string)) {\n            throw new InvalidArgumentException('Invalid UTF-8 string.');\n        }\n\n        $str->string = $string;\n\n        return $str;\n    }\n\n    public function replace(string $from, string $to): static\n    {\n        $str = clone $this;\n        normalizer_is_normalized($from) ?: $from = normalizer_normalize($from);\n\n        if ('' !== $from && false !== $from) {\n            $tail = $str->string;\n            $result = '';\n            $indexOf = $this->ignoreCase ? 'grapheme_stripos' : 'grapheme_strpos';\n\n            while ('' !== $tail && false !== $i = $indexOf($tail, $from)) {\n                $slice = grapheme_substr($tail, 0, $i);\n                $result .= $slice.$to;\n                $tail = substr($tail, \\strlen($slice) + \\strlen($from));\n            }\n\n            $str->string = $result.$tail;\n\n            if (normalizer_is_normalized($str->string)) {\n                return $str;\n            }\n\n            if (false === $string = normalizer_normalize($str->string)) {\n                throw new InvalidArgumentException('Invalid UTF-8 string.');\n            }\n\n            $str->string = $string;\n        }\n\n        return $str;\n    }\n\n    public function replaceMatches(string $fromRegexp, string|callable $to): static\n    {\n        $str = parent::replaceMatches($fromRegexp, $to);\n        normalizer_is_normalized($str->string) ?: $str->string = normalizer_normalize($str->string);\n\n        return $str;\n    }\n\n    public function slice(int $start = 0, ?int $length = null): static\n    {\n        $str = clone $this;\n\n        $str->string = (string) grapheme_substr($this->string, $start, $length ?? 2147483647);\n\n        return $str;\n    }\n\n    public function splice(string $replacement, int $start = 0, ?int $length = null): static\n    {\n        $str = clone $this;\n\n        $start = $start ? \\strlen(grapheme_substr($this->string, 0, $start)) : 0;\n        $length = $length ? \\strlen(grapheme_substr(substr($this->string, $start), 0, $length)) : $length;\n        $str->string = substr_replace($this->string, $replacement, $start, $length ?? 2147483647);\n\n        if (normalizer_is_normalized($str->string)) {\n            return $str;\n        }\n\n        if (false === $string = normalizer_normalize($str->string)) {\n            throw new InvalidArgumentException('Invalid UTF-8 string.');\n        }\n\n        $str->string = $string;\n\n        return $str;\n    }\n\n    public function split(string $delimiter, ?int $limit = null, ?int $flags = null): array\n    {\n        if (1 > $limit ??= 2147483647) {\n            throw new InvalidArgumentException('Split limit must be a positive integer.');\n        }\n\n        if ('' === $delimiter) {\n            throw new InvalidArgumentException('Split delimiter is empty.');\n        }\n\n        if (null !== $flags) {\n            return parent::split($delimiter.'u', $limit, $flags);\n        }\n\n        normalizer_is_normalized($delimiter) ?: $delimiter = normalizer_normalize($delimiter);\n\n        if (false === $delimiter) {\n            throw new InvalidArgumentException('Split delimiter is not a valid UTF-8 string.');\n        }\n\n        $str = clone $this;\n        $tail = $this->string;\n        $chunks = [];\n        $indexOf = $this->ignoreCase ? 'grapheme_stripos' : 'grapheme_strpos';\n\n        while (1 < $limit && false !== $i = $indexOf($tail, $delimiter)) {\n            $str->string = grapheme_substr($tail, 0, $i);\n            $chunks[] = clone $str;\n            $tail = substr($tail, \\strlen($str->string) + \\strlen($delimiter));\n            --$limit;\n        }\n\n        $str->string = $tail;\n        $chunks[] = clone $str;\n\n        return $chunks;\n    }\n\n    public function startsWith(string|iterable|AbstractString $prefix): bool\n    {\n        if ($prefix instanceof AbstractString) {\n            $prefix = $prefix->string;\n        } elseif (!\\is_string($prefix)) {\n            return parent::startsWith($prefix);\n        }\n\n        $form = null === $this->ignoreCase ? \\Normalizer::NFD : \\Normalizer::NFC;\n        normalizer_is_normalized($prefix, $form) ?: $prefix = normalizer_normalize($prefix, $form);\n\n        if ('' === $prefix || false === $prefix) {\n            return false;\n        }\n\n        if (false === $grapheme = grapheme_extract($this->string, \\strlen($prefix), \\GRAPHEME_EXTR_MAXBYTES)) {\n            $grapheme = '';\n        }\n\n        if ($this->ignoreCase) {\n            return 0 === mb_stripos($grapheme, $prefix, 0, 'UTF-8');\n        }\n\n        return $prefix === $grapheme;\n    }\n\n    public function trimPrefix($prefix): static\n    {\n        if (\\is_array($prefix) || $prefix instanceof \\Traversable) {\n            return parent::trimPrefix($prefix);\n        }\n\n        if ($prefix instanceof AbstractString) {\n            $prefix = $prefix->string;\n        } else {\n            $prefix = (string) $prefix;\n        }\n\n        if (!normalizer_is_normalized($prefix, \\Normalizer::NFC)) {\n            $prefix = normalizer_normalize($prefix, \\Normalizer::NFC);\n        }\n\n        return parent::trimPrefix($prefix);\n    }\n\n    public function trimSuffix($suffix): static\n    {\n        if (\\is_array($suffix) || $suffix instanceof \\Traversable) {\n            return parent::trimSuffix($suffix);\n        }\n\n        if ($suffix instanceof AbstractString) {\n            $suffix = $suffix->string;\n        } else {\n            $suffix = (string) $suffix;\n        }\n\n        if (!normalizer_is_normalized($suffix, \\Normalizer::NFC)) {\n            $suffix = normalizer_normalize($suffix, \\Normalizer::NFC);\n        }\n\n        return parent::trimSuffix($suffix);\n    }\n\n    public function __unserialize(array $data): void\n    {\n        if ($wakeup = self::class !== (new \\ReflectionMethod($this, '__wakeup'))->class && self::class === (new \\ReflectionMethod($this, '__unserialize'))->class) {\n            trigger_deprecation('symfony/string', '7.4', 'Implementing \"%s::__wakeup()\" is deprecated, use \"__unserialize()\" instead.', get_debug_type($this));\n        }\n\n        if (($data['string'] ?? null) instanceof \\Stringable || ($data[\"\\0*\\0string\"] ?? null) instanceof \\Stringable) {\n            throw new \\BadMethodCallException('Cannot unserialize '.__CLASS__);\n        }\n\n        try {\n            if (\\in_array(array_keys($data), [['string'], [\"\\0*\\0string\"]], true)) {\n                $this->string = $data['string'] ?? $data[\"\\0*\\0string\"];\n\n                if ($wakeup) {\n                    $this->__wakeup();\n                }\n\n                return;\n            }\n\n            trigger_deprecation('symfony/string', '7.4', 'Passing more than just key \"string\" to \"%s::__unserialize()\" is deprecated, populate properties in \"%s::__unserialize()\" instead.', self::class, get_debug_type($this));\n\n            \\Closure::bind(function ($data) use ($wakeup) {\n                foreach ($data as $key => $value) {\n                    $this->{(\"\\0\" === $key[0] ?? '') ? substr($key, 1 + strrpos($key, \"\\0\")) : $key} = $value;\n                }\n\n                if ($wakeup) {\n                    $this->__wakeup();\n                }\n            }, $this, static::class)($data);\n        } finally {\n            if (!$wakeup) {\n                normalizer_is_normalized($this->string) ?: $this->string = normalizer_normalize($this->string);\n            }\n        }\n    }\n\n    /**\n     * @deprecated since Symfony 7.4, will be replaced by `__unserialize()` in 8.0\n     */\n    public function __wakeup(): void\n    {\n        trigger_deprecation('symfony/string', '7.4', 'Calling \"%s::__wakeup()\" is deprecated, use \"__unserialize()\" instead.', get_debug_type($this));\n\n        if (!\\is_string($this->string)) {\n            throw new \\BadMethodCallException('Cannot unserialize '.__CLASS__);\n        }\n\n        normalizer_is_normalized($this->string) ?: $this->string = normalizer_normalize($this->string);\n    }\n\n    public function __clone()\n    {\n        if (null === $this->ignoreCase) {\n            normalizer_is_normalized($this->string) ?: $this->string = normalizer_normalize($this->string);\n        }\n\n        $this->ignoreCase = false;\n    }\n}\n","vendor/symfony/string/composer.json":"{\n    \"name\": \"symfony/string\",\n    \"type\": \"library\",\n    \"description\": \"Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way\",\n    \"keywords\": [\"string\", \"utf8\", \"utf-8\", \"grapheme\", \"i18n\", \"unicode\"],\n    \"homepage\": \"https://symfony.com\",\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"Nicolas Grekas\",\n            \"email\": \"p@tchwork.com\"\n        },\n        {\n            \"name\": \"Symfony Community\",\n            \"homepage\": \"https://symfony.com/contributors\"\n        }\n    ],\n    \"require\": {\n        \"php\": \">=8.2\",\n        \"symfony/deprecation-contracts\": \"^2.5|^3.0\",\n        \"symfony/polyfill-ctype\": \"~1.8\",\n        \"symfony/polyfill-intl-grapheme\": \"~1.33\",\n        \"symfony/polyfill-intl-normalizer\": \"~1.0\",\n        \"symfony/polyfill-mbstring\": \"~1.0\"\n    },\n    \"require-dev\": {\n        \"symfony/emoji\": \"^7.1|^8.0\",\n        \"symfony/http-client\": \"^6.4|^7.0|^8.0\",\n        \"symfony/intl\": \"^6.4|^7.0|^8.0\",\n        \"symfony/translation-contracts\": \"^2.5|^3.0\",\n        \"symfony/var-exporter\": \"^6.4|^7.0|^8.0\"\n    },\n    \"conflict\": {\n        \"symfony/translation-contracts\": \"<2.5\"\n    },\n    \"autoload\": {\n        \"psr-4\": { \"Symfony\\\\Component\\\\String\\\\\": \"\" },\n        \"files\": [ \"Resources/functions.php\" ],\n        \"exclude-from-classmap\": [\n            \"/Tests/\"\n        ]\n    },\n    \"minimum-stability\": \"dev\"\n}\n","vendor/symfony/yaml/CHANGELOG.md":"CHANGELOG\n=========\n\n7.3\n---\n\n * Add compact nested mapping support by using the `Yaml::DUMP_COMPACT_NESTED_MAPPING` flag\n * Add the `Yaml::DUMP_FORCE_DOUBLE_QUOTES_ON_VALUES` flag to enforce double quotes around string values\n\n7.2\n---\n\n * Deprecate parsing duplicate mapping keys whose value is `null`\n * Add support for dumping `null` as an empty value by using the `Yaml::DUMP_NULL_AS_EMPTY` flag\n\n7.1\n---\n\n * Add support for getting all the enum cases with `!php/enum Foo`\n\n7.0\n---\n\n * Remove the `!php/const:` tag, use `!php/const` instead (without the colon)\n\n6.3\n---\n\n * Add support to dump int keys as strings by using the `Yaml::DUMP_NUMERIC_KEY_AS_STRING` flag\n\n6.2\n---\n\n * Add support for `!php/enum` and `!php/enum *->value`\n * Deprecate the `!php/const:` tag in key which will be replaced by the `!php/const` tag (without the colon) since 3.4\n\n6.1\n---\n\n * In cases where it will likely improve readability, strings containing single quotes will be double-quoted\n\n5.4\n---\n\n * Add a `$maxNestingLevel` argument to `Parser::__construct()`, `Yaml::parse()` and `Yaml::parseFile()` to bound recursion depth (default 128)\n * Add a `$maxAliasesForCollections` argument to `Parser::__construct()`, `Yaml::parse()` and `Yaml::parseFile()` to bound alias expansion of collection values (default 128)\n * Add `Yaml::PARSE_EXCEPTION_ON_ALIAS` to reject YAML aliases while parsing untrusted input\n * Add new `lint:yaml dirname --exclude=/dirname/foo.yaml --exclude=/dirname/bar.yaml`\n   option to exclude one or more specific files from multiple file list\n * Allow negatable for the parse tags option with `--no-parse-tags`\n\n5.3\n---\n\n * Added `github` format support & autodetection to render errors as annotations\n   when running the YAML linter command in a Github Action environment.\n\n5.1.0\n-----\n\n * Added support for parsing numbers prefixed with `0o` as octal numbers.\n * Deprecated support for parsing numbers starting with `0` as octal numbers. They will be parsed as strings as of Symfony 6.0. Prefix numbers with `0o`\n   so that they are parsed as octal numbers.\n\n   Before:\n\n   ```yaml\n   Yaml::parse('072');\n   ```\n\n   After:\n\n   ```yaml\n   Yaml::parse('0o72');\n   ```\n\n * Added `yaml-lint` binary.\n * Deprecated using the `!php/object` and `!php/const` tags without a value.\n\n5.0.0\n-----\n\n * Removed support for mappings inside multi-line strings.\n * removed support for implicit STDIN usage in the `lint:yaml` command, use `lint:yaml -` (append a dash) instead to make it explicit.\n\n4.4.0\n-----\n\n * Added support for parsing the inline notation spanning multiple lines.\n * Added support to dump `null` as `~` by using the `Yaml::DUMP_NULL_AS_TILDE` flag.\n * deprecated accepting STDIN implicitly when using the `lint:yaml` command, use `lint:yaml -` (append a dash) instead to make it explicit.\n\n4.3.0\n-----\n\n * Using a mapping inside a multi-line string is deprecated and will throw a `ParseException` in 5.0.\n\n4.2.0\n-----\n\n * added support for multiple files or directories in `LintCommand`\n\n4.0.0\n-----\n\n * The behavior of the non-specific tag `!` is changed and now forces\n   non-evaluating your values.\n * complex mappings will throw a `ParseException`\n * support for the comma as a group separator for floats has been dropped, use\n   the underscore instead\n * support for the `!!php/object` tag has been dropped, use the `!php/object`\n   tag instead\n * duplicate mapping keys throw a `ParseException`\n * non-string mapping keys throw a `ParseException`, use the `Yaml::PARSE_KEYS_AS_STRINGS`\n   flag to cast them to strings\n * `%` at the beginning of an unquoted string throw a `ParseException`\n * mappings with a colon (`:`) that is not followed by a whitespace throw a\n   `ParseException`\n * the `Dumper::setIndentation()` method has been removed\n * being able to pass boolean options to the `Yaml::parse()`, `Yaml::dump()`,\n   `Parser::parse()`, and `Dumper::dump()` methods to configure the behavior of\n   the parser and dumper is no longer supported, pass bitmask flags instead\n * the constructor arguments of the `Parser` class have been removed\n * the `Inline` class is internal and no longer part of the BC promise\n * removed support for the `!str` tag, use the `!!str` tag instead\n * added support for tagged scalars.\n\n   ```yml\n   Yaml::parse('!foo bar', Yaml::PARSE_CUSTOM_TAGS);\n   // returns TaggedValue('foo', 'bar');\n   ```\n\n3.4.0\n-----\n\n * added support for parsing YAML files using the `Yaml::parseFile()` or `Parser::parseFile()` method\n\n * the `Dumper`, `Parser`, and `Yaml` classes are marked as final\n\n * Deprecated the `!php/object:` tag which will be replaced by the\n   `!php/object` tag (without the colon) in 4.0.\n\n * Deprecated the `!php/const:` tag which will be replaced by the\n   `!php/const` tag (without the colon) in 4.0.\n\n * Support for the `!str` tag is deprecated, use the `!!str` tag instead.\n\n * Deprecated using the non-specific tag `!` as its behavior will change in 4.0.\n   It will force non-evaluating your values in 4.0. Use plain integers or `!!float` instead.\n\n3.3.0\n-----\n\n * Starting an unquoted string with a question mark followed by a space is\n   deprecated and will throw a `ParseException` in Symfony 4.0.\n\n * Deprecated support for implicitly parsing non-string mapping keys as strings.\n   Mapping keys that are no strings will lead to a `ParseException` in Symfony\n   4.0. Use quotes to opt-in for keys to be parsed as strings.\n\n   Before:\n\n   ```php\n   $yaml = <<<YAML\n   null: null key\n   true: boolean true\n   2.0: float key\n   YAML;\n\n   Yaml::parse($yaml);\n   ```\n\n   After:\n\n   ```php\n\n   $yaml = <<<YAML\n   \"null\": null key\n   \"true\": boolean true\n   \"2.0\": float key\n   YAML;\n\n   Yaml::parse($yaml);\n   ```\n\n * Omitted mapping values will be parsed as `null`.\n\n * Omitting the key of a mapping is deprecated and will throw a `ParseException` in Symfony 4.0.\n\n * Added support for dumping empty PHP arrays as YAML sequences:\n\n   ```php\n   Yaml::dump([], 0, 0, Yaml::DUMP_EMPTY_ARRAY_AS_SEQUENCE);\n   ```\n\n3.2.0\n-----\n\n * Mappings with a colon (`:`) that is not followed by a whitespace are deprecated\n   when the mapping key is not quoted and will lead to a `ParseException` in\n   Symfony 4.0 (e.g. `foo:bar` must be `foo: bar`).\n\n * Added support for parsing PHP constants:\n\n   ```php\n   Yaml::parse('!php/const:PHP_INT_MAX', Yaml::PARSE_CONSTANT);\n   ```\n\n * Support for silently ignoring duplicate mapping keys in YAML has been\n   deprecated and will lead to a `ParseException` in Symfony 4.0.\n\n3.1.0\n-----\n\n * Added support to dump `stdClass` and `ArrayAccess` objects as YAML mappings\n   through the `Yaml::DUMP_OBJECT_AS_MAP` flag.\n\n * Strings that are not UTF-8 encoded will be dumped as base64 encoded binary\n   data.\n\n * Added support for dumping multi line strings as literal blocks.\n\n * Added support for parsing base64 encoded binary data when they are tagged\n   with the `!!binary` tag.\n\n * Added support for parsing timestamps as `\\DateTime` objects:\n\n   ```php\n   Yaml::parse('2001-12-15 21:59:43.10 -5', Yaml::PARSE_DATETIME);\n   ```\n\n * `\\DateTime` and `\\DateTimeImmutable` objects are dumped as YAML timestamps.\n\n * Deprecated usage of `%` at the beginning of an unquoted string.\n\n * Added support for customizing the YAML parser behavior through an optional bit field:\n\n   ```php\n   Yaml::parse('{ \"foo\": \"bar\", \"fiz\": \"cat\" }', Yaml::PARSE_EXCEPTION_ON_INVALID_TYPE | Yaml::PARSE_OBJECT | Yaml::PARSE_OBJECT_FOR_MAP);\n   ```\n\n * Added support for customizing the dumped YAML string through an optional bit field:\n\n   ```php\n   Yaml::dump(['foo' => new A(), 'bar' => 1], 0, 0, Yaml::DUMP_EXCEPTION_ON_INVALID_TYPE | Yaml::DUMP_OBJECT);\n   ```\n\n3.0.0\n-----\n\n * Yaml::parse() now throws an exception when a blackslash is not escaped\n   in double-quoted strings\n\n2.8.0\n-----\n\n * Deprecated usage of a colon in an unquoted mapping value\n * Deprecated usage of @, \\`, | and > at the beginning of an unquoted string\n * When surrounding strings with double-quotes, you must now escape `\\` characters. Not\n   escaping those characters (when surrounded by double-quotes) is deprecated.\n\n   Before:\n\n   ```yml\n   class: \"Foo\\Var\"\n   ```\n\n   After:\n\n   ```yml\n   class: \"Foo\\\\Var\"\n   ```\n\n2.1.0\n-----\n\n * Yaml::parse() does not evaluate loaded files as PHP files by default\n   anymore (call Yaml::enablePhpParsing() to get back the old behavior)\n","vendor/symfony/yaml/Command/LintCommand.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Yaml\\Command;\n\nuse Symfony\\Component\\Console\\Attribute\\AsCommand;\nuse Symfony\\Component\\Console\\CI\\GithubActionReporter;\nuse Symfony\\Component\\Console\\Command\\Command;\nuse Symfony\\Component\\Console\\Completion\\CompletionInput;\nuse Symfony\\Component\\Console\\Completion\\CompletionSuggestions;\nuse Symfony\\Component\\Console\\Exception\\InvalidArgumentException;\nuse Symfony\\Component\\Console\\Exception\\RuntimeException;\nuse Symfony\\Component\\Console\\Input\\InputArgument;\nuse Symfony\\Component\\Console\\Input\\InputInterface;\nuse Symfony\\Component\\Console\\Input\\InputOption;\nuse Symfony\\Component\\Console\\Output\\OutputInterface;\nuse Symfony\\Component\\Console\\Style\\SymfonyStyle;\nuse Symfony\\Component\\Yaml\\Exception\\ParseException;\nuse Symfony\\Component\\Yaml\\Parser;\nuse Symfony\\Component\\Yaml\\Yaml;\n\n/**\n * Validates YAML files syntax and outputs encountered errors.\n *\n * @author Grégoire Pineau <lyrixx@lyrixx.info>\n * @author Robin Chalas <robin.chalas@gmail.com>\n */\n#[AsCommand(name: 'lint:yaml', description: 'Lint a YAML file and outputs encountered errors')]\nclass LintCommand extends Command\n{\n    private Parser $parser;\n    private ?string $format = null;\n    private bool $displayCorrectFiles;\n    private ?\\Closure $directoryIteratorProvider;\n    private ?\\Closure $isReadableProvider;\n\n    public function __construct(?string $name = null, ?callable $directoryIteratorProvider = null, ?callable $isReadableProvider = null)\n    {\n        parent::__construct($name);\n\n        $this->directoryIteratorProvider = null === $directoryIteratorProvider ? null : $directoryIteratorProvider(...);\n        $this->isReadableProvider = null === $isReadableProvider ? null : $isReadableProvider(...);\n    }\n\n    protected function configure(): void\n    {\n        $this\n            ->addArgument('filename', InputArgument::IS_ARRAY, 'A file, a directory or \"-\" for reading from STDIN')\n            ->addOption('format', null, InputOption::VALUE_REQUIRED, \\sprintf('The output format (\"%s\")', implode('\", \"', $this->getAvailableFormatOptions())))\n            ->addOption('exclude', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Path(s) to exclude')\n            ->addOption('parse-tags', null, InputOption::VALUE_NEGATABLE, 'Parse custom tags', null)\n            ->setHelp(<<<EOF\n                The <info>%command.name%</info> command lints a YAML file and outputs to STDOUT\n                the first encountered syntax error.\n\n                You can validates YAML contents passed from STDIN:\n\n                  <info>cat filename | php %command.full_name% -</info>\n\n                You can also validate the syntax of a file:\n\n                  <info>php %command.full_name% filename</info>\n\n                Or of a whole directory:\n\n                  <info>php %command.full_name% dirname</info>\n\n                The <info>--format</info> option specifies the format of the command output:\n\n                  <info>php %command.full_name% dirname --format=json</info>\n\n                You can also exclude one or more specific files:\n\n                  <info>php %command.full_name% dirname --exclude=\"dirname/foo.yaml\" --exclude=\"dirname/bar.yaml\"</info>\n\n                EOF\n            )\n        ;\n    }\n\n    protected function execute(InputInterface $input, OutputInterface $output): int\n    {\n        $io = new SymfonyStyle($input, $output);\n        $filenames = (array) $input->getArgument('filename');\n        $excludes = $input->getOption('exclude');\n        $this->format = $input->getOption('format');\n        $flags = $input->getOption('parse-tags');\n\n        if (null === $this->format) {\n            // Autodetect format according to CI environment\n            $this->format = class_exists(GithubActionReporter::class) && GithubActionReporter::isGithubActionEnvironment() ? 'github' : 'txt';\n        }\n\n        $flags = $flags ? Yaml::PARSE_CUSTOM_TAGS : 0;\n\n        $this->displayCorrectFiles = $output->isVerbose();\n\n        if (['-'] === $filenames) {\n            return $this->display($io, [$this->validate(file_get_contents('php://stdin'), $flags)]);\n        }\n\n        if (!$filenames) {\n            throw new RuntimeException('Please provide a filename or pipe file content to STDIN.');\n        }\n\n        $filesInfo = [];\n        foreach ($filenames as $filename) {\n            if (!$this->isReadable($filename)) {\n                throw new RuntimeException(\\sprintf('File or directory \"%s\" is not readable.', $filename));\n            }\n\n            foreach ($this->getFiles($filename) as $file) {\n                if (!\\in_array($file->getPathname(), $excludes, true)) {\n                    $filesInfo[] = $this->validate(file_get_contents($file), $flags, $file);\n                }\n            }\n        }\n\n        return $this->display($io, $filesInfo);\n    }\n\n    private function validate(string $content, int $flags, ?string $file = null): array\n    {\n        $prevErrorHandler = set_error_handler(function ($level, $message, $file, $line) use (&$prevErrorHandler) {\n            if (\\E_USER_DEPRECATED === $level) {\n                throw new ParseException($message, $this->getParser()->getRealCurrentLineNb() + 1);\n            }\n\n            return $prevErrorHandler ? $prevErrorHandler($level, $message, $file, $line) : false;\n        });\n\n        try {\n            $this->getParser()->parse($content, Yaml::PARSE_CONSTANT | $flags);\n        } catch (ParseException $e) {\n            return ['file' => $file, 'line' => $e->getParsedLine(), 'valid' => false, 'message' => $e->getMessage()];\n        } finally {\n            restore_error_handler();\n        }\n\n        return ['file' => $file, 'valid' => true];\n    }\n\n    private function display(SymfonyStyle $io, array $files): int\n    {\n        return match ($this->format) {\n            'txt' => $this->displayTxt($io, $files),\n            'json' => $this->displayJson($io, $files),\n            'github' => $this->displayTxt($io, $files, true),\n            default => throw new InvalidArgumentException(\\sprintf('Supported formats are \"%s\".', implode('\", \"', $this->getAvailableFormatOptions()))),\n        };\n    }\n\n    private function displayTxt(SymfonyStyle $io, array $filesInfo, bool $errorAsGithubAnnotations = false): int\n    {\n        $countFiles = \\count($filesInfo);\n        $erroredFiles = 0;\n        $suggestTagOption = false;\n\n        if ($errorAsGithubAnnotations) {\n            $githubReporter = new GithubActionReporter($io);\n        }\n\n        foreach ($filesInfo as $info) {\n            if ($info['valid'] && $this->displayCorrectFiles) {\n                $io->comment('<info>OK</info>'.($info['file'] ? \\sprintf(' in %s', $info['file']) : ''));\n            } elseif (!$info['valid']) {\n                ++$erroredFiles;\n                $io->text('<error> ERROR </error>'.($info['file'] ? \\sprintf(' in %s', $info['file']) : ''));\n                $io->text(\\sprintf('<error> >> %s</error>', $info['message']));\n\n                if (str_contains($info['message'], 'PARSE_CUSTOM_TAGS')) {\n                    $suggestTagOption = true;\n                }\n\n                if ($errorAsGithubAnnotations) {\n                    $githubReporter->error($info['message'], $info['file'] ?? 'php://stdin', $info['line']);\n                }\n            }\n        }\n\n        if (0 === $erroredFiles) {\n            $io->success(\\sprintf('All %d YAML files contain valid syntax.', $countFiles));\n        } else {\n            $io->warning(\\sprintf('%d YAML files have valid syntax and %d contain errors.%s', $countFiles - $erroredFiles, $erroredFiles, $suggestTagOption ? ' Use the --parse-tags option if you want parse custom tags.' : ''));\n        }\n\n        return min($erroredFiles, 1);\n    }\n\n    private function displayJson(SymfonyStyle $io, array $filesInfo): int\n    {\n        $errors = 0;\n\n        array_walk($filesInfo, static function (&$v) use (&$errors) {\n            $v['file'] = (string) $v['file'];\n            if (!$v['valid']) {\n                ++$errors;\n            }\n\n            if (isset($v['message']) && str_contains($v['message'], 'PARSE_CUSTOM_TAGS')) {\n                $v['message'] .= ' Use the --parse-tags option if you want parse custom tags.';\n            }\n        });\n\n        $io->writeln(json_encode($filesInfo, \\JSON_PRETTY_PRINT | \\JSON_UNESCAPED_SLASHES));\n\n        return min($errors, 1);\n    }\n\n    private function getFiles(string $fileOrDirectory): iterable\n    {\n        if (is_file($fileOrDirectory)) {\n            yield new \\SplFileInfo($fileOrDirectory);\n\n            return;\n        }\n\n        foreach ($this->getDirectoryIterator($fileOrDirectory) as $file) {\n            if (!\\in_array($file->getExtension(), ['yml', 'yaml'], true)) {\n                continue;\n            }\n\n            yield $file;\n        }\n    }\n\n    private function getParser(): Parser\n    {\n        return $this->parser ??= new Parser();\n    }\n\n    private function getDirectoryIterator(string $directory): iterable\n    {\n        $default = static fn ($directory) => new \\RecursiveIteratorIterator(\n            new \\RecursiveDirectoryIterator($directory, \\FilesystemIterator::SKIP_DOTS | \\FilesystemIterator::FOLLOW_SYMLINKS),\n            \\RecursiveIteratorIterator::LEAVES_ONLY\n        );\n\n        if (null !== $this->directoryIteratorProvider) {\n            return ($this->directoryIteratorProvider)($directory, $default);\n        }\n\n        return $default($directory);\n    }\n\n    private function isReadable(string $fileOrDirectory): bool\n    {\n        $default = is_readable(...);\n\n        if (null !== $this->isReadableProvider) {\n            return ($this->isReadableProvider)($fileOrDirectory, $default);\n        }\n\n        return $default($fileOrDirectory);\n    }\n\n    public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void\n    {\n        if ($input->mustSuggestOptionValuesFor('format')) {\n            $suggestions->suggestValues($this->getAvailableFormatOptions());\n        }\n    }\n\n    /** @return string[] */\n    private function getAvailableFormatOptions(): array\n    {\n        return ['txt', 'json', 'github'];\n    }\n}\n","vendor/symfony/yaml/Dumper.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Yaml;\n\nuse Symfony\\Component\\Yaml\\Tag\\TaggedValue;\n\n/**\n * Dumper dumps PHP variables to YAML strings.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n *\n * @final\n */\nclass Dumper\n{\n    /**\n     * @param int $indentation The amount of spaces to use for indentation of nested nodes\n     */\n    public function __construct(private int $indentation = 4)\n    {\n        if ($indentation < 1) {\n            throw new \\InvalidArgumentException('The indentation must be greater than zero.');\n        }\n    }\n\n    /**\n     * Dumps a PHP value to YAML.\n     *\n     * @param mixed                     $input  The PHP value\n     * @param int                       $inline The level where you switch to inline YAML\n     * @param int                       $indent The level of indentation (used internally)\n     * @param int-mask-of<Yaml::DUMP_*> $flags  A bit field of Yaml::DUMP_* constants to customize the dumped YAML string\n     */\n    public function dump(mixed $input, int $inline = 0, int $indent = 0, int $flags = 0): string\n    {\n        if ($flags & Yaml::DUMP_NULL_AS_EMPTY && $flags & Yaml::DUMP_NULL_AS_TILDE) {\n            throw new \\InvalidArgumentException('The Yaml::DUMP_NULL_AS_EMPTY and Yaml::DUMP_NULL_AS_TILDE flags cannot be used together.');\n        }\n\n        return $this->doDump($input, $inline, $indent, $flags);\n    }\n\n    private function doDump(mixed $input, int $inline = 0, int $indent = 0, int $flags = 0, int $nestingLevel = 0): string\n    {\n        $output = '';\n        $prefix = $indent ? str_repeat(' ', $indent) : '';\n        $dumpObjectAsInlineMap = true;\n\n        if (Yaml::DUMP_OBJECT_AS_MAP & $flags && ($input instanceof \\ArrayObject || $input instanceof \\stdClass)) {\n            $dumpObjectAsInlineMap = !(array) $input;\n        }\n\n        if ($inline <= 0 || (!\\is_array($input) && !$input instanceof TaggedValue && $dumpObjectAsInlineMap) || !$input) {\n            $output .= $prefix.Inline::dump($input, $flags, 0 === $nestingLevel);\n        } elseif ($input instanceof TaggedValue) {\n            $output .= $this->dumpTaggedValue($input, $inline, $indent, $flags, $prefix, $nestingLevel);\n        } else {\n            $dumpAsMap = Inline::isHash($input);\n            $compactNestedMapping = Yaml::DUMP_COMPACT_NESTED_MAPPING & $flags && !$dumpAsMap;\n\n            foreach ($input as $key => $value) {\n                if ('' !== $output && \"\\n\" !== $output[-1]) {\n                    $output .= \"\\n\";\n                }\n\n                if (\\is_int($key) && Yaml::DUMP_NUMERIC_KEY_AS_STRING & $flags) {\n                    $key = (string) $key;\n                }\n\n                if (Yaml::DUMP_MULTI_LINE_LITERAL_BLOCK & $flags && \\is_string($value) && str_contains($value, \"\\n\") && !str_contains($value, \"\\r\")) {\n                    $blockIndentationIndicator = $this->getBlockIndentationIndicator($value);\n\n                    if (isset($value[-2]) && \"\\n\" === $value[-2] && \"\\n\" === $value[-1]) {\n                        $blockChompingIndicator = '+';\n                    } elseif (\"\\n\" === $value[-1]) {\n                        $blockChompingIndicator = '';\n                    } else {\n                        $blockChompingIndicator = '-';\n                    }\n\n                    $output .= \\sprintf('%s%s%s |%s%s', $prefix, $dumpAsMap ? Inline::dump($key, $flags).':' : '-', '', $blockIndentationIndicator, $blockChompingIndicator);\n\n                    foreach (explode(\"\\n\", $value) as $row) {\n                        if ('' === $row) {\n                            $output .= \"\\n\";\n                        } else {\n                            $output .= \\sprintf(\"\\n%s%s%s\", $prefix, str_repeat(' ', $this->indentation), $row);\n                        }\n                    }\n\n                    continue;\n                }\n\n                if ($value instanceof TaggedValue) {\n                    $output .= \\sprintf('%s%s !%s', $prefix, $dumpAsMap ? Inline::dump($key, $flags).':' : '-', $value->getTag());\n\n                    if (Yaml::DUMP_MULTI_LINE_LITERAL_BLOCK & $flags && \\is_string($value->getValue()) && str_contains($value->getValue(), \"\\n\") && !str_contains($value->getValue(), \"\\r\\n\")) {\n                        $blockIndentationIndicator = $this->getBlockIndentationIndicator($value->getValue());\n                        $output .= \\sprintf(' |%s', $blockIndentationIndicator);\n\n                        foreach (explode(\"\\n\", $value->getValue()) as $row) {\n                            $output .= \\sprintf(\"\\n%s%s%s\", $prefix, str_repeat(' ', $this->indentation), $row);\n                        }\n\n                        continue;\n                    }\n\n                    if ($inline - 1 <= 0 || null === $value->getValue() || \\is_scalar($value->getValue())) {\n                        $output .= ' '.$this->doDump($value->getValue(), $inline - 1, 0, $flags, $nestingLevel + 1).\"\\n\";\n                    } else {\n                        $output .= \"\\n\";\n                        $output .= $this->doDump($value->getValue(), $inline - 1, $dumpAsMap ? $indent + $this->indentation : $indent + 2, $flags, $nestingLevel + 1);\n                    }\n\n                    continue;\n                }\n\n                $dumpObjectAsInlineMap = true;\n\n                if (Yaml::DUMP_OBJECT_AS_MAP & $flags && ($value instanceof \\ArrayObject || $value instanceof \\stdClass)) {\n                    $dumpObjectAsInlineMap = !(array) $value;\n                }\n\n                $willBeInlined = $inline - 1 <= 0 || !\\is_array($value) && $dumpObjectAsInlineMap || !$value;\n\n                $output .= \\sprintf('%s%s%s%s',\n                    $prefix,\n                    $dumpAsMap ? Inline::dump($key, $flags).':' : '-',\n                    $willBeInlined || ($compactNestedMapping && \\is_array($value) && Inline::isHash($value)) ? ' ' : \"\\n\",\n                    $compactNestedMapping && \\is_array($value) && Inline::isHash($value) ? substr($this->doDump($value, $inline - 1, $indent + 2, $flags, $nestingLevel + 1), $indent + 2) : $this->doDump($value, $inline - 1, $willBeInlined ? 0 : $indent + $this->indentation, $flags, $nestingLevel + 1)\n                ).($willBeInlined ? \"\\n\" : '');\n            }\n        }\n\n        return $output;\n    }\n\n    private function dumpTaggedValue(TaggedValue $value, int $inline, int $indent, int $flags, string $prefix, int $nestingLevel): string\n    {\n        $output = \\sprintf('%s!%s', $prefix ? $prefix.' ' : '', $value->getTag());\n\n        if (Yaml::DUMP_MULTI_LINE_LITERAL_BLOCK & $flags && \\is_string($value->getValue()) && str_contains($value->getValue(), \"\\n\") && !str_contains($value->getValue(), \"\\r\\n\")) {\n            $blockIndentationIndicator = $this->getBlockIndentationIndicator($value->getValue());\n            $output .= \\sprintf(' |%s', $blockIndentationIndicator);\n\n            foreach (explode(\"\\n\", $value->getValue()) as $row) {\n                $output .= \\sprintf(\"\\n%s%s%s\", $prefix, str_repeat(' ', $this->indentation), $row);\n            }\n\n            return $output;\n        }\n\n        if ($inline - 1 <= 0 || null === $value->getValue() || \\is_scalar($value->getValue())) {\n            return $output.' '.$this->doDump($value->getValue(), $inline - 1, 0, $flags, $nestingLevel + 1).\"\\n\";\n        }\n\n        return $output.\"\\n\".$this->doDump($value->getValue(), $inline - 1, $indent, $flags, $nestingLevel + 1);\n    }\n\n    private function getBlockIndentationIndicator(string $value): string\n    {\n        $lines = explode(\"\\n\", $value);\n\n        // If the first line (that is neither empty nor contains only spaces)\n        // starts with a space character, the spec requires a block indentation indicator\n        // http://www.yaml.org/spec/1.2/spec.html#id2793979\n        foreach ($lines as $line) {\n            if ('' !== trim($line, ' ')) {\n                return str_starts_with($line, ' ') ? (string) $this->indentation : '';\n            }\n        }\n\n        return '';\n    }\n}\n","vendor/symfony/yaml/Escaper.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Yaml;\n\n/**\n * Escaper encapsulates escaping rules for single and double-quoted\n * YAML strings.\n *\n * @author Matthew Lewinski <matthew@lewinski.org>\n *\n * @internal\n */\nclass Escaper\n{\n    // Characters that would cause a dumped string to require double quoting.\n    public const REGEX_CHARACTER_TO_ESCAPE = \"[\\\\x00-\\\\x1f]|\\x7f|\\xc2\\x85|\\xc2\\xa0|\\xe2\\x80\\xa8|\\xe2\\x80\\xa9\";\n\n    // Mapping arrays for escaping a double quoted string. The backslash is\n    // first to ensure proper escaping because str_replace operates iteratively\n    // on the input arrays. This ordering of the characters avoids the use of strtr,\n    // which performs more slowly.\n    private const ESCAPEES = [\n        '\\\\', '\\\\\\\\', '\\\\\"', '\"',\n        \"\\x00\",  \"\\x01\",  \"\\x02\",  \"\\x03\",  \"\\x04\",  \"\\x05\",  \"\\x06\",  \"\\x07\",\n        \"\\x08\",  \"\\x09\",  \"\\x0a\",  \"\\x0b\",  \"\\x0c\",  \"\\x0d\",  \"\\x0e\",  \"\\x0f\",\n        \"\\x10\",  \"\\x11\",  \"\\x12\",  \"\\x13\",  \"\\x14\",  \"\\x15\",  \"\\x16\",  \"\\x17\",\n        \"\\x18\",  \"\\x19\",  \"\\x1a\",  \"\\x1b\",  \"\\x1c\",  \"\\x1d\",  \"\\x1e\",  \"\\x1f\",\n        \"\\x7f\",\n        \"\\xc2\\x85\", \"\\xc2\\xa0\", \"\\xe2\\x80\\xa8\", \"\\xe2\\x80\\xa9\",\n    ];\n    private const ESCAPED = [\n        '\\\\\\\\', '\\\\\"', '\\\\\\\\', '\\\\\"',\n        '\\\\0',   '\\\\x01', '\\\\x02', '\\\\x03', '\\\\x04', '\\\\x05', '\\\\x06', '\\\\a',\n        '\\\\b',   '\\\\t',   '\\\\n',   '\\\\v',   '\\\\f',   '\\\\r',   '\\\\x0e', '\\\\x0f',\n        '\\\\x10', '\\\\x11', '\\\\x12', '\\\\x13', '\\\\x14', '\\\\x15', '\\\\x16', '\\\\x17',\n        '\\\\x18', '\\\\x19', '\\\\x1a', '\\\\e',   '\\\\x1c', '\\\\x1d', '\\\\x1e', '\\\\x1f',\n        '\\\\x7f',\n        '\\\\N', '\\\\_', '\\\\L', '\\\\P',\n    ];\n\n    /**\n     * Determines if a PHP value would require double quoting in YAML.\n     *\n     * @param string $value A PHP value\n     */\n    public static function requiresDoubleQuoting(string $value): bool\n    {\n        return 0 < preg_match('/'.self::REGEX_CHARACTER_TO_ESCAPE.'/u', $value);\n    }\n\n    /**\n     * Escapes and surrounds a PHP value with double quotes.\n     *\n     * @param string $value A PHP value\n     */\n    public static function escapeWithDoubleQuotes(string $value): string\n    {\n        return \\sprintf('\"%s\"', str_replace(self::ESCAPEES, self::ESCAPED, $value));\n    }\n\n    /**\n     * Determines if a PHP value would require single quoting in YAML.\n     *\n     * @param string $value A PHP value\n     */\n    public static function requiresSingleQuoting(string $value): bool\n    {\n        // Determines if a PHP value is entirely composed of a value that would\n        // require single quoting in YAML.\n        if (\\in_array(strtolower($value), ['null', '~', 'true', 'false', 'y', 'n', 'yes', 'no', 'on', 'off'], true)) {\n            return true;\n        }\n\n        // Determines if the PHP value contains any single characters that would\n        // cause it to require single quoting in YAML.\n        return 0 < preg_match('/[\\s\\'\"\\:\\{\\}\\[\\],&\\*\\#\\?] | \\A[\\-?|<>=!%@`\\p{Zs}]/xu', $value);\n    }\n\n    /**\n     * Escapes and surrounds a PHP value with single quotes.\n     *\n     * @param string $value A PHP value\n     */\n    public static function escapeWithSingleQuotes(string $value): string\n    {\n        return \\sprintf(\"'%s'\", str_replace('\\'', '\\'\\'', $value));\n    }\n}\n","vendor/symfony/yaml/Exception/DumpException.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Yaml\\Exception;\n\n/**\n * Exception class thrown when an error occurs during dumping.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n */\nclass DumpException extends RuntimeException\n{\n}\n","vendor/symfony/yaml/Exception/ExceptionInterface.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Yaml\\Exception;\n\n/**\n * Exception interface for all exceptions thrown by the component.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n */\ninterface ExceptionInterface extends \\Throwable\n{\n}\n","vendor/symfony/yaml/Exception/ParseException.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Yaml\\Exception;\n\n/**\n * Exception class thrown when an error occurs during parsing.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n */\nclass ParseException extends RuntimeException\n{\n    /**\n     * @param string      $rawMessage The error message\n     * @param int         $parsedLine The line where the error occurred\n     * @param string|null $snippet    The snippet of code near the problem\n     * @param string|null $parsedFile The file name where the error occurred\n     */\n    public function __construct(\n        private string $rawMessage,\n        private int $parsedLine = -1,\n        private ?string $snippet = null,\n        private ?string $parsedFile = null,\n        ?\\Throwable $previous = null,\n    ) {\n        $this->updateRepr();\n\n        parent::__construct($this->message, 0, $previous);\n    }\n\n    /**\n     * Gets the snippet of code near the error.\n     */\n    public function getSnippet(): string\n    {\n        return $this->snippet;\n    }\n\n    /**\n     * Sets the snippet of code near the error.\n     */\n    public function setSnippet(string $snippet): void\n    {\n        $this->snippet = $snippet;\n\n        $this->updateRepr();\n    }\n\n    /**\n     * Gets the filename where the error occurred.\n     *\n     * This method returns null if a string is parsed.\n     */\n    public function getParsedFile(): string\n    {\n        return $this->parsedFile;\n    }\n\n    /**\n     * Sets the filename where the error occurred.\n     */\n    public function setParsedFile(string $parsedFile): void\n    {\n        $this->parsedFile = $parsedFile;\n\n        $this->updateRepr();\n    }\n\n    /**\n     * Gets the line where the error occurred.\n     */\n    public function getParsedLine(): int\n    {\n        return $this->parsedLine;\n    }\n\n    /**\n     * Sets the line where the error occurred.\n     */\n    public function setParsedLine(int $parsedLine): void\n    {\n        $this->parsedLine = $parsedLine;\n\n        $this->updateRepr();\n    }\n\n    private function updateRepr(): void\n    {\n        $this->message = $this->rawMessage;\n\n        $dot = false;\n        if (str_ends_with($this->message, '.')) {\n            $this->message = substr($this->message, 0, -1);\n            $dot = true;\n        }\n\n        if (null !== $this->parsedFile) {\n            $this->message .= \\sprintf(' in %s', json_encode($this->parsedFile, \\JSON_UNESCAPED_SLASHES | \\JSON_UNESCAPED_UNICODE));\n        }\n\n        if ($this->parsedLine >= 0) {\n            $this->message .= \\sprintf(' at line %d', $this->parsedLine);\n        }\n\n        if ($this->snippet) {\n            $this->message .= \\sprintf(' (near \"%s\")', $this->snippet);\n        }\n\n        if ($dot) {\n            $this->message .= '.';\n        }\n    }\n}\n","vendor/symfony/yaml/Exception/RuntimeException.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Yaml\\Exception;\n\n/**\n * Exception class thrown when an error occurs during parsing.\n *\n * @author Romain Neutron <imprec@gmail.com>\n */\nclass RuntimeException extends \\RuntimeException implements ExceptionInterface\n{\n}\n","vendor/symfony/yaml/Inline.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Yaml;\n\nuse Symfony\\Component\\Yaml\\Exception\\DumpException;\nuse Symfony\\Component\\Yaml\\Exception\\ParseException;\nuse Symfony\\Component\\Yaml\\Tag\\TaggedValue;\n\n/**\n * Inline implements a YAML parser/dumper for the YAML inline syntax.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n *\n * @internal\n */\nclass Inline\n{\n    public const REGEX_QUOTED_STRING = '(?:\"([^\"\\\\\\\\]*+(?:\\\\\\\\.[^\"\\\\\\\\]*+)*+)\"|\\'([^\\']*+(?:\\'\\'[^\\']*+)*+)\\')';\n\n    public static int $parsedLineNumber = -1;\n    public static ?string $parsedFilename = null;\n\n    private static bool $exceptionOnInvalidType = false;\n    private static bool $objectSupport = false;\n    private static bool $objectForMap = false;\n    private static bool $constantSupport = false;\n\n    public static function initialize(int $flags, ?int $parsedLineNumber = null, ?string $parsedFilename = null): void\n    {\n        self::$exceptionOnInvalidType = (bool) (Yaml::PARSE_EXCEPTION_ON_INVALID_TYPE & $flags);\n        self::$objectSupport = (bool) (Yaml::PARSE_OBJECT & $flags);\n        self::$objectForMap = (bool) (Yaml::PARSE_OBJECT_FOR_MAP & $flags);\n        self::$constantSupport = (bool) (Yaml::PARSE_CONSTANT & $flags);\n        self::$parsedFilename = $parsedFilename;\n\n        if (null !== $parsedLineNumber) {\n            self::$parsedLineNumber = $parsedLineNumber;\n        }\n    }\n\n    /**\n     * Converts a YAML string to a PHP value.\n     *\n     * @param int   $flags      A bit field of Yaml::PARSE_* constants to customize the YAML parser behavior\n     * @param array $references Mapping of variable names to values\n     *\n     * @throws ParseException\n     */\n    public static function parse(string $value, int $flags = 0, array &$references = [], ?ParserState $state = null): mixed\n    {\n        self::initialize($flags);\n        $state ??= new ParserState();\n\n        $value = trim($value);\n\n        if ('' === $value) {\n            return '';\n        }\n\n        $i = 0;\n        $isQuoted = null;\n        $tag = self::parseTag($value, $i, $flags);\n        switch ($value[$i]) {\n            case '[':\n                $result = self::parseSequence($state, $value, $flags, $i, $references);\n                ++$i;\n                break;\n            case '{':\n                $result = self::parseMapping($state, $value, $flags, $i, $references);\n                ++$i;\n                break;\n            default:\n                $result = self::parseScalar($value, $flags, null, $i, true, $references, $isQuoted, $state);\n        }\n\n        // some comments are allowed at the end\n        if (preg_replace('/\\s*#.*$/A', '', substr($value, $i))) {\n            throw new ParseException(\\sprintf('Unexpected characters near \"%s\".', substr($value, $i)), self::$parsedLineNumber + 1, $value, self::$parsedFilename);\n        }\n\n        if (null !== $tag && '' !== $tag) {\n            return new TaggedValue($tag, $result);\n        }\n\n        return $result;\n    }\n\n    /**\n     * Dumps a given PHP variable to a YAML string.\n     *\n     * @param mixed $value The PHP variable to convert\n     * @param int   $flags A bit field of Yaml::DUMP_* constants to customize the dumped YAML string\n     *\n     * @throws DumpException When trying to dump PHP resource\n     */\n    public static function dump(mixed $value, int $flags = 0, bool $rootLevel = false): string\n    {\n        switch (true) {\n            case \\is_resource($value):\n                if (Yaml::DUMP_EXCEPTION_ON_INVALID_TYPE & $flags) {\n                    throw new DumpException(\\sprintf('Unable to dump PHP resources in a YAML file (\"%s\").', get_resource_type($value)));\n                }\n\n                return self::dumpNull($flags);\n            case $value instanceof \\DateTimeInterface:\n                return $value->format(match (true) {\n                    !$length = \\strlen(rtrim($value->format('u'), '0')) => 'c',\n                    $length < 4 => 'Y-m-d\\TH:i:s.vP',\n                    default => 'Y-m-d\\TH:i:s.uP',\n                });\n            case $value instanceof \\UnitEnum:\n                return \\sprintf('!php/enum %s::%s', $value::class, $value->name);\n            case \\is_object($value):\n                if ($value instanceof TaggedValue) {\n                    return '!'.$value->getTag().' '.self::dump($value->getValue(), $flags);\n                }\n\n                if (Yaml::DUMP_OBJECT & $flags) {\n                    return '!php/object '.self::dump(serialize($value));\n                }\n\n                if (Yaml::DUMP_OBJECT_AS_MAP & $flags && ($value instanceof \\stdClass || $value instanceof \\ArrayObject)) {\n                    return self::dumpHashArray($value, $flags);\n                }\n\n                if (Yaml::DUMP_EXCEPTION_ON_INVALID_TYPE & $flags) {\n                    throw new DumpException('Object support when dumping a YAML file has been disabled.');\n                }\n\n                return self::dumpNull($flags);\n            case \\is_array($value):\n                return self::dumpArray($value, $flags);\n            case null === $value:\n                return self::dumpNull($flags, $rootLevel);\n            case true === $value:\n                return 'true';\n            case false === $value:\n                return 'false';\n            case \\is_int($value):\n                return $value;\n            case \\is_float($value) && is_nan($value):\n                return '.NaN';\n            case is_numeric($value) && false === strpbrk($value, \"\\f\\n\\r\\t\\v\"):\n                $locale = setlocale(\\LC_NUMERIC, 0);\n                if (false !== $locale) {\n                    setlocale(\\LC_NUMERIC, 'C');\n                }\n                if (\\is_float($value)) {\n                    $repr = (string) $value;\n                    if (is_infinite($value)) {\n                        $repr = str_ireplace('INF', '.Inf', $repr);\n                    } elseif (floor($value) == $value && $repr == $value) {\n                        // Preserve float data type since storing a whole number will result in integer value.\n                        if (!str_contains($repr, 'E')) {\n                            $repr .= '.0';\n                        }\n                    }\n                } else {\n                    $repr = \\is_string($value) ? \"'$value'\" : (string) $value;\n                }\n                if (false !== $locale) {\n                    setlocale(\\LC_NUMERIC, $locale);\n                }\n\n                return $repr;\n            case '' == $value:\n                return \"''\";\n            case self::isBinaryString($value):\n                return '!!binary '.base64_encode($value);\n            case Escaper::requiresDoubleQuoting($value):\n            case Yaml::DUMP_FORCE_DOUBLE_QUOTES_ON_VALUES & $flags:\n                return Escaper::escapeWithDoubleQuotes($value);\n            case Escaper::requiresSingleQuoting($value):\n                $singleQuoted = Escaper::escapeWithSingleQuotes($value);\n                if (!str_contains($value, \"'\")) {\n                    return $singleQuoted;\n                }\n                // Attempt double-quoting the string instead to see if it's more efficient.\n                $doubleQuoted = Escaper::escapeWithDoubleQuotes($value);\n\n                return \\strlen($doubleQuoted) < \\strlen($singleQuoted) ? $doubleQuoted : $singleQuoted;\n            case Parser::preg_match('{^[0-9]+[_0-9]*$}', $value):\n            case Parser::preg_match('{^[+-]?0o[0-7_]++$}', $value):\n            case Parser::preg_match(self::getHexRegex(), $value):\n            case Parser::preg_match(self::getTimestampRegex(), $value):\n                return Escaper::escapeWithSingleQuotes($value);\n            default:\n                return $value;\n        }\n    }\n\n    /**\n     * Check if given array is hash or just normal indexed array.\n     */\n    public static function isHash(array|\\ArrayObject|\\stdClass $value): bool\n    {\n        if ($value instanceof \\stdClass || $value instanceof \\ArrayObject) {\n            return true;\n        }\n\n        $expectedKey = 0;\n\n        foreach ($value as $key => $val) {\n            if ($key !== $expectedKey++) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n\n    /**\n     * Dumps a PHP array to a YAML string.\n     *\n     * @param array $value The PHP array to dump\n     * @param int   $flags A bit field of Yaml::DUMP_* constants to customize the dumped YAML string\n     */\n    private static function dumpArray(array $value, int $flags): string\n    {\n        // array\n        if (($value || Yaml::DUMP_EMPTY_ARRAY_AS_SEQUENCE & $flags) && !self::isHash($value)) {\n            $output = [];\n            foreach ($value as $val) {\n                $output[] = self::dump($val, $flags);\n            }\n\n            return \\sprintf('[%s]', implode(', ', $output));\n        }\n\n        return self::dumpHashArray($value, $flags);\n    }\n\n    /**\n     * Dumps hash array to a YAML string.\n     *\n     * @param array|\\ArrayObject|\\stdClass $value The hash array to dump\n     * @param int                          $flags A bit field of Yaml::DUMP_* constants to customize the dumped YAML string\n     */\n    private static function dumpHashArray(array|\\ArrayObject|\\stdClass $value, int $flags): string\n    {\n        $output = [];\n        $keyFlags = $flags & ~Yaml::DUMP_FORCE_DOUBLE_QUOTES_ON_VALUES;\n        foreach ($value as $key => $val) {\n            if (\\is_int($key) && Yaml::DUMP_NUMERIC_KEY_AS_STRING & $flags) {\n                $key = (string) $key;\n            }\n\n            $output[] = \\sprintf('%s: %s', self::dump($key, $keyFlags), self::dump($val, $flags));\n        }\n\n        return \\sprintf('{ %s }', implode(', ', $output));\n    }\n\n    private static function dumpNull(int $flags, bool $rootLevel = false): string\n    {\n        if (Yaml::DUMP_NULL_AS_TILDE & $flags) {\n            return '~';\n        }\n\n        if (Yaml::DUMP_NULL_AS_EMPTY & $flags && !$rootLevel) {\n            return '';\n        }\n\n        return 'null';\n    }\n\n    /**\n     * Parses a YAML scalar.\n     *\n     * @throws ParseException When malformed inline YAML string is parsed\n     */\n    public static function parseScalar(string $scalar, int $flags = 0, ?array $delimiters = null, int &$i = 0, bool $evaluate = true, array &$references = [], ?bool &$isQuoted = null, ?ParserState $state = null): mixed\n    {\n        if (\\in_array($scalar[$i], ['\"', \"'\"], true)) {\n            // quoted scalar\n            $isQuoted = true;\n            $output = self::parseQuotedScalar($scalar, $i);\n\n            if (null !== $delimiters) {\n                $tmp = ltrim(substr($scalar, $i), \" \\n\");\n                if ('' === $tmp) {\n                    throw new ParseException(\\sprintf('Unexpected end of line, expected one of \"%s\".', implode('', $delimiters)), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);\n                }\n                if (!\\in_array($tmp[0], $delimiters)) {\n                    throw new ParseException(\\sprintf('Unexpected characters (%s).', substr($scalar, $i)), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);\n                }\n            }\n        } else {\n            // \"normal\" string\n            $isQuoted = false;\n\n            if (!$delimiters) {\n                $output = substr($scalar, $i);\n                $i += \\strlen($output);\n\n                // remove comments\n                if (Parser::preg_match('/[ \\t]+#/', $output, $match, \\PREG_OFFSET_CAPTURE)) {\n                    $output = substr($output, 0, $match[0][1]);\n                }\n            } elseif (Parser::preg_match('/^(.*?)('.implode('|', $delimiters).')/', substr($scalar, $i), $match)) {\n                $output = $match[1];\n                $i += \\strlen($output);\n                $output = trim($output);\n            } else {\n                throw new ParseException(\\sprintf('Malformed inline YAML string: \"%s\".', $scalar), self::$parsedLineNumber + 1, null, self::$parsedFilename);\n            }\n\n            // a non-quoted string cannot start with @ or ` (reserved) nor with a scalar indicator (| or >)\n            if ($output && ('@' === $output[0] || '`' === $output[0] || '|' === $output[0] || '>' === $output[0] || '%' === $output[0])) {\n                throw new ParseException(\\sprintf('The reserved indicator \"%s\" cannot start a plain scalar; you need to quote the scalar.', $output[0]), self::$parsedLineNumber + 1, $output, self::$parsedFilename);\n            }\n\n            if ($evaluate) {\n                $state ??= new ParserState();\n                $output = self::evaluateScalar($state, $output, $flags, $references, $isQuoted);\n            }\n        }\n\n        return $output;\n    }\n\n    /**\n     * Parses a YAML quoted scalar.\n     *\n     * @throws ParseException When malformed inline YAML string is parsed\n     */\n    private static function parseQuotedScalar(string $scalar, int &$i = 0): string\n    {\n        if (!Parser::preg_match('/'.self::REGEX_QUOTED_STRING.'/Au', substr($scalar, $i), $match)) {\n            throw new ParseException(\\sprintf('Malformed inline YAML string: \"%s\".', substr($scalar, $i)), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);\n        }\n\n        $output = substr($match[0], 1, -1);\n\n        $unescaper = new Unescaper();\n        if ('\"' == $scalar[$i]) {\n            $output = $unescaper->unescapeDoubleQuotedString($output);\n        } else {\n            $output = $unescaper->unescapeSingleQuotedString($output);\n        }\n\n        $i += \\strlen($match[0]);\n\n        return $output;\n    }\n\n    /**\n     * Parses a YAML sequence.\n     *\n     * @throws ParseException When malformed inline YAML string is parsed\n     */\n    private static function parseSequence(ParserState $state, string $sequence, int $flags, int &$i = 0, array &$references = []): array\n    {\n        $state->enterNestingLevel(self::$parsedLineNumber + 1, null, self::$parsedFilename);\n\n        $output = [];\n        $len = \\strlen($sequence);\n        ++$i;\n\n        try {\n            // [foo, bar, ...]\n            $lastToken = null;\n            while ($i < $len) {\n                if (']' === $sequence[$i]) {\n                    return $output;\n                }\n                if (',' === $sequence[$i] || ' ' === $sequence[$i]) {\n                    if (',' === $sequence[$i] && (null === $lastToken || 'separator' === $lastToken)) {\n                        $output[] = null;\n                    } elseif (',' === $sequence[$i]) {\n                        $lastToken = 'separator';\n                    }\n\n                    ++$i;\n\n                    continue;\n                }\n\n                $tag = self::parseTag($sequence, $i, $flags);\n                $anchorRef = self::parseAnchor($sequence, $i);\n                if (null !== $anchorRef && null === $tag) {\n                    $tag = self::parseTag($sequence, $i, $flags);\n                }\n\n                if (null !== $anchorRef && (!isset($sequence[$i]) || ',' === $sequence[$i] || ']' === $sequence[$i])) {\n                    $value = null;\n                    $references[$anchorRef] = $value;\n                    if (null !== $tag && '' !== $tag) {\n                        $value = new TaggedValue($tag, $value);\n                    }\n                    $output[] = $value;\n                    $lastToken = 'value';\n                    continue;\n                }\n\n                switch ($sequence[$i]) {\n                    case '[':\n                        // nested sequence\n                        $value = self::parseSequence($state, $sequence, $flags, $i, $references);\n                        break;\n                    case '{':\n                        // nested mapping\n                        $value = self::parseMapping($state, $sequence, $flags, $i, $references);\n                        break;\n                    default:\n                        $value = self::parseScalar($sequence, $flags, [',', ']'], $i, null === $tag, $references, $isQuoted, $state);\n\n                        // the value can be an array if a reference has been resolved to an array var\n                        if (\\is_string($value) && !$isQuoted && str_contains($value, ': ')) {\n                            // embedded mapping?\n                            $j = $i;\n                            $mappingValue = $value;\n                            $mappingException = null;\n                            do {\n                                try {\n                                    $pos = 0;\n                                    $value = self::parseMapping($state, '{'.$mappingValue.'}', $flags, $pos, $references);\n                                    $i = $j;\n                                    $mappingException = null;\n                                    break;\n                                } catch (ParseException $exception) {\n                                    $mappingException = $exception;\n                                    if ($j >= $len) {\n                                        break;\n                                    }\n\n                                    $mappingValue .= $sequence[$j++];\n                                    if ($j >= $len) {\n                                        break;\n                                    }\n\n                                    $mappingValue .= self::parseScalar($sequence, $flags, [',', ']'], $j, null === $tag, $references);\n                                }\n                            } while ($j < $len);\n\n                            if ($mappingException) {\n                                throw $mappingException;\n                            }\n                        }\n\n                        --$i;\n                }\n\n                if (null !== $anchorRef) {\n                    $references[$anchorRef] = $value;\n                }\n\n                if (null !== $tag && '' !== $tag) {\n                    $value = new TaggedValue($tag, $value);\n                }\n\n                $output[] = $value;\n\n                $lastToken = 'value';\n                ++$i;\n            }\n\n            throw new ParseException(\\sprintf('Malformed inline YAML string: \"%s\".', $sequence), self::$parsedLineNumber + 1, null, self::$parsedFilename);\n        } finally {\n            $state->leaveNestingLevel();\n        }\n    }\n\n    /**\n     * Parses a YAML mapping.\n     *\n     * @throws ParseException When malformed inline YAML string is parsed\n     */\n    private static function parseMapping(ParserState $state, string $mapping, int $flags, int &$i = 0, array &$references = []): array|\\stdClass\n    {\n        $state->enterNestingLevel(self::$parsedLineNumber + 1, null, self::$parsedFilename);\n\n        $output = [];\n        $len = \\strlen($mapping);\n        ++$i;\n        $allowOverwrite = false;\n\n        try {\n            // {foo: bar, bar:foo, ...}\n            while ($i < $len) {\n                switch ($mapping[$i]) {\n                    case ' ':\n                    case ',':\n                    case \"\\n\":\n                        ++$i;\n                        continue 2;\n                    case '}':\n                        if (self::$objectForMap) {\n                            return (object) $output;\n                        }\n\n                        return $output;\n                }\n\n                // key\n                $offsetBeforeKeyParsing = $i;\n                $isKeyQuoted = \\in_array($mapping[$i], ['\"', \"'\"], true);\n                $key = self::parseScalar($mapping, $flags, [':', ' '], $i, false);\n\n                if ($offsetBeforeKeyParsing === $i) {\n                    throw new ParseException('Missing mapping key.', self::$parsedLineNumber + 1, $mapping);\n                }\n\n                if ('!php/const' === $key || '!php/enum' === $key) {\n                    $key .= ' '.self::parseScalar($mapping, $flags, ['(?<!:):(?!:)'], $i, false);\n                    $key = self::evaluateScalar($state, $key, $flags);\n                }\n\n                if (false === $i = strpos($mapping, ':', $i)) {\n                    break;\n                }\n\n                if (!$isKeyQuoted) {\n                    $evaluatedKey = self::evaluateScalar($state, $key, $flags, $references);\n\n                    if ('' !== $key && $evaluatedKey !== $key && !\\is_string($evaluatedKey) && !\\is_int($evaluatedKey)) {\n                        throw new ParseException('Implicit casting of incompatible mapping keys to strings is not supported. Quote your evaluable mapping keys instead.', self::$parsedLineNumber + 1, $mapping);\n                    }\n                }\n\n                if (!$isKeyQuoted && (!isset($mapping[$i + 1]) || !\\in_array($mapping[$i + 1], [' ', ',', '[', ']', '{', '}', \"\\n\"], true))) {\n                    throw new ParseException('Colons must be followed by a space or an indication character (i.e. \" \", \",\", \"[\", \"]\", \"{\", \"}\").', self::$parsedLineNumber + 1, $mapping);\n                }\n\n                if ('<<' === $key) {\n                    $allowOverwrite = true;\n                }\n\n                while ($i < $len) {\n                    if (':' === $mapping[$i] || ' ' === $mapping[$i] || \"\\n\" === $mapping[$i]) {\n                        ++$i;\n\n                        continue;\n                    }\n\n                    $tag = self::parseTag($mapping, $i, $flags);\n                    $anchorRef = self::parseAnchor($mapping, $i);\n                    if (null !== $anchorRef && null === $tag) {\n                        $tag = self::parseTag($mapping, $i, $flags);\n                    }\n\n                    if (null !== $anchorRef && (!isset($mapping[$i]) || \\in_array($mapping[$i], [',', '}', \"\\n\"], true))) {\n                        $value = null;\n                        $references[$anchorRef] = $value;\n                        if ('<<' !== $key) {\n                            if ($allowOverwrite || !isset($output[$key])) {\n                                $output[$key] = null !== $tag ? new TaggedValue($tag, $value) : $value;\n                            } elseif (isset($output[$key])) {\n                                throw new ParseException(\\sprintf('Duplicate key \"%s\" detected.', $key), self::$parsedLineNumber + 1, $mapping);\n                            }\n                        }\n                        continue 2;\n                    }\n\n                    switch ($mapping[$i]) {\n                        case '[':\n                            // nested sequence\n                            $value = self::parseSequence($state, $mapping, $flags, $i, $references);\n                            if (null !== $anchorRef) {\n                                $references[$anchorRef] = $value;\n                            }\n                            // Spec: Keys MUST be unique; first one wins.\n                            // Parser cannot abort this mapping earlier, since lines\n                            // are processed sequentially.\n                            // But overwriting is allowed when a merge node is used in current block.\n                            if ('<<' === $key) {\n                                foreach ($value as $parsedValue) {\n                                    $output += $parsedValue;\n                                }\n                            } elseif ($allowOverwrite || !isset($output[$key])) {\n                                if (null !== $tag) {\n                                    $output[$key] = new TaggedValue($tag, $value);\n                                } else {\n                                    $output[$key] = $value;\n                                }\n                            } elseif (isset($output[$key])) {\n                                throw new ParseException(\\sprintf('Duplicate key \"%s\" detected.', $key), self::$parsedLineNumber + 1, $mapping);\n                            }\n                            break;\n                        case '{':\n                            // nested mapping\n                            $value = self::parseMapping($state, $mapping, $flags, $i, $references);\n                            if (null !== $anchorRef) {\n                                $references[$anchorRef] = $value;\n                            }\n                            // Spec: Keys MUST be unique; first one wins.\n                            // Parser cannot abort this mapping earlier, since lines\n                            // are processed sequentially.\n                            // But overwriting is allowed when a merge node is used in current block.\n                            if ('<<' === $key) {\n                                $output += $value;\n                            } elseif ($allowOverwrite || !isset($output[$key])) {\n                                if (null !== $tag) {\n                                    $output[$key] = new TaggedValue($tag, $value);\n                                } else {\n                                    $output[$key] = $value;\n                                }\n                            } elseif (isset($output[$key])) {\n                                throw new ParseException(\\sprintf('Duplicate key \"%s\" detected.', $key), self::$parsedLineNumber + 1, $mapping);\n                            }\n                            break;\n                        default:\n                            $value = self::parseScalar($mapping, $flags, [',', '}', \"\\n\"], $i, null === $tag, $references, $isValueQuoted, $state);\n                            if (null !== $anchorRef) {\n                                $references[$anchorRef] = $value;\n                            }\n                            // Spec: Keys MUST be unique; first one wins.\n                            // Parser cannot abort this mapping earlier, since lines\n                            // are processed sequentially.\n                            // But overwriting is allowed when a merge node is used in current block.\n                            if ('<<' === $key) {\n                                $output += $value;\n                            } elseif ($allowOverwrite || !isset($output[$key])) {\n                                if (null !== $tag) {\n                                    $output[$key] = new TaggedValue($tag, $value);\n                                } else {\n                                    $output[$key] = $value;\n                                }\n                            } elseif (isset($output[$key])) {\n                                throw new ParseException(\\sprintf('Duplicate key \"%s\" detected.', $key), self::$parsedLineNumber + 1, $mapping);\n                            }\n                            --$i;\n                    }\n                    ++$i;\n\n                    continue 2;\n                }\n            }\n\n            throw new ParseException(\\sprintf('Malformed inline YAML string: \"%s\".', $mapping), self::$parsedLineNumber + 1, null, self::$parsedFilename);\n        } finally {\n            $state->leaveNestingLevel();\n        }\n    }\n\n    /**\n     * Evaluates scalars and replaces magic values.\n     *\n     * @throws ParseException when object parsing support was disabled and the parser detected a PHP object or when a reference could not be resolved\n     */\n    private static function evaluateScalar(ParserState $state, string $scalar, int $flags, array &$references = [], ?bool &$isQuotedString = null): mixed\n    {\n        $isQuotedString = false;\n        $scalar = trim($scalar);\n\n        if (str_starts_with($scalar, '*')) {\n            $value = substr($scalar, 1);\n\n            // remove comments\n            if (Parser::preg_match('/[ \\t]+#/', $value, $match, \\PREG_OFFSET_CAPTURE)) {\n                $value = substr($value, 0, $match[0][1]);\n            }\n\n            // an unquoted *\n            if ('' === $value) {\n                throw new ParseException('A reference must contain at least one character.', self::$parsedLineNumber + 1, $value, self::$parsedFilename);\n            }\n\n            if (!\\array_key_exists($value, $references)) {\n                throw new ParseException(\\sprintf('Reference \"%s\" does not exist.', $value), self::$parsedLineNumber + 1, $value, self::$parsedFilename);\n            }\n\n            $state->countAlias($references[$value], self::$parsedLineNumber + 1, null, self::$parsedFilename);\n\n            return $references[$value];\n        }\n\n        $scalarLower = strtolower($scalar);\n\n        switch (true) {\n            case 'null' === $scalarLower:\n            case '' === $scalar:\n            case '~' === $scalar:\n                return null;\n            case 'true' === $scalarLower:\n                return true;\n            case 'false' === $scalarLower:\n                return false;\n            case '!' === $scalar[0]:\n                switch (true) {\n                    case str_starts_with($scalar, '!!str '):\n                        $s = substr($scalar, 6);\n\n                        if (\\in_array($s[0] ?? '', ['\"', \"'\"], true)) {\n                            $isQuotedString = true;\n                            $s = self::parseQuotedScalar($s);\n                        }\n\n                        return $s;\n                    case str_starts_with($scalar, '! '):\n                        return substr($scalar, 2);\n                    case str_starts_with($scalar, '!php/object'):\n                        if (self::$objectSupport) {\n                            if (!isset($scalar[12])) {\n                                throw new ParseException('Missing value for tag \"!php/object\".', self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);\n                            }\n\n                            return unserialize(self::parseScalar(substr($scalar, 12)), ['allowed_classes' => true]);\n                        }\n\n                        if (self::$exceptionOnInvalidType) {\n                            throw new ParseException('Object support when parsing a YAML file has been disabled.', self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);\n                        }\n\n                        return null;\n                    case str_starts_with($scalar, '!php/const'):\n                        if (self::$constantSupport) {\n                            if (!isset($scalar[11])) {\n                                throw new ParseException('Missing value for tag \"!php/const\".', self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);\n                            }\n\n                            $i = 0;\n                            if (\\defined($const = self::parseScalar(substr($scalar, 11), 0, null, $i, false))) {\n                                return \\constant($const);\n                            }\n\n                            throw new ParseException(\\sprintf('The constant \"%s\" is not defined.', $const), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);\n                        }\n                        if (self::$exceptionOnInvalidType) {\n                            throw new ParseException(\\sprintf('The string \"%s\" could not be parsed as a constant. Did you forget to pass the \"Yaml::PARSE_CONSTANT\" flag to the parser?', $scalar), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);\n                        }\n\n                        return null;\n                    case str_starts_with($scalar, '!php/enum'):\n                        if (self::$constantSupport) {\n                            if (!isset($scalar[11])) {\n                                throw new ParseException('Missing value for tag \"!php/enum\".', self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);\n                            }\n\n                            $i = 0;\n                            $enumName = self::parseScalar(substr($scalar, 10), 0, null, $i, false);\n                            $useName = str_contains($enumName, '::');\n                            $enum = $useName ? strstr($enumName, '::', true) : $enumName;\n\n                            if (!enum_exists($enum)) {\n                                throw new ParseException(\\sprintf('The enum \"%s\" is not defined.', $enum), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);\n                            }\n                            if (!$useName) {\n                                return $enum::cases();\n                            }\n                            if ($useValue = str_ends_with($enumName, '->value')) {\n                                $enumName = substr($enumName, 0, -7);\n                            }\n\n                            if (!\\defined($enumName)) {\n                                throw new ParseException(\\sprintf('The string \"%s\" is not the name of a valid enum.', $enumName), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);\n                            }\n\n                            $value = \\constant($enumName);\n\n                            if (!$useValue) {\n                                return $value;\n                            }\n                            if (!$value instanceof \\BackedEnum) {\n                                throw new ParseException(\\sprintf('The enum \"%s\" defines no value next to its name.', $enumName), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);\n                            }\n\n                            return $value->value;\n                        }\n                        if (self::$exceptionOnInvalidType) {\n                            throw new ParseException(\\sprintf('The string \"%s\" could not be parsed as an enum. Did you forget to pass the \"Yaml::PARSE_CONSTANT\" flag to the parser?', $scalar), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);\n                        }\n\n                        return null;\n                    case str_starts_with($scalar, '!!float '):\n                        return (float) substr($scalar, 8);\n                    case str_starts_with($scalar, '!!binary '):\n                        return self::evaluateBinaryScalar(substr($scalar, 9));\n                }\n\n                throw new ParseException(\\sprintf('The string \"%s\" could not be parsed as it uses an unsupported built-in tag.', $scalar), self::$parsedLineNumber, $scalar, self::$parsedFilename);\n            case preg_match('/^(?:\\+|-)?0o(?P<value>[0-7_]++)$/', $scalar, $matches):\n                $value = str_replace('_', '', $matches['value']);\n\n                if ('-' === $scalar[0]) {\n                    return -octdec($value);\n                }\n\n                return octdec($value);\n            case \\in_array($scalar[0], ['+', '-', '.'], true) || is_numeric($scalar[0]):\n                if (Parser::preg_match('{^[+-]?[0-9][0-9_]*$}', $scalar)) {\n                    $scalar = str_replace('_', '', $scalar);\n\n                    if ('+' === $scalar[0]) {\n                        $scalar = substr($scalar, 1);\n                    }\n                }\n\n                switch (true) {\n                    case ctype_digit($scalar):\n                    case '-' === $scalar[0] && ctype_digit(substr($scalar, 1)):\n                        if ($scalar < \\PHP_INT_MIN || \\PHP_INT_MAX < $scalar) {\n                            return $scalar;\n                        }\n\n                        $cast = (int) $scalar;\n\n                        return ($scalar === (string) $cast) ? $cast : $scalar;\n                    case is_numeric($scalar):\n                    case Parser::preg_match(self::getHexRegex(), $scalar):\n                        $scalar = str_replace('_', '', $scalar);\n\n                        return '0x' === $scalar[0].$scalar[1] ? hexdec($scalar) : (float) $scalar;\n                    case '.inf' === $scalarLower:\n                        return -log(0);\n                    case '.nan' === $scalarLower:\n                        return \\NAN;\n                    case '-.inf' === $scalarLower:\n                        return log(0);\n                    case Parser::preg_match('/^(-|\\+)?[0-9][0-9_]*(\\.[0-9_]+)?$/', $scalar):\n                        return (float) str_replace('_', '', $scalar);\n                    case Parser::preg_match(self::getTimestampRegex(), $scalar):\n                        try {\n                            // When no timezone is provided in the parsed date, YAML spec says we must assume UTC.\n                            $time = new \\DateTimeImmutable($scalar, new \\DateTimeZone('UTC'));\n                        } catch (\\Exception $e) {\n                            // Some dates accepted by the regex are not valid dates.\n                            throw new ParseException(\\sprintf('The date \"%s\" could not be parsed as it is an invalid date.', $scalar), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename, $e);\n                        }\n\n                        if (Yaml::PARSE_DATETIME & $flags) {\n                            return $time;\n                        }\n\n                        if ('' !== rtrim($time->format('u'), '0')) {\n                            return (float) $time->format('U.u');\n                        }\n\n                        try {\n                            if (false !== $scalar = $time->getTimestamp()) {\n                                return $scalar;\n                            }\n                        } catch (\\DateRangeError|\\ValueError) {\n                            // no-op\n                        }\n\n                        return $time->format('U');\n                }\n        }\n\n        return (string) $scalar;\n    }\n\n    private static function parseAnchor(string $value, int &$i): ?string\n    {\n        if (!isset($value[$i]) || '&' !== $value[$i]) {\n            return null;\n        }\n\n        if (!Parser::preg_match('/^&(?P<ref>[^ \\t,\\[\\]\\{\\}\\n]++)\\s*+/A', substr($value, $i), $matches)) {\n            return null;\n        }\n\n        $i += \\strlen($matches[0]);\n\n        return $matches['ref'];\n    }\n\n    private static function parseTag(string $value, int &$i, int $flags): ?string\n    {\n        if ('!' !== $value[$i]) {\n            return null;\n        }\n\n        $tagLength = strcspn($value, \" \\t\\n[]{},\", $i + 1);\n        $tag = substr($value, $i + 1, $tagLength);\n\n        $nextOffset = $i + $tagLength + 1;\n        $nextOffset += strspn($value, ' ', $nextOffset);\n\n        if ('' === $tag && (!isset($value[$nextOffset]) || \\in_array($value[$nextOffset], [']', '}', ','], true))) {\n            throw new ParseException('Using the unquoted scalar value \"!\" is not supported. You must quote it.', self::$parsedLineNumber + 1, $value, self::$parsedFilename);\n        }\n\n        // Is followed by a scalar and is a built-in tag\n        if ('' !== $tag && (!isset($value[$nextOffset]) || !\\in_array($value[$nextOffset], ['[', '{'], true)) && ('!' === $tag[0] || \\in_array($tag, ['str', 'php/const', 'php/enum', 'php/object'], true))) {\n            // Manage in {@link self::evaluateScalar()}\n            return null;\n        }\n\n        $i = $nextOffset;\n\n        // Built-in tags\n        if ('' !== $tag && '!' === $tag[0]) {\n            throw new ParseException(\\sprintf('The built-in tag \"!%s\" is not implemented.', $tag), self::$parsedLineNumber + 1, $value, self::$parsedFilename);\n        }\n\n        if ('' !== $tag && !isset($value[$i])) {\n            throw new ParseException(\\sprintf('Missing value for tag \"%s\".', $tag), self::$parsedLineNumber + 1, $value, self::$parsedFilename);\n        }\n\n        if ('' === $tag || Yaml::PARSE_CUSTOM_TAGS & $flags) {\n            return $tag;\n        }\n\n        throw new ParseException(\\sprintf('Tags support is not enabled. Enable the \"Yaml::PARSE_CUSTOM_TAGS\" flag to use \"!%s\".', $tag), self::$parsedLineNumber + 1, $value, self::$parsedFilename);\n    }\n\n    public static function evaluateBinaryScalar(string $scalar): string\n    {\n        $parsedBinaryData = self::parseScalar(preg_replace('/\\s/', '', $scalar));\n\n        if (!\\is_scalar($parsedBinaryData ?? '') && !$parsedBinaryData instanceof \\Stringable) {\n            throw new ParseException(\\sprintf('The \"!!binary\" tag only supports a base64 encoded string, got \"%s\".', get_debug_type($parsedBinaryData)), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);\n        }\n\n        $parsedBinaryData = (string) $parsedBinaryData;\n\n        if (0 !== (\\strlen($parsedBinaryData) % 4)) {\n            throw new ParseException(\\sprintf('The normalized base64 encoded data (data without whitespace characters) length must be a multiple of four (%d bytes given).', \\strlen($parsedBinaryData)), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);\n        }\n\n        if (!Parser::preg_match('#^[A-Z0-9+/]+={0,2}$#i', $parsedBinaryData)) {\n            throw new ParseException(\\sprintf('The base64 encoded data (%s) contains invalid characters.', $parsedBinaryData), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);\n        }\n\n        return base64_decode($parsedBinaryData, true);\n    }\n\n    private static function isBinaryString(string $value): bool\n    {\n        return !preg_match('//u', $value) || preg_match('/[^\\x00\\x07-\\x0d\\x1B\\x20-\\xff]/', $value);\n    }\n\n    /**\n     * Gets a regex that matches a YAML date.\n     *\n     * @see http://www.yaml.org/spec/1.2/spec.html#id2761573\n     */\n    private static function getTimestampRegex(): string\n    {\n        return <<<EOF\n                    ~^\n                    (?P<year>[0-9][0-9][0-9][0-9])\n                    -(?P<month>[0-9][0-9]?)\n                    -(?P<day>[0-9][0-9]?)\n                    (?:(?:[Tt]|[ \\t]+)\n                    (?P<hour>[0-9][0-9]?)\n                    :(?P<minute>[0-9][0-9])\n                    :(?P<second>[0-9][0-9])\n                    (?:\\.(?P<fraction>[0-9]*))?\n                    (?:[ \\t]*(?P<tz>Z|(?P<tz_sign>[-+])(?P<tz_hour>[0-9][0-9]?)\n                    (?::(?P<tz_minute>[0-9][0-9]))?))?)?\n                    $~x\n            EOF;\n    }\n\n    /**\n     * Gets a regex that matches a YAML number in hexadecimal notation.\n     */\n    private static function getHexRegex(): string\n    {\n        return '~^0x[0-9a-fA-F_]++$~';\n    }\n}\n","vendor/symfony/yaml/LICENSE":"Copyright (c) 2004-present Fabien Potencier\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is furnished\nto do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n","vendor/symfony/yaml/Parser.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Yaml;\n\nuse Symfony\\Component\\Yaml\\Exception\\ParseException;\nuse Symfony\\Component\\Yaml\\Tag\\TaggedValue;\n\n/**\n * Parser parses YAML strings to convert them to PHP arrays.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n *\n * @final\n */\nclass Parser\n{\n    public const TAG_PATTERN = '(?P<tag>![\\w!.\\/:-]+)';\n    public const BLOCK_SCALAR_HEADER_PATTERN = '(?P<separator>\\||>)(?P<modifiers>\\+|\\-|\\d+|\\+\\d+|\\-\\d+|\\d+\\+|\\d+\\-)?(?P<comments> +#.*)?';\n    public const REFERENCE_PATTERN = '#^&(?P<ref>[^ ]++) *+(?P<value>.*)#u';\n    public const DEFAULT_MAX_NESTING_LEVEL = 128;\n    public const DEFAULT_MAX_ALIASES_FOR_COLLECTIONS = 128;\n\n    private ?string $filename = null;\n    private int $offset = 0;\n    private int $numberOfParsedLines = 0;\n    private ?int $totalNumberOfLines = null;\n    private array $lines = [];\n    private int $currentLineNb = -1;\n    private string $currentLine = '';\n    private array $refs = [];\n    private array $skippedLineNumbers = [];\n    private array $locallySkippedLineNumbers = [];\n    private array $refsBeingParsed = [];\n    private ?ParserState $state = null;\n\n    public function __construct(int $maxNestingLevel = self::DEFAULT_MAX_NESTING_LEVEL, int $maxAliasesForCollections = self::DEFAULT_MAX_ALIASES_FOR_COLLECTIONS)\n    {\n        if ($maxNestingLevel < 1) {\n            throw new \\InvalidArgumentException('The maximum nesting depth must be greater than 0.');\n        }\n\n        if ($maxAliasesForCollections < 0) {\n            throw new \\InvalidArgumentException('The maximum number of collection aliases must be greater than or equal to 0.');\n        }\n\n        $this->getState()->maxNestingLevel = $maxNestingLevel;\n        $this->getState()->maxAliasesForCollections = $maxAliasesForCollections;\n    }\n\n    /**\n     * Parses a YAML file into a PHP value.\n     *\n     * @param string                     $filename The path to the YAML file to be parsed\n     * @param int-mask-of<Yaml::PARSE_*> $flags    A bit field of Yaml::PARSE_* constants to customize the YAML parser behavior\n     *\n     * @throws ParseException If the file could not be read or the YAML is not valid\n     */\n    public function parseFile(string $filename, int $flags = 0): mixed\n    {\n        if (!is_file($filename)) {\n            throw new ParseException(\\sprintf('File \"%s\" does not exist.', $filename));\n        }\n\n        if (!is_readable($filename)) {\n            throw new ParseException(\\sprintf('File \"%s\" cannot be read.', $filename));\n        }\n\n        $this->filename = $filename;\n\n        try {\n            return $this->parse(file_get_contents($filename), $flags);\n        } finally {\n            $this->filename = null;\n        }\n    }\n\n    /**\n     * Parses a YAML string to a PHP value.\n     *\n     * @param string                     $value A YAML string\n     * @param int-mask-of<Yaml::PARSE_*> $flags A bit field of Yaml::PARSE_* constants to customize the YAML parser behavior\n     *\n     * @throws ParseException If the YAML is not valid\n     */\n    public function parse(string $value, int $flags = 0): mixed\n    {\n        if (false === preg_match('//u', $value)) {\n            throw new ParseException('The YAML value does not appear to be valid UTF-8.', -1, null, $this->filename);\n        }\n\n        $this->refs = [];\n        $state = $this->getState();\n        $state->reset();\n        $state->aliasesEnabled = 0 === (Yaml::PARSE_EXCEPTION_ON_ALIAS & $flags);\n\n        try {\n            $data = $this->doParse($value, $flags);\n        } finally {\n            $this->refsBeingParsed = [];\n            $this->offset = 0;\n            $this->lines = [];\n            $this->currentLine = '';\n            $this->numberOfParsedLines = 0;\n            $this->refs = [];\n            $this->skippedLineNumbers = [];\n            $this->locallySkippedLineNumbers = [];\n            $this->totalNumberOfLines = null;\n            $state->reset();\n        }\n\n        return $data;\n    }\n\n    private function getState(): ParserState\n    {\n        return $this->state ??= new ParserState();\n    }\n\n    private function doParse(string $value, int $flags): mixed\n    {\n        $this->currentLineNb = -1;\n        $this->currentLine = '';\n        $value = $this->cleanup($value);\n        $this->lines = explode(\"\\n\", $value);\n        $this->numberOfParsedLines = \\count($this->lines);\n        $this->locallySkippedLineNumbers = [];\n        $this->totalNumberOfLines ??= $this->numberOfParsedLines;\n\n        if (!$this->moveToNextLine()) {\n            return null;\n        }\n\n        $data = [];\n        $context = null;\n        $allowOverwrite = false;\n\n        while ($this->isCurrentLineEmpty()) {\n            if (!$this->moveToNextLine()) {\n                return null;\n            }\n        }\n\n        // Resolves the tag and returns if end of the document\n        if (null !== ($tag = $this->getLineTag($this->currentLine, $flags, false)) && !$this->moveToNextLine()) {\n            return new TaggedValue($tag, '');\n        }\n\n        do {\n            if ($this->isCurrentLineEmpty()) {\n                continue;\n            }\n\n            // tab?\n            if (\"\\t\" === $this->currentLine[0]) {\n                throw new ParseException('A YAML file cannot contain tabs as indentation.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);\n            }\n\n            Inline::initialize($flags, $this->getRealCurrentLineNb(), $this->filename);\n\n            $isRef = $mergeNode = false;\n            if ('-' === $this->currentLine[0] && self::preg_match('#^\\-((?P<leadspaces>\\s+)(?P<value>.+))?$#u', rtrim($this->currentLine), $values)) {\n                if ($context && 'mapping' == $context) {\n                    throw new ParseException('You cannot define a sequence item when in a mapping.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);\n                }\n                $context = 'sequence';\n\n                if (isset($values['value']) && '&' === $values['value'][0] && self::preg_match(self::REFERENCE_PATTERN, $values['value'], $matches)) {\n                    $isRef = $matches['ref'];\n                    $this->refsBeingParsed[] = $isRef;\n                    $values['value'] = $matches['value'];\n                }\n\n                if (isset($values['value'][1]) && '?' === $values['value'][0] && ' ' === $values['value'][1]) {\n                    throw new ParseException('Complex mappings are not supported.', $this->getRealCurrentLineNb() + 1, $this->currentLine);\n                }\n\n                // array\n                if (isset($values['value']) && str_starts_with(ltrim($values['value'], ' '), '-')) {\n                    // Inline first child\n                    $currentLineNumber = $this->getRealCurrentLineNb();\n\n                    $sequenceIndentation = \\strlen($values['leadspaces']) + 1;\n                    $sequenceYaml = substr($this->currentLine, $sequenceIndentation);\n                    $sequenceYaml .= \"\\n\".$this->getNextEmbedBlock($sequenceIndentation, true);\n\n                    $data[] = $this->parseBlock($currentLineNumber, rtrim($sequenceYaml), $flags);\n                } elseif (!isset($values['value']) || '' == trim($values['value'], ' ') || str_starts_with(ltrim($values['value'], ' '), '#')) {\n                    $data[] = $this->parseBlock($this->getRealCurrentLineNb() + 1, $this->getNextEmbedBlock(null, true) ?? '', $flags);\n                } elseif (null !== $subTag = $this->getLineTag(ltrim($values['value'], ' '), $flags)) {\n                    $data[] = new TaggedValue(\n                        $subTag,\n                        $this->parseBlock($this->getRealCurrentLineNb() + 1, $this->getNextEmbedBlock(null, true), $flags)\n                    );\n                } elseif (self::preg_match('/^'.self::TAG_PATTERN.' +'.self::BLOCK_SCALAR_HEADER_PATTERN.'$/', $values['value'])) {\n                    $data[] = $this->parseValue($values['value'], $flags, $context);\n                } else {\n                    if (\n                        isset($values['leadspaces'])\n                        && (\n                            '!' === $values['value'][0]\n                            || self::preg_match('#^(?P<key>'.Inline::REGEX_QUOTED_STRING.'|[^ \\'\"\\{\\[].*?) *\\:(\\s+(?P<value>.+?))?\\s*$#u', $this->trimTag($values['value']), $matches)\n                        )\n                    ) {\n                        $block = $values['value'];\n                        if ($this->isNextLineIndented() || isset($matches['value']) && '>-' === $matches['value']) {\n                            $block .= \"\\n\".$this->getNextEmbedBlock($this->getCurrentLineIndentation() + \\strlen($values['leadspaces']) + 1);\n                        }\n\n                        $data[] = $this->parseBlock($this->getRealCurrentLineNb(), $block, $flags);\n                    } else {\n                        $data[] = $this->parseValue($values['value'], $flags, $context);\n                    }\n                }\n                if ($isRef) {\n                    $this->refs[$isRef] = end($data);\n                    array_pop($this->refsBeingParsed);\n                }\n            } elseif (\n                self::preg_match('#^(?P<key>(?:![^\\s]++\\s++)?(?:'.Inline::REGEX_QUOTED_STRING.'|[^ \\'\"\\[\\{!].*?)) *\\:(( |\\t)++(?P<value>.+))?$#u', rtrim($this->currentLine), $values)\n                && (!str_contains($values['key'], ' #') || \\in_array($values['key'][0], ['\"', \"'\"], true))\n            ) {\n                if ($context && 'sequence' == $context) {\n                    throw new ParseException('You cannot define a mapping item when in a sequence.', $this->currentLineNb + 1, $this->currentLine, $this->filename);\n                }\n                $context = 'mapping';\n\n                try {\n                    $key = Inline::parseScalar($values['key']);\n                } catch (ParseException $e) {\n                    $e->setParsedLine($this->getRealCurrentLineNb() + 1);\n                    $e->setSnippet($this->currentLine);\n\n                    throw $e;\n                }\n\n                if (!\\is_string($key) && !\\is_int($key)) {\n                    throw new ParseException((is_numeric($key) ? 'Numeric' : 'Non-string').' keys are not supported. Quote your evaluable mapping keys instead.', $this->getRealCurrentLineNb() + 1, $this->currentLine);\n                }\n\n                // Convert float keys to strings, to avoid being converted to integers by PHP\n                if (\\is_float($key)) {\n                    $key = (string) $key;\n                }\n\n                if ('<<' === $key && (!isset($values['value']) || '&' !== $values['value'][0] || !self::preg_match('#^&(?P<ref>[^ ]+)#u', $values['value'], $refMatches))) {\n                    $mergeNode = true;\n                    $allowOverwrite = true;\n                    if (isset($values['value'][0]) && '*' === $values['value'][0]) {\n                        $refName = substr(rtrim($values['value']), 1);\n\n                        // remove comments\n                        if (self::preg_match('/[ \\t]+#/', $refName, $match, \\PREG_OFFSET_CAPTURE)) {\n                            $refName = substr($refName, 0, $match[0][1]);\n                        }\n\n                        if (!\\array_key_exists($refName, $this->refs)) {\n                            if (false !== $pos = array_search($refName, $this->refsBeingParsed, true)) {\n                                throw new ParseException(\\sprintf('Circular reference [%s] detected for reference \"%s\".', implode(', ', array_merge(\\array_slice($this->refsBeingParsed, $pos), [$refName])), $refName), $this->currentLineNb + 1, $this->currentLine, $this->filename);\n                            }\n\n                            throw new ParseException(\\sprintf('Reference \"%s\" does not exist.', $refName), $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);\n                        }\n\n                        $refValue = $this->refs[$refName];\n\n                        $this->getState()->countAlias($refValue, $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);\n\n                        if (Yaml::PARSE_OBJECT_FOR_MAP & $flags && $refValue instanceof \\stdClass) {\n                            $refValue = (array) $refValue;\n                        }\n\n                        if (!\\is_array($refValue)) {\n                            throw new ParseException('YAML merge keys used with a scalar value instead of an array.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);\n                        }\n\n                        $data += $refValue; // array union\n                    } else {\n                        if (isset($values['value']) && '' !== $values['value']) {\n                            $value = $values['value'];\n                        } else {\n                            $value = $this->getNextEmbedBlock();\n                        }\n                        $parsed = $this->parseBlock($this->getRealCurrentLineNb() + 1, $value, $flags);\n\n                        if (Yaml::PARSE_OBJECT_FOR_MAP & $flags && $parsed instanceof \\stdClass) {\n                            $parsed = (array) $parsed;\n                        }\n\n                        if (!\\is_array($parsed)) {\n                            throw new ParseException('YAML merge keys used with a scalar value instead of an array.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);\n                        }\n\n                        if (isset($parsed[0])) {\n                            // If the value associated with the merge key is a sequence, then this sequence is expected to contain mapping nodes\n                            // and each of these nodes is merged in turn according to its order in the sequence. Keys in mapping nodes earlier\n                            // in the sequence override keys specified in later mapping nodes.\n                            foreach ($parsed as $parsedItem) {\n                                if (Yaml::PARSE_OBJECT_FOR_MAP & $flags && $parsedItem instanceof \\stdClass) {\n                                    $parsedItem = (array) $parsedItem;\n                                }\n\n                                if (!\\is_array($parsedItem)) {\n                                    throw new ParseException('Merge items must be arrays.', $this->getRealCurrentLineNb() + 1, $parsedItem, $this->filename);\n                                }\n\n                                $data += $parsedItem; // array union\n                            }\n                        } else {\n                            // If the value associated with the key is a single mapping node, each of its key/value pairs is inserted into the\n                            // current mapping, unless the key already exists in it.\n                            $data += $parsed; // array union\n                        }\n                    }\n                } elseif ('<<' !== $key && isset($values['value']) && '&' === $values['value'][0] && self::preg_match(self::REFERENCE_PATTERN, $values['value'], $matches)) {\n                    $isRef = $matches['ref'];\n                    $this->refsBeingParsed[] = $isRef;\n                    $values['value'] = $matches['value'];\n                }\n\n                $subTag = null;\n                if ($mergeNode) {\n                    // Merge keys\n                } elseif (!isset($values['value']) || '' === $values['value'] || str_starts_with($values['value'], '#') || (null !== $subTag = $this->getLineTag($values['value'], $flags)) || '<<' === $key) {\n                    // hash\n                    // if next line is less indented or equal, then it means that the current value is null\n                    if (!$this->isNextLineIndented() && !$this->isNextLineUnIndentedCollection()) {\n                        // Spec: Keys MUST be unique; first one wins.\n                        // But overwriting is allowed when a merge node is used in current block.\n                        if ($allowOverwrite || !isset($data[$key])) {\n                            if (!$allowOverwrite && \\array_key_exists($key, $data)) {\n                                trigger_deprecation('symfony/yaml', '7.2', 'Duplicate key \"%s\" detected on line %d whilst parsing YAML. Silent handling of duplicate mapping keys in YAML is deprecated and will throw a ParseException in 8.0.', $key, $this->getRealCurrentLineNb() + 1);\n                            }\n\n                            if (null !== $subTag) {\n                                $data[$key] = new TaggedValue($subTag, '');\n                            } else {\n                                $data[$key] = null;\n                            }\n                        } else {\n                            throw new ParseException(\\sprintf('Duplicate key \"%s\" detected.', $key), $this->getRealCurrentLineNb() + 1, $this->currentLine);\n                        }\n                    } else {\n                        // remember the parsed line number here in case we need it to provide some contexts in error messages below\n                        $realCurrentLineNbKey = $this->getRealCurrentLineNb();\n                        $value = $this->parseBlock($this->getRealCurrentLineNb() + 1, $this->getNextEmbedBlock(), $flags);\n                        if ('<<' === $key) {\n                            $this->refs[$refMatches['ref']] = $value;\n\n                            if (Yaml::PARSE_OBJECT_FOR_MAP & $flags && $value instanceof \\stdClass) {\n                                $value = (array) $value;\n                            }\n\n                            $data += $value;\n                        } elseif ($allowOverwrite || !isset($data[$key])) {\n                            if (!$allowOverwrite && \\array_key_exists($key, $data)) {\n                                trigger_deprecation('symfony/yaml', '7.2', 'Duplicate key \"%s\" detected on line %d whilst parsing YAML. Silent handling of duplicate mapping keys in YAML is deprecated and will throw a ParseException in 8.0.', $key, $this->getRealCurrentLineNb() + 1);\n                            }\n\n                            // Spec: Keys MUST be unique; first one wins.\n                            // But overwriting is allowed when a merge node is used in current block.\n                            if (null !== $subTag) {\n                                $data[$key] = new TaggedValue($subTag, $value);\n                            } else {\n                                $data[$key] = $value;\n                            }\n                        } else {\n                            throw new ParseException(\\sprintf('Duplicate key \"%s\" detected.', $key), $realCurrentLineNbKey + 1, $this->currentLine);\n                        }\n                    }\n                } else {\n                    $value = $this->parseValue(rtrim($values['value']), $flags, $context);\n                    // Spec: Keys MUST be unique; first one wins.\n                    // But overwriting is allowed when a merge node is used in current block.\n                    if ($allowOverwrite || !isset($data[$key])) {\n                        if (!$allowOverwrite && \\array_key_exists($key, $data)) {\n                            trigger_deprecation('symfony/yaml', '7.2', 'Duplicate key \"%s\" detected on line %d whilst parsing YAML. Silent handling of duplicate mapping keys in YAML is deprecated and will throw a ParseException in 8.0.', $key, $this->getRealCurrentLineNb() + 1);\n                        }\n\n                        $data[$key] = $value;\n                    } else {\n                        throw new ParseException(\\sprintf('Duplicate key \"%s\" detected.', $key), $this->getRealCurrentLineNb() + 1, $this->currentLine);\n                    }\n                }\n                if ($isRef) {\n                    $this->refs[$isRef] = $data[$key];\n                    array_pop($this->refsBeingParsed);\n                }\n            } elseif ('\"' === $this->currentLine[0] || \"'\" === $this->currentLine[0]) {\n                if (null !== $context) {\n                    throw new ParseException('Unable to parse.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);\n                }\n\n                try {\n                    return Inline::parse($this->lexInlineQuotedString(), $flags, $this->refs, $this->state);\n                } catch (ParseException $e) {\n                    $e->setParsedLine($this->getRealCurrentLineNb() + 1);\n                    $e->setSnippet($this->currentLine);\n\n                    throw $e;\n                }\n            } elseif ('{' === $this->currentLine[0]) {\n                if (null !== $context) {\n                    throw new ParseException('Unable to parse.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);\n                }\n\n                try {\n                    $parsedMapping = Inline::parse($this->lexInlineMapping(), $flags, $this->refs, $this->state);\n\n                    while ($this->moveToNextLine()) {\n                        if (!$this->isCurrentLineEmpty()) {\n                            throw new ParseException('Unable to parse.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);\n                        }\n                    }\n\n                    return $parsedMapping;\n                } catch (ParseException $e) {\n                    $e->setParsedLine($this->getRealCurrentLineNb() + 1);\n                    $e->setSnippet($this->currentLine);\n\n                    throw $e;\n                }\n            } elseif ('[' === $this->currentLine[0]) {\n                if (null !== $context) {\n                    throw new ParseException('Unable to parse.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);\n                }\n\n                try {\n                    $parsedSequence = Inline::parse($this->lexInlineSequence(), $flags, $this->refs, $this->state);\n\n                    while ($this->moveToNextLine()) {\n                        if (!$this->isCurrentLineEmpty()) {\n                            throw new ParseException('Unable to parse.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);\n                        }\n                    }\n\n                    return $parsedSequence;\n                } catch (ParseException $e) {\n                    $e->setParsedLine($this->getRealCurrentLineNb() + 1);\n                    $e->setSnippet($this->currentLine);\n\n                    throw $e;\n                }\n            } else {\n                // multiple documents are not supported\n                if ('---' === $this->currentLine) {\n                    throw new ParseException('Multiple documents are not supported.', $this->currentLineNb + 1, $this->currentLine, $this->filename);\n                }\n\n                if (isset($this->currentLine[1]) && '?' === $this->currentLine[0] && ' ' === $this->currentLine[1]) {\n                    throw new ParseException('Complex mappings are not supported.', $this->getRealCurrentLineNb() + 1, $this->currentLine);\n                }\n\n                // 1-liner optionally followed by newline(s)\n                if (\\is_string($value) && $this->lines[0] === trim($value)) {\n                    try {\n                        $value = Inline::parse($this->lines[0], $flags, $this->refs, $this->state);\n                    } catch (ParseException $e) {\n                        $e->setParsedLine($this->getRealCurrentLineNb() + 1);\n                        $e->setSnippet($this->currentLine);\n\n                        throw $e;\n                    }\n\n                    return $value;\n                }\n\n                // try to parse the value as a multi-line string as a last resort\n                if (0 === $this->currentLineNb) {\n                    $previousLineWasNewline = false;\n                    $previousLineWasTerminatedWithBackslash = false;\n                    $value = '';\n\n                    foreach ($this->lines as $line) {\n                        $trimmedLine = trim($line);\n                        if ('#' === ($trimmedLine[0] ?? '')) {\n                            continue;\n                        }\n                        // If the indentation is not consistent at offset 0, it is to be considered as a ParseError\n                        if (0 === $this->offset && isset($line[0]) && ' ' === $line[0]) {\n                            throw new ParseException('Unable to parse.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);\n                        }\n\n                        if (str_contains($line, ': ')) {\n                            throw new ParseException('Mapping values are not allowed in multi-line blocks.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);\n                        }\n\n                        if ('' === $trimmedLine) {\n                            $value .= \"\\n\";\n                        } elseif (!$previousLineWasNewline && !$previousLineWasTerminatedWithBackslash) {\n                            $value .= ' ';\n                        }\n\n                        if ('' !== $trimmedLine && str_ends_with($line, '\\\\')) {\n                            $value .= ltrim(substr($line, 0, -1));\n                        } elseif ('' !== $trimmedLine) {\n                            $value .= $trimmedLine;\n                        }\n\n                        if ('' === $trimmedLine) {\n                            $previousLineWasNewline = true;\n                            $previousLineWasTerminatedWithBackslash = false;\n                        } elseif (str_ends_with($line, '\\\\')) {\n                            $previousLineWasNewline = false;\n                            $previousLineWasTerminatedWithBackslash = true;\n                        } else {\n                            $previousLineWasNewline = false;\n                            $previousLineWasTerminatedWithBackslash = false;\n                        }\n                    }\n\n                    try {\n                        return Inline::parse(trim($value), 0, $this->refs, $this->state);\n                    } catch (ParseException) {\n                        // fall-through to the ParseException thrown below\n                    }\n                }\n\n                throw new ParseException('Unable to parse.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);\n            }\n        } while ($this->moveToNextLine());\n\n        if (null !== $tag) {\n            $data = new TaggedValue($tag, $data);\n        }\n\n        if (Yaml::PARSE_OBJECT_FOR_MAP & $flags && 'mapping' === $context && !\\is_object($data)) {\n            $object = new \\stdClass();\n\n            foreach ($data as $key => $value) {\n                $object->$key = $value;\n            }\n\n            $data = $object;\n        }\n\n        return $data ?: null;\n    }\n\n    private function parseBlock(int $offset, string $yaml, int $flags): mixed\n    {\n        $skippedLineNumbers = $this->skippedLineNumbers;\n\n        foreach ($this->locallySkippedLineNumbers as $lineNumber) {\n            if ($lineNumber < $offset) {\n                continue;\n            }\n\n            $skippedLineNumbers[] = $lineNumber;\n        }\n\n        $parser = new self();\n        $parser->offset = $offset;\n        $parser->totalNumberOfLines = $this->totalNumberOfLines;\n        $parser->skippedLineNumbers = $skippedLineNumbers;\n        $parser->refs = &$this->refs;\n        $parser->refsBeingParsed = $this->refsBeingParsed;\n        $parser->state = $this->state;\n\n        $this->getState()->enterNestingLevel($offset + 1, $this->currentLine, $this->filename);\n\n        try {\n            return $parser->doParse($yaml, $flags);\n        } finally {\n            $this->getState()->leaveNestingLevel();\n        }\n    }\n\n    /**\n     * Returns the current line number (takes the offset into account).\n     *\n     * @internal\n     */\n    public function getRealCurrentLineNb(): int\n    {\n        $realCurrentLineNumber = $this->currentLineNb + $this->offset;\n\n        foreach ($this->skippedLineNumbers as $skippedLineNumber) {\n            if ($skippedLineNumber > $realCurrentLineNumber) {\n                break;\n            }\n\n            ++$realCurrentLineNumber;\n        }\n\n        return $realCurrentLineNumber;\n    }\n\n    private function getCurrentLineIndentation(): int\n    {\n        if (' ' !== ($this->currentLine[0] ?? '')) {\n            return 0;\n        }\n\n        return \\strlen($this->currentLine) - \\strlen(ltrim($this->currentLine, ' '));\n    }\n\n    /**\n     * Returns the next embed block of YAML.\n     *\n     * @param int|null $indentation The indent level at which the block is to be read, or null for default\n     * @param bool     $inSequence  True if the enclosing data structure is a sequence\n     *\n     * @throws ParseException When indentation problem are detected\n     */\n    private function getNextEmbedBlock(?int $indentation = null, bool $inSequence = false): string\n    {\n        $oldLineIndentation = $this->getCurrentLineIndentation();\n\n        if (!$this->moveToNextLine()) {\n            return '';\n        }\n\n        if (null === $indentation) {\n            $newIndent = null;\n            $movements = 0;\n\n            do {\n                $EOF = false;\n\n                // empty and comment-like lines do not influence the indentation depth\n                if ($this->isCurrentLineEmpty() || $this->isCurrentLineComment()) {\n                    $EOF = !$this->moveToNextLine();\n\n                    if (!$EOF) {\n                        ++$movements;\n                    }\n                } else {\n                    $newIndent = $this->getCurrentLineIndentation();\n                }\n            } while (!$EOF && null === $newIndent);\n\n            for ($i = 0; $i < $movements; ++$i) {\n                $this->moveToPreviousLine();\n            }\n\n            $unindentedEmbedBlock = $this->isStringUnIndentedCollectionItem();\n\n            if (!$this->isCurrentLineEmpty() && 0 === $newIndent && !$unindentedEmbedBlock) {\n                throw new ParseException('Indentation problem.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);\n            }\n        } else {\n            $newIndent = $indentation;\n        }\n\n        $data = [];\n\n        if ($this->getCurrentLineIndentation() >= $newIndent) {\n            $data[] = substr($this->currentLine, $newIndent ?? 0);\n        } elseif ($this->isCurrentLineEmpty() || $this->isCurrentLineComment()) {\n            $data[] = $this->currentLine;\n        } else {\n            $this->moveToPreviousLine();\n\n            return '';\n        }\n\n        if ($inSequence && $oldLineIndentation === $newIndent && isset($data[0][0]) && '-' === $data[0][0]) {\n            // the previous line contained a dash but no item content, this line is a sequence item with the same indentation\n            // and therefore no nested list or mapping\n            $this->moveToPreviousLine();\n\n            return '';\n        }\n\n        $isItUnindentedCollection = $this->isStringUnIndentedCollectionItem();\n        $isItComment = $this->isCurrentLineComment();\n\n        while ($this->moveToNextLine()) {\n            if ($isItComment && !$isItUnindentedCollection) {\n                $isItUnindentedCollection = $this->isStringUnIndentedCollectionItem();\n                $isItComment = $this->isCurrentLineComment();\n            }\n\n            $indent = $this->getCurrentLineIndentation();\n\n            if ($isItUnindentedCollection && !$this->isCurrentLineEmpty() && !$this->isStringUnIndentedCollectionItem() && $newIndent === $indent) {\n                $this->moveToPreviousLine();\n                break;\n            }\n\n            if ($this->isCurrentLineBlank()) {\n                $data[] = substr($this->currentLine, $newIndent ?? 0);\n                continue;\n            }\n\n            if ($indent >= $newIndent) {\n                $data[] = substr($this->currentLine, $newIndent ?? 0);\n            } elseif ($this->isCurrentLineComment()) {\n                $data[] = $this->currentLine;\n            } elseif (0 == $indent) {\n                $this->moveToPreviousLine();\n\n                break;\n            } else {\n                throw new ParseException('Indentation problem.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);\n            }\n        }\n\n        return implode(\"\\n\", $data);\n    }\n\n    private function hasMoreLines(): bool\n    {\n        return (\\count($this->lines) - 1) > $this->currentLineNb;\n    }\n\n    /**\n     * Moves the parser to the next line.\n     */\n    private function moveToNextLine(): bool\n    {\n        if ($this->currentLineNb >= $this->numberOfParsedLines - 1) {\n            return false;\n        }\n\n        $this->currentLine = $this->lines[++$this->currentLineNb];\n\n        return true;\n    }\n\n    /**\n     * Moves the parser to the previous line.\n     */\n    private function moveToPreviousLine(): bool\n    {\n        if ($this->currentLineNb < 1) {\n            return false;\n        }\n\n        $this->currentLine = $this->lines[--$this->currentLineNb];\n\n        return true;\n    }\n\n    /**\n     * Parses a YAML value.\n     *\n     * @param string $value   A YAML value\n     * @param int    $flags   A bit field of Yaml::PARSE_* constants to customize the YAML parser behavior\n     * @param string $context The parser context (either sequence or mapping)\n     *\n     * @throws ParseException When reference does not exist\n     */\n    private function parseValue(string $value, int $flags, string $context): mixed\n    {\n        if (str_starts_with($value, '*')) {\n            $value = substr($value, 1);\n\n            // remove comments\n            if (self::preg_match('/[ \\t]+#/', $value, $match, \\PREG_OFFSET_CAPTURE)) {\n                $value = substr($value, 0, $match[0][1]);\n            }\n\n            if (!\\array_key_exists($value, $this->refs)) {\n                if (false !== $pos = array_search($value, $this->refsBeingParsed, true)) {\n                    throw new ParseException(\\sprintf('Circular reference [%s] detected for reference \"%s\".', implode(', ', array_merge(\\array_slice($this->refsBeingParsed, $pos), [$value])), $value), $this->currentLineNb + 1, $this->currentLine, $this->filename);\n                }\n\n                throw new ParseException(\\sprintf('Reference \"%s\" does not exist.', $value), $this->currentLineNb + 1, $this->currentLine, $this->filename);\n            }\n\n            $this->getState()->countAlias($this->refs[$value], $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);\n\n            return $this->refs[$value];\n        }\n\n        if (\\in_array($value[0], ['!', '|', '>'], true) && self::preg_match('/^(?:'.self::TAG_PATTERN.' +)?'.self::BLOCK_SCALAR_HEADER_PATTERN.'$/', $value, $matches)) {\n            $modifiers = $matches['modifiers'] ?? '';\n\n            $data = $this->parseBlockScalar($matches['separator'], preg_replace('#\\d+#', '', $modifiers), abs((int) $modifiers));\n\n            if ('' !== $matches['tag'] && '!' !== $matches['tag']) {\n                if ('!!binary' === $matches['tag']) {\n                    return Inline::evaluateBinaryScalar($data);\n                }\n\n                return new TaggedValue(substr($matches['tag'], 1), $data);\n            }\n\n            return $data;\n        }\n\n        try {\n            if ('' !== $value && '{' === $value[0]) {\n                $cursor = \\strlen(rtrim($this->currentLine)) - \\strlen(rtrim($value));\n\n                return Inline::parse($this->lexInlineMapping($cursor), $flags, $this->refs, $this->state);\n            } elseif ('' !== $value && '[' === $value[0]) {\n                $cursor = \\strlen(rtrim($this->currentLine)) - \\strlen(rtrim($value));\n\n                return Inline::parse($this->lexInlineSequence($cursor), $flags, $this->refs, $this->state);\n            }\n\n            switch ($value[0] ?? '') {\n                case '\"':\n                case \"'\":\n                    $cursor = \\strlen(rtrim($this->currentLine)) - \\strlen(rtrim($value));\n                    $parsedValue = Inline::parse($this->lexInlineQuotedString($cursor), $flags, $this->refs, $this->state);\n\n                    if (isset($this->currentLine[$cursor]) && preg_replace('/\\s*(#.*)?$/A', '', substr($this->currentLine, $cursor))) {\n                        throw new ParseException(\\sprintf('Unexpected characters near \"%s\".', substr($this->currentLine, $cursor)));\n                    }\n\n                    return $parsedValue;\n                default:\n                    $lines = [];\n\n                    while ($this->moveToNextLine()) {\n                        // unquoted strings end before the first unindented line\n                        if (0 === $this->getCurrentLineIndentation()) {\n                            $this->moveToPreviousLine();\n\n                            break;\n                        }\n\n                        if ($this->isCurrentLineComment()) {\n                            break;\n                        }\n\n                        if ('mapping' === $context && str_contains($this->currentLine, ': ') && !$this->isCurrentLineComment()) {\n                            throw new ParseException('A colon cannot be used in an unquoted mapping value.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);\n                        }\n\n                        $lines[] = trim($this->currentLine);\n                    }\n\n                    for ($i = 0, $linesCount = \\count($lines), $previousLineBlank = false; $i < $linesCount; ++$i) {\n                        if ('' === $lines[$i]) {\n                            $value .= \"\\n\";\n                            $previousLineBlank = true;\n                        } elseif ($previousLineBlank) {\n                            $value .= $lines[$i];\n                            $previousLineBlank = false;\n                        } else {\n                            $value .= ' '.$lines[$i];\n                            $previousLineBlank = false;\n                        }\n                    }\n\n                    Inline::$parsedLineNumber = $this->getRealCurrentLineNb();\n\n                    $parsedValue = Inline::parse($value, $flags, $this->refs, $this->state);\n\n                    if ('mapping' === $context && \\is_string($parsedValue) && '\"' !== $value[0] && \"'\" !== $value[0] && '[' !== $value[0] && '{' !== $value[0] && '!' !== $value[0] && str_contains($parsedValue, ': ')) {\n                        throw new ParseException('A colon cannot be used in an unquoted mapping value.', $this->getRealCurrentLineNb() + 1, $value, $this->filename);\n                    }\n\n                    return $parsedValue;\n            }\n        } catch (ParseException $e) {\n            $e->setParsedLine($this->getRealCurrentLineNb() + 1);\n            $e->setSnippet($this->currentLine);\n\n            throw $e;\n        }\n    }\n\n    /**\n     * Parses a block scalar.\n     *\n     * @param string $style       The style indicator that was used to begin this block scalar (| or >)\n     * @param string $chomping    The chomping indicator that was used to begin this block scalar (+ or -)\n     * @param int    $indentation The indentation indicator that was used to begin this block scalar\n     */\n    private function parseBlockScalar(string $style, string $chomping = '', int $indentation = 0): string\n    {\n        $notEOF = $this->moveToNextLine();\n        if (!$notEOF) {\n            return '';\n        }\n\n        $isCurrentLineBlank = $this->isCurrentLineBlank();\n        $blockLines = [];\n\n        // leading blank lines are consumed before determining indentation\n        while ($notEOF && $isCurrentLineBlank) {\n            // newline only if not EOF\n            if ($notEOF = $this->moveToNextLine()) {\n                $blockLines[] = '';\n                $isCurrentLineBlank = $this->isCurrentLineBlank();\n            }\n        }\n\n        // determine indentation if not specified\n        if (0 === $indentation) {\n            $currentLineLength = \\strlen($this->currentLine);\n\n            for ($i = 0; $i < $currentLineLength && ' ' === $this->currentLine[$i]; ++$i) {\n                ++$indentation;\n            }\n        }\n\n        if ($indentation > 0) {\n            $pattern = \\sprintf('/^ {%d}(.*)$/', $indentation);\n\n            while (\n                $notEOF && (\n                    $isCurrentLineBlank\n                    || self::preg_match($pattern, $this->currentLine, $matches)\n                )\n            ) {\n                if ($isCurrentLineBlank && \\strlen($this->currentLine) > $indentation) {\n                    $blockLines[] = substr($this->currentLine, $indentation);\n                } elseif ($isCurrentLineBlank) {\n                    $blockLines[] = '';\n                } else {\n                    $blockLines[] = $matches[1];\n                }\n\n                // newline only if not EOF\n                if ($notEOF = $this->moveToNextLine()) {\n                    $isCurrentLineBlank = $this->isCurrentLineBlank();\n                }\n            }\n        } elseif ($notEOF) {\n            $blockLines[] = '';\n        }\n\n        if ($notEOF) {\n            $blockLines[] = '';\n            $this->moveToPreviousLine();\n        } elseif (!$this->isCurrentLineLastLineInDocument()) {\n            $blockLines[] = '';\n        }\n\n        // folded style\n        if ('>' === $style) {\n            $text = '';\n            $previousLineIndented = false;\n            $previousLineBlank = false;\n\n            for ($i = 0, $blockLinesCount = \\count($blockLines); $i < $blockLinesCount; ++$i) {\n                if ('' === $blockLines[$i]) {\n                    $text .= \"\\n\";\n                    $previousLineIndented = false;\n                    $previousLineBlank = true;\n                } elseif (' ' === $blockLines[$i][0]) {\n                    $text .= \"\\n\".$blockLines[$i];\n                    $previousLineIndented = true;\n                    $previousLineBlank = false;\n                } elseif ($previousLineIndented) {\n                    $text .= \"\\n\".$blockLines[$i];\n                    $previousLineIndented = false;\n                    $previousLineBlank = false;\n                } elseif ($previousLineBlank || 0 === $i) {\n                    $text .= $blockLines[$i];\n                    $previousLineIndented = false;\n                    $previousLineBlank = false;\n                } else {\n                    $text .= ' '.$blockLines[$i];\n                    $previousLineIndented = false;\n                    $previousLineBlank = false;\n                }\n            }\n        } else {\n            $text = implode(\"\\n\", $blockLines);\n        }\n\n        // deal with trailing newlines\n        if ('' === $chomping) {\n            $text = preg_replace('/\\n+$/', \"\\n\", $text);\n        } elseif ('-' === $chomping) {\n            $text = preg_replace('/\\n+$/', '', $text);\n        }\n\n        return $text;\n    }\n\n    /**\n     * Returns true if the next line is indented.\n     */\n    private function isNextLineIndented(): bool\n    {\n        $currentIndentation = $this->getCurrentLineIndentation();\n        $movements = 0;\n\n        do {\n            $EOF = !$this->moveToNextLine();\n\n            if (!$EOF) {\n                ++$movements;\n            }\n        } while (!$EOF && ($this->isCurrentLineEmpty() || $this->isCurrentLineComment()));\n\n        if ($EOF) {\n            for ($i = 0; $i < $movements; ++$i) {\n                $this->moveToPreviousLine();\n            }\n\n            return false;\n        }\n\n        $ret = $this->getCurrentLineIndentation() > $currentIndentation;\n\n        for ($i = 0; $i < $movements; ++$i) {\n            $this->moveToPreviousLine();\n        }\n\n        return $ret;\n    }\n\n    private function isCurrentLineEmpty(): bool\n    {\n        return $this->isCurrentLineBlank() || $this->isCurrentLineComment();\n    }\n\n    private function isCurrentLineBlank(): bool\n    {\n        return '' === $this->currentLine || '' === trim($this->currentLine, ' ');\n    }\n\n    private function isCurrentLineComment(): bool\n    {\n        // checking explicitly the first char of the trim is faster than loops or strpos\n        $ltrimmedLine = '' !== $this->currentLine && ' ' === $this->currentLine[0] ? ltrim($this->currentLine, ' ') : $this->currentLine;\n\n        return '' !== $ltrimmedLine && '#' === $ltrimmedLine[0];\n    }\n\n    private function isCurrentLineLastLineInDocument(): bool\n    {\n        return ($this->offset + $this->currentLineNb) >= ($this->totalNumberOfLines - 1);\n    }\n\n    private function cleanup(string $value): string\n    {\n        $value = str_replace([\"\\r\\n\", \"\\r\"], \"\\n\", $value);\n\n        // strip YAML header\n        $count = 0;\n        $value = preg_replace('#^%YAML[: ][\\d.]++[^\\n]*+\\n#u', '', $value, -1, $count);\n        $this->offset += $count;\n\n        // remove leading comments\n        $trimmedValue = preg_replace('#^(?:\\#[^\\n]*+\\n)++#', '', $value, -1, $count);\n        if (1 === $count) {\n            // items have been removed, update the offset\n            $this->offset += substr_count($value, \"\\n\") - substr_count($trimmedValue, \"\\n\");\n            $value = $trimmedValue;\n        }\n\n        // remove start of the document marker (---)\n        $trimmedValue = preg_replace('#^---[^\\n]*+\\n#', '', $value, -1, $count);\n        if (1 === $count) {\n            // items have been removed, update the offset\n            $this->offset += substr_count($value, \"\\n\") - substr_count($trimmedValue, \"\\n\");\n            $value = $trimmedValue;\n\n            // remove end of the document marker (...)\n            $value = preg_replace('#\\.\\.\\.\\s*+$#', '', $value);\n        }\n\n        return $value;\n    }\n\n    private function isNextLineUnIndentedCollection(): bool\n    {\n        $currentIndentation = $this->getCurrentLineIndentation();\n        $movements = 0;\n\n        do {\n            $EOF = !$this->moveToNextLine();\n\n            if (!$EOF) {\n                ++$movements;\n            }\n        } while (!$EOF && ($this->isCurrentLineEmpty() || $this->isCurrentLineComment()));\n\n        if ($EOF) {\n            return false;\n        }\n\n        $ret = $this->getCurrentLineIndentation() === $currentIndentation && $this->isStringUnIndentedCollectionItem();\n\n        for ($i = 0; $i < $movements; ++$i) {\n            $this->moveToPreviousLine();\n        }\n\n        return $ret;\n    }\n\n    private function isStringUnIndentedCollectionItem(): bool\n    {\n        return '-' === rtrim($this->currentLine) || str_starts_with($this->currentLine, '- ');\n    }\n\n    /**\n     * A local wrapper for \"preg_match\" which will throw a ParseException if there\n     * is an internal error in the PCRE engine.\n     *\n     * This avoids us needing to check for \"false\" every time PCRE is used\n     * in the YAML engine\n     *\n     * @throws ParseException on a PCRE internal error\n     *\n     * @internal\n     */\n    public static function preg_match(string $pattern, string $subject, ?array &$matches = null, int $flags = 0, int $offset = 0): int\n    {\n        if (false === $ret = preg_match($pattern, $subject, $matches, $flags, $offset)) {\n            throw new ParseException(preg_last_error_msg());\n        }\n\n        return $ret;\n    }\n\n    /**\n     * Trim the tag on top of the value.\n     *\n     * Prevent values such as \"!foo {quz: bar}\" to be considered as\n     * a mapping block.\n     */\n    private function trimTag(string $value): string\n    {\n        if ('!' === $value[0]) {\n            return ltrim(substr($value, 1, strcspn($value, \" \\r\\n\", 1)), ' ');\n        }\n\n        return $value;\n    }\n\n    private function getLineTag(string $value, int $flags, bool $nextLineCheck = true): ?string\n    {\n        if ('' === $value || '!' !== $value[0] || 1 !== self::preg_match('/^'.self::TAG_PATTERN.' *( +#.*)?$/', $value, $matches)) {\n            return null;\n        }\n\n        if ($nextLineCheck && !$this->isNextLineIndented()) {\n            return null;\n        }\n\n        $tag = substr($matches['tag'], 1);\n\n        // Built-in tags\n        if ($tag && '!' === $tag[0]) {\n            throw new ParseException(\\sprintf('The built-in tag \"!%s\" is not implemented.', $tag), $this->getRealCurrentLineNb() + 1, $value, $this->filename);\n        }\n\n        if (Yaml::PARSE_CUSTOM_TAGS & $flags) {\n            return $tag;\n        }\n\n        throw new ParseException(\\sprintf('Tags support is not enabled. You must use the flag \"Yaml::PARSE_CUSTOM_TAGS\" to use \"%s\".', $matches['tag']), $this->getRealCurrentLineNb() + 1, $value, $this->filename);\n    }\n\n    private function lexInlineQuotedString(int &$cursor = 0): string\n    {\n        $quotation = $this->currentLine[$cursor];\n        $value = $quotation;\n        ++$cursor;\n\n        $previousLineWasNewline = true;\n        $previousLineWasTerminatedWithBackslash = false;\n        $lineNumber = 0;\n\n        do {\n            if (++$lineNumber > 1) {\n                $cursor += strspn($this->currentLine, ' ', $cursor);\n            }\n\n            if ($this->isCurrentLineBlank()) {\n                $value .= \"\\n\";\n            } elseif (!$previousLineWasNewline && !$previousLineWasTerminatedWithBackslash) {\n                $value .= ' ';\n            }\n\n            for (; \\strlen($this->currentLine) > $cursor; ++$cursor) {\n                switch ($this->currentLine[$cursor]) {\n                    case '\\\\':\n                        if (\"'\" === $quotation) {\n                            $value .= '\\\\';\n                        } elseif (isset($this->currentLine[++$cursor])) {\n                            $value .= '\\\\'.$this->currentLine[$cursor];\n                        }\n\n                        break;\n                    case $quotation:\n                        ++$cursor;\n\n                        if (\"'\" === $quotation && isset($this->currentLine[$cursor]) && \"'\" === $this->currentLine[$cursor]) {\n                            $value .= \"''\";\n                            break;\n                        }\n\n                        return $value.$quotation;\n                    default:\n                        $value .= $this->currentLine[$cursor];\n                }\n            }\n\n            if ($this->isCurrentLineBlank()) {\n                $previousLineWasNewline = true;\n                $previousLineWasTerminatedWithBackslash = false;\n            } elseif ('\"' === $quotation && 1 === (\\strlen($this->currentLine) - \\strlen(rtrim($this->currentLine, '\\\\'))) % 2) {\n                $previousLineWasNewline = false;\n                $previousLineWasTerminatedWithBackslash = true;\n            } else {\n                $previousLineWasNewline = false;\n                $previousLineWasTerminatedWithBackslash = false;\n            }\n\n            if ($this->hasMoreLines()) {\n                $cursor = 0;\n            }\n        } while ($this->moveToNextLine());\n\n        throw new ParseException('Malformed inline YAML string.');\n    }\n\n    private function lexUnquotedString(int &$cursor): string\n    {\n        $offset = $cursor;\n\n        while ($cursor < \\strlen($this->currentLine)) {\n            if (\\in_array($this->currentLine[$cursor], ['[', ']', '{', '}', ',', ':'], true)) {\n                break;\n            }\n\n            if (\\in_array($this->currentLine[$cursor], [' ', \"\\t\"], true) && '#' === ($this->currentLine[$cursor + 1] ?? '')) {\n                break;\n            }\n\n            ++$cursor;\n        }\n\n        if ($cursor === $offset) {\n            throw new ParseException('Malformed unquoted YAML string.');\n        }\n\n        return substr($this->currentLine, $offset, $cursor - $offset);\n    }\n\n    private function lexInlineAnchorOrAlias(int &$cursor): string\n    {\n        $offset = $cursor;\n        ++$cursor;\n\n        while ($cursor < \\strlen($this->currentLine) && !\\in_array($this->currentLine[$cursor], [' ', \"\\t\", ',', '[', ']', '{', '}'], true)) {\n            ++$cursor;\n        }\n\n        return substr($this->currentLine, $offset, $cursor - $offset);\n    }\n\n    private function lexInlineMapping(int &$cursor = 0, bool $consumeUntilEol = true): string\n    {\n        return $this->lexInlineStructure($cursor, '}', $consumeUntilEol);\n    }\n\n    private function lexInlineSequence(int &$cursor = 0, bool $consumeUntilEol = true): string\n    {\n        return $this->lexInlineStructure($cursor, ']', $consumeUntilEol);\n    }\n\n    private function lexInlineStructure(int &$cursor, string $closingTag, bool $consumeUntilEol = true): string\n    {\n        $state = $this->getState();\n        $state->enterNestingLevel($this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);\n\n        try {\n            return $this->doLexInlineStructure($cursor, $closingTag, $consumeUntilEol);\n        } finally {\n            $state->leaveNestingLevel();\n        }\n    }\n\n    private function doLexInlineStructure(int &$cursor, string $closingTag, bool $consumeUntilEol = true): string\n    {\n        $value = $this->currentLine[$cursor];\n        ++$cursor;\n\n        do {\n            $this->consumeWhitespaces($cursor);\n\n            while (isset($this->currentLine[$cursor])) {\n                switch ($this->currentLine[$cursor]) {\n                    case '\"':\n                    case \"'\":\n                        $value .= $this->lexInlineQuotedString($cursor);\n                        break;\n                    case ':':\n                    case ',':\n                        $value .= $this->currentLine[$cursor];\n                        ++$cursor;\n                        break;\n                    case '{':\n                        $value .= $this->lexInlineMapping($cursor, false);\n                        break;\n                    case '[':\n                        $value .= $this->lexInlineSequence($cursor, false);\n                        break;\n                    case '&':\n                    case '*':\n                        $value .= $this->lexInlineAnchorOrAlias($cursor);\n                        break;\n                    case $closingTag:\n                        $value .= $this->currentLine[$cursor];\n                        ++$cursor;\n\n                        if ($consumeUntilEol && isset($this->currentLine[$cursor]) && ($whitespaces = strspn($this->currentLine, ' ', $cursor) + $cursor) < \\strlen($this->currentLine) && '#' !== $this->currentLine[$whitespaces]) {\n                            throw new ParseException(\\sprintf('Unexpected token \"%s\".', trim(substr($this->currentLine, $cursor))));\n                        }\n\n                        return $value;\n                    case '#':\n                        break 2;\n                    default:\n                        $value .= $this->lexUnquotedString($cursor);\n                }\n\n                if ($this->consumeWhitespaces($cursor)) {\n                    $value .= ' ';\n                }\n            }\n\n            if ($this->hasMoreLines()) {\n                $cursor = 0;\n            }\n        } while ($this->moveToNextLine());\n\n        throw new ParseException('Malformed inline YAML string.');\n    }\n\n    private function consumeWhitespaces(int &$cursor): bool\n    {\n        $whitespacesConsumed = 0;\n\n        do {\n            $whitespaceOnlyTokenLength = strspn($this->currentLine, \" \\t\", $cursor);\n            $whitespacesConsumed += $whitespaceOnlyTokenLength;\n            $cursor += $whitespaceOnlyTokenLength;\n\n            if (isset($this->currentLine[$cursor])) {\n                return 0 < $whitespacesConsumed;\n            }\n\n            if ($this->hasMoreLines()) {\n                $cursor = 0;\n            }\n        } while ($this->moveToNextLine());\n\n        return 0 < $whitespacesConsumed;\n    }\n}\n","vendor/symfony/yaml/ParserState.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Yaml;\n\nuse Symfony\\Component\\Yaml\\Exception\\ParseException;\nuse Symfony\\Component\\Yaml\\Tag\\TaggedValue;\n\n/**\n * @internal\n */\nfinal class ParserState\n{\n    public int $maxNestingLevel = Parser::DEFAULT_MAX_NESTING_LEVEL;\n    public int $currentNestingLevel = 0;\n    public int $maxAliasesForCollections = Parser::DEFAULT_MAX_ALIASES_FOR_COLLECTIONS;\n    public int $collectionAliasCount = 0;\n    public bool $aliasesEnabled = true;\n\n    public function reset(): void\n    {\n        $this->currentNestingLevel = 0;\n        $this->collectionAliasCount = 0;\n        $this->aliasesEnabled = true;\n    }\n\n    public function enterNestingLevel(int $line, ?string $snippet, ?string $filename): void\n    {\n        if (++$this->currentNestingLevel > $this->maxNestingLevel) {\n            --$this->currentNestingLevel;\n\n            throw new ParseException(\\sprintf('Maximum nesting depth of %d exceeded.', $this->maxNestingLevel), $line, $snippet, $filename);\n        }\n    }\n\n    public function leaveNestingLevel(): void\n    {\n        if ($this->currentNestingLevel > 0) {\n            --$this->currentNestingLevel;\n        }\n    }\n\n    public function countAlias(mixed $refValue, int $line, ?string $snippet, ?string $filename): void\n    {\n        if (!$this->aliasesEnabled) {\n            throw new ParseException('Aliases are disabled.', $line, $snippet, $filename);\n        }\n\n        if ($refValue instanceof TaggedValue) {\n            $refValue = $refValue->getValue();\n        }\n\n        if (!\\is_array($refValue) && !$refValue instanceof \\stdClass) {\n            return;\n        }\n\n        if (++$this->collectionAliasCount > $this->maxAliasesForCollections) {\n            throw new ParseException(\\sprintf('Maximum number of collection aliases (%d) exceeded. This limit can be increased via the Parser constructor.', $this->maxAliasesForCollections), $line, $snippet, $filename);\n        }\n    }\n}\n","vendor/symfony/yaml/README.md":"Yaml Component\n==============\n\nThe Yaml component loads and dumps YAML files.\n\nResources\n---------\n\n * [Documentation](https://symfony.com/doc/current/components/yaml.html)\n * [Contributing](https://symfony.com/doc/current/contributing/index.html)\n * [Report issues](https://github.com/symfony/symfony/issues) and\n   [send Pull Requests](https://github.com/symfony/symfony/pulls)\n   in the [main Symfony repository](https://github.com/symfony/symfony)\n","vendor/symfony/yaml/Resources/bin/yaml-lint":"#!/usr/bin/env php\n<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nif ('cli' !== \\PHP_SAPI) {\n    throw new Exception('This script must be run from the command line.');\n}\n\n/**\n * Runs the Yaml lint command.\n *\n * @author Jan Schädlich <jan.schaedlich@sensiolabs.de>\n */\n\nuse Symfony\\Component\\Console\\Application;\nuse Symfony\\Component\\Yaml\\Command\\LintCommand;\n\nfunction includeIfExists(string $file): bool\n{\n    return file_exists($file) && include $file;\n}\n\nif (\n    !includeIfExists(__DIR__ . '/../../../../autoload.php') &&\n    !includeIfExists(__DIR__ . '/../../vendor/autoload.php') &&\n    !includeIfExists(__DIR__ . '/../../../../../../vendor/autoload.php')\n) {\n    fwrite(STDERR, 'Install dependencies using Composer.'.PHP_EOL);\n    exit(1);\n}\n\nif (!class_exists(Application::class)) {\n    fwrite(STDERR, 'You need the \"symfony/console\" component in order to run the Yaml linter.'.PHP_EOL);\n    exit(1);\n}\n\n$command = new LintCommand();\nif (method_exists($app = new Application(), 'addCommand')) {\n    $app->addCommand($command);\n} else {\n    $app->add($command);\n}\n$app\n    ->setDefaultCommand($command->getName(), true)\n    ->run()\n;\n","vendor/symfony/yaml/Tag/TaggedValue.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Yaml\\Tag;\n\n/**\n * @author Nicolas Grekas <p@tchwork.com>\n * @author Guilhem N. <egetick@gmail.com>\n */\nfinal class TaggedValue\n{\n    public function __construct(\n        private string $tag,\n        private mixed $value,\n    ) {\n    }\n\n    public function getTag(): string\n    {\n        return $this->tag;\n    }\n\n    public function getValue(): mixed\n    {\n        return $this->value;\n    }\n}\n","vendor/symfony/yaml/Unescaper.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Yaml;\n\nuse Symfony\\Component\\Yaml\\Exception\\ParseException;\n\n/**\n * Unescaper encapsulates unescaping rules for single and double-quoted\n * YAML strings.\n *\n * @author Matthew Lewinski <matthew@lewinski.org>\n *\n * @internal\n */\nclass Unescaper\n{\n    /**\n     * Regex fragment that matches an escaped character in a double quoted string.\n     */\n    public const REGEX_ESCAPED_CHARACTER = '\\\\\\\\(x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|U[0-9a-fA-F]{8}|.)';\n\n    /**\n     * Unescapes a single quoted string.\n     *\n     * @param string $value A single quoted string\n     */\n    public function unescapeSingleQuotedString(string $value): string\n    {\n        return str_replace('\\'\\'', '\\'', $value);\n    }\n\n    /**\n     * Unescapes a double quoted string.\n     *\n     * @param string $value A double quoted string\n     */\n    public function unescapeDoubleQuotedString(string $value): string\n    {\n        $callback = fn ($match) => $this->unescapeCharacter($match[0]);\n\n        // evaluate the string\n        return preg_replace_callback('/'.self::REGEX_ESCAPED_CHARACTER.'/u', $callback, $value);\n    }\n\n    /**\n     * Unescapes a character that was found in a double-quoted string.\n     *\n     * @param string $value An escaped character\n     */\n    private function unescapeCharacter(string $value): string\n    {\n        return match ($value[1]) {\n            '0' => \"\\x0\",\n            'a' => \"\\x7\",\n            'b' => \"\\x8\",\n            't' => \"\\t\",\n            \"\\t\" => \"\\t\",\n            'n' => \"\\n\",\n            'v' => \"\\xB\",\n            'f' => \"\\xC\",\n            'r' => \"\\r\",\n            'e' => \"\\x1B\",\n            ' ' => ' ',\n            '\"' => '\"',\n            '/' => '/',\n            '\\\\' => '\\\\',\n            // U+0085 NEXT LINE\n            'N' => \"\\xC2\\x85\",\n            // U+00A0 NO-BREAK SPACE\n            '_' => \"\\xC2\\xA0\",\n            // U+2028 LINE SEPARATOR\n            'L' => \"\\xE2\\x80\\xA8\",\n            // U+2029 PARAGRAPH SEPARATOR\n            'P' => \"\\xE2\\x80\\xA9\",\n            'x' => self::utf8chr(hexdec(substr($value, 2, 2))),\n            'u' => self::utf8chr(hexdec(substr($value, 2, 4))),\n            'U' => self::utf8chr(hexdec(substr($value, 2, 8))),\n            default => throw new ParseException(\\sprintf('Found unknown escape character \"%s\".', $value)),\n        };\n    }\n\n    /**\n     * Get the UTF-8 character for the given code point.\n     */\n    private static function utf8chr(int $c): string\n    {\n        if (0x80 > $c %= 0x200000) {\n            return \\chr($c);\n        }\n        if (0x800 > $c) {\n            return \\chr(0xC0 | $c >> 6).\\chr(0x80 | $c & 0x3F);\n        }\n        if (0x10000 > $c) {\n            return \\chr(0xE0 | $c >> 12).\\chr(0x80 | $c >> 6 & 0x3F).\\chr(0x80 | $c & 0x3F);\n        }\n\n        return \\chr(0xF0 | $c >> 18).\\chr(0x80 | $c >> 12 & 0x3F).\\chr(0x80 | $c >> 6 & 0x3F).\\chr(0x80 | $c & 0x3F);\n    }\n}\n","vendor/symfony/yaml/Yaml.php":"<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony\\Component\\Yaml;\n\nuse Symfony\\Component\\Yaml\\Exception\\ParseException;\n\n/**\n * Yaml offers convenience methods to load and dump YAML.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n *\n * @final\n */\nclass Yaml\n{\n    public const DUMP_OBJECT = 1;\n    public const PARSE_EXCEPTION_ON_INVALID_TYPE = 2;\n    public const PARSE_OBJECT = 4;\n    public const PARSE_OBJECT_FOR_MAP = 8;\n    public const DUMP_EXCEPTION_ON_INVALID_TYPE = 16;\n    public const PARSE_DATETIME = 32;\n    public const DUMP_OBJECT_AS_MAP = 64;\n    public const DUMP_MULTI_LINE_LITERAL_BLOCK = 128;\n    public const PARSE_CONSTANT = 256;\n    public const PARSE_CUSTOM_TAGS = 512;\n    public const DUMP_EMPTY_ARRAY_AS_SEQUENCE = 1024;\n    public const DUMP_NULL_AS_TILDE = 2048;\n    public const DUMP_NUMERIC_KEY_AS_STRING = 4096;\n    public const DUMP_NULL_AS_EMPTY = 8192;\n    public const DUMP_COMPACT_NESTED_MAPPING = 16384;\n    public const DUMP_FORCE_DOUBLE_QUOTES_ON_VALUES = 32768;\n    public const PARSE_EXCEPTION_ON_ALIAS = 65536;\n\n    /**\n     * Parses a YAML file into a PHP value.\n     *\n     * Usage:\n     *\n     *     $array = Yaml::parseFile('config.yml');\n     *     print_r($array);\n     *\n     * @param string                     $filename                 The path to the YAML file to be parsed\n     * @param int-mask-of<self::PARSE_*> $flags                    A bit field of PARSE_* constants to customize the YAML parser behavior\n     * @param int                        $maxNestingLevel          The maximum nesting depth for nested YAML blocks\n     * @param int                        $maxAliasesForCollections The maximum number of collection aliases to resolve\n     *\n     * @throws ParseException If the file could not be read or the YAML is not valid\n     */\n    public static function parseFile(string $filename, int $flags = 0, int $maxNestingLevel = Parser::DEFAULT_MAX_NESTING_LEVEL, int $maxAliasesForCollections = Parser::DEFAULT_MAX_ALIASES_FOR_COLLECTIONS): mixed\n    {\n        $yaml = new Parser($maxNestingLevel, $maxAliasesForCollections);\n\n        return $yaml->parseFile($filename, $flags);\n    }\n\n    /**\n     * Parses YAML into a PHP value.\n     *\n     *  Usage:\n     *  <code>\n     *   $array = Yaml::parse(file_get_contents('config.yml'));\n     *   print_r($array);\n     *  </code>\n     *\n     * @param string                     $input                    A string containing YAML\n     * @param int-mask-of<self::PARSE_*> $flags                    A bit field of PARSE_* constants to customize the YAML parser behavior\n     * @param int                        $maxNestingLevel          The maximum nesting depth for nested YAML blocks\n     * @param int                        $maxAliasesForCollections The maximum number of collection aliases to resolve\n     *\n     * @throws ParseException If the YAML is not valid\n     */\n    public static function parse(string $input, int $flags = 0, int $maxNestingLevel = Parser::DEFAULT_MAX_NESTING_LEVEL, int $maxAliasesForCollections = Parser::DEFAULT_MAX_ALIASES_FOR_COLLECTIONS): mixed\n    {\n        $yaml = new Parser($maxNestingLevel, $maxAliasesForCollections);\n\n        return $yaml->parse($input, $flags);\n    }\n\n    /**\n     * Dumps a PHP value to a YAML string.\n     *\n     * The dump method, when supplied with an array, will do its best\n     * to convert the array into friendly YAML.\n     *\n     * @param mixed                     $input  The PHP value\n     * @param int                       $inline The level where you switch to inline YAML\n     * @param int                       $indent The amount of spaces to use for indentation of nested nodes\n     * @param int-mask-of<self::DUMP_*> $flags  A bit field of DUMP_* constants to customize the dumped YAML string\n     */\n    public static function dump(mixed $input, int $inline = 2, int $indent = 4, int $flags = 0): string\n    {\n        $yaml = new Dumper($indent);\n\n        return $yaml->dump($input, $inline, 0, $flags);\n    }\n}\n","vendor/symfony/yaml/composer.json":"{\n    \"name\": \"symfony/yaml\",\n    \"type\": \"library\",\n    \"description\": \"Loads and dumps YAML files\",\n    \"keywords\": [],\n    \"homepage\": \"https://symfony.com\",\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"Fabien Potencier\",\n            \"email\": \"fabien@symfony.com\"\n        },\n        {\n            \"name\": \"Symfony Community\",\n            \"homepage\": \"https://symfony.com/contributors\"\n        }\n    ],\n    \"require\": {\n        \"php\": \">=8.2\",\n        \"symfony/deprecation-contracts\": \"^2.5|^3\",\n        \"symfony/polyfill-ctype\": \"^1.8\"\n    },\n    \"require-dev\": {\n        \"symfony/console\": \"^6.4|^7.0|^8.0\"\n    },\n    \"conflict\": {\n        \"symfony/console\": \"<6.4\"\n    },\n    \"autoload\": {\n        \"psr-4\": { \"Symfony\\\\Component\\\\Yaml\\\\\": \"\" },\n        \"exclude-from-classmap\": [\n            \"/Tests/\"\n        ]\n    },\n    \"bin\": [\n        \"Resources/bin/yaml-lint\"\n    ],\n    \"minimum-stability\": \"dev\"\n}\n"}}