diff --git a/composer.lock b/composer.lock index c85530825..378c16ec9 100644 --- a/composer.lock +++ b/composer.lock @@ -211,16 +211,16 @@ }, { "name": "egulias/email-validator", - "version": "2.1.6", + "version": "2.1.7", "source": { "type": "git", "url": "https://github.com/egulias/EmailValidator.git", - "reference": "0578b32b30b22de3e8664f797cf846fc9246f786" + "reference": "709f21f92707308cdf8f9bcfa1af4cb26586521e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/0578b32b30b22de3e8664f797cf846fc9246f786", - "reference": "0578b32b30b22de3e8664f797cf846fc9246f786", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/709f21f92707308cdf8f9bcfa1af4cb26586521e", + "reference": "709f21f92707308cdf8f9bcfa1af4cb26586521e", "shasum": "" }, "require": { @@ -264,7 +264,7 @@ "validation", "validator" ], - "time": "2018-09-25T20:47:26+00:00" + "time": "2018-12-04T22:38:24+00:00" }, { "name": "erusev/parsedown", @@ -535,32 +535,33 @@ }, { "name": "guzzlehttp/psr7", - "version": "1.4.2", + "version": "1.5.2", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c" + "reference": "9f83dded91781a01c63574e387eaa769be769115" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/f5b8a8512e2b58b0071a7280e39f14f72e05d87c", - "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/9f83dded91781a01c63574e387eaa769be769115", + "reference": "9f83dded91781a01c63574e387eaa769be769115", "shasum": "" }, "require": { "php": ">=5.4.0", - "psr/http-message": "~1.0" + "psr/http-message": "~1.0", + "ralouphie/getallheaders": "^2.0.5" }, "provide": { "psr/http-message-implementation": "1.0" }, "require-dev": { - "phpunit/phpunit": "~4.0" + "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.4-dev" + "dev-master": "1.5-dev" } }, "autoload": { @@ -590,13 +591,14 @@ "keywords": [ "http", "message", + "psr-7", "request", "response", "stream", "uri", "url" ], - "time": "2017-03-20T17:10:46+00:00" + "time": "2018-12-04T20:46:45+00:00" }, { "name": "jakub-onderka/php-console-color", @@ -642,33 +644,34 @@ }, { "name": "jakub-onderka/php-console-highlighter", - "version": "v0.3.2", + "version": "v0.4", "source": { "type": "git", "url": "https://github.com/JakubOnderka/PHP-Console-Highlighter.git", - "reference": "7daa75df45242c8d5b75a22c00a201e7954e4fb5" + "reference": "9f7a229a69d52506914b4bc61bfdb199d90c5547" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/JakubOnderka/PHP-Console-Highlighter/zipball/7daa75df45242c8d5b75a22c00a201e7954e4fb5", - "reference": "7daa75df45242c8d5b75a22c00a201e7954e4fb5", + "url": "https://api.github.com/repos/JakubOnderka/PHP-Console-Highlighter/zipball/9f7a229a69d52506914b4bc61bfdb199d90c5547", + "reference": "9f7a229a69d52506914b4bc61bfdb199d90c5547", "shasum": "" }, "require": { - "jakub-onderka/php-console-color": "~0.1", - "php": ">=5.3.0" + "ext-tokenizer": "*", + "jakub-onderka/php-console-color": "~0.2", + "php": ">=5.4.0" }, "require-dev": { "jakub-onderka/php-code-style": "~1.0", - "jakub-onderka/php-parallel-lint": "~0.5", + "jakub-onderka/php-parallel-lint": "~1.0", "jakub-onderka/php-var-dump-check": "~0.1", "phpunit/phpunit": "~4.0", "squizlabs/php_codesniffer": "~1.5" }, "type": "library", "autoload": { - "psr-0": { - "JakubOnderka\\PhpConsoleHighlighter": "src/" + "psr-4": { + "JakubOnderka\\PhpConsoleHighlighter\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -682,20 +685,21 @@ "homepage": "http://www.acci.cz/" } ], - "time": "2015-04-20T18:58:01+00:00" + "description": "Highlight PHP code in terminal", + "time": "2018-09-29T18:48:56+00:00" }, { "name": "laravel/framework", - "version": "v5.7.8", + "version": "v5.7.19", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "763b64a43ebb6042e463aab4214d4cc9722147be" + "reference": "5c1d1ec7e8563ea31826fd5eb3f6791acf01160c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/763b64a43ebb6042e463aab4214d4cc9722147be", - "reference": "763b64a43ebb6042e463aab4214d4cc9722147be", + "url": "https://api.github.com/repos/laravel/framework/zipball/5c1d1ec7e8563ea31826fd5eb3f6791acf01160c", + "reference": "5c1d1ec7e8563ea31826fd5eb3f6791acf01160c", "shasum": "" }, "require": { @@ -704,6 +708,8 @@ "erusev/parsedown": "^1.7", "ext-mbstring": "*", "ext-openssl": "*", + "laravel/nexmo-notification-channel": "^1.0", + "laravel/slack-notification-channel": "^1.0", "league/flysystem": "^1.0.8", "monolog/monolog": "^1.12", "nesbot/carbon": "^1.26.3", @@ -761,6 +767,7 @@ "aws/aws-sdk-php": "^3.0", "doctrine/dbal": "^2.6", "filp/whoops": "^2.1.4", + "guzzlehttp/guzzle": "^6.3", "league/flysystem-cached-adapter": "^1.0", "mockery/mockery": "^1.0", "moontoast/math": "^1.1", @@ -777,6 +784,7 @@ "doctrine/dbal": "Required to rename columns and drop SQLite columns (^2.6).", "ext-pcntl": "Required to use all features of the queue worker.", "ext-posix": "Required to use all features of the queue worker.", + "filp/whoops": "Required for friendly error pages in development (^2.1.4).", "fzaninotto/faker": "Required to use the eloquent factory builder (^1.4).", "guzzlehttp/guzzle": "Required to use the Mailgun and Mandrill mail drivers and the ping methods on schedules (^6.0).", "laravel/tinker": "Required to use the tinker console command (^1.0).", @@ -824,20 +832,134 @@ "framework", "laravel" ], - "time": "2018-10-04T14:47:20+00:00" + "time": "2018-12-18T14:00:38+00:00" }, { - "name": "laravel/socialite", - "version": "v3.1.1", + "name": "laravel/nexmo-notification-channel", + "version": "v1.0.1", "source": { "type": "git", - "url": "https://github.com/laravel/socialite.git", - "reference": "65f771ff4f266ebae23de1a3f18efd80a1da2f8d" + "url": "https://github.com/laravel/nexmo-notification-channel.git", + "reference": "03edd42a55b306ff980c9950899d5a2b03260d48" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/socialite/zipball/65f771ff4f266ebae23de1a3f18efd80a1da2f8d", - "reference": "65f771ff4f266ebae23de1a3f18efd80a1da2f8d", + "url": "https://api.github.com/repos/laravel/nexmo-notification-channel/zipball/03edd42a55b306ff980c9950899d5a2b03260d48", + "reference": "03edd42a55b306ff980c9950899d5a2b03260d48", + "shasum": "" + }, + "require": { + "nexmo/client": "^1.0", + "php": "^7.1.3" + }, + "require-dev": { + "illuminate/notifications": "~5.7", + "mockery/mockery": "^1.0", + "phpunit/phpunit": "^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + }, + "laravel": { + "providers": [ + "Illuminate\\Notifications\\NexmoChannelServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Notifications\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Nexmo Notification Channel for laravel.", + "keywords": [ + "laravel", + "nexmo", + "notifications" + ], + "time": "2018-12-04T12:57:08+00:00" + }, + { + "name": "laravel/slack-notification-channel", + "version": "v1.0.3", + "source": { + "type": "git", + "url": "https://github.com/laravel/slack-notification-channel.git", + "reference": "6e164293b754a95f246faf50ab2bbea3e4923cc9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/slack-notification-channel/zipball/6e164293b754a95f246faf50ab2bbea3e4923cc9", + "reference": "6e164293b754a95f246faf50ab2bbea3e4923cc9", + "shasum": "" + }, + "require": { + "guzzlehttp/guzzle": "^6.0", + "php": "^7.1.3" + }, + "require-dev": { + "illuminate/notifications": "~5.7", + "mockery/mockery": "^1.0", + "phpunit/phpunit": "^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + }, + "laravel": { + "providers": [ + "Illuminate\\Notifications\\SlackChannelServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Notifications\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Slack Notification Channel for laravel.", + "keywords": [ + "laravel", + "notifications", + "slack" + ], + "time": "2018-12-12T13:12:06+00:00" + }, + { + "name": "laravel/socialite", + "version": "v3.2.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/socialite.git", + "reference": "7194c0cd9fb2ce449669252b8ec316b85b7de481" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/socialite/zipball/7194c0cd9fb2ce449669252b8ec316b85b7de481", + "reference": "7194c0cd9fb2ce449669252b8ec316b85b7de481", "shasum": "" }, "require": { @@ -887,20 +1009,20 @@ "laravel", "oauth" ], - "time": "2018-08-16T12:51:21+00:00" + "time": "2018-10-18T03:39:04+00:00" }, { "name": "laravel/tinker", - "version": "v1.0.7", + "version": "v1.0.8", "source": { "type": "git", "url": "https://github.com/laravel/tinker.git", - "reference": "e3086ee8cb1f54a39ae8dcb72d1c37d10128997d" + "reference": "cafbf598a90acde68985660e79b2b03c5609a405" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/tinker/zipball/e3086ee8cb1f54a39ae8dcb72d1c37d10128997d", - "reference": "e3086ee8cb1f54a39ae8dcb72d1c37d10128997d", + "url": "https://api.github.com/repos/laravel/tinker/zipball/cafbf598a90acde68985660e79b2b03c5609a405", + "reference": "cafbf598a90acde68985660e79b2b03c5609a405", "shasum": "" }, "require": { @@ -950,7 +1072,7 @@ "laravel", "psysh" ], - "time": "2018-05-17T13:42:07+00:00" + "time": "2018-10-12T19:39:35+00:00" }, { "name": "laravelcollective/html", @@ -1021,17 +1143,75 @@ "time": "2018-09-05T18:32:53+00:00" }, { - "name": "league/flysystem", - "version": "1.0.47", + "name": "lcobucci/jwt", + "version": "3.2.5", "source": { "type": "git", - "url": "https://github.com/thephpleague/flysystem.git", - "reference": "a11e4a75f256bdacf99d20780ce42d3b8272975c" + "url": "https://github.com/lcobucci/jwt.git", + "reference": "82be04b4753f8b7693b62852b7eab30f97524f9b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/a11e4a75f256bdacf99d20780ce42d3b8272975c", - "reference": "a11e4a75f256bdacf99d20780ce42d3b8272975c", + "url": "https://api.github.com/repos/lcobucci/jwt/zipball/82be04b4753f8b7693b62852b7eab30f97524f9b", + "reference": "82be04b4753f8b7693b62852b7eab30f97524f9b", + "shasum": "" + }, + "require": { + "ext-openssl": "*", + "php": ">=5.5" + }, + "require-dev": { + "mdanter/ecc": "~0.3.1", + "mikey179/vfsstream": "~1.5", + "phpmd/phpmd": "~2.2", + "phpunit/php-invoker": "~1.1", + "phpunit/phpunit": "~4.5", + "squizlabs/php_codesniffer": "~2.3" + }, + "suggest": { + "mdanter/ecc": "Required to use Elliptic Curves based algorithms." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "psr-4": { + "Lcobucci\\JWT\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Luís Otávio Cobucci Oblonczyk", + "email": "lcobucci@gmail.com", + "role": "developer" + } + ], + "description": "A simple library to work with JSON Web Token and JSON Web Signature", + "keywords": [ + "JWS", + "jwt" + ], + "time": "2018-11-11T12:22:26+00:00" + }, + { + "name": "league/flysystem", + "version": "1.0.49", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem.git", + "reference": "a63cc83d8a931b271be45148fa39ba7156782ffd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/a63cc83d8a931b271be45148fa39ba7156782ffd", + "reference": "a63cc83d8a931b271be45148fa39ba7156782ffd", "shasum": "" }, "require": { @@ -1102,7 +1282,7 @@ "sftp", "storage" ], - "time": "2018-09-14T15:30:29+00:00" + "time": "2018-11-23T23:41:29+00:00" }, { "name": "league/oauth1-client", @@ -1169,16 +1349,16 @@ }, { "name": "monolog/monolog", - "version": "1.23.0", + "version": "1.24.0", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "fd8c787753b3a2ad11bc60c063cff1358a32a3b4" + "reference": "bfc9ebb28f97e7a24c45bdc3f0ff482e47bb0266" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/fd8c787753b3a2ad11bc60c063cff1358a32a3b4", - "reference": "fd8c787753b3a2ad11bc60c063cff1358a32a3b4", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/bfc9ebb28f97e7a24c45bdc3f0ff482e47bb0266", + "reference": "bfc9ebb28f97e7a24c45bdc3f0ff482e47bb0266", "shasum": "" }, "require": { @@ -1243,20 +1423,20 @@ "logging", "psr-3" ], - "time": "2017-06-19T01:22:40+00:00" + "time": "2018-11-05T09:00:11+00:00" }, { "name": "nesbot/carbon", - "version": "1.34.0", + "version": "1.36.1", "source": { "type": "git", "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "1dbd3cb01c5645f3e7deda7aa46ef780d95fcc33" + "reference": "63da8cdf89d7a5efe43aabc794365f6e7b7b8983" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/1dbd3cb01c5645f3e7deda7aa46ef780d95fcc33", - "reference": "1dbd3cb01c5645f3e7deda7aa46ef780d95fcc33", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/63da8cdf89d7a5efe43aabc794365f6e7b7b8983", + "reference": "63da8cdf89d7a5efe43aabc794365f6e7b7b8983", "shasum": "" }, "require": { @@ -1264,9 +1444,12 @@ "symfony/translation": "~2.6 || ~3.0 || ~4.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "~2", "phpunit/phpunit": "^4.8.35 || ^5.7" }, + "suggest": { + "friendsofphp/php-cs-fixer": "Needed for the `composer phpcs` command. Allow to automatically fix code style.", + "phpstan/phpstan": "Needed for the `composer phpstan` command. Allow to detect potential errors." + }, "type": "library", "extra": { "laravel": { @@ -1298,20 +1481,68 @@ "datetime", "time" ], - "time": "2018-09-20T19:36:25+00:00" + "time": "2018-11-22T18:23:02+00:00" }, { - "name": "nikic/php-parser", - "version": "v4.0.4", + "name": "nexmo/client", + "version": "1.6.0", "source": { "type": "git", - "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "fa6ee28600d21d49b2b4e1006b48426cec8e579c" + "url": "https://github.com/Nexmo/nexmo-php.git", + "reference": "01809cc1e17a5af275913c49bb5d444eb6cc06d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/fa6ee28600d21d49b2b4e1006b48426cec8e579c", - "reference": "fa6ee28600d21d49b2b4e1006b48426cec8e579c", + "url": "https://api.github.com/repos/Nexmo/nexmo-php/zipball/01809cc1e17a5af275913c49bb5d444eb6cc06d4", + "reference": "01809cc1e17a5af275913c49bb5d444eb6cc06d4", + "shasum": "" + }, + "require": { + "lcobucci/jwt": "^3.2", + "php": ">=5.6", + "php-http/client-implementation": "^1.0", + "php-http/guzzle6-adapter": "^1.0", + "zendframework/zend-diactoros": "^1.3" + }, + "require-dev": { + "estahn/phpunit-json-assertions": "^1.0.0", + "php-http/mock-client": "^0.3.0", + "phpunit/phpunit": "^5.7", + "squizlabs/php_codesniffer": "^3.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Nexmo\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Tim Lytle", + "email": "tim@nexmo.com", + "homepage": "http://twitter.com/tjlytle", + "role": "Developer" + } + ], + "description": "PHP Client for using Nexmo's API.", + "time": "2018-12-17T10:47:50+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v4.1.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "d0230c5c77a7e3cfa69446febf340978540958c0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/d0230c5c77a7e3cfa69446febf340978540958c0", + "reference": "d0230c5c77a7e3cfa69446febf340978540958c0", "shasum": "" }, "require": { @@ -1327,7 +1558,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-master": "4.1-dev" } }, "autoload": { @@ -1349,7 +1580,7 @@ "parser", "php" ], - "time": "2018-09-18T07:03:24+00:00" + "time": "2018-10-10T09:24:14+00:00" }, { "name": "nullx27/eveonline-socialite", @@ -1398,16 +1629,16 @@ }, { "name": "opis/closure", - "version": "3.1.1", + "version": "3.1.2", "source": { "type": "git", "url": "https://github.com/opis/closure.git", - "reference": "d3209e46ad6c69a969b705df0738fd0dbe26ef9e" + "reference": "de00c69a2328d3ee5baa71fc584dc643222a574c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/opis/closure/zipball/d3209e46ad6c69a969b705df0738fd0dbe26ef9e", - "reference": "d3209e46ad6c69a969b705df0738fd0dbe26ef9e", + "url": "https://api.github.com/repos/opis/closure/zipball/de00c69a2328d3ee5baa71fc584dc643222a574c", + "reference": "de00c69a2328d3ee5baa71fc584dc643222a574c", "shasum": "" }, "require": { @@ -1415,7 +1646,7 @@ }, "require-dev": { "jeremeamia/superclosure": "^2.0", - "phpunit/phpunit": "^4.0" + "phpunit/phpunit": "^4.0|^5.0|^6.0|^7.0" }, "type": "library", "extra": { @@ -1455,7 +1686,7 @@ "serialization", "serialize" ], - "time": "2018-10-02T13:36:53+00:00" + "time": "2018-12-16T21:48:23+00:00" }, { "name": "paragonie/random_compat", @@ -1502,6 +1733,172 @@ ], "time": "2018-07-02T15:55:56+00:00" }, + { + "name": "php-http/guzzle6-adapter", + "version": "v1.1.1", + "source": { + "type": "git", + "url": "https://github.com/php-http/guzzle6-adapter.git", + "reference": "a56941f9dc6110409cfcddc91546ee97039277ab" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/guzzle6-adapter/zipball/a56941f9dc6110409cfcddc91546ee97039277ab", + "reference": "a56941f9dc6110409cfcddc91546ee97039277ab", + "shasum": "" + }, + "require": { + "guzzlehttp/guzzle": "^6.0", + "php": ">=5.5.0", + "php-http/httplug": "^1.0" + }, + "provide": { + "php-http/async-client-implementation": "1.0", + "php-http/client-implementation": "1.0" + }, + "require-dev": { + "ext-curl": "*", + "php-http/adapter-integration-tests": "^0.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Adapter\\Guzzle6\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + }, + { + "name": "David de Boer", + "email": "david@ddeboer.nl" + } + ], + "description": "Guzzle 6 HTTP Adapter", + "homepage": "http://httplug.io", + "keywords": [ + "Guzzle", + "http" + ], + "time": "2016-05-10T06:13:32+00:00" + }, + { + "name": "php-http/httplug", + "version": "v1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/httplug.git", + "reference": "1c6381726c18579c4ca2ef1ec1498fdae8bdf018" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/httplug/zipball/1c6381726c18579c4ca2ef1ec1498fdae8bdf018", + "reference": "1c6381726c18579c4ca2ef1ec1498fdae8bdf018", + "shasum": "" + }, + "require": { + "php": ">=5.4", + "php-http/promise": "^1.0", + "psr/http-message": "^1.0" + }, + "require-dev": { + "henrikbjorn/phpspec-code-coverage": "^1.0", + "phpspec/phpspec": "^2.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eric GELOEN", + "email": "geloen.eric@gmail.com" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "HTTPlug, the HTTP client abstraction for PHP", + "homepage": "http://httplug.io", + "keywords": [ + "client", + "http" + ], + "time": "2016-08-31T08:30:17+00:00" + }, + { + "name": "php-http/promise", + "version": "v1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/promise.git", + "reference": "dc494cdc9d7160b9a09bd5573272195242ce7980" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/promise/zipball/dc494cdc9d7160b9a09bd5573272195242ce7980", + "reference": "dc494cdc9d7160b9a09bd5573272195242ce7980", + "shasum": "" + }, + "require-dev": { + "henrikbjorn/phpspec-code-coverage": "^1.0", + "phpspec/phpspec": "^2.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + }, + { + "name": "Joel Wurtz", + "email": "joel.wurtz@gmail.com" + } + ], + "description": "Promise used for asynchronous HTTP requests", + "homepage": "http://httplug.io", + "keywords": [ + "promise" + ], + "time": "2016-01-26T13:27:02+00:00" + }, { "name": "predis/predis", "version": "v1.1.1", @@ -1653,16 +2050,16 @@ }, { "name": "psr/log", - "version": "1.0.2", + "version": "1.1.0", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d" + "reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", - "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", + "url": "https://api.github.com/repos/php-fig/log/zipball/6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd", + "reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd", "shasum": "" }, "require": { @@ -1696,7 +2093,7 @@ "psr", "psr-3" ], - "time": "2016-10-10T12:19:37+00:00" + "time": "2018-11-20T15:27:04+00:00" }, { "name": "psr/simple-cache", @@ -1748,23 +2145,23 @@ }, { "name": "psy/psysh", - "version": "v0.9.8", + "version": "v0.9.9", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "ed3c32c4304e1a678a6e0f9dc11dd2d927d89555" + "reference": "9aaf29575bb8293206bb0420c1e1c87ff2ffa94e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/ed3c32c4304e1a678a6e0f9dc11dd2d927d89555", - "reference": "ed3c32c4304e1a678a6e0f9dc11dd2d927d89555", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/9aaf29575bb8293206bb0420c1e1c87ff2ffa94e", + "reference": "9aaf29575bb8293206bb0420c1e1c87ff2ffa94e", "shasum": "" }, "require": { "dnoegel/php-xdg-base-dir": "0.1", "ext-json": "*", "ext-tokenizer": "*", - "jakub-onderka/php-console-highlighter": "0.3.*", + "jakub-onderka/php-console-highlighter": "0.3.*|0.4.*", "nikic/php-parser": "~1.3|~2.0|~3.0|~4.0", "php": ">=5.4.0", "symfony/console": "~2.3.10|^2.4.2|~3.0|~4.0", @@ -1818,7 +2215,47 @@ "interactive", "shell" ], - "time": "2018-09-05T11:40:09+00:00" + "time": "2018-10-13T15:16:03+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "2.0.5", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "5601c8a83fbba7ef674a7369456d12f1e0d0eafa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/5601c8a83fbba7ef674a7369456d12f1e0d0eafa", + "reference": "5601c8a83fbba7ef674a7369456d12f1e0d0eafa", + "shasum": "" + }, + "require": { + "php": ">=5.3" + }, + "require-dev": { + "phpunit/phpunit": "~3.7.0", + "satooshi/php-coveralls": ">=1.0" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "time": "2016-02-11T07:05:27+00:00" }, { "name": "ramsey/uuid", @@ -1963,20 +2400,21 @@ }, { "name": "symfony/console", - "version": "v4.1.6", + "version": "v4.2.1", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "dc7122fe5f6113cfaba3b3de575d31112c9aa60b" + "reference": "4dff24e5d01e713818805c1862d2e3f901ee7dd0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/dc7122fe5f6113cfaba3b3de575d31112c9aa60b", - "reference": "dc7122fe5f6113cfaba3b3de575d31112c9aa60b", + "url": "https://api.github.com/repos/symfony/console/zipball/4dff24e5d01e713818805c1862d2e3f901ee7dd0", + "reference": "4dff24e5d01e713818805c1862d2e3f901ee7dd0", "shasum": "" }, "require": { "php": "^7.1.3", + "symfony/contracts": "^1.0", "symfony/polyfill-mbstring": "~1.0" }, "conflict": { @@ -2000,7 +2438,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.1-dev" + "dev-master": "4.2-dev" } }, "autoload": { @@ -2027,20 +2465,88 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2018-10-03T08:15:46+00:00" + "time": "2018-11-27T07:40:44+00:00" }, { - "name": "symfony/css-selector", - "version": "v4.1.6", + "name": "symfony/contracts", + "version": "v1.0.2", "source": { "type": "git", - "url": "https://github.com/symfony/css-selector.git", - "reference": "d67de79a70a27d93c92c47f37ece958bf8de4d8a" + "url": "https://github.com/symfony/contracts.git", + "reference": "1aa7ab2429c3d594dd70689604b5cf7421254cdf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/d67de79a70a27d93c92c47f37ece958bf8de4d8a", - "reference": "d67de79a70a27d93c92c47f37ece958bf8de4d8a", + "url": "https://api.github.com/repos/symfony/contracts/zipball/1aa7ab2429c3d594dd70689604b5cf7421254cdf", + "reference": "1aa7ab2429c3d594dd70689604b5cf7421254cdf", + "shasum": "" + }, + "require": { + "php": "^7.1.3" + }, + "require-dev": { + "psr/cache": "^1.0", + "psr/container": "^1.0" + }, + "suggest": { + "psr/cache": "When using the Cache contracts", + "psr/container": "When using the Service contracts", + "symfony/cache-contracts-implementation": "", + "symfony/service-contracts-implementation": "", + "symfony/translation-contracts-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\": "" + }, + "exclude-from-classmap": [ + "**/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A set of abstractions extracted out of the Symfony components", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "time": "2018-12-05T08:06:11+00:00" + }, + { + "name": "symfony/css-selector", + "version": "v4.2.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/css-selector.git", + "reference": "aa9fa526ba1b2ec087ffdfb32753803d999fcfcd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/aa9fa526ba1b2ec087ffdfb32753803d999fcfcd", + "reference": "aa9fa526ba1b2ec087ffdfb32753803d999fcfcd", "shasum": "" }, "require": { @@ -2049,7 +2555,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.1-dev" + "dev-master": "4.2-dev" } }, "autoload": { @@ -2080,20 +2586,20 @@ ], "description": "Symfony CssSelector Component", "homepage": "https://symfony.com", - "time": "2018-10-02T16:36:10+00:00" + "time": "2018-11-11T19:52:12+00:00" }, { "name": "symfony/debug", - "version": "v4.1.6", + "version": "v4.2.1", "source": { "type": "git", "url": "https://github.com/symfony/debug.git", - "reference": "e3f76ce6198f81994e019bb2b4e533e9de1b9b90" + "reference": "e0a2b92ee0b5b934f973d90c2f58e18af109d276" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/e3f76ce6198f81994e019bb2b4e533e9de1b9b90", - "reference": "e3f76ce6198f81994e019bb2b4e533e9de1b9b90", + "url": "https://api.github.com/repos/symfony/debug/zipball/e0a2b92ee0b5b934f973d90c2f58e18af109d276", + "reference": "e0a2b92ee0b5b934f973d90c2f58e18af109d276", "shasum": "" }, "require": { @@ -2109,7 +2615,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.1-dev" + "dev-master": "4.2-dev" } }, "autoload": { @@ -2136,24 +2642,25 @@ ], "description": "Symfony Debug Component", "homepage": "https://symfony.com", - "time": "2018-10-02T16:36:10+00:00" + "time": "2018-11-28T18:24:18+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v4.1.6", + "version": "v4.2.1", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "bfb30c2ad377615a463ebbc875eba64a99f6aa3e" + "reference": "921f49c3158a276d27c0d770a5a347a3b718b328" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/bfb30c2ad377615a463ebbc875eba64a99f6aa3e", - "reference": "bfb30c2ad377615a463ebbc875eba64a99f6aa3e", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/921f49c3158a276d27c0d770a5a347a3b718b328", + "reference": "921f49c3158a276d27c0d770a5a347a3b718b328", "shasum": "" }, "require": { - "php": "^7.1.3" + "php": "^7.1.3", + "symfony/contracts": "^1.0" }, "conflict": { "symfony/dependency-injection": "<3.4" @@ -2172,7 +2679,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.1-dev" + "dev-master": "4.2-dev" } }, "autoload": { @@ -2199,20 +2706,20 @@ ], "description": "Symfony EventDispatcher Component", "homepage": "https://symfony.com", - "time": "2018-07-26T09:10:45+00:00" + "time": "2018-12-01T08:52:38+00:00" }, { "name": "symfony/finder", - "version": "v4.1.6", + "version": "v4.2.1", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "1f17195b44543017a9c9b2d437c670627e96ad06" + "reference": "e53d477d7b5c4982d0e1bfd2298dbee63d01441d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/1f17195b44543017a9c9b2d437c670627e96ad06", - "reference": "1f17195b44543017a9c9b2d437c670627e96ad06", + "url": "https://api.github.com/repos/symfony/finder/zipball/e53d477d7b5c4982d0e1bfd2298dbee63d01441d", + "reference": "e53d477d7b5c4982d0e1bfd2298dbee63d01441d", "shasum": "" }, "require": { @@ -2221,7 +2728,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.1-dev" + "dev-master": "4.2-dev" } }, "autoload": { @@ -2248,20 +2755,20 @@ ], "description": "Symfony Finder Component", "homepage": "https://symfony.com", - "time": "2018-10-03T08:47:56+00:00" + "time": "2018-11-11T19:52:12+00:00" }, { "name": "symfony/http-foundation", - "version": "v4.1.6", + "version": "v4.2.1", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "d528136617ff24f530e70df9605acc1b788b08d4" + "reference": "1b31f3017fadd8cb05cf2c8aebdbf3b12a943851" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/d528136617ff24f530e70df9605acc1b788b08d4", - "reference": "d528136617ff24f530e70df9605acc1b788b08d4", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/1b31f3017fadd8cb05cf2c8aebdbf3b12a943851", + "reference": "1b31f3017fadd8cb05cf2c8aebdbf3b12a943851", "shasum": "" }, "require": { @@ -2275,7 +2782,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.1-dev" + "dev-master": "4.2-dev" } }, "autoload": { @@ -2302,25 +2809,26 @@ ], "description": "Symfony HttpFoundation Component", "homepage": "https://symfony.com", - "time": "2018-10-03T08:48:45+00:00" + "time": "2018-11-26T10:55:26+00:00" }, { "name": "symfony/http-kernel", - "version": "v4.1.6", + "version": "v4.2.1", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "f5e7c15a5d010be0e16ce798594c5960451d4220" + "reference": "b39ceffc0388232c309cbde3a7c3685f2ec0a624" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/f5e7c15a5d010be0e16ce798594c5960451d4220", - "reference": "f5e7c15a5d010be0e16ce798594c5960451d4220", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/b39ceffc0388232c309cbde3a7c3685f2ec0a624", + "reference": "b39ceffc0388232c309cbde3a7c3685f2ec0a624", "shasum": "" }, "require": { "php": "^7.1.3", "psr/log": "~1.0", + "symfony/contracts": "^1.0.2", "symfony/debug": "~3.4|~4.0", "symfony/event-dispatcher": "~4.1", "symfony/http-foundation": "^4.1.1", @@ -2328,7 +2836,8 @@ }, "conflict": { "symfony/config": "<3.4", - "symfony/dependency-injection": "<4.1", + "symfony/dependency-injection": "<4.2", + "symfony/translation": "<4.2", "symfony/var-dumper": "<4.1.1", "twig/twig": "<1.34|<2.4,>=2" }, @@ -2341,7 +2850,7 @@ "symfony/config": "~3.4|~4.0", "symfony/console": "~3.4|~4.0", "symfony/css-selector": "~3.4|~4.0", - "symfony/dependency-injection": "^4.1", + "symfony/dependency-injection": "^4.2", "symfony/dom-crawler": "~3.4|~4.0", "symfony/expression-language": "~3.4|~4.0", "symfony/finder": "~3.4|~4.0", @@ -2349,7 +2858,7 @@ "symfony/routing": "~3.4|~4.0", "symfony/stopwatch": "~3.4|~4.0", "symfony/templating": "~3.4|~4.0", - "symfony/translation": "~3.4|~4.0", + "symfony/translation": "~4.2", "symfony/var-dumper": "^4.1.1" }, "suggest": { @@ -2362,7 +2871,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.1-dev" + "dev-master": "4.2-dev" } }, "autoload": { @@ -2389,11 +2898,11 @@ ], "description": "Symfony HttpKernel Component", "homepage": "https://symfony.com", - "time": "2018-10-03T12:53:38+00:00" + "time": "2018-12-06T17:39:52+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.9.0", + "version": "v1.10.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", @@ -2451,16 +2960,16 @@ }, { "name": "symfony/polyfill-mbstring", - "version": "v1.9.0", + "version": "v1.10.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "d0cd638f4634c16d8df4508e847f14e9e43168b8" + "reference": "c79c051f5b3a46be09205c73b80b346e4153e494" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/d0cd638f4634c16d8df4508e847f14e9e43168b8", - "reference": "d0cd638f4634c16d8df4508e847f14e9e43168b8", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/c79c051f5b3a46be09205c73b80b346e4153e494", + "reference": "c79c051f5b3a46be09205c73b80b346e4153e494", "shasum": "" }, "require": { @@ -2506,20 +3015,20 @@ "portable", "shim" ], - "time": "2018-08-06T14:22:27+00:00" + "time": "2018-09-21T13:07:52+00:00" }, { "name": "symfony/polyfill-php72", - "version": "v1.9.0", + "version": "v1.10.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "95c50420b0baed23852452a7f0c7b527303ed5ae" + "reference": "9050816e2ca34a8e916c3a0ae8b9c2fccf68b631" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/95c50420b0baed23852452a7f0c7b527303ed5ae", - "reference": "95c50420b0baed23852452a7f0c7b527303ed5ae", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/9050816e2ca34a8e916c3a0ae8b9c2fccf68b631", + "reference": "9050816e2ca34a8e916c3a0ae8b9c2fccf68b631", "shasum": "" }, "require": { @@ -2561,20 +3070,20 @@ "portable", "shim" ], - "time": "2018-08-06T14:22:27+00:00" + "time": "2018-09-21T13:07:52+00:00" }, { "name": "symfony/process", - "version": "v4.1.6", + "version": "v4.2.1", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "ee33c0322a8fee0855afcc11fff81e6b1011b529" + "reference": "2b341009ccec76837a7f46f59641b431e4d4c2b0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/ee33c0322a8fee0855afcc11fff81e6b1011b529", - "reference": "ee33c0322a8fee0855afcc11fff81e6b1011b529", + "url": "https://api.github.com/repos/symfony/process/zipball/2b341009ccec76837a7f46f59641b431e4d4c2b0", + "reference": "2b341009ccec76837a7f46f59641b431e4d4c2b0", "shasum": "" }, "require": { @@ -2583,7 +3092,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.1-dev" + "dev-master": "4.2-dev" } }, "autoload": { @@ -2610,34 +3119,34 @@ ], "description": "Symfony Process Component", "homepage": "https://symfony.com", - "time": "2018-10-02T12:40:59+00:00" + "time": "2018-11-20T16:22:05+00:00" }, { "name": "symfony/routing", - "version": "v4.1.6", + "version": "v4.2.1", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "537803f0bdfede36b9acef052d2e4d447d9fa0e9" + "reference": "649460207e77da6c545326c7f53618d23ad2c866" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/537803f0bdfede36b9acef052d2e4d447d9fa0e9", - "reference": "537803f0bdfede36b9acef052d2e4d447d9fa0e9", + "url": "https://api.github.com/repos/symfony/routing/zipball/649460207e77da6c545326c7f53618d23ad2c866", + "reference": "649460207e77da6c545326c7f53618d23ad2c866", "shasum": "" }, "require": { "php": "^7.1.3" }, "conflict": { - "symfony/config": "<3.4", + "symfony/config": "<4.2", "symfony/dependency-injection": "<3.4", "symfony/yaml": "<3.4" }, "require-dev": { "doctrine/annotations": "~1.0", "psr/log": "~1.0", - "symfony/config": "~3.4|~4.0", + "symfony/config": "~4.2", "symfony/dependency-injection": "~3.4|~4.0", "symfony/expression-language": "~3.4|~4.0", "symfony/http-foundation": "~3.4|~4.0", @@ -2654,7 +3163,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.1-dev" + "dev-master": "4.2-dev" } }, "autoload": { @@ -2687,24 +3196,25 @@ "uri", "url" ], - "time": "2018-10-02T12:40:59+00:00" + "time": "2018-12-03T22:08:12+00:00" }, { "name": "symfony/translation", - "version": "v4.1.6", + "version": "v4.2.1", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "9f0b61e339160a466ebcde167a6c5521c810e304" + "reference": "c0e2191e9bed845946ab3d99767513b56ca7dcd6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/9f0b61e339160a466ebcde167a6c5521c810e304", - "reference": "9f0b61e339160a466ebcde167a6c5521c810e304", + "url": "https://api.github.com/repos/symfony/translation/zipball/c0e2191e9bed845946ab3d99767513b56ca7dcd6", + "reference": "c0e2191e9bed845946ab3d99767513b56ca7dcd6", "shasum": "" }, "require": { "php": "^7.1.3", + "symfony/contracts": "^1.0.2", "symfony/polyfill-mbstring": "~1.0" }, "conflict": { @@ -2712,6 +3222,9 @@ "symfony/dependency-injection": "<3.4", "symfony/yaml": "<3.4" }, + "provide": { + "symfony/translation-contracts-implementation": "1.0" + }, "require-dev": { "psr/log": "~1.0", "symfony/config": "~3.4|~4.0", @@ -2729,7 +3242,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.1-dev" + "dev-master": "4.2-dev" } }, "autoload": { @@ -2756,20 +3269,20 @@ ], "description": "Symfony Translation Component", "homepage": "https://symfony.com", - "time": "2018-10-02T16:36:10+00:00" + "time": "2018-12-06T10:45:32+00:00" }, { "name": "symfony/var-dumper", - "version": "v4.1.6", + "version": "v4.2.1", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "60319b45653580b0cdacca499344577d87732f16" + "reference": "db61258540350725f4beb6b84006e32398acd120" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/60319b45653580b0cdacca499344577d87732f16", - "reference": "60319b45653580b0cdacca499344577d87732f16", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/db61258540350725f4beb6b84006e32398acd120", + "reference": "db61258540350725f4beb6b84006e32398acd120", "shasum": "" }, "require": { @@ -2797,7 +3310,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.1-dev" + "dev-master": "4.2-dev" } }, "autoload": { @@ -2831,7 +3344,7 @@ "debug", "dump" ], - "time": "2018-10-02T16:36:10+00:00" + "time": "2018-11-25T12:50:42+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", @@ -2980,6 +3493,70 @@ "environment" ], "time": "2018-07-29T20:33:41+00:00" + }, + { + "name": "zendframework/zend-diactoros", + "version": "1.8.6", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-diactoros.git", + "reference": "20da13beba0dde8fb648be3cc19765732790f46e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-diactoros/zipball/20da13beba0dde8fb648be3cc19765732790f46e", + "reference": "20da13beba0dde8fb648be3cc19765732790f46e", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0", + "psr/http-message": "^1.0" + }, + "provide": { + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "ext-dom": "*", + "ext-libxml": "*", + "php-http/psr7-integration-tests": "dev-master", + "phpunit/phpunit": "^5.7.16 || ^6.0.8 || ^7.2.7", + "zendframework/zend-coding-standard": "~1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.8.x-dev", + "dev-develop": "1.9.x-dev", + "dev-release-2.0": "2.0.x-dev" + } + }, + "autoload": { + "files": [ + "src/functions/create_uploaded_file.php", + "src/functions/marshal_headers_from_sapi.php", + "src/functions/marshal_method_from_sapi.php", + "src/functions/marshal_protocol_version_from_sapi.php", + "src/functions/marshal_uri_from_sapi.php", + "src/functions/normalize_server.php", + "src/functions/normalize_uploaded_files.php", + "src/functions/parse_cookie_header.php" + ], + "psr-4": { + "Zend\\Diactoros\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "description": "PSR HTTP Message implementations", + "homepage": "https://github.com/zendframework/zend-diactoros", + "keywords": [ + "http", + "psr", + "psr-7" + ], + "time": "2018-09-05T19:29:37+00:00" } ], "packages-dev": [ @@ -3100,16 +3677,16 @@ }, { "name": "filp/whoops", - "version": "2.2.1", + "version": "2.3.1", "source": { "type": "git", "url": "https://github.com/filp/whoops.git", - "reference": "e79cd403fb77fc8963a99ecc30e80ddd885b3311" + "reference": "bc0fd11bc455cc20ee4b5edabc63ebbf859324c7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filp/whoops/zipball/e79cd403fb77fc8963a99ecc30e80ddd885b3311", - "reference": "e79cd403fb77fc8963a99ecc30e80ddd885b3311", + "url": "https://api.github.com/repos/filp/whoops/zipball/bc0fd11bc455cc20ee4b5edabc63ebbf859324c7", + "reference": "bc0fd11bc455cc20ee4b5edabc63ebbf859324c7", "shasum": "" }, "require": { @@ -3157,7 +3734,7 @@ "throwable", "whoops" ], - "time": "2018-06-30T13:14:06+00:00" + "time": "2018-10-23T09:00:00+00:00" }, { "name": "fzaninotto/faker", @@ -3372,26 +3949,27 @@ }, { "name": "nunomaduro/collision", - "version": "v2.1.0", + "version": "v2.1.1", "source": { "type": "git", "url": "https://github.com/nunomaduro/collision.git", - "reference": "1149ad9f36f61b121ae61f5f6de820fc77b51e6b" + "reference": "b5feb0c0d92978ec7169232ce5d70d6da6b29f63" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/collision/zipball/1149ad9f36f61b121ae61f5f6de820fc77b51e6b", - "reference": "1149ad9f36f61b121ae61f5f6de820fc77b51e6b", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/b5feb0c0d92978ec7169232ce5d70d6da6b29f63", + "reference": "b5feb0c0d92978ec7169232ce5d70d6da6b29f63", "shasum": "" }, "require": { "filp/whoops": "^2.1.4", - "jakub-onderka/php-console-highlighter": "0.3.*", + "jakub-onderka/php-console-highlighter": "0.3.*|0.4.*", "php": "^7.1", "symfony/console": "~2.8|~3.3|~4.0" }, "require-dev": { "laravel/framework": "5.7.*", + "nunomaduro/larastan": "^0.3.0", "phpstan/phpstan": "^0.10", "phpunit/phpunit": "~7.3" }, @@ -3431,7 +4009,7 @@ "php", "symfony" ], - "time": "2018-10-03T20:01:54+00:00" + "time": "2018-11-21T21:40:54+00:00" }, { "name": "phar-io/manifest", @@ -3752,16 +4330,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "6.0.8", + "version": "6.1.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "848f78b3309780fef7ec8c4666b7ab4e6b09b22f" + "reference": "807e6013b00af69b6c5d9ceb4282d0393dbb9d8d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/848f78b3309780fef7ec8c4666b7ab4e6b09b22f", - "reference": "848f78b3309780fef7ec8c4666b7ab4e6b09b22f", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/807e6013b00af69b6c5d9ceb4282d0393dbb9d8d", + "reference": "807e6013b00af69b6c5d9ceb4282d0393dbb9d8d", "shasum": "" }, "require": { @@ -3772,7 +4350,7 @@ "phpunit/php-text-template": "^1.2.1", "phpunit/php-token-stream": "^3.0", "sebastian/code-unit-reverse-lookup": "^1.0.1", - "sebastian/environment": "^3.1", + "sebastian/environment": "^3.1 || ^4.0", "sebastian/version": "^2.0.1", "theseer/tokenizer": "^1.1" }, @@ -3785,7 +4363,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "6.0-dev" + "dev-master": "6.1-dev" } }, "autoload": { @@ -3811,7 +4389,7 @@ "testing", "xunit" ], - "time": "2018-10-04T03:41:23+00:00" + "time": "2018-10-31T16:06:48+00:00" }, { "name": "phpunit/php-file-iterator", @@ -3955,16 +4533,16 @@ }, { "name": "phpunit/php-token-stream", - "version": "3.0.0", + "version": "3.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "21ad88bbba7c3d93530d93994e0a33cd45f02ace" + "reference": "c99e3be9d3e85f60646f152f9002d46ed7770d18" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/21ad88bbba7c3d93530d93994e0a33cd45f02ace", - "reference": "21ad88bbba7c3d93530d93994e0a33cd45f02ace", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/c99e3be9d3e85f60646f152f9002d46ed7770d18", + "reference": "c99e3be9d3e85f60646f152f9002d46ed7770d18", "shasum": "" }, "require": { @@ -4000,20 +4578,20 @@ "keywords": [ "tokenizer" ], - "time": "2018-02-01T13:16:43+00:00" + "time": "2018-10-30T05:52:18+00:00" }, { "name": "phpunit/phpunit", - "version": "7.4.0", + "version": "7.5.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "f3837fa1e07758057ae06e8ddec6d06ba183f126" + "reference": "c23d78776ad415d5506e0679723cb461d71f488f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/f3837fa1e07758057ae06e8ddec6d06ba183f126", - "reference": "f3837fa1e07758057ae06e8ddec6d06ba183f126", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c23d78776ad415d5506e0679723cb461d71f488f", + "reference": "c23d78776ad415d5506e0679723cb461d71f488f", "shasum": "" }, "require": { @@ -4034,7 +4612,7 @@ "phpunit/php-timer": "^2.0", "sebastian/comparator": "^3.0", "sebastian/diff": "^3.0", - "sebastian/environment": "^3.1", + "sebastian/environment": "^4.0", "sebastian/exporter": "^3.1", "sebastian/global-state": "^2.0", "sebastian/object-enumerator": "^3.0.3", @@ -4058,7 +4636,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "7.4-dev" + "dev-master": "7.5-dev" } }, "autoload": { @@ -4084,7 +4662,7 @@ "testing", "xunit" ], - "time": "2018-10-05T04:05:24+00:00" + "time": "2018-12-12T07:20:32+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", @@ -4253,28 +4831,28 @@ }, { "name": "sebastian/environment", - "version": "3.1.0", + "version": "4.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "cd0871b3975fb7fc44d11314fd1ee20925fce4f5" + "reference": "febd209a219cea7b56ad799b30ebbea34b71eb8f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/cd0871b3975fb7fc44d11314fd1ee20925fce4f5", - "reference": "cd0871b3975fb7fc44d11314fd1ee20925fce4f5", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/febd209a219cea7b56ad799b30ebbea34b71eb8f", + "reference": "febd209a219cea7b56ad799b30ebbea34b71eb8f", "shasum": "" }, "require": { - "php": "^7.0" + "php": "^7.1" }, "require-dev": { - "phpunit/phpunit": "^6.1" + "phpunit/phpunit": "^7.4" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.1.x-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -4299,7 +4877,7 @@ "environment", "hhvm" ], - "time": "2017-07-01T08:51:00+00:00" + "time": "2018-11-25T09:31:21+00:00" }, { "name": "sebastian/exporter", diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php index 46ed2587e..6b8a4d0ea 100644 --- a/vendor/composer/autoload_classmap.php +++ b/vendor/composer/autoload_classmap.php @@ -716,6 +716,7 @@ return array( 'GuzzleHttp\\Psr7\\PumpStream' => $vendorDir . '/guzzlehttp/psr7/src/PumpStream.php', 'GuzzleHttp\\Psr7\\Request' => $vendorDir . '/guzzlehttp/psr7/src/Request.php', 'GuzzleHttp\\Psr7\\Response' => $vendorDir . '/guzzlehttp/psr7/src/Response.php', + 'GuzzleHttp\\Psr7\\Rfc7230' => $vendorDir . '/guzzlehttp/psr7/src/Rfc7230.php', 'GuzzleHttp\\Psr7\\ServerRequest' => $vendorDir . '/guzzlehttp/psr7/src/ServerRequest.php', 'GuzzleHttp\\Psr7\\Stream' => $vendorDir . '/guzzlehttp/psr7/src/Stream.php', 'GuzzleHttp\\Psr7\\StreamDecoratorTrait' => $vendorDir . '/guzzlehttp/psr7/src/StreamDecoratorTrait.php', @@ -797,6 +798,20 @@ return array( 'Hamcrest\\Type\\IsString' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Type/IsString.php', 'Hamcrest\\Util' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Util.php', 'Hamcrest\\Xml\\HasXPath' => $vendorDir . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Xml/HasXPath.php', + 'Http\\Adapter\\Guzzle6\\Client' => $vendorDir . '/php-http/guzzle6-adapter/src/Client.php', + 'Http\\Adapter\\Guzzle6\\Promise' => $vendorDir . '/php-http/guzzle6-adapter/src/Promise.php', + 'Http\\Client\\Exception' => $vendorDir . '/php-http/httplug/src/Exception.php', + 'Http\\Client\\Exception\\HttpException' => $vendorDir . '/php-http/httplug/src/Exception/HttpException.php', + 'Http\\Client\\Exception\\NetworkException' => $vendorDir . '/php-http/httplug/src/Exception/NetworkException.php', + 'Http\\Client\\Exception\\RequestException' => $vendorDir . '/php-http/httplug/src/Exception/RequestException.php', + 'Http\\Client\\Exception\\TransferException' => $vendorDir . '/php-http/httplug/src/Exception/TransferException.php', + 'Http\\Client\\HttpAsyncClient' => $vendorDir . '/php-http/httplug/src/HttpAsyncClient.php', + 'Http\\Client\\HttpClient' => $vendorDir . '/php-http/httplug/src/HttpClient.php', + 'Http\\Client\\Promise\\HttpFulfilledPromise' => $vendorDir . '/php-http/httplug/src/Promise/HttpFulfilledPromise.php', + 'Http\\Client\\Promise\\HttpRejectedPromise' => $vendorDir . '/php-http/httplug/src/Promise/HttpRejectedPromise.php', + 'Http\\Promise\\FulfilledPromise' => $vendorDir . '/php-http/promise/src/FulfilledPromise.php', + 'Http\\Promise\\Promise' => $vendorDir . '/php-http/promise/src/Promise.php', + 'Http\\Promise\\RejectedPromise' => $vendorDir . '/php-http/promise/src/RejectedPromise.php', 'Illuminate\\Auth\\Access\\AuthorizationException' => $vendorDir . '/laravel/framework/src/Illuminate/Auth/Access/AuthorizationException.php', 'Illuminate\\Auth\\Access\\Gate' => $vendorDir . '/laravel/framework/src/Illuminate/Auth/Access/Gate.php', 'Illuminate\\Auth\\Access\\HandlesAuthorization' => $vendorDir . '/laravel/framework/src/Illuminate/Auth/Access/HandlesAuthorization.php', @@ -1318,8 +1333,8 @@ return array( 'Illuminate\\Notifications\\Channels\\BroadcastChannel' => $vendorDir . '/laravel/framework/src/Illuminate/Notifications/Channels/BroadcastChannel.php', 'Illuminate\\Notifications\\Channels\\DatabaseChannel' => $vendorDir . '/laravel/framework/src/Illuminate/Notifications/Channels/DatabaseChannel.php', 'Illuminate\\Notifications\\Channels\\MailChannel' => $vendorDir . '/laravel/framework/src/Illuminate/Notifications/Channels/MailChannel.php', - 'Illuminate\\Notifications\\Channels\\NexmoSmsChannel' => $vendorDir . '/laravel/framework/src/Illuminate/Notifications/Channels/NexmoSmsChannel.php', - 'Illuminate\\Notifications\\Channels\\SlackWebhookChannel' => $vendorDir . '/laravel/framework/src/Illuminate/Notifications/Channels/SlackWebhookChannel.php', + 'Illuminate\\Notifications\\Channels\\NexmoSmsChannel' => $vendorDir . '/laravel/nexmo-notification-channel/src/Channels/NexmoSmsChannel.php', + 'Illuminate\\Notifications\\Channels\\SlackWebhookChannel' => $vendorDir . '/laravel/slack-notification-channel/src/Channels/SlackWebhookChannel.php', 'Illuminate\\Notifications\\Console\\NotificationTableCommand' => $vendorDir . '/laravel/framework/src/Illuminate/Notifications/Console/NotificationTableCommand.php', 'Illuminate\\Notifications\\DatabaseNotification' => $vendorDir . '/laravel/framework/src/Illuminate/Notifications/DatabaseNotification.php', 'Illuminate\\Notifications\\DatabaseNotificationCollection' => $vendorDir . '/laravel/framework/src/Illuminate/Notifications/DatabaseNotificationCollection.php', @@ -1331,17 +1346,19 @@ return array( 'Illuminate\\Notifications\\Messages\\BroadcastMessage' => $vendorDir . '/laravel/framework/src/Illuminate/Notifications/Messages/BroadcastMessage.php', 'Illuminate\\Notifications\\Messages\\DatabaseMessage' => $vendorDir . '/laravel/framework/src/Illuminate/Notifications/Messages/DatabaseMessage.php', 'Illuminate\\Notifications\\Messages\\MailMessage' => $vendorDir . '/laravel/framework/src/Illuminate/Notifications/Messages/MailMessage.php', - 'Illuminate\\Notifications\\Messages\\NexmoMessage' => $vendorDir . '/laravel/framework/src/Illuminate/Notifications/Messages/NexmoMessage.php', + 'Illuminate\\Notifications\\Messages\\NexmoMessage' => $vendorDir . '/laravel/nexmo-notification-channel/src/Messages/NexmoMessage.php', 'Illuminate\\Notifications\\Messages\\SimpleMessage' => $vendorDir . '/laravel/framework/src/Illuminate/Notifications/Messages/SimpleMessage.php', - 'Illuminate\\Notifications\\Messages\\SlackAttachment' => $vendorDir . '/laravel/framework/src/Illuminate/Notifications/Messages/SlackAttachment.php', - 'Illuminate\\Notifications\\Messages\\SlackAttachmentField' => $vendorDir . '/laravel/framework/src/Illuminate/Notifications/Messages/SlackAttachmentField.php', - 'Illuminate\\Notifications\\Messages\\SlackMessage' => $vendorDir . '/laravel/framework/src/Illuminate/Notifications/Messages/SlackMessage.php', + 'Illuminate\\Notifications\\Messages\\SlackAttachment' => $vendorDir . '/laravel/slack-notification-channel/src/Messages/SlackAttachment.php', + 'Illuminate\\Notifications\\Messages\\SlackAttachmentField' => $vendorDir . '/laravel/slack-notification-channel/src/Messages/SlackAttachmentField.php', + 'Illuminate\\Notifications\\Messages\\SlackMessage' => $vendorDir . '/laravel/slack-notification-channel/src/Messages/SlackMessage.php', + 'Illuminate\\Notifications\\NexmoChannelServiceProvider' => $vendorDir . '/laravel/nexmo-notification-channel/src/NexmoChannelServiceProvider.php', 'Illuminate\\Notifications\\Notifiable' => $vendorDir . '/laravel/framework/src/Illuminate/Notifications/Notifiable.php', 'Illuminate\\Notifications\\Notification' => $vendorDir . '/laravel/framework/src/Illuminate/Notifications/Notification.php', 'Illuminate\\Notifications\\NotificationSender' => $vendorDir . '/laravel/framework/src/Illuminate/Notifications/NotificationSender.php', 'Illuminate\\Notifications\\NotificationServiceProvider' => $vendorDir . '/laravel/framework/src/Illuminate/Notifications/NotificationServiceProvider.php', 'Illuminate\\Notifications\\RoutesNotifications' => $vendorDir . '/laravel/framework/src/Illuminate/Notifications/RoutesNotifications.php', 'Illuminate\\Notifications\\SendQueuedNotifications' => $vendorDir . '/laravel/framework/src/Illuminate/Notifications/SendQueuedNotifications.php', + 'Illuminate\\Notifications\\SlackChannelServiceProvider' => $vendorDir . '/laravel/slack-notification-channel/src/SlackChannelServiceProvider.php', 'Illuminate\\Pagination\\AbstractPaginator' => $vendorDir . '/laravel/framework/src/Illuminate/Pagination/AbstractPaginator.php', 'Illuminate\\Pagination\\LengthAwarePaginator' => $vendorDir . '/laravel/framework/src/Illuminate/Pagination/LengthAwarePaginator.php', 'Illuminate\\Pagination\\PaginationServiceProvider' => $vendorDir . '/laravel/framework/src/Illuminate/Pagination/PaginationServiceProvider.php', @@ -1605,7 +1622,7 @@ return array( 'Illuminate\\View\\ViewServiceProvider' => $vendorDir . '/laravel/framework/src/Illuminate/View/ViewServiceProvider.php', 'JakubOnderka\\PhpConsoleColor\\ConsoleColor' => $vendorDir . '/jakub-onderka/php-console-color/src/ConsoleColor.php', 'JakubOnderka\\PhpConsoleColor\\InvalidStyleException' => $vendorDir . '/jakub-onderka/php-console-color/src/InvalidStyleException.php', - 'JakubOnderka\\PhpConsoleHighlighter\\Highlighter' => $vendorDir . '/jakub-onderka/php-console-highlighter/src/JakubOnderka/PhpConsoleHighlighter/Highlighter.php', + 'JakubOnderka\\PhpConsoleHighlighter\\Highlighter' => $vendorDir . '/jakub-onderka/php-console-highlighter/src/Highlighter.php', 'JsonSerializable' => $vendorDir . '/nesbot/carbon/src/JsonSerializable.php', 'Laravel\\Socialite\\AbstractUser' => $vendorDir . '/laravel/socialite/src/AbstractUser.php', 'Laravel\\Socialite\\Contracts\\Factory' => $vendorDir . '/laravel/socialite/src/Contracts/Factory.php', @@ -1621,6 +1638,7 @@ return array( 'Laravel\\Socialite\\Two\\BitbucketProvider' => $vendorDir . '/laravel/socialite/src/Two/BitbucketProvider.php', 'Laravel\\Socialite\\Two\\FacebookProvider' => $vendorDir . '/laravel/socialite/src/Two/FacebookProvider.php', 'Laravel\\Socialite\\Two\\GithubProvider' => $vendorDir . '/laravel/socialite/src/Two/GithubProvider.php', + 'Laravel\\Socialite\\Two\\GitlabProvider' => $vendorDir . '/laravel/socialite/src/Two/GitlabProvider.php', 'Laravel\\Socialite\\Two\\GoogleProvider' => $vendorDir . '/laravel/socialite/src/Two/GoogleProvider.php', 'Laravel\\Socialite\\Two\\InvalidStateException' => $vendorDir . '/laravel/socialite/src/Two/InvalidStateException.php', 'Laravel\\Socialite\\Two\\LinkedInProvider' => $vendorDir . '/laravel/socialite/src/Two/LinkedInProvider.php', @@ -1630,6 +1648,37 @@ return array( 'Laravel\\Tinker\\Console\\TinkerCommand' => $vendorDir . '/laravel/tinker/src/Console/TinkerCommand.php', 'Laravel\\Tinker\\TinkerCaster' => $vendorDir . '/laravel/tinker/src/TinkerCaster.php', 'Laravel\\Tinker\\TinkerServiceProvider' => $vendorDir . '/laravel/tinker/src/TinkerServiceProvider.php', + 'Lcobucci\\JWT\\Builder' => $vendorDir . '/lcobucci/jwt/src/Builder.php', + 'Lcobucci\\JWT\\Claim' => $vendorDir . '/lcobucci/jwt/src/Claim.php', + 'Lcobucci\\JWT\\Claim\\Basic' => $vendorDir . '/lcobucci/jwt/src/Claim/Basic.php', + 'Lcobucci\\JWT\\Claim\\EqualsTo' => $vendorDir . '/lcobucci/jwt/src/Claim/EqualsTo.php', + 'Lcobucci\\JWT\\Claim\\Factory' => $vendorDir . '/lcobucci/jwt/src/Claim/Factory.php', + 'Lcobucci\\JWT\\Claim\\GreaterOrEqualsTo' => $vendorDir . '/lcobucci/jwt/src/Claim/GreaterOrEqualsTo.php', + 'Lcobucci\\JWT\\Claim\\LesserOrEqualsTo' => $vendorDir . '/lcobucci/jwt/src/Claim/LesserOrEqualsTo.php', + 'Lcobucci\\JWT\\Claim\\Validatable' => $vendorDir . '/lcobucci/jwt/src/Claim/Validatable.php', + 'Lcobucci\\JWT\\Parser' => $vendorDir . '/lcobucci/jwt/src/Parser.php', + 'Lcobucci\\JWT\\Parsing\\Decoder' => $vendorDir . '/lcobucci/jwt/src/Parsing/Decoder.php', + 'Lcobucci\\JWT\\Parsing\\Encoder' => $vendorDir . '/lcobucci/jwt/src/Parsing/Encoder.php', + 'Lcobucci\\JWT\\Signature' => $vendorDir . '/lcobucci/jwt/src/Signature.php', + 'Lcobucci\\JWT\\Signer' => $vendorDir . '/lcobucci/jwt/src/Signer.php', + 'Lcobucci\\JWT\\Signer\\BaseSigner' => $vendorDir . '/lcobucci/jwt/src/Signer/BaseSigner.php', + 'Lcobucci\\JWT\\Signer\\Ecdsa' => $vendorDir . '/lcobucci/jwt/src/Signer/Ecdsa.php', + 'Lcobucci\\JWT\\Signer\\Ecdsa\\KeyParser' => $vendorDir . '/lcobucci/jwt/src/Signer/Ecdsa/KeyParser.php', + 'Lcobucci\\JWT\\Signer\\Ecdsa\\Sha256' => $vendorDir . '/lcobucci/jwt/src/Signer/Ecdsa/Sha256.php', + 'Lcobucci\\JWT\\Signer\\Ecdsa\\Sha384' => $vendorDir . '/lcobucci/jwt/src/Signer/Ecdsa/Sha384.php', + 'Lcobucci\\JWT\\Signer\\Ecdsa\\Sha512' => $vendorDir . '/lcobucci/jwt/src/Signer/Ecdsa/Sha512.php', + 'Lcobucci\\JWT\\Signer\\Hmac' => $vendorDir . '/lcobucci/jwt/src/Signer/Hmac.php', + 'Lcobucci\\JWT\\Signer\\Hmac\\Sha256' => $vendorDir . '/lcobucci/jwt/src/Signer/Hmac/Sha256.php', + 'Lcobucci\\JWT\\Signer\\Hmac\\Sha384' => $vendorDir . '/lcobucci/jwt/src/Signer/Hmac/Sha384.php', + 'Lcobucci\\JWT\\Signer\\Hmac\\Sha512' => $vendorDir . '/lcobucci/jwt/src/Signer/Hmac/Sha512.php', + 'Lcobucci\\JWT\\Signer\\Key' => $vendorDir . '/lcobucci/jwt/src/Signer/Key.php', + 'Lcobucci\\JWT\\Signer\\Keychain' => $vendorDir . '/lcobucci/jwt/src/Signer/Keychain.php', + 'Lcobucci\\JWT\\Signer\\Rsa' => $vendorDir . '/lcobucci/jwt/src/Signer/Rsa.php', + 'Lcobucci\\JWT\\Signer\\Rsa\\Sha256' => $vendorDir . '/lcobucci/jwt/src/Signer/Rsa/Sha256.php', + 'Lcobucci\\JWT\\Signer\\Rsa\\Sha384' => $vendorDir . '/lcobucci/jwt/src/Signer/Rsa/Sha384.php', + 'Lcobucci\\JWT\\Signer\\Rsa\\Sha512' => $vendorDir . '/lcobucci/jwt/src/Signer/Rsa/Sha512.php', + 'Lcobucci\\JWT\\Token' => $vendorDir . '/lcobucci/jwt/src/Token.php', + 'Lcobucci\\JWT\\ValidationData' => $vendorDir . '/lcobucci/jwt/src/ValidationData.php', 'League\\Flysystem\\AdapterInterface' => $vendorDir . '/league/flysystem/src/AdapterInterface.php', 'League\\Flysystem\\Adapter\\AbstractAdapter' => $vendorDir . '/league/flysystem/src/Adapter/AbstractAdapter.php', 'League\\Flysystem\\Adapter\\AbstractFtpAdapter' => $vendorDir . '/league/flysystem/src/Adapter/AbstractFtpAdapter.php', @@ -1825,6 +1874,7 @@ return array( 'Monolog\\Handler\\HandlerWrapper' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/HandlerWrapper.php', 'Monolog\\Handler\\HipChatHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/HipChatHandler.php', 'Monolog\\Handler\\IFTTTHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/IFTTTHandler.php', + 'Monolog\\Handler\\InsightOpsHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/InsightOpsHandler.php', 'Monolog\\Handler\\LogEntriesHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/LogEntriesHandler.php', 'Monolog\\Handler\\LogglyHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/LogglyHandler.php', 'Monolog\\Handler\\MailHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/MailHandler.php', @@ -1863,11 +1913,135 @@ return array( 'Monolog\\Processor\\MemoryUsageProcessor' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/MemoryUsageProcessor.php', 'Monolog\\Processor\\MercurialProcessor' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/MercurialProcessor.php', 'Monolog\\Processor\\ProcessIdProcessor' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/ProcessIdProcessor.php', + 'Monolog\\Processor\\ProcessorInterface' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/ProcessorInterface.php', 'Monolog\\Processor\\PsrLogMessageProcessor' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/PsrLogMessageProcessor.php', 'Monolog\\Processor\\TagProcessor' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/TagProcessor.php', 'Monolog\\Processor\\UidProcessor' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/UidProcessor.php', 'Monolog\\Processor\\WebProcessor' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/WebProcessor.php', 'Monolog\\Registry' => $vendorDir . '/monolog/monolog/src/Monolog/Registry.php', + 'Monolog\\ResettableInterface' => $vendorDir . '/monolog/monolog/src/Monolog/ResettableInterface.php', + 'Monolog\\SignalHandler' => $vendorDir . '/monolog/monolog/src/Monolog/SignalHandler.php', + 'Monolog\\Utils' => $vendorDir . '/monolog/monolog/src/Monolog/Utils.php', + 'Nexmo\\Account\\Balance' => $vendorDir . '/nexmo/client/src/Account/Balance.php', + 'Nexmo\\Account\\Client' => $vendorDir . '/nexmo/client/src/Account/Client.php', + 'Nexmo\\Account\\PrefixPrice' => $vendorDir . '/nexmo/client/src/Account/PrefixPrice.php', + 'Nexmo\\Account\\Price' => $vendorDir . '/nexmo/client/src/Account/Price.php', + 'Nexmo\\Account\\Secret' => $vendorDir . '/nexmo/client/src/Account/Secret.php', + 'Nexmo\\Account\\SecretCollection' => $vendorDir . '/nexmo/client/src/Account/SecretCollection.php', + 'Nexmo\\Account\\SmsPrice' => $vendorDir . '/nexmo/client/src/Account/SmsPrice.php', + 'Nexmo\\Account\\VoicePrice' => $vendorDir . '/nexmo/client/src/Account/VoicePrice.php', + 'Nexmo\\ApiErrorHandler' => $vendorDir . '/nexmo/client/src/ApiErrorHandler.php', + 'Nexmo\\Application\\Application' => $vendorDir . '/nexmo/client/src/Application/Application.php', + 'Nexmo\\Application\\ApplicationInterface' => $vendorDir . '/nexmo/client/src/Application/ApplicationInterface.php', + 'Nexmo\\Application\\Client' => $vendorDir . '/nexmo/client/src/Application/Client.php', + 'Nexmo\\Application\\Filter' => $vendorDir . '/nexmo/client/src/Application/Filter.php', + 'Nexmo\\Application\\VoiceConfig' => $vendorDir . '/nexmo/client/src/Application/VoiceConfig.php', + 'Nexmo\\Application\\Webhook' => $vendorDir . '/nexmo/client/src/Application/Webhook.php', + 'Nexmo\\Call\\Call' => $vendorDir . '/nexmo/client/src/Call/Call.php', + 'Nexmo\\Call\\Collection' => $vendorDir . '/nexmo/client/src/Call/Collection.php', + 'Nexmo\\Call\\Dtmf' => $vendorDir . '/nexmo/client/src/Call/Dtmf.php', + 'Nexmo\\Call\\Earmuff' => $vendorDir . '/nexmo/client/src/Call/Earmuff.php', + 'Nexmo\\Call\\Endpoint' => $vendorDir . '/nexmo/client/src/Call/Endpoint.php', + 'Nexmo\\Call\\Event' => $vendorDir . '/nexmo/client/src/Call/Event.php', + 'Nexmo\\Call\\Filter' => $vendorDir . '/nexmo/client/src/Call/Filter.php', + 'Nexmo\\Call\\Hangup' => $vendorDir . '/nexmo/client/src/Call/Hangup.php', + 'Nexmo\\Call\\Mute' => $vendorDir . '/nexmo/client/src/Call/Mute.php', + 'Nexmo\\Call\\Stream' => $vendorDir . '/nexmo/client/src/Call/Stream.php', + 'Nexmo\\Call\\Talk' => $vendorDir . '/nexmo/client/src/Call/Talk.php', + 'Nexmo\\Call\\Transfer' => $vendorDir . '/nexmo/client/src/Call/Transfer.php', + 'Nexmo\\Call\\Unearmuff' => $vendorDir . '/nexmo/client/src/Call/Unearmuff.php', + 'Nexmo\\Call\\Unmute' => $vendorDir . '/nexmo/client/src/Call/Unmute.php', + 'Nexmo\\Call\\Webhook' => $vendorDir . '/nexmo/client/src/Call/Webhook.php', + 'Nexmo\\Client' => $vendorDir . '/nexmo/client/src/Client.php', + 'Nexmo\\Client\\Callback\\Callback' => $vendorDir . '/nexmo/client/src/Client/Callback/Callback.php', + 'Nexmo\\Client\\Callback\\CallbackInterface' => $vendorDir . '/nexmo/client/src/Client/Callback/CallbackInterface.php', + 'Nexmo\\Client\\ClientAwareInterface' => $vendorDir . '/nexmo/client/src/Client/ClientAwareInterface.php', + 'Nexmo\\Client\\ClientAwareTrait' => $vendorDir . '/nexmo/client/src/Client/ClientAwareTrait.php', + 'Nexmo\\Client\\Credentials\\AbstractCredentials' => $vendorDir . '/nexmo/client/src/Client/Credentials/AbstractCredentials.php', + 'Nexmo\\Client\\Credentials\\Basic' => $vendorDir . '/nexmo/client/src/Client/Credentials/Basic.php', + 'Nexmo\\Client\\Credentials\\Container' => $vendorDir . '/nexmo/client/src/Client/Credentials/Container.php', + 'Nexmo\\Client\\Credentials\\CredentialsInterface' => $vendorDir . '/nexmo/client/src/Client/Credentials/CredentialsInterface.php', + 'Nexmo\\Client\\Credentials\\Keypair' => $vendorDir . '/nexmo/client/src/Client/Credentials/Keypair.php', + 'Nexmo\\Client\\Credentials\\OAuth' => $vendorDir . '/nexmo/client/src/Client/Credentials/OAuth.php', + 'Nexmo\\Client\\Credentials\\SignatureSecret' => $vendorDir . '/nexmo/client/src/Client/Credentials/SignatureSecret.php', + 'Nexmo\\Client\\Exception\\Exception' => $vendorDir . '/nexmo/client/src/Client/Exception/Exception.php', + 'Nexmo\\Client\\Exception\\Request' => $vendorDir . '/nexmo/client/src/Client/Exception/Request.php', + 'Nexmo\\Client\\Exception\\Server' => $vendorDir . '/nexmo/client/src/Client/Exception/Server.php', + 'Nexmo\\Client\\Exception\\Transport' => $vendorDir . '/nexmo/client/src/Client/Exception/Transport.php', + 'Nexmo\\Client\\Exception\\Validation' => $vendorDir . '/nexmo/client/src/Client/Exception/Validation.php', + 'Nexmo\\Client\\Factory\\FactoryInterface' => $vendorDir . '/nexmo/client/src/Client/Factory/FactoryInterface.php', + 'Nexmo\\Client\\Factory\\MapFactory' => $vendorDir . '/nexmo/client/src/Client/Factory/MapFactory.php', + 'Nexmo\\Client\\Request\\AbstractRequest' => $vendorDir . '/nexmo/client/src/Client/Request/AbstractRequest.php', + 'Nexmo\\Client\\Request\\RequestInterface' => $vendorDir . '/nexmo/client/src/Client/Request/RequestInterface.php', + 'Nexmo\\Client\\Request\\WrapResponseInterface' => $vendorDir . '/nexmo/client/src/Client/Request/WrapResponseInterface.php', + 'Nexmo\\Client\\Response\\AbstractResponse' => $vendorDir . '/nexmo/client/src/Client/Response/AbstractResponse.php', + 'Nexmo\\Client\\Response\\Error' => $vendorDir . '/nexmo/client/src/Client/Response/Error.php', + 'Nexmo\\Client\\Response\\Response' => $vendorDir . '/nexmo/client/src/Client/Response/Response.php', + 'Nexmo\\Client\\Response\\ResponseInterface' => $vendorDir . '/nexmo/client/src/Client/Response/ResponseInterface.php', + 'Nexmo\\Client\\Signature' => $vendorDir . '/nexmo/client/src/Client/Signature.php', + 'Nexmo\\Conversations\\Collection' => $vendorDir . '/nexmo/client/src/Conversations/Collection.php', + 'Nexmo\\Conversations\\Conversation' => $vendorDir . '/nexmo/client/src/Conversations/Conversation.php', + 'Nexmo\\Conversion\\Client' => $vendorDir . '/nexmo/client/src/Conversion/Client.php', + 'Nexmo\\Entity\\ArrayAccessTrait' => $vendorDir . '/nexmo/client/src/Entity/ArrayAccessTrait.php', + 'Nexmo\\Entity\\CollectionAwareInterface' => $vendorDir . '/nexmo/client/src/Entity/CollectionAwareInterface.php', + 'Nexmo\\Entity\\CollectionAwareTrait' => $vendorDir . '/nexmo/client/src/Entity/CollectionAwareTrait.php', + 'Nexmo\\Entity\\CollectionInterface' => $vendorDir . '/nexmo/client/src/Entity/CollectionInterface.php', + 'Nexmo\\Entity\\CollectionTrait' => $vendorDir . '/nexmo/client/src/Entity/CollectionTrait.php', + 'Nexmo\\Entity\\EmptyFilter' => $vendorDir . '/nexmo/client/src/Entity/EmptyFilter.php', + 'Nexmo\\Entity\\EntityInterface' => $vendorDir . '/nexmo/client/src/Entity/EntityInterface.php', + 'Nexmo\\Entity\\FilterInterface' => $vendorDir . '/nexmo/client/src/Entity/FilterInterface.php', + 'Nexmo\\Entity\\HasEntityTrait' => $vendorDir . '/nexmo/client/src/Entity/HasEntityTrait.php', + 'Nexmo\\Entity\\JsonResponseTrait' => $vendorDir . '/nexmo/client/src/Entity/JsonResponseTrait.php', + 'Nexmo\\Entity\\JsonSerializableInterface' => $vendorDir . '/nexmo/client/src/Entity/JsonSerializableInterface.php', + 'Nexmo\\Entity\\JsonSerializableTrait' => $vendorDir . '/nexmo/client/src/Entity/JsonSerializableTrait.php', + 'Nexmo\\Entity\\JsonUnserializableInterface' => $vendorDir . '/nexmo/client/src/Entity/JsonUnserializableInterface.php', + 'Nexmo\\Entity\\NoRequestResponseTrait' => $vendorDir . '/nexmo/client/src/Entity/NoRequestResponseTrait.php', + 'Nexmo\\Entity\\Psr7Trait' => $vendorDir . '/nexmo/client/src/Entity/Psr7Trait.php', + 'Nexmo\\Entity\\RequestArrayTrait' => $vendorDir . '/nexmo/client/src/Entity/RequestArrayTrait.php', + 'Nexmo\\Insights\\Advanced' => $vendorDir . '/nexmo/client/src/Insights/Advanced.php', + 'Nexmo\\Insights\\AdvancedCnam' => $vendorDir . '/nexmo/client/src/Insights/AdvancedCnam.php', + 'Nexmo\\Insights\\Basic' => $vendorDir . '/nexmo/client/src/Insights/Basic.php', + 'Nexmo\\Insights\\Client' => $vendorDir . '/nexmo/client/src/Insights/Client.php', + 'Nexmo\\Insights\\CnamTrait' => $vendorDir . '/nexmo/client/src/Insights/CnamTrait.php', + 'Nexmo\\Insights\\Standard' => $vendorDir . '/nexmo/client/src/Insights/Standard.php', + 'Nexmo\\Insights\\StandardCnam' => $vendorDir . '/nexmo/client/src/Insights/StandardCnam.php', + 'Nexmo\\InvalidResponseException' => $vendorDir . '/nexmo/client/src/InvalidResponseException.php', + 'Nexmo\\Message\\AutoDetect' => $vendorDir . '/nexmo/client/src/Message/AutoDetect.php', + 'Nexmo\\Message\\Binary' => $vendorDir . '/nexmo/client/src/Message/Binary.php', + 'Nexmo\\Message\\Callback\\Receipt' => $vendorDir . '/nexmo/client/src/Message/Callback/Receipt.php', + 'Nexmo\\Message\\Client' => $vendorDir . '/nexmo/client/src/Message/Client.php', + 'Nexmo\\Message\\CollectionTrait' => $vendorDir . '/nexmo/client/src/Message/CollectionTrait.php', + 'Nexmo\\Message\\EncodingDetector' => $vendorDir . '/nexmo/client/src/Message/EncodingDetector.php', + 'Nexmo\\Message\\InboundMessage' => $vendorDir . '/nexmo/client/src/Message/InboundMessage.php', + 'Nexmo\\Message\\Message' => $vendorDir . '/nexmo/client/src/Message/Message.php', + 'Nexmo\\Message\\MessageInterface' => $vendorDir . '/nexmo/client/src/Message/MessageInterface.php', + 'Nexmo\\Message\\Query' => $vendorDir . '/nexmo/client/src/Message/Query.php', + 'Nexmo\\Message\\Response\\Collection' => $vendorDir . '/nexmo/client/src/Message/Response/Collection.php', + 'Nexmo\\Message\\Response\\Message' => $vendorDir . '/nexmo/client/src/Message/Response/Message.php', + 'Nexmo\\Message\\Text' => $vendorDir . '/nexmo/client/src/Message/Text.php', + 'Nexmo\\Message\\Unicode' => $vendorDir . '/nexmo/client/src/Message/Unicode.php', + 'Nexmo\\Message\\Vcal' => $vendorDir . '/nexmo/client/src/Message/Vcal.php', + 'Nexmo\\Message\\Vcard' => $vendorDir . '/nexmo/client/src/Message/Vcard.php', + 'Nexmo\\Message\\Wap' => $vendorDir . '/nexmo/client/src/Message/Wap.php', + 'Nexmo\\Network' => $vendorDir . '/nexmo/client/src/Network.php', + 'Nexmo\\Network\\Number\\Callback' => $vendorDir . '/nexmo/client/src/Network/Number/Callback.php', + 'Nexmo\\Network\\Number\\Request' => $vendorDir . '/nexmo/client/src/Network/Number/Request.php', + 'Nexmo\\Network\\Number\\Response' => $vendorDir . '/nexmo/client/src/Network/Number/Response.php', + 'Nexmo\\Numbers\\Client' => $vendorDir . '/nexmo/client/src/Numbers/Client.php', + 'Nexmo\\Numbers\\Number' => $vendorDir . '/nexmo/client/src/Numbers/Number.php', + 'Nexmo\\Redact\\Client' => $vendorDir . '/nexmo/client/src/Redact/Client.php', + 'Nexmo\\Response' => $vendorDir . '/nexmo/client/src/Response.php', + 'Nexmo\\Response\\Message' => $vendorDir . '/nexmo/client/src/Response/Message.php', + 'Nexmo\\User\\Collection' => $vendorDir . '/nexmo/client/src/User/Collection.php', + 'Nexmo\\User\\User' => $vendorDir . '/nexmo/client/src/User/User.php', + 'Nexmo\\Verify\\Check' => $vendorDir . '/nexmo/client/src/Verify/Check.php', + 'Nexmo\\Verify\\Client' => $vendorDir . '/nexmo/client/src/Verify/Client.php', + 'Nexmo\\Verify\\Verification' => $vendorDir . '/nexmo/client/src/Verify/Verification.php', + 'Nexmo\\Verify\\VerificationInterface' => $vendorDir . '/nexmo/client/src/Verify/VerificationInterface.php', + 'Nexmo\\Voice\\Call\\Call' => $vendorDir . '/nexmo/client/src/Voice/Call/Call.php', + 'Nexmo\\Voice\\Call\\Inbound' => $vendorDir . '/nexmo/client/src/Voice/Call/Inbound.php', + 'Nexmo\\Voice\\Message\\Callback' => $vendorDir . '/nexmo/client/src/Voice/Message/Callback.php', + 'Nexmo\\Voice\\Message\\Message' => $vendorDir . '/nexmo/client/src/Voice/Message/Message.php', 'NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider' => $vendorDir . '/nunomaduro/collision/src/Adapters/Laravel/CollisionServiceProvider.php', 'NunoMaduro\\Collision\\Adapters\\Laravel\\ExceptionHandler' => $vendorDir . '/nunomaduro/collision/src/Adapters/Laravel/ExceptionHandler.php', 'NunoMaduro\\Collision\\Adapters\\Laravel\\Inspector' => $vendorDir . '/nunomaduro/collision/src/Adapters/Laravel/Inspector.php', @@ -2032,6 +2206,7 @@ return array( 'PHPUnit\\Runner\\AfterSuccessfulTestHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/AfterSuccessfulTestHook.php', 'PHPUnit\\Runner\\AfterTestErrorHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/AfterTestErrorHook.php', 'PHPUnit\\Runner\\AfterTestFailureHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/AfterTestFailureHook.php', + 'PHPUnit\\Runner\\AfterTestHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/AfterTestHook.php', 'PHPUnit\\Runner\\AfterTestWarningHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/AfterTestWarningHook.php', 'PHPUnit\\Runner\\BaseTestRunner' => $vendorDir . '/phpunit/phpunit/src/Runner/BaseTestRunner.php', 'PHPUnit\\Runner\\BeforeFirstTestHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/BeforeFirstTestHook.php', @@ -2924,6 +3099,7 @@ return array( 'Psr\\Log\\NullLogger' => $vendorDir . '/psr/log/Psr/Log/NullLogger.php', 'Psr\\Log\\Test\\DummyTest' => $vendorDir . '/psr/log/Psr/Log/Test/LoggerInterfaceTest.php', 'Psr\\Log\\Test\\LoggerInterfaceTest' => $vendorDir . '/psr/log/Psr/Log/Test/LoggerInterfaceTest.php', + 'Psr\\Log\\Test\\TestLogger' => $vendorDir . '/psr/log/Psr/Log/Test/TestLogger.php', 'Psr\\SimpleCache\\CacheException' => $vendorDir . '/psr/simple-cache/src/CacheException.php', 'Psr\\SimpleCache\\CacheInterface' => $vendorDir . '/psr/simple-cache/src/CacheInterface.php', 'Psr\\SimpleCache\\InvalidArgumentException' => $vendorDir . '/psr/simple-cache/src/InvalidArgumentException.php', @@ -3274,6 +3450,7 @@ return array( 'Symfony\\Component\\Console\\Formatter\\OutputFormatterStyle' => $vendorDir . '/symfony/console/Formatter/OutputFormatterStyle.php', 'Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleInterface' => $vendorDir . '/symfony/console/Formatter/OutputFormatterStyleInterface.php', 'Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleStack' => $vendorDir . '/symfony/console/Formatter/OutputFormatterStyleStack.php', + 'Symfony\\Component\\Console\\Formatter\\WrappableOutputFormatterInterface' => $vendorDir . '/symfony/console/Formatter/WrappableOutputFormatterInterface.php', 'Symfony\\Component\\Console\\Helper\\DebugFormatterHelper' => $vendorDir . '/symfony/console/Helper/DebugFormatterHelper.php', 'Symfony\\Component\\Console\\Helper\\DescriptorHelper' => $vendorDir . '/symfony/console/Helper/DescriptorHelper.php', 'Symfony\\Component\\Console\\Helper\\FormatterHelper' => $vendorDir . '/symfony/console/Helper/FormatterHelper.php', @@ -3470,6 +3647,7 @@ return array( 'Symfony\\Component\\HttpFoundation\\Session\\SessionBagInterface' => $vendorDir . '/symfony/http-foundation/Session/SessionBagInterface.php', 'Symfony\\Component\\HttpFoundation\\Session\\SessionBagProxy' => $vendorDir . '/symfony/http-foundation/Session/SessionBagProxy.php', 'Symfony\\Component\\HttpFoundation\\Session\\SessionInterface' => $vendorDir . '/symfony/http-foundation/Session/SessionInterface.php', + 'Symfony\\Component\\HttpFoundation\\Session\\SessionUtils' => $vendorDir . '/symfony/http-foundation/Session/SessionUtils.php', 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\AbstractSessionHandler' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/AbstractSessionHandler.php', 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\MemcachedSessionHandler' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/MemcachedSessionHandler.php', 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\MigratingSessionHandler' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/MigratingSessionHandler.php', @@ -3575,6 +3753,7 @@ return array( 'Symfony\\Component\\HttpKernel\\Exception\\AccessDeniedHttpException' => $vendorDir . '/symfony/http-kernel/Exception/AccessDeniedHttpException.php', 'Symfony\\Component\\HttpKernel\\Exception\\BadRequestHttpException' => $vendorDir . '/symfony/http-kernel/Exception/BadRequestHttpException.php', 'Symfony\\Component\\HttpKernel\\Exception\\ConflictHttpException' => $vendorDir . '/symfony/http-kernel/Exception/ConflictHttpException.php', + 'Symfony\\Component\\HttpKernel\\Exception\\ControllerDoesNotReturnResponseException' => $vendorDir . '/symfony/http-kernel/Exception/ControllerDoesNotReturnResponseException.php', 'Symfony\\Component\\HttpKernel\\Exception\\GoneHttpException' => $vendorDir . '/symfony/http-kernel/Exception/GoneHttpException.php', 'Symfony\\Component\\HttpKernel\\Exception\\HttpException' => $vendorDir . '/symfony/http-kernel/Exception/HttpException.php', 'Symfony\\Component\\HttpKernel\\Exception\\HttpExceptionInterface' => $vendorDir . '/symfony/http-kernel/Exception/HttpExceptionInterface.php', @@ -3675,6 +3854,7 @@ return array( 'Symfony\\Component\\Routing\\Matcher\\Dumper\\MatcherDumper' => $vendorDir . '/symfony/routing/Matcher/Dumper/MatcherDumper.php', 'Symfony\\Component\\Routing\\Matcher\\Dumper\\MatcherDumperInterface' => $vendorDir . '/symfony/routing/Matcher/Dumper/MatcherDumperInterface.php', 'Symfony\\Component\\Routing\\Matcher\\Dumper\\PhpMatcherDumper' => $vendorDir . '/symfony/routing/Matcher/Dumper/PhpMatcherDumper.php', + 'Symfony\\Component\\Routing\\Matcher\\Dumper\\PhpMatcherTrait' => $vendorDir . '/symfony/routing/Matcher/Dumper/PhpMatcherTrait.php', 'Symfony\\Component\\Routing\\Matcher\\Dumper\\StaticPrefixCollection' => $vendorDir . '/symfony/routing/Matcher/Dumper/StaticPrefixCollection.php', 'Symfony\\Component\\Routing\\Matcher\\RedirectableUrlMatcher' => $vendorDir . '/symfony/routing/Matcher/RedirectableUrlMatcher.php', 'Symfony\\Component\\Routing\\Matcher\\RedirectableUrlMatcherInterface' => $vendorDir . '/symfony/routing/Matcher/RedirectableUrlMatcherInterface.php', @@ -3725,6 +3905,8 @@ return array( 'Symfony\\Component\\Translation\\Extractor\\PhpExtractor' => $vendorDir . '/symfony/translation/Extractor/PhpExtractor.php', 'Symfony\\Component\\Translation\\Extractor\\PhpStringTokenParser' => $vendorDir . '/symfony/translation/Extractor/PhpStringTokenParser.php', 'Symfony\\Component\\Translation\\Formatter\\ChoiceMessageFormatterInterface' => $vendorDir . '/symfony/translation/Formatter/ChoiceMessageFormatterInterface.php', + 'Symfony\\Component\\Translation\\Formatter\\IntlFormatter' => $vendorDir . '/symfony/translation/Formatter/IntlFormatter.php', + 'Symfony\\Component\\Translation\\Formatter\\IntlFormatterInterface' => $vendorDir . '/symfony/translation/Formatter/IntlFormatterInterface.php', 'Symfony\\Component\\Translation\\Formatter\\MessageFormatter' => $vendorDir . '/symfony/translation/Formatter/MessageFormatter.php', 'Symfony\\Component\\Translation\\Formatter\\MessageFormatterInterface' => $vendorDir . '/symfony/translation/Formatter/MessageFormatterInterface.php', 'Symfony\\Component\\Translation\\IdentityTranslator' => $vendorDir . '/symfony/translation/IdentityTranslator.php', @@ -3755,6 +3937,7 @@ return array( 'Symfony\\Component\\Translation\\TranslatorBagInterface' => $vendorDir . '/symfony/translation/TranslatorBagInterface.php', 'Symfony\\Component\\Translation\\TranslatorInterface' => $vendorDir . '/symfony/translation/TranslatorInterface.php', 'Symfony\\Component\\Translation\\Util\\ArrayConverter' => $vendorDir . '/symfony/translation/Util/ArrayConverter.php', + 'Symfony\\Component\\Translation\\Util\\XliffUtils' => $vendorDir . '/symfony/translation/Util/XliffUtils.php', 'Symfony\\Component\\Translation\\Writer\\TranslationWriter' => $vendorDir . '/symfony/translation/Writer/TranslationWriter.php', 'Symfony\\Component\\Translation\\Writer\\TranslationWriterInterface' => $vendorDir . '/symfony/translation/Writer/TranslationWriterInterface.php', 'Symfony\\Component\\VarDumper\\Caster\\AmqpCaster' => $vendorDir . '/symfony/var-dumper/Caster/AmqpCaster.php', @@ -3771,9 +3954,12 @@ return array( 'Symfony\\Component\\VarDumper\\Caster\\ExceptionCaster' => $vendorDir . '/symfony/var-dumper/Caster/ExceptionCaster.php', 'Symfony\\Component\\VarDumper\\Caster\\FrameStub' => $vendorDir . '/symfony/var-dumper/Caster/FrameStub.php', 'Symfony\\Component\\VarDumper\\Caster\\GmpCaster' => $vendorDir . '/symfony/var-dumper/Caster/GmpCaster.php', + 'Symfony\\Component\\VarDumper\\Caster\\IntlCaster' => $vendorDir . '/symfony/var-dumper/Caster/IntlCaster.php', 'Symfony\\Component\\VarDumper\\Caster\\LinkStub' => $vendorDir . '/symfony/var-dumper/Caster/LinkStub.php', + 'Symfony\\Component\\VarDumper\\Caster\\MemcachedCaster' => $vendorDir . '/symfony/var-dumper/Caster/MemcachedCaster.php', 'Symfony\\Component\\VarDumper\\Caster\\PdoCaster' => $vendorDir . '/symfony/var-dumper/Caster/PdoCaster.php', 'Symfony\\Component\\VarDumper\\Caster\\PgSqlCaster' => $vendorDir . '/symfony/var-dumper/Caster/PgSqlCaster.php', + 'Symfony\\Component\\VarDumper\\Caster\\ProxyManagerCaster' => $vendorDir . '/symfony/var-dumper/Caster/ProxyManagerCaster.php', 'Symfony\\Component\\VarDumper\\Caster\\RedisCaster' => $vendorDir . '/symfony/var-dumper/Caster/RedisCaster.php', 'Symfony\\Component\\VarDumper\\Caster\\ReflectionCaster' => $vendorDir . '/symfony/var-dumper/Caster/ReflectionCaster.php', 'Symfony\\Component\\VarDumper\\Caster\\ResourceCaster' => $vendorDir . '/symfony/var-dumper/Caster/ResourceCaster.php', @@ -3808,6 +3994,26 @@ return array( 'Symfony\\Component\\VarDumper\\Server\\DumpServer' => $vendorDir . '/symfony/var-dumper/Server/DumpServer.php', 'Symfony\\Component\\VarDumper\\Test\\VarDumperTestTrait' => $vendorDir . '/symfony/var-dumper/Test/VarDumperTestTrait.php', 'Symfony\\Component\\VarDumper\\VarDumper' => $vendorDir . '/symfony/var-dumper/VarDumper.php', + 'Symfony\\Contracts\\Cache\\CacheInterface' => $vendorDir . '/symfony/contracts/Cache/CacheInterface.php', + 'Symfony\\Contracts\\Cache\\CacheTrait' => $vendorDir . '/symfony/contracts/Cache/CacheTrait.php', + 'Symfony\\Contracts\\Cache\\CallbackInterface' => $vendorDir . '/symfony/contracts/Cache/CallbackInterface.php', + 'Symfony\\Contracts\\Cache\\ItemInterface' => $vendorDir . '/symfony/contracts/Cache/ItemInterface.php', + 'Symfony\\Contracts\\Cache\\TagAwareCacheInterface' => $vendorDir . '/symfony/contracts/Cache/TagAwareCacheInterface.php', + 'Symfony\\Contracts\\Service\\ResetInterface' => $vendorDir . '/symfony/contracts/Service/ResetInterface.php', + 'Symfony\\Contracts\\Service\\ServiceLocatorTrait' => $vendorDir . '/symfony/contracts/Service/ServiceLocatorTrait.php', + 'Symfony\\Contracts\\Service\\ServiceSubscriberInterface' => $vendorDir . '/symfony/contracts/Service/ServiceSubscriberInterface.php', + 'Symfony\\Contracts\\Service\\ServiceSubscriberTrait' => $vendorDir . '/symfony/contracts/Service/ServiceSubscriberTrait.php', + 'Symfony\\Contracts\\Tests\\Cache\\CacheTraitTest' => $vendorDir . '/symfony/contracts/Tests/Cache/CacheTraitTest.php', + 'Symfony\\Contracts\\Tests\\Cache\\TestPool' => $vendorDir . '/symfony/contracts/Tests/Cache/CacheTraitTest.php', + 'Symfony\\Contracts\\Tests\\Service\\ChildTestService' => $vendorDir . '/symfony/contracts/Tests/Service/ServiceSubscriberTraitTest.php', + 'Symfony\\Contracts\\Tests\\Service\\ParentTestService' => $vendorDir . '/symfony/contracts/Tests/Service/ServiceSubscriberTraitTest.php', + 'Symfony\\Contracts\\Tests\\Service\\ServiceLocatorTest' => $vendorDir . '/symfony/contracts/Tests/Service/ServiceLocatorTest.php', + 'Symfony\\Contracts\\Tests\\Service\\ServiceSubscriberTraitTest' => $vendorDir . '/symfony/contracts/Tests/Service/ServiceSubscriberTraitTest.php', + 'Symfony\\Contracts\\Tests\\Service\\TestService' => $vendorDir . '/symfony/contracts/Tests/Service/ServiceSubscriberTraitTest.php', + 'Symfony\\Contracts\\Tests\\Translation\\TranslatorTest' => $vendorDir . '/symfony/contracts/Tests/Translation/TranslatorTest.php', + 'Symfony\\Contracts\\Translation\\LocaleAwareInterface' => $vendorDir . '/symfony/contracts/Translation/LocaleAwareInterface.php', + 'Symfony\\Contracts\\Translation\\TranslatorInterface' => $vendorDir . '/symfony/contracts/Translation/TranslatorInterface.php', + 'Symfony\\Contracts\\Translation\\TranslatorTrait' => $vendorDir . '/symfony/contracts/Translation/TranslatorTrait.php', 'Symfony\\Polyfill\\Ctype\\Ctype' => $vendorDir . '/symfony/polyfill-ctype/Ctype.php', 'Symfony\\Polyfill\\Mbstring\\Mbstring' => $vendorDir . '/symfony/polyfill-mbstring/Mbstring.php', 'Symfony\\Polyfill\\Php72\\Php72' => $vendorDir . '/symfony/polyfill-php72/Php72.php', @@ -3851,6 +4057,38 @@ return array( 'Whoops\\Util\\TemplateHelper' => $vendorDir . '/filp/whoops/src/Whoops/Util/TemplateHelper.php', 'WikiTableSeeder' => $baseDir . '/database/seeds/WikiTableSeeder.php', 'XdgBaseDir\\Xdg' => $vendorDir . '/dnoegel/php-xdg-base-dir/src/Xdg.php', + 'Zend\\Diactoros\\AbstractSerializer' => $vendorDir . '/zendframework/zend-diactoros/src/AbstractSerializer.php', + 'Zend\\Diactoros\\CallbackStream' => $vendorDir . '/zendframework/zend-diactoros/src/CallbackStream.php', + 'Zend\\Diactoros\\Exception\\DeprecatedMethodException' => $vendorDir . '/zendframework/zend-diactoros/src/Exception/DeprecatedMethodException.php', + 'Zend\\Diactoros\\Exception\\ExceptionInterface' => $vendorDir . '/zendframework/zend-diactoros/src/Exception/ExceptionInterface.php', + 'Zend\\Diactoros\\HeaderSecurity' => $vendorDir . '/zendframework/zend-diactoros/src/HeaderSecurity.php', + 'Zend\\Diactoros\\MessageTrait' => $vendorDir . '/zendframework/zend-diactoros/src/MessageTrait.php', + 'Zend\\Diactoros\\PhpInputStream' => $vendorDir . '/zendframework/zend-diactoros/src/PhpInputStream.php', + 'Zend\\Diactoros\\RelativeStream' => $vendorDir . '/zendframework/zend-diactoros/src/RelativeStream.php', + 'Zend\\Diactoros\\Request' => $vendorDir . '/zendframework/zend-diactoros/src/Request.php', + 'Zend\\Diactoros\\RequestTrait' => $vendorDir . '/zendframework/zend-diactoros/src/RequestTrait.php', + 'Zend\\Diactoros\\Request\\ArraySerializer' => $vendorDir . '/zendframework/zend-diactoros/src/Request/ArraySerializer.php', + 'Zend\\Diactoros\\Request\\Serializer' => $vendorDir . '/zendframework/zend-diactoros/src/Request/Serializer.php', + 'Zend\\Diactoros\\Response' => $vendorDir . '/zendframework/zend-diactoros/src/Response.php', + 'Zend\\Diactoros\\Response\\ArraySerializer' => $vendorDir . '/zendframework/zend-diactoros/src/Response/ArraySerializer.php', + 'Zend\\Diactoros\\Response\\EmitterInterface' => $vendorDir . '/zendframework/zend-diactoros/src/Response/EmitterInterface.php', + 'Zend\\Diactoros\\Response\\EmptyResponse' => $vendorDir . '/zendframework/zend-diactoros/src/Response/EmptyResponse.php', + 'Zend\\Diactoros\\Response\\HtmlResponse' => $vendorDir . '/zendframework/zend-diactoros/src/Response/HtmlResponse.php', + 'Zend\\Diactoros\\Response\\InjectContentTypeTrait' => $vendorDir . '/zendframework/zend-diactoros/src/Response/InjectContentTypeTrait.php', + 'Zend\\Diactoros\\Response\\JsonResponse' => $vendorDir . '/zendframework/zend-diactoros/src/Response/JsonResponse.php', + 'Zend\\Diactoros\\Response\\RedirectResponse' => $vendorDir . '/zendframework/zend-diactoros/src/Response/RedirectResponse.php', + 'Zend\\Diactoros\\Response\\SapiEmitter' => $vendorDir . '/zendframework/zend-diactoros/src/Response/SapiEmitter.php', + 'Zend\\Diactoros\\Response\\SapiEmitterTrait' => $vendorDir . '/zendframework/zend-diactoros/src/Response/SapiEmitterTrait.php', + 'Zend\\Diactoros\\Response\\SapiStreamEmitter' => $vendorDir . '/zendframework/zend-diactoros/src/Response/SapiStreamEmitter.php', + 'Zend\\Diactoros\\Response\\Serializer' => $vendorDir . '/zendframework/zend-diactoros/src/Response/Serializer.php', + 'Zend\\Diactoros\\Response\\TextResponse' => $vendorDir . '/zendframework/zend-diactoros/src/Response/TextResponse.php', + 'Zend\\Diactoros\\Response\\XmlResponse' => $vendorDir . '/zendframework/zend-diactoros/src/Response/XmlResponse.php', + 'Zend\\Diactoros\\Server' => $vendorDir . '/zendframework/zend-diactoros/src/Server.php', + 'Zend\\Diactoros\\ServerRequest' => $vendorDir . '/zendframework/zend-diactoros/src/ServerRequest.php', + 'Zend\\Diactoros\\ServerRequestFactory' => $vendorDir . '/zendframework/zend-diactoros/src/ServerRequestFactory.php', + 'Zend\\Diactoros\\Stream' => $vendorDir . '/zendframework/zend-diactoros/src/Stream.php', + 'Zend\\Diactoros\\UploadedFile' => $vendorDir . '/zendframework/zend-diactoros/src/UploadedFile.php', + 'Zend\\Diactoros\\Uri' => $vendorDir . '/zendframework/zend-diactoros/src/Uri.php', 'nullx27\\Socialite\\EveOnline\\Providers\\EveOnlineServiceProvider' => $vendorDir . '/nullx27/eveonline-socialite/src/Providers/EveOnlineServiceProvider.php', 'nullx27\\Socialite\\EveOnline\\Providers\\EveOnlineSocialiteProvider' => $vendorDir . '/nullx27/eveonline-socialite/src/Providers/EveOnlineSocialiteProvider.php', 'nullx27\\Socialite\\EveOnline\\Traits\\EveAuth' => $vendorDir . '/nullx27/eveonline-socialite/src/Traits/EveAuth.php', diff --git a/vendor/composer/autoload_files.php b/vendor/composer/autoload_files.php index d5fd2227d..affda2f5a 100644 --- a/vendor/composer/autoload_files.php +++ b/vendor/composer/autoload_files.php @@ -7,13 +7,22 @@ $baseDir = dirname($vendorDir); return array( '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php', - '25072dd6e2470089de65ae7bf11d3109' => $vendorDir . '/symfony/polyfill-php72/bootstrap.php', - '667aeda72477189d0494fecd327c3641' => $vendorDir . '/symfony/var-dumper/Resources/functions/dump.php', - '320cde22f66dd4f5d3fd621d3e88b98f' => $vendorDir . '/symfony/polyfill-ctype/bootstrap.php', + '7b11c4dc42b3b3023073cb14e519683c' => $vendorDir . '/ralouphie/getallheaders/src/getallheaders.php', 'c964ee0ededf28c96ebd9db5099ef910' => $vendorDir . '/guzzlehttp/promises/src/functions_include.php', 'a0edc8309cc5e1d60e3047b5df6b7052' => $vendorDir . '/guzzlehttp/psr7/src/functions_include.php', + '25072dd6e2470089de65ae7bf11d3109' => $vendorDir . '/symfony/polyfill-php72/bootstrap.php', '37a3dc5111fe8f707ab4c132ef1dbc62' => $vendorDir . '/guzzlehttp/guzzle/src/functions_include.php', + '667aeda72477189d0494fecd327c3641' => $vendorDir . '/symfony/var-dumper/Resources/functions/dump.php', + '320cde22f66dd4f5d3fd621d3e88b98f' => $vendorDir . '/symfony/polyfill-ctype/bootstrap.php', '2c102faa651ef8ea5874edb585946bce' => $vendorDir . '/swiftmailer/swiftmailer/lib/swift_required.php', + 'cf97c57bfe0f23854afd2f3818abb7a0' => $vendorDir . '/zendframework/zend-diactoros/src/functions/create_uploaded_file.php', + '9bf37a3d0dad93e29cb4e1b1bfab04e9' => $vendorDir . '/zendframework/zend-diactoros/src/functions/marshal_headers_from_sapi.php', + 'ce70dccb4bcc2efc6e94d2ee526e6972' => $vendorDir . '/zendframework/zend-diactoros/src/functions/marshal_method_from_sapi.php', + 'f86420df471f14d568bfcb71e271b523' => $vendorDir . '/zendframework/zend-diactoros/src/functions/marshal_protocol_version_from_sapi.php', + 'b87481e008a3700344428ae089e7f9e5' => $vendorDir . '/zendframework/zend-diactoros/src/functions/marshal_uri_from_sapi.php', + '0b0974a5566a1077e4f2e111341112c1' => $vendorDir . '/zendframework/zend-diactoros/src/functions/normalize_server.php', + '1ca3bc274755662169f9629d5412a1da' => $vendorDir . '/zendframework/zend-diactoros/src/functions/normalize_uploaded_files.php', + '40360c0b9b437e69bcbb7f1349ce029e' => $vendorDir . '/zendframework/zend-diactoros/src/functions/parse_cookie_header.php', '538ca81a9a966a6716601ecf48f4eaef' => $vendorDir . '/opis/closure/functions.php', 'f0906e6318348a765ffb6eb24e0d0938' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/helpers.php', '58571171fd5812e6e447dce228f52f4d' => $vendorDir . '/laravel/framework/src/Illuminate/Support/helpers.php', diff --git a/vendor/composer/autoload_namespaces.php b/vendor/composer/autoload_namespaces.php index 1df8b4f99..36551427a 100644 --- a/vendor/composer/autoload_namespaces.php +++ b/vendor/composer/autoload_namespaces.php @@ -9,6 +9,5 @@ return array( 'Prophecy\\' => array($vendorDir . '/phpspec/prophecy/src'), 'Parsedown' => array($vendorDir . '/erusev/parsedown'), 'Mockery' => array($vendorDir . '/mockery/mockery/library'), - 'JakubOnderka\\PhpConsoleHighlighter' => array($vendorDir . '/jakub-onderka/php-console-highlighter/src'), 'Doctrine\\Common\\Lexer\\' => array($vendorDir . '/doctrine/lexer/lib'), ); diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php index 154f9893b..36a195235 100644 --- a/vendor/composer/autoload_psr4.php +++ b/vendor/composer/autoload_psr4.php @@ -8,6 +8,7 @@ $baseDir = dirname($vendorDir); return array( 'phpDocumentor\\Reflection\\' => array($vendorDir . '/phpdocumentor/reflection-common/src', $vendorDir . '/phpdocumentor/reflection-docblock/src', $vendorDir . '/phpdocumentor/type-resolver/src'), 'nullx27\\Socialite\\EveOnline\\' => array($vendorDir . '/nullx27/eveonline-socialite/src'), + 'Zend\\Diactoros\\' => array($vendorDir . '/zendframework/zend-diactoros/src'), 'XdgBaseDir\\' => array($vendorDir . '/dnoegel/php-xdg-base-dir/src'), 'Whoops\\' => array($vendorDir . '/filp/whoops/src/Whoops'), 'Webmozart\\Assert\\' => array($vendorDir . '/webmozart/assert/src'), @@ -16,6 +17,7 @@ return array( 'Symfony\\Polyfill\\Php72\\' => array($vendorDir . '/symfony/polyfill-php72'), 'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'), 'Symfony\\Polyfill\\Ctype\\' => array($vendorDir . '/symfony/polyfill-ctype'), + 'Symfony\\Contracts\\' => array($vendorDir . '/symfony/contracts'), 'Symfony\\Component\\VarDumper\\' => array($vendorDir . '/symfony/var-dumper'), 'Symfony\\Component\\Translation\\' => array($vendorDir . '/symfony/translation'), 'Symfony\\Component\\Routing\\' => array($vendorDir . '/symfony/routing'), @@ -38,13 +40,20 @@ return array( 'PhpParser\\' => array($vendorDir . '/nikic/php-parser/lib/PhpParser'), 'Opis\\Closure\\' => array($vendorDir . '/opis/closure/src'), 'NunoMaduro\\Collision\\' => array($vendorDir . '/nunomaduro/collision/src'), + 'Nexmo\\' => array($vendorDir . '/nexmo/client/src'), 'Monolog\\' => array($vendorDir . '/monolog/monolog/src/Monolog'), 'League\\OAuth1\\' => array($vendorDir . '/league/oauth1-client/src'), 'League\\Flysystem\\' => array($vendorDir . '/league/flysystem/src'), + 'Lcobucci\\JWT\\' => array($vendorDir . '/lcobucci/jwt/src'), 'Laravel\\Tinker\\' => array($vendorDir . '/laravel/tinker/src'), 'Laravel\\Socialite\\' => array($vendorDir . '/laravel/socialite/src'), + 'JakubOnderka\\PhpConsoleHighlighter\\' => array($vendorDir . '/jakub-onderka/php-console-highlighter/src'), 'JakubOnderka\\PhpConsoleColor\\' => array($vendorDir . '/jakub-onderka/php-console-color/src'), + 'Illuminate\\Notifications\\' => array($vendorDir . '/laravel/nexmo-notification-channel/src', $vendorDir . '/laravel/slack-notification-channel/src'), 'Illuminate\\' => array($vendorDir . '/laravel/framework/src/Illuminate'), + 'Http\\Promise\\' => array($vendorDir . '/php-http/promise/src'), + 'Http\\Client\\' => array($vendorDir . '/php-http/httplug/src'), + 'Http\\Adapter\\Guzzle6\\' => array($vendorDir . '/php-http/guzzle6-adapter/src'), 'GuzzleHttp\\Psr7\\' => array($vendorDir . '/guzzlehttp/psr7/src'), 'GuzzleHttp\\Promise\\' => array($vendorDir . '/guzzlehttp/promises/src'), 'GuzzleHttp\\' => array($vendorDir . '/guzzlehttp/guzzle/src'), diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php index 364067bbd..5ac01f4b1 100644 --- a/vendor/composer/autoload_static.php +++ b/vendor/composer/autoload_static.php @@ -8,13 +8,22 @@ class ComposerStaticInitc3f953f8a7291d41a76e1664339777c9 { public static $files = array ( '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php', - '25072dd6e2470089de65ae7bf11d3109' => __DIR__ . '/..' . '/symfony/polyfill-php72/bootstrap.php', - '667aeda72477189d0494fecd327c3641' => __DIR__ . '/..' . '/symfony/var-dumper/Resources/functions/dump.php', - '320cde22f66dd4f5d3fd621d3e88b98f' => __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php', + '7b11c4dc42b3b3023073cb14e519683c' => __DIR__ . '/..' . '/ralouphie/getallheaders/src/getallheaders.php', 'c964ee0ededf28c96ebd9db5099ef910' => __DIR__ . '/..' . '/guzzlehttp/promises/src/functions_include.php', 'a0edc8309cc5e1d60e3047b5df6b7052' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/functions_include.php', + '25072dd6e2470089de65ae7bf11d3109' => __DIR__ . '/..' . '/symfony/polyfill-php72/bootstrap.php', '37a3dc5111fe8f707ab4c132ef1dbc62' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/functions_include.php', + '667aeda72477189d0494fecd327c3641' => __DIR__ . '/..' . '/symfony/var-dumper/Resources/functions/dump.php', + '320cde22f66dd4f5d3fd621d3e88b98f' => __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php', '2c102faa651ef8ea5874edb585946bce' => __DIR__ . '/..' . '/swiftmailer/swiftmailer/lib/swift_required.php', + 'cf97c57bfe0f23854afd2f3818abb7a0' => __DIR__ . '/..' . '/zendframework/zend-diactoros/src/functions/create_uploaded_file.php', + '9bf37a3d0dad93e29cb4e1b1bfab04e9' => __DIR__ . '/..' . '/zendframework/zend-diactoros/src/functions/marshal_headers_from_sapi.php', + 'ce70dccb4bcc2efc6e94d2ee526e6972' => __DIR__ . '/..' . '/zendframework/zend-diactoros/src/functions/marshal_method_from_sapi.php', + 'f86420df471f14d568bfcb71e271b523' => __DIR__ . '/..' . '/zendframework/zend-diactoros/src/functions/marshal_protocol_version_from_sapi.php', + 'b87481e008a3700344428ae089e7f9e5' => __DIR__ . '/..' . '/zendframework/zend-diactoros/src/functions/marshal_uri_from_sapi.php', + '0b0974a5566a1077e4f2e111341112c1' => __DIR__ . '/..' . '/zendframework/zend-diactoros/src/functions/normalize_server.php', + '1ca3bc274755662169f9629d5412a1da' => __DIR__ . '/..' . '/zendframework/zend-diactoros/src/functions/normalize_uploaded_files.php', + '40360c0b9b437e69bcbb7f1349ce029e' => __DIR__ . '/..' . '/zendframework/zend-diactoros/src/functions/parse_cookie_header.php', '538ca81a9a966a6716601ecf48f4eaef' => __DIR__ . '/..' . '/opis/closure/functions.php', 'f0906e6318348a765ffb6eb24e0d0938' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/helpers.php', '58571171fd5812e6e447dce228f52f4d' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/helpers.php', @@ -34,6 +43,10 @@ class ComposerStaticInitc3f953f8a7291d41a76e1664339777c9 array ( 'nullx27\\Socialite\\EveOnline\\' => 28, ), + 'Z' => + array ( + 'Zend\\Diactoros\\' => 15, + ), 'X' => array ( 'XdgBaseDir\\' => 11, @@ -53,6 +66,7 @@ class ComposerStaticInitc3f953f8a7291d41a76e1664339777c9 'Symfony\\Polyfill\\Php72\\' => 23, 'Symfony\\Polyfill\\Mbstring\\' => 26, 'Symfony\\Polyfill\\Ctype\\' => 23, + 'Symfony\\Contracts\\' => 18, 'Symfony\\Component\\VarDumper\\' => 28, 'Symfony\\Component\\Translation\\' => 30, 'Symfony\\Component\\Routing\\' => 26, @@ -87,6 +101,7 @@ class ComposerStaticInitc3f953f8a7291d41a76e1664339777c9 'N' => array ( 'NunoMaduro\\Collision\\' => 21, + 'Nexmo\\' => 6, ), 'M' => array ( @@ -96,17 +111,26 @@ class ComposerStaticInitc3f953f8a7291d41a76e1664339777c9 array ( 'League\\OAuth1\\' => 14, 'League\\Flysystem\\' => 17, + 'Lcobucci\\JWT\\' => 13, 'Laravel\\Tinker\\' => 15, 'Laravel\\Socialite\\' => 18, ), 'J' => array ( + 'JakubOnderka\\PhpConsoleHighlighter\\' => 35, 'JakubOnderka\\PhpConsoleColor\\' => 29, ), 'I' => array ( + 'Illuminate\\Notifications\\' => 25, 'Illuminate\\' => 11, ), + 'H' => + array ( + 'Http\\Promise\\' => 13, + 'Http\\Client\\' => 12, + 'Http\\Adapter\\Guzzle6\\' => 21, + ), 'G' => array ( 'GuzzleHttp\\Psr7\\' => 16, @@ -155,6 +179,10 @@ class ComposerStaticInitc3f953f8a7291d41a76e1664339777c9 array ( 0 => __DIR__ . '/..' . '/nullx27/eveonline-socialite/src', ), + 'Zend\\Diactoros\\' => + array ( + 0 => __DIR__ . '/..' . '/zendframework/zend-diactoros/src', + ), 'XdgBaseDir\\' => array ( 0 => __DIR__ . '/..' . '/dnoegel/php-xdg-base-dir/src', @@ -187,6 +215,10 @@ class ComposerStaticInitc3f953f8a7291d41a76e1664339777c9 array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-ctype', ), + 'Symfony\\Contracts\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/contracts', + ), 'Symfony\\Component\\VarDumper\\' => array ( 0 => __DIR__ . '/..' . '/symfony/var-dumper', @@ -275,6 +307,10 @@ class ComposerStaticInitc3f953f8a7291d41a76e1664339777c9 array ( 0 => __DIR__ . '/..' . '/nunomaduro/collision/src', ), + 'Nexmo\\' => + array ( + 0 => __DIR__ . '/..' . '/nexmo/client/src', + ), 'Monolog\\' => array ( 0 => __DIR__ . '/..' . '/monolog/monolog/src/Monolog', @@ -287,6 +323,10 @@ class ComposerStaticInitc3f953f8a7291d41a76e1664339777c9 array ( 0 => __DIR__ . '/..' . '/league/flysystem/src', ), + 'Lcobucci\\JWT\\' => + array ( + 0 => __DIR__ . '/..' . '/lcobucci/jwt/src', + ), 'Laravel\\Tinker\\' => array ( 0 => __DIR__ . '/..' . '/laravel/tinker/src', @@ -295,14 +335,35 @@ class ComposerStaticInitc3f953f8a7291d41a76e1664339777c9 array ( 0 => __DIR__ . '/..' . '/laravel/socialite/src', ), + 'JakubOnderka\\PhpConsoleHighlighter\\' => + array ( + 0 => __DIR__ . '/..' . '/jakub-onderka/php-console-highlighter/src', + ), 'JakubOnderka\\PhpConsoleColor\\' => array ( 0 => __DIR__ . '/..' . '/jakub-onderka/php-console-color/src', ), + 'Illuminate\\Notifications\\' => + array ( + 0 => __DIR__ . '/..' . '/laravel/nexmo-notification-channel/src', + 1 => __DIR__ . '/..' . '/laravel/slack-notification-channel/src', + ), 'Illuminate\\' => array ( 0 => __DIR__ . '/..' . '/laravel/framework/src/Illuminate', ), + 'Http\\Promise\\' => + array ( + 0 => __DIR__ . '/..' . '/php-http/promise/src', + ), + 'Http\\Client\\' => + array ( + 0 => __DIR__ . '/..' . '/php-http/httplug/src', + ), + 'Http\\Adapter\\Guzzle6\\' => + array ( + 0 => __DIR__ . '/..' . '/php-http/guzzle6-adapter/src', + ), 'GuzzleHttp\\Psr7\\' => array ( 0 => __DIR__ . '/..' . '/guzzlehttp/psr7/src', @@ -384,13 +445,6 @@ class ComposerStaticInitc3f953f8a7291d41a76e1664339777c9 0 => __DIR__ . '/..' . '/mockery/mockery/library', ), ), - 'J' => - array ( - 'JakubOnderka\\PhpConsoleHighlighter' => - array ( - 0 => __DIR__ . '/..' . '/jakub-onderka/php-console-highlighter/src', - ), - ), 'D' => array ( 'Doctrine\\Common\\Lexer\\' => @@ -1111,6 +1165,7 @@ class ComposerStaticInitc3f953f8a7291d41a76e1664339777c9 'GuzzleHttp\\Psr7\\PumpStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/PumpStream.php', 'GuzzleHttp\\Psr7\\Request' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Request.php', 'GuzzleHttp\\Psr7\\Response' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Response.php', + 'GuzzleHttp\\Psr7\\Rfc7230' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Rfc7230.php', 'GuzzleHttp\\Psr7\\ServerRequest' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/ServerRequest.php', 'GuzzleHttp\\Psr7\\Stream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Stream.php', 'GuzzleHttp\\Psr7\\StreamDecoratorTrait' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/StreamDecoratorTrait.php', @@ -1192,6 +1247,20 @@ class ComposerStaticInitc3f953f8a7291d41a76e1664339777c9 'Hamcrest\\Type\\IsString' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Type/IsString.php', 'Hamcrest\\Util' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Util.php', 'Hamcrest\\Xml\\HasXPath' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest/Xml/HasXPath.php', + 'Http\\Adapter\\Guzzle6\\Client' => __DIR__ . '/..' . '/php-http/guzzle6-adapter/src/Client.php', + 'Http\\Adapter\\Guzzle6\\Promise' => __DIR__ . '/..' . '/php-http/guzzle6-adapter/src/Promise.php', + 'Http\\Client\\Exception' => __DIR__ . '/..' . '/php-http/httplug/src/Exception.php', + 'Http\\Client\\Exception\\HttpException' => __DIR__ . '/..' . '/php-http/httplug/src/Exception/HttpException.php', + 'Http\\Client\\Exception\\NetworkException' => __DIR__ . '/..' . '/php-http/httplug/src/Exception/NetworkException.php', + 'Http\\Client\\Exception\\RequestException' => __DIR__ . '/..' . '/php-http/httplug/src/Exception/RequestException.php', + 'Http\\Client\\Exception\\TransferException' => __DIR__ . '/..' . '/php-http/httplug/src/Exception/TransferException.php', + 'Http\\Client\\HttpAsyncClient' => __DIR__ . '/..' . '/php-http/httplug/src/HttpAsyncClient.php', + 'Http\\Client\\HttpClient' => __DIR__ . '/..' . '/php-http/httplug/src/HttpClient.php', + 'Http\\Client\\Promise\\HttpFulfilledPromise' => __DIR__ . '/..' . '/php-http/httplug/src/Promise/HttpFulfilledPromise.php', + 'Http\\Client\\Promise\\HttpRejectedPromise' => __DIR__ . '/..' . '/php-http/httplug/src/Promise/HttpRejectedPromise.php', + 'Http\\Promise\\FulfilledPromise' => __DIR__ . '/..' . '/php-http/promise/src/FulfilledPromise.php', + 'Http\\Promise\\Promise' => __DIR__ . '/..' . '/php-http/promise/src/Promise.php', + 'Http\\Promise\\RejectedPromise' => __DIR__ . '/..' . '/php-http/promise/src/RejectedPromise.php', 'Illuminate\\Auth\\Access\\AuthorizationException' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Auth/Access/AuthorizationException.php', 'Illuminate\\Auth\\Access\\Gate' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Auth/Access/Gate.php', 'Illuminate\\Auth\\Access\\HandlesAuthorization' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Auth/Access/HandlesAuthorization.php', @@ -1713,8 +1782,8 @@ class ComposerStaticInitc3f953f8a7291d41a76e1664339777c9 'Illuminate\\Notifications\\Channels\\BroadcastChannel' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Notifications/Channels/BroadcastChannel.php', 'Illuminate\\Notifications\\Channels\\DatabaseChannel' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Notifications/Channels/DatabaseChannel.php', 'Illuminate\\Notifications\\Channels\\MailChannel' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Notifications/Channels/MailChannel.php', - 'Illuminate\\Notifications\\Channels\\NexmoSmsChannel' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Notifications/Channels/NexmoSmsChannel.php', - 'Illuminate\\Notifications\\Channels\\SlackWebhookChannel' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Notifications/Channels/SlackWebhookChannel.php', + 'Illuminate\\Notifications\\Channels\\NexmoSmsChannel' => __DIR__ . '/..' . '/laravel/nexmo-notification-channel/src/Channels/NexmoSmsChannel.php', + 'Illuminate\\Notifications\\Channels\\SlackWebhookChannel' => __DIR__ . '/..' . '/laravel/slack-notification-channel/src/Channels/SlackWebhookChannel.php', 'Illuminate\\Notifications\\Console\\NotificationTableCommand' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Notifications/Console/NotificationTableCommand.php', 'Illuminate\\Notifications\\DatabaseNotification' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Notifications/DatabaseNotification.php', 'Illuminate\\Notifications\\DatabaseNotificationCollection' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Notifications/DatabaseNotificationCollection.php', @@ -1726,17 +1795,19 @@ class ComposerStaticInitc3f953f8a7291d41a76e1664339777c9 'Illuminate\\Notifications\\Messages\\BroadcastMessage' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Notifications/Messages/BroadcastMessage.php', 'Illuminate\\Notifications\\Messages\\DatabaseMessage' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Notifications/Messages/DatabaseMessage.php', 'Illuminate\\Notifications\\Messages\\MailMessage' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Notifications/Messages/MailMessage.php', - 'Illuminate\\Notifications\\Messages\\NexmoMessage' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Notifications/Messages/NexmoMessage.php', + 'Illuminate\\Notifications\\Messages\\NexmoMessage' => __DIR__ . '/..' . '/laravel/nexmo-notification-channel/src/Messages/NexmoMessage.php', 'Illuminate\\Notifications\\Messages\\SimpleMessage' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Notifications/Messages/SimpleMessage.php', - 'Illuminate\\Notifications\\Messages\\SlackAttachment' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Notifications/Messages/SlackAttachment.php', - 'Illuminate\\Notifications\\Messages\\SlackAttachmentField' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Notifications/Messages/SlackAttachmentField.php', - 'Illuminate\\Notifications\\Messages\\SlackMessage' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Notifications/Messages/SlackMessage.php', + 'Illuminate\\Notifications\\Messages\\SlackAttachment' => __DIR__ . '/..' . '/laravel/slack-notification-channel/src/Messages/SlackAttachment.php', + 'Illuminate\\Notifications\\Messages\\SlackAttachmentField' => __DIR__ . '/..' . '/laravel/slack-notification-channel/src/Messages/SlackAttachmentField.php', + 'Illuminate\\Notifications\\Messages\\SlackMessage' => __DIR__ . '/..' . '/laravel/slack-notification-channel/src/Messages/SlackMessage.php', + 'Illuminate\\Notifications\\NexmoChannelServiceProvider' => __DIR__ . '/..' . '/laravel/nexmo-notification-channel/src/NexmoChannelServiceProvider.php', 'Illuminate\\Notifications\\Notifiable' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Notifications/Notifiable.php', 'Illuminate\\Notifications\\Notification' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Notifications/Notification.php', 'Illuminate\\Notifications\\NotificationSender' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Notifications/NotificationSender.php', 'Illuminate\\Notifications\\NotificationServiceProvider' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Notifications/NotificationServiceProvider.php', 'Illuminate\\Notifications\\RoutesNotifications' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Notifications/RoutesNotifications.php', 'Illuminate\\Notifications\\SendQueuedNotifications' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Notifications/SendQueuedNotifications.php', + 'Illuminate\\Notifications\\SlackChannelServiceProvider' => __DIR__ . '/..' . '/laravel/slack-notification-channel/src/SlackChannelServiceProvider.php', 'Illuminate\\Pagination\\AbstractPaginator' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Pagination/AbstractPaginator.php', 'Illuminate\\Pagination\\LengthAwarePaginator' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Pagination/LengthAwarePaginator.php', 'Illuminate\\Pagination\\PaginationServiceProvider' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Pagination/PaginationServiceProvider.php', @@ -2000,7 +2071,7 @@ class ComposerStaticInitc3f953f8a7291d41a76e1664339777c9 'Illuminate\\View\\ViewServiceProvider' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/View/ViewServiceProvider.php', 'JakubOnderka\\PhpConsoleColor\\ConsoleColor' => __DIR__ . '/..' . '/jakub-onderka/php-console-color/src/ConsoleColor.php', 'JakubOnderka\\PhpConsoleColor\\InvalidStyleException' => __DIR__ . '/..' . '/jakub-onderka/php-console-color/src/InvalidStyleException.php', - 'JakubOnderka\\PhpConsoleHighlighter\\Highlighter' => __DIR__ . '/..' . '/jakub-onderka/php-console-highlighter/src/JakubOnderka/PhpConsoleHighlighter/Highlighter.php', + 'JakubOnderka\\PhpConsoleHighlighter\\Highlighter' => __DIR__ . '/..' . '/jakub-onderka/php-console-highlighter/src/Highlighter.php', 'JsonSerializable' => __DIR__ . '/..' . '/nesbot/carbon/src/JsonSerializable.php', 'Laravel\\Socialite\\AbstractUser' => __DIR__ . '/..' . '/laravel/socialite/src/AbstractUser.php', 'Laravel\\Socialite\\Contracts\\Factory' => __DIR__ . '/..' . '/laravel/socialite/src/Contracts/Factory.php', @@ -2016,6 +2087,7 @@ class ComposerStaticInitc3f953f8a7291d41a76e1664339777c9 'Laravel\\Socialite\\Two\\BitbucketProvider' => __DIR__ . '/..' . '/laravel/socialite/src/Two/BitbucketProvider.php', 'Laravel\\Socialite\\Two\\FacebookProvider' => __DIR__ . '/..' . '/laravel/socialite/src/Two/FacebookProvider.php', 'Laravel\\Socialite\\Two\\GithubProvider' => __DIR__ . '/..' . '/laravel/socialite/src/Two/GithubProvider.php', + 'Laravel\\Socialite\\Two\\GitlabProvider' => __DIR__ . '/..' . '/laravel/socialite/src/Two/GitlabProvider.php', 'Laravel\\Socialite\\Two\\GoogleProvider' => __DIR__ . '/..' . '/laravel/socialite/src/Two/GoogleProvider.php', 'Laravel\\Socialite\\Two\\InvalidStateException' => __DIR__ . '/..' . '/laravel/socialite/src/Two/InvalidStateException.php', 'Laravel\\Socialite\\Two\\LinkedInProvider' => __DIR__ . '/..' . '/laravel/socialite/src/Two/LinkedInProvider.php', @@ -2025,6 +2097,37 @@ class ComposerStaticInitc3f953f8a7291d41a76e1664339777c9 'Laravel\\Tinker\\Console\\TinkerCommand' => __DIR__ . '/..' . '/laravel/tinker/src/Console/TinkerCommand.php', 'Laravel\\Tinker\\TinkerCaster' => __DIR__ . '/..' . '/laravel/tinker/src/TinkerCaster.php', 'Laravel\\Tinker\\TinkerServiceProvider' => __DIR__ . '/..' . '/laravel/tinker/src/TinkerServiceProvider.php', + 'Lcobucci\\JWT\\Builder' => __DIR__ . '/..' . '/lcobucci/jwt/src/Builder.php', + 'Lcobucci\\JWT\\Claim' => __DIR__ . '/..' . '/lcobucci/jwt/src/Claim.php', + 'Lcobucci\\JWT\\Claim\\Basic' => __DIR__ . '/..' . '/lcobucci/jwt/src/Claim/Basic.php', + 'Lcobucci\\JWT\\Claim\\EqualsTo' => __DIR__ . '/..' . '/lcobucci/jwt/src/Claim/EqualsTo.php', + 'Lcobucci\\JWT\\Claim\\Factory' => __DIR__ . '/..' . '/lcobucci/jwt/src/Claim/Factory.php', + 'Lcobucci\\JWT\\Claim\\GreaterOrEqualsTo' => __DIR__ . '/..' . '/lcobucci/jwt/src/Claim/GreaterOrEqualsTo.php', + 'Lcobucci\\JWT\\Claim\\LesserOrEqualsTo' => __DIR__ . '/..' . '/lcobucci/jwt/src/Claim/LesserOrEqualsTo.php', + 'Lcobucci\\JWT\\Claim\\Validatable' => __DIR__ . '/..' . '/lcobucci/jwt/src/Claim/Validatable.php', + 'Lcobucci\\JWT\\Parser' => __DIR__ . '/..' . '/lcobucci/jwt/src/Parser.php', + 'Lcobucci\\JWT\\Parsing\\Decoder' => __DIR__ . '/..' . '/lcobucci/jwt/src/Parsing/Decoder.php', + 'Lcobucci\\JWT\\Parsing\\Encoder' => __DIR__ . '/..' . '/lcobucci/jwt/src/Parsing/Encoder.php', + 'Lcobucci\\JWT\\Signature' => __DIR__ . '/..' . '/lcobucci/jwt/src/Signature.php', + 'Lcobucci\\JWT\\Signer' => __DIR__ . '/..' . '/lcobucci/jwt/src/Signer.php', + 'Lcobucci\\JWT\\Signer\\BaseSigner' => __DIR__ . '/..' . '/lcobucci/jwt/src/Signer/BaseSigner.php', + 'Lcobucci\\JWT\\Signer\\Ecdsa' => __DIR__ . '/..' . '/lcobucci/jwt/src/Signer/Ecdsa.php', + 'Lcobucci\\JWT\\Signer\\Ecdsa\\KeyParser' => __DIR__ . '/..' . '/lcobucci/jwt/src/Signer/Ecdsa/KeyParser.php', + 'Lcobucci\\JWT\\Signer\\Ecdsa\\Sha256' => __DIR__ . '/..' . '/lcobucci/jwt/src/Signer/Ecdsa/Sha256.php', + 'Lcobucci\\JWT\\Signer\\Ecdsa\\Sha384' => __DIR__ . '/..' . '/lcobucci/jwt/src/Signer/Ecdsa/Sha384.php', + 'Lcobucci\\JWT\\Signer\\Ecdsa\\Sha512' => __DIR__ . '/..' . '/lcobucci/jwt/src/Signer/Ecdsa/Sha512.php', + 'Lcobucci\\JWT\\Signer\\Hmac' => __DIR__ . '/..' . '/lcobucci/jwt/src/Signer/Hmac.php', + 'Lcobucci\\JWT\\Signer\\Hmac\\Sha256' => __DIR__ . '/..' . '/lcobucci/jwt/src/Signer/Hmac/Sha256.php', + 'Lcobucci\\JWT\\Signer\\Hmac\\Sha384' => __DIR__ . '/..' . '/lcobucci/jwt/src/Signer/Hmac/Sha384.php', + 'Lcobucci\\JWT\\Signer\\Hmac\\Sha512' => __DIR__ . '/..' . '/lcobucci/jwt/src/Signer/Hmac/Sha512.php', + 'Lcobucci\\JWT\\Signer\\Key' => __DIR__ . '/..' . '/lcobucci/jwt/src/Signer/Key.php', + 'Lcobucci\\JWT\\Signer\\Keychain' => __DIR__ . '/..' . '/lcobucci/jwt/src/Signer/Keychain.php', + 'Lcobucci\\JWT\\Signer\\Rsa' => __DIR__ . '/..' . '/lcobucci/jwt/src/Signer/Rsa.php', + 'Lcobucci\\JWT\\Signer\\Rsa\\Sha256' => __DIR__ . '/..' . '/lcobucci/jwt/src/Signer/Rsa/Sha256.php', + 'Lcobucci\\JWT\\Signer\\Rsa\\Sha384' => __DIR__ . '/..' . '/lcobucci/jwt/src/Signer/Rsa/Sha384.php', + 'Lcobucci\\JWT\\Signer\\Rsa\\Sha512' => __DIR__ . '/..' . '/lcobucci/jwt/src/Signer/Rsa/Sha512.php', + 'Lcobucci\\JWT\\Token' => __DIR__ . '/..' . '/lcobucci/jwt/src/Token.php', + 'Lcobucci\\JWT\\ValidationData' => __DIR__ . '/..' . '/lcobucci/jwt/src/ValidationData.php', 'League\\Flysystem\\AdapterInterface' => __DIR__ . '/..' . '/league/flysystem/src/AdapterInterface.php', 'League\\Flysystem\\Adapter\\AbstractAdapter' => __DIR__ . '/..' . '/league/flysystem/src/Adapter/AbstractAdapter.php', 'League\\Flysystem\\Adapter\\AbstractFtpAdapter' => __DIR__ . '/..' . '/league/flysystem/src/Adapter/AbstractFtpAdapter.php', @@ -2220,6 +2323,7 @@ class ComposerStaticInitc3f953f8a7291d41a76e1664339777c9 'Monolog\\Handler\\HandlerWrapper' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/HandlerWrapper.php', 'Monolog\\Handler\\HipChatHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/HipChatHandler.php', 'Monolog\\Handler\\IFTTTHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/IFTTTHandler.php', + 'Monolog\\Handler\\InsightOpsHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/InsightOpsHandler.php', 'Monolog\\Handler\\LogEntriesHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/LogEntriesHandler.php', 'Monolog\\Handler\\LogglyHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/LogglyHandler.php', 'Monolog\\Handler\\MailHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/MailHandler.php', @@ -2258,11 +2362,135 @@ class ComposerStaticInitc3f953f8a7291d41a76e1664339777c9 'Monolog\\Processor\\MemoryUsageProcessor' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/MemoryUsageProcessor.php', 'Monolog\\Processor\\MercurialProcessor' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/MercurialProcessor.php', 'Monolog\\Processor\\ProcessIdProcessor' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/ProcessIdProcessor.php', + 'Monolog\\Processor\\ProcessorInterface' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/ProcessorInterface.php', 'Monolog\\Processor\\PsrLogMessageProcessor' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/PsrLogMessageProcessor.php', 'Monolog\\Processor\\TagProcessor' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/TagProcessor.php', 'Monolog\\Processor\\UidProcessor' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/UidProcessor.php', 'Monolog\\Processor\\WebProcessor' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/WebProcessor.php', 'Monolog\\Registry' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Registry.php', + 'Monolog\\ResettableInterface' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/ResettableInterface.php', + 'Monolog\\SignalHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/SignalHandler.php', + 'Monolog\\Utils' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Utils.php', + 'Nexmo\\Account\\Balance' => __DIR__ . '/..' . '/nexmo/client/src/Account/Balance.php', + 'Nexmo\\Account\\Client' => __DIR__ . '/..' . '/nexmo/client/src/Account/Client.php', + 'Nexmo\\Account\\PrefixPrice' => __DIR__ . '/..' . '/nexmo/client/src/Account/PrefixPrice.php', + 'Nexmo\\Account\\Price' => __DIR__ . '/..' . '/nexmo/client/src/Account/Price.php', + 'Nexmo\\Account\\Secret' => __DIR__ . '/..' . '/nexmo/client/src/Account/Secret.php', + 'Nexmo\\Account\\SecretCollection' => __DIR__ . '/..' . '/nexmo/client/src/Account/SecretCollection.php', + 'Nexmo\\Account\\SmsPrice' => __DIR__ . '/..' . '/nexmo/client/src/Account/SmsPrice.php', + 'Nexmo\\Account\\VoicePrice' => __DIR__ . '/..' . '/nexmo/client/src/Account/VoicePrice.php', + 'Nexmo\\ApiErrorHandler' => __DIR__ . '/..' . '/nexmo/client/src/ApiErrorHandler.php', + 'Nexmo\\Application\\Application' => __DIR__ . '/..' . '/nexmo/client/src/Application/Application.php', + 'Nexmo\\Application\\ApplicationInterface' => __DIR__ . '/..' . '/nexmo/client/src/Application/ApplicationInterface.php', + 'Nexmo\\Application\\Client' => __DIR__ . '/..' . '/nexmo/client/src/Application/Client.php', + 'Nexmo\\Application\\Filter' => __DIR__ . '/..' . '/nexmo/client/src/Application/Filter.php', + 'Nexmo\\Application\\VoiceConfig' => __DIR__ . '/..' . '/nexmo/client/src/Application/VoiceConfig.php', + 'Nexmo\\Application\\Webhook' => __DIR__ . '/..' . '/nexmo/client/src/Application/Webhook.php', + 'Nexmo\\Call\\Call' => __DIR__ . '/..' . '/nexmo/client/src/Call/Call.php', + 'Nexmo\\Call\\Collection' => __DIR__ . '/..' . '/nexmo/client/src/Call/Collection.php', + 'Nexmo\\Call\\Dtmf' => __DIR__ . '/..' . '/nexmo/client/src/Call/Dtmf.php', + 'Nexmo\\Call\\Earmuff' => __DIR__ . '/..' . '/nexmo/client/src/Call/Earmuff.php', + 'Nexmo\\Call\\Endpoint' => __DIR__ . '/..' . '/nexmo/client/src/Call/Endpoint.php', + 'Nexmo\\Call\\Event' => __DIR__ . '/..' . '/nexmo/client/src/Call/Event.php', + 'Nexmo\\Call\\Filter' => __DIR__ . '/..' . '/nexmo/client/src/Call/Filter.php', + 'Nexmo\\Call\\Hangup' => __DIR__ . '/..' . '/nexmo/client/src/Call/Hangup.php', + 'Nexmo\\Call\\Mute' => __DIR__ . '/..' . '/nexmo/client/src/Call/Mute.php', + 'Nexmo\\Call\\Stream' => __DIR__ . '/..' . '/nexmo/client/src/Call/Stream.php', + 'Nexmo\\Call\\Talk' => __DIR__ . '/..' . '/nexmo/client/src/Call/Talk.php', + 'Nexmo\\Call\\Transfer' => __DIR__ . '/..' . '/nexmo/client/src/Call/Transfer.php', + 'Nexmo\\Call\\Unearmuff' => __DIR__ . '/..' . '/nexmo/client/src/Call/Unearmuff.php', + 'Nexmo\\Call\\Unmute' => __DIR__ . '/..' . '/nexmo/client/src/Call/Unmute.php', + 'Nexmo\\Call\\Webhook' => __DIR__ . '/..' . '/nexmo/client/src/Call/Webhook.php', + 'Nexmo\\Client' => __DIR__ . '/..' . '/nexmo/client/src/Client.php', + 'Nexmo\\Client\\Callback\\Callback' => __DIR__ . '/..' . '/nexmo/client/src/Client/Callback/Callback.php', + 'Nexmo\\Client\\Callback\\CallbackInterface' => __DIR__ . '/..' . '/nexmo/client/src/Client/Callback/CallbackInterface.php', + 'Nexmo\\Client\\ClientAwareInterface' => __DIR__ . '/..' . '/nexmo/client/src/Client/ClientAwareInterface.php', + 'Nexmo\\Client\\ClientAwareTrait' => __DIR__ . '/..' . '/nexmo/client/src/Client/ClientAwareTrait.php', + 'Nexmo\\Client\\Credentials\\AbstractCredentials' => __DIR__ . '/..' . '/nexmo/client/src/Client/Credentials/AbstractCredentials.php', + 'Nexmo\\Client\\Credentials\\Basic' => __DIR__ . '/..' . '/nexmo/client/src/Client/Credentials/Basic.php', + 'Nexmo\\Client\\Credentials\\Container' => __DIR__ . '/..' . '/nexmo/client/src/Client/Credentials/Container.php', + 'Nexmo\\Client\\Credentials\\CredentialsInterface' => __DIR__ . '/..' . '/nexmo/client/src/Client/Credentials/CredentialsInterface.php', + 'Nexmo\\Client\\Credentials\\Keypair' => __DIR__ . '/..' . '/nexmo/client/src/Client/Credentials/Keypair.php', + 'Nexmo\\Client\\Credentials\\OAuth' => __DIR__ . '/..' . '/nexmo/client/src/Client/Credentials/OAuth.php', + 'Nexmo\\Client\\Credentials\\SignatureSecret' => __DIR__ . '/..' . '/nexmo/client/src/Client/Credentials/SignatureSecret.php', + 'Nexmo\\Client\\Exception\\Exception' => __DIR__ . '/..' . '/nexmo/client/src/Client/Exception/Exception.php', + 'Nexmo\\Client\\Exception\\Request' => __DIR__ . '/..' . '/nexmo/client/src/Client/Exception/Request.php', + 'Nexmo\\Client\\Exception\\Server' => __DIR__ . '/..' . '/nexmo/client/src/Client/Exception/Server.php', + 'Nexmo\\Client\\Exception\\Transport' => __DIR__ . '/..' . '/nexmo/client/src/Client/Exception/Transport.php', + 'Nexmo\\Client\\Exception\\Validation' => __DIR__ . '/..' . '/nexmo/client/src/Client/Exception/Validation.php', + 'Nexmo\\Client\\Factory\\FactoryInterface' => __DIR__ . '/..' . '/nexmo/client/src/Client/Factory/FactoryInterface.php', + 'Nexmo\\Client\\Factory\\MapFactory' => __DIR__ . '/..' . '/nexmo/client/src/Client/Factory/MapFactory.php', + 'Nexmo\\Client\\Request\\AbstractRequest' => __DIR__ . '/..' . '/nexmo/client/src/Client/Request/AbstractRequest.php', + 'Nexmo\\Client\\Request\\RequestInterface' => __DIR__ . '/..' . '/nexmo/client/src/Client/Request/RequestInterface.php', + 'Nexmo\\Client\\Request\\WrapResponseInterface' => __DIR__ . '/..' . '/nexmo/client/src/Client/Request/WrapResponseInterface.php', + 'Nexmo\\Client\\Response\\AbstractResponse' => __DIR__ . '/..' . '/nexmo/client/src/Client/Response/AbstractResponse.php', + 'Nexmo\\Client\\Response\\Error' => __DIR__ . '/..' . '/nexmo/client/src/Client/Response/Error.php', + 'Nexmo\\Client\\Response\\Response' => __DIR__ . '/..' . '/nexmo/client/src/Client/Response/Response.php', + 'Nexmo\\Client\\Response\\ResponseInterface' => __DIR__ . '/..' . '/nexmo/client/src/Client/Response/ResponseInterface.php', + 'Nexmo\\Client\\Signature' => __DIR__ . '/..' . '/nexmo/client/src/Client/Signature.php', + 'Nexmo\\Conversations\\Collection' => __DIR__ . '/..' . '/nexmo/client/src/Conversations/Collection.php', + 'Nexmo\\Conversations\\Conversation' => __DIR__ . '/..' . '/nexmo/client/src/Conversations/Conversation.php', + 'Nexmo\\Conversion\\Client' => __DIR__ . '/..' . '/nexmo/client/src/Conversion/Client.php', + 'Nexmo\\Entity\\ArrayAccessTrait' => __DIR__ . '/..' . '/nexmo/client/src/Entity/ArrayAccessTrait.php', + 'Nexmo\\Entity\\CollectionAwareInterface' => __DIR__ . '/..' . '/nexmo/client/src/Entity/CollectionAwareInterface.php', + 'Nexmo\\Entity\\CollectionAwareTrait' => __DIR__ . '/..' . '/nexmo/client/src/Entity/CollectionAwareTrait.php', + 'Nexmo\\Entity\\CollectionInterface' => __DIR__ . '/..' . '/nexmo/client/src/Entity/CollectionInterface.php', + 'Nexmo\\Entity\\CollectionTrait' => __DIR__ . '/..' . '/nexmo/client/src/Entity/CollectionTrait.php', + 'Nexmo\\Entity\\EmptyFilter' => __DIR__ . '/..' . '/nexmo/client/src/Entity/EmptyFilter.php', + 'Nexmo\\Entity\\EntityInterface' => __DIR__ . '/..' . '/nexmo/client/src/Entity/EntityInterface.php', + 'Nexmo\\Entity\\FilterInterface' => __DIR__ . '/..' . '/nexmo/client/src/Entity/FilterInterface.php', + 'Nexmo\\Entity\\HasEntityTrait' => __DIR__ . '/..' . '/nexmo/client/src/Entity/HasEntityTrait.php', + 'Nexmo\\Entity\\JsonResponseTrait' => __DIR__ . '/..' . '/nexmo/client/src/Entity/JsonResponseTrait.php', + 'Nexmo\\Entity\\JsonSerializableInterface' => __DIR__ . '/..' . '/nexmo/client/src/Entity/JsonSerializableInterface.php', + 'Nexmo\\Entity\\JsonSerializableTrait' => __DIR__ . '/..' . '/nexmo/client/src/Entity/JsonSerializableTrait.php', + 'Nexmo\\Entity\\JsonUnserializableInterface' => __DIR__ . '/..' . '/nexmo/client/src/Entity/JsonUnserializableInterface.php', + 'Nexmo\\Entity\\NoRequestResponseTrait' => __DIR__ . '/..' . '/nexmo/client/src/Entity/NoRequestResponseTrait.php', + 'Nexmo\\Entity\\Psr7Trait' => __DIR__ . '/..' . '/nexmo/client/src/Entity/Psr7Trait.php', + 'Nexmo\\Entity\\RequestArrayTrait' => __DIR__ . '/..' . '/nexmo/client/src/Entity/RequestArrayTrait.php', + 'Nexmo\\Insights\\Advanced' => __DIR__ . '/..' . '/nexmo/client/src/Insights/Advanced.php', + 'Nexmo\\Insights\\AdvancedCnam' => __DIR__ . '/..' . '/nexmo/client/src/Insights/AdvancedCnam.php', + 'Nexmo\\Insights\\Basic' => __DIR__ . '/..' . '/nexmo/client/src/Insights/Basic.php', + 'Nexmo\\Insights\\Client' => __DIR__ . '/..' . '/nexmo/client/src/Insights/Client.php', + 'Nexmo\\Insights\\CnamTrait' => __DIR__ . '/..' . '/nexmo/client/src/Insights/CnamTrait.php', + 'Nexmo\\Insights\\Standard' => __DIR__ . '/..' . '/nexmo/client/src/Insights/Standard.php', + 'Nexmo\\Insights\\StandardCnam' => __DIR__ . '/..' . '/nexmo/client/src/Insights/StandardCnam.php', + 'Nexmo\\InvalidResponseException' => __DIR__ . '/..' . '/nexmo/client/src/InvalidResponseException.php', + 'Nexmo\\Message\\AutoDetect' => __DIR__ . '/..' . '/nexmo/client/src/Message/AutoDetect.php', + 'Nexmo\\Message\\Binary' => __DIR__ . '/..' . '/nexmo/client/src/Message/Binary.php', + 'Nexmo\\Message\\Callback\\Receipt' => __DIR__ . '/..' . '/nexmo/client/src/Message/Callback/Receipt.php', + 'Nexmo\\Message\\Client' => __DIR__ . '/..' . '/nexmo/client/src/Message/Client.php', + 'Nexmo\\Message\\CollectionTrait' => __DIR__ . '/..' . '/nexmo/client/src/Message/CollectionTrait.php', + 'Nexmo\\Message\\EncodingDetector' => __DIR__ . '/..' . '/nexmo/client/src/Message/EncodingDetector.php', + 'Nexmo\\Message\\InboundMessage' => __DIR__ . '/..' . '/nexmo/client/src/Message/InboundMessage.php', + 'Nexmo\\Message\\Message' => __DIR__ . '/..' . '/nexmo/client/src/Message/Message.php', + 'Nexmo\\Message\\MessageInterface' => __DIR__ . '/..' . '/nexmo/client/src/Message/MessageInterface.php', + 'Nexmo\\Message\\Query' => __DIR__ . '/..' . '/nexmo/client/src/Message/Query.php', + 'Nexmo\\Message\\Response\\Collection' => __DIR__ . '/..' . '/nexmo/client/src/Message/Response/Collection.php', + 'Nexmo\\Message\\Response\\Message' => __DIR__ . '/..' . '/nexmo/client/src/Message/Response/Message.php', + 'Nexmo\\Message\\Text' => __DIR__ . '/..' . '/nexmo/client/src/Message/Text.php', + 'Nexmo\\Message\\Unicode' => __DIR__ . '/..' . '/nexmo/client/src/Message/Unicode.php', + 'Nexmo\\Message\\Vcal' => __DIR__ . '/..' . '/nexmo/client/src/Message/Vcal.php', + 'Nexmo\\Message\\Vcard' => __DIR__ . '/..' . '/nexmo/client/src/Message/Vcard.php', + 'Nexmo\\Message\\Wap' => __DIR__ . '/..' . '/nexmo/client/src/Message/Wap.php', + 'Nexmo\\Network' => __DIR__ . '/..' . '/nexmo/client/src/Network.php', + 'Nexmo\\Network\\Number\\Callback' => __DIR__ . '/..' . '/nexmo/client/src/Network/Number/Callback.php', + 'Nexmo\\Network\\Number\\Request' => __DIR__ . '/..' . '/nexmo/client/src/Network/Number/Request.php', + 'Nexmo\\Network\\Number\\Response' => __DIR__ . '/..' . '/nexmo/client/src/Network/Number/Response.php', + 'Nexmo\\Numbers\\Client' => __DIR__ . '/..' . '/nexmo/client/src/Numbers/Client.php', + 'Nexmo\\Numbers\\Number' => __DIR__ . '/..' . '/nexmo/client/src/Numbers/Number.php', + 'Nexmo\\Redact\\Client' => __DIR__ . '/..' . '/nexmo/client/src/Redact/Client.php', + 'Nexmo\\Response' => __DIR__ . '/..' . '/nexmo/client/src/Response.php', + 'Nexmo\\Response\\Message' => __DIR__ . '/..' . '/nexmo/client/src/Response/Message.php', + 'Nexmo\\User\\Collection' => __DIR__ . '/..' . '/nexmo/client/src/User/Collection.php', + 'Nexmo\\User\\User' => __DIR__ . '/..' . '/nexmo/client/src/User/User.php', + 'Nexmo\\Verify\\Check' => __DIR__ . '/..' . '/nexmo/client/src/Verify/Check.php', + 'Nexmo\\Verify\\Client' => __DIR__ . '/..' . '/nexmo/client/src/Verify/Client.php', + 'Nexmo\\Verify\\Verification' => __DIR__ . '/..' . '/nexmo/client/src/Verify/Verification.php', + 'Nexmo\\Verify\\VerificationInterface' => __DIR__ . '/..' . '/nexmo/client/src/Verify/VerificationInterface.php', + 'Nexmo\\Voice\\Call\\Call' => __DIR__ . '/..' . '/nexmo/client/src/Voice/Call/Call.php', + 'Nexmo\\Voice\\Call\\Inbound' => __DIR__ . '/..' . '/nexmo/client/src/Voice/Call/Inbound.php', + 'Nexmo\\Voice\\Message\\Callback' => __DIR__ . '/..' . '/nexmo/client/src/Voice/Message/Callback.php', + 'Nexmo\\Voice\\Message\\Message' => __DIR__ . '/..' . '/nexmo/client/src/Voice/Message/Message.php', 'NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider' => __DIR__ . '/..' . '/nunomaduro/collision/src/Adapters/Laravel/CollisionServiceProvider.php', 'NunoMaduro\\Collision\\Adapters\\Laravel\\ExceptionHandler' => __DIR__ . '/..' . '/nunomaduro/collision/src/Adapters/Laravel/ExceptionHandler.php', 'NunoMaduro\\Collision\\Adapters\\Laravel\\Inspector' => __DIR__ . '/..' . '/nunomaduro/collision/src/Adapters/Laravel/Inspector.php', @@ -2427,6 +2655,7 @@ class ComposerStaticInitc3f953f8a7291d41a76e1664339777c9 'PHPUnit\\Runner\\AfterSuccessfulTestHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/AfterSuccessfulTestHook.php', 'PHPUnit\\Runner\\AfterTestErrorHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/AfterTestErrorHook.php', 'PHPUnit\\Runner\\AfterTestFailureHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/AfterTestFailureHook.php', + 'PHPUnit\\Runner\\AfterTestHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/AfterTestHook.php', 'PHPUnit\\Runner\\AfterTestWarningHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/AfterTestWarningHook.php', 'PHPUnit\\Runner\\BaseTestRunner' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/BaseTestRunner.php', 'PHPUnit\\Runner\\BeforeFirstTestHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/BeforeFirstTestHook.php', @@ -3319,6 +3548,7 @@ class ComposerStaticInitc3f953f8a7291d41a76e1664339777c9 'Psr\\Log\\NullLogger' => __DIR__ . '/..' . '/psr/log/Psr/Log/NullLogger.php', 'Psr\\Log\\Test\\DummyTest' => __DIR__ . '/..' . '/psr/log/Psr/Log/Test/LoggerInterfaceTest.php', 'Psr\\Log\\Test\\LoggerInterfaceTest' => __DIR__ . '/..' . '/psr/log/Psr/Log/Test/LoggerInterfaceTest.php', + 'Psr\\Log\\Test\\TestLogger' => __DIR__ . '/..' . '/psr/log/Psr/Log/Test/TestLogger.php', 'Psr\\SimpleCache\\CacheException' => __DIR__ . '/..' . '/psr/simple-cache/src/CacheException.php', 'Psr\\SimpleCache\\CacheInterface' => __DIR__ . '/..' . '/psr/simple-cache/src/CacheInterface.php', 'Psr\\SimpleCache\\InvalidArgumentException' => __DIR__ . '/..' . '/psr/simple-cache/src/InvalidArgumentException.php', @@ -3669,6 +3899,7 @@ class ComposerStaticInitc3f953f8a7291d41a76e1664339777c9 'Symfony\\Component\\Console\\Formatter\\OutputFormatterStyle' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatterStyle.php', 'Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleInterface' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatterStyleInterface.php', 'Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleStack' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatterStyleStack.php', + 'Symfony\\Component\\Console\\Formatter\\WrappableOutputFormatterInterface' => __DIR__ . '/..' . '/symfony/console/Formatter/WrappableOutputFormatterInterface.php', 'Symfony\\Component\\Console\\Helper\\DebugFormatterHelper' => __DIR__ . '/..' . '/symfony/console/Helper/DebugFormatterHelper.php', 'Symfony\\Component\\Console\\Helper\\DescriptorHelper' => __DIR__ . '/..' . '/symfony/console/Helper/DescriptorHelper.php', 'Symfony\\Component\\Console\\Helper\\FormatterHelper' => __DIR__ . '/..' . '/symfony/console/Helper/FormatterHelper.php', @@ -3865,6 +4096,7 @@ class ComposerStaticInitc3f953f8a7291d41a76e1664339777c9 'Symfony\\Component\\HttpFoundation\\Session\\SessionBagInterface' => __DIR__ . '/..' . '/symfony/http-foundation/Session/SessionBagInterface.php', 'Symfony\\Component\\HttpFoundation\\Session\\SessionBagProxy' => __DIR__ . '/..' . '/symfony/http-foundation/Session/SessionBagProxy.php', 'Symfony\\Component\\HttpFoundation\\Session\\SessionInterface' => __DIR__ . '/..' . '/symfony/http-foundation/Session/SessionInterface.php', + 'Symfony\\Component\\HttpFoundation\\Session\\SessionUtils' => __DIR__ . '/..' . '/symfony/http-foundation/Session/SessionUtils.php', 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\AbstractSessionHandler' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/AbstractSessionHandler.php', 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\MemcachedSessionHandler' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/MemcachedSessionHandler.php', 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\MigratingSessionHandler' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/MigratingSessionHandler.php', @@ -3970,6 +4202,7 @@ class ComposerStaticInitc3f953f8a7291d41a76e1664339777c9 'Symfony\\Component\\HttpKernel\\Exception\\AccessDeniedHttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/AccessDeniedHttpException.php', 'Symfony\\Component\\HttpKernel\\Exception\\BadRequestHttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/BadRequestHttpException.php', 'Symfony\\Component\\HttpKernel\\Exception\\ConflictHttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/ConflictHttpException.php', + 'Symfony\\Component\\HttpKernel\\Exception\\ControllerDoesNotReturnResponseException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/ControllerDoesNotReturnResponseException.php', 'Symfony\\Component\\HttpKernel\\Exception\\GoneHttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/GoneHttpException.php', 'Symfony\\Component\\HttpKernel\\Exception\\HttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/HttpException.php', 'Symfony\\Component\\HttpKernel\\Exception\\HttpExceptionInterface' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/HttpExceptionInterface.php', @@ -4070,6 +4303,7 @@ class ComposerStaticInitc3f953f8a7291d41a76e1664339777c9 'Symfony\\Component\\Routing\\Matcher\\Dumper\\MatcherDumper' => __DIR__ . '/..' . '/symfony/routing/Matcher/Dumper/MatcherDumper.php', 'Symfony\\Component\\Routing\\Matcher\\Dumper\\MatcherDumperInterface' => __DIR__ . '/..' . '/symfony/routing/Matcher/Dumper/MatcherDumperInterface.php', 'Symfony\\Component\\Routing\\Matcher\\Dumper\\PhpMatcherDumper' => __DIR__ . '/..' . '/symfony/routing/Matcher/Dumper/PhpMatcherDumper.php', + 'Symfony\\Component\\Routing\\Matcher\\Dumper\\PhpMatcherTrait' => __DIR__ . '/..' . '/symfony/routing/Matcher/Dumper/PhpMatcherTrait.php', 'Symfony\\Component\\Routing\\Matcher\\Dumper\\StaticPrefixCollection' => __DIR__ . '/..' . '/symfony/routing/Matcher/Dumper/StaticPrefixCollection.php', 'Symfony\\Component\\Routing\\Matcher\\RedirectableUrlMatcher' => __DIR__ . '/..' . '/symfony/routing/Matcher/RedirectableUrlMatcher.php', 'Symfony\\Component\\Routing\\Matcher\\RedirectableUrlMatcherInterface' => __DIR__ . '/..' . '/symfony/routing/Matcher/RedirectableUrlMatcherInterface.php', @@ -4120,6 +4354,8 @@ class ComposerStaticInitc3f953f8a7291d41a76e1664339777c9 'Symfony\\Component\\Translation\\Extractor\\PhpExtractor' => __DIR__ . '/..' . '/symfony/translation/Extractor/PhpExtractor.php', 'Symfony\\Component\\Translation\\Extractor\\PhpStringTokenParser' => __DIR__ . '/..' . '/symfony/translation/Extractor/PhpStringTokenParser.php', 'Symfony\\Component\\Translation\\Formatter\\ChoiceMessageFormatterInterface' => __DIR__ . '/..' . '/symfony/translation/Formatter/ChoiceMessageFormatterInterface.php', + 'Symfony\\Component\\Translation\\Formatter\\IntlFormatter' => __DIR__ . '/..' . '/symfony/translation/Formatter/IntlFormatter.php', + 'Symfony\\Component\\Translation\\Formatter\\IntlFormatterInterface' => __DIR__ . '/..' . '/symfony/translation/Formatter/IntlFormatterInterface.php', 'Symfony\\Component\\Translation\\Formatter\\MessageFormatter' => __DIR__ . '/..' . '/symfony/translation/Formatter/MessageFormatter.php', 'Symfony\\Component\\Translation\\Formatter\\MessageFormatterInterface' => __DIR__ . '/..' . '/symfony/translation/Formatter/MessageFormatterInterface.php', 'Symfony\\Component\\Translation\\IdentityTranslator' => __DIR__ . '/..' . '/symfony/translation/IdentityTranslator.php', @@ -4150,6 +4386,7 @@ class ComposerStaticInitc3f953f8a7291d41a76e1664339777c9 'Symfony\\Component\\Translation\\TranslatorBagInterface' => __DIR__ . '/..' . '/symfony/translation/TranslatorBagInterface.php', 'Symfony\\Component\\Translation\\TranslatorInterface' => __DIR__ . '/..' . '/symfony/translation/TranslatorInterface.php', 'Symfony\\Component\\Translation\\Util\\ArrayConverter' => __DIR__ . '/..' . '/symfony/translation/Util/ArrayConverter.php', + 'Symfony\\Component\\Translation\\Util\\XliffUtils' => __DIR__ . '/..' . '/symfony/translation/Util/XliffUtils.php', 'Symfony\\Component\\Translation\\Writer\\TranslationWriter' => __DIR__ . '/..' . '/symfony/translation/Writer/TranslationWriter.php', 'Symfony\\Component\\Translation\\Writer\\TranslationWriterInterface' => __DIR__ . '/..' . '/symfony/translation/Writer/TranslationWriterInterface.php', 'Symfony\\Component\\VarDumper\\Caster\\AmqpCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/AmqpCaster.php', @@ -4166,9 +4403,12 @@ class ComposerStaticInitc3f953f8a7291d41a76e1664339777c9 'Symfony\\Component\\VarDumper\\Caster\\ExceptionCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/ExceptionCaster.php', 'Symfony\\Component\\VarDumper\\Caster\\FrameStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/FrameStub.php', 'Symfony\\Component\\VarDumper\\Caster\\GmpCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/GmpCaster.php', + 'Symfony\\Component\\VarDumper\\Caster\\IntlCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/IntlCaster.php', 'Symfony\\Component\\VarDumper\\Caster\\LinkStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/LinkStub.php', + 'Symfony\\Component\\VarDumper\\Caster\\MemcachedCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/MemcachedCaster.php', 'Symfony\\Component\\VarDumper\\Caster\\PdoCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/PdoCaster.php', 'Symfony\\Component\\VarDumper\\Caster\\PgSqlCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/PgSqlCaster.php', + 'Symfony\\Component\\VarDumper\\Caster\\ProxyManagerCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/ProxyManagerCaster.php', 'Symfony\\Component\\VarDumper\\Caster\\RedisCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/RedisCaster.php', 'Symfony\\Component\\VarDumper\\Caster\\ReflectionCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/ReflectionCaster.php', 'Symfony\\Component\\VarDumper\\Caster\\ResourceCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/ResourceCaster.php', @@ -4203,6 +4443,26 @@ class ComposerStaticInitc3f953f8a7291d41a76e1664339777c9 'Symfony\\Component\\VarDumper\\Server\\DumpServer' => __DIR__ . '/..' . '/symfony/var-dumper/Server/DumpServer.php', 'Symfony\\Component\\VarDumper\\Test\\VarDumperTestTrait' => __DIR__ . '/..' . '/symfony/var-dumper/Test/VarDumperTestTrait.php', 'Symfony\\Component\\VarDumper\\VarDumper' => __DIR__ . '/..' . '/symfony/var-dumper/VarDumper.php', + 'Symfony\\Contracts\\Cache\\CacheInterface' => __DIR__ . '/..' . '/symfony/contracts/Cache/CacheInterface.php', + 'Symfony\\Contracts\\Cache\\CacheTrait' => __DIR__ . '/..' . '/symfony/contracts/Cache/CacheTrait.php', + 'Symfony\\Contracts\\Cache\\CallbackInterface' => __DIR__ . '/..' . '/symfony/contracts/Cache/CallbackInterface.php', + 'Symfony\\Contracts\\Cache\\ItemInterface' => __DIR__ . '/..' . '/symfony/contracts/Cache/ItemInterface.php', + 'Symfony\\Contracts\\Cache\\TagAwareCacheInterface' => __DIR__ . '/..' . '/symfony/contracts/Cache/TagAwareCacheInterface.php', + 'Symfony\\Contracts\\Service\\ResetInterface' => __DIR__ . '/..' . '/symfony/contracts/Service/ResetInterface.php', + 'Symfony\\Contracts\\Service\\ServiceLocatorTrait' => __DIR__ . '/..' . '/symfony/contracts/Service/ServiceLocatorTrait.php', + 'Symfony\\Contracts\\Service\\ServiceSubscriberInterface' => __DIR__ . '/..' . '/symfony/contracts/Service/ServiceSubscriberInterface.php', + 'Symfony\\Contracts\\Service\\ServiceSubscriberTrait' => __DIR__ . '/..' . '/symfony/contracts/Service/ServiceSubscriberTrait.php', + 'Symfony\\Contracts\\Tests\\Cache\\CacheTraitTest' => __DIR__ . '/..' . '/symfony/contracts/Tests/Cache/CacheTraitTest.php', + 'Symfony\\Contracts\\Tests\\Cache\\TestPool' => __DIR__ . '/..' . '/symfony/contracts/Tests/Cache/CacheTraitTest.php', + 'Symfony\\Contracts\\Tests\\Service\\ChildTestService' => __DIR__ . '/..' . '/symfony/contracts/Tests/Service/ServiceSubscriberTraitTest.php', + 'Symfony\\Contracts\\Tests\\Service\\ParentTestService' => __DIR__ . '/..' . '/symfony/contracts/Tests/Service/ServiceSubscriberTraitTest.php', + 'Symfony\\Contracts\\Tests\\Service\\ServiceLocatorTest' => __DIR__ . '/..' . '/symfony/contracts/Tests/Service/ServiceLocatorTest.php', + 'Symfony\\Contracts\\Tests\\Service\\ServiceSubscriberTraitTest' => __DIR__ . '/..' . '/symfony/contracts/Tests/Service/ServiceSubscriberTraitTest.php', + 'Symfony\\Contracts\\Tests\\Service\\TestService' => __DIR__ . '/..' . '/symfony/contracts/Tests/Service/ServiceSubscriberTraitTest.php', + 'Symfony\\Contracts\\Tests\\Translation\\TranslatorTest' => __DIR__ . '/..' . '/symfony/contracts/Tests/Translation/TranslatorTest.php', + 'Symfony\\Contracts\\Translation\\LocaleAwareInterface' => __DIR__ . '/..' . '/symfony/contracts/Translation/LocaleAwareInterface.php', + 'Symfony\\Contracts\\Translation\\TranslatorInterface' => __DIR__ . '/..' . '/symfony/contracts/Translation/TranslatorInterface.php', + 'Symfony\\Contracts\\Translation\\TranslatorTrait' => __DIR__ . '/..' . '/symfony/contracts/Translation/TranslatorTrait.php', 'Symfony\\Polyfill\\Ctype\\Ctype' => __DIR__ . '/..' . '/symfony/polyfill-ctype/Ctype.php', 'Symfony\\Polyfill\\Mbstring\\Mbstring' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/Mbstring.php', 'Symfony\\Polyfill\\Php72\\Php72' => __DIR__ . '/..' . '/symfony/polyfill-php72/Php72.php', @@ -4246,6 +4506,38 @@ class ComposerStaticInitc3f953f8a7291d41a76e1664339777c9 'Whoops\\Util\\TemplateHelper' => __DIR__ . '/..' . '/filp/whoops/src/Whoops/Util/TemplateHelper.php', 'WikiTableSeeder' => __DIR__ . '/../..' . '/database/seeds/WikiTableSeeder.php', 'XdgBaseDir\\Xdg' => __DIR__ . '/..' . '/dnoegel/php-xdg-base-dir/src/Xdg.php', + 'Zend\\Diactoros\\AbstractSerializer' => __DIR__ . '/..' . '/zendframework/zend-diactoros/src/AbstractSerializer.php', + 'Zend\\Diactoros\\CallbackStream' => __DIR__ . '/..' . '/zendframework/zend-diactoros/src/CallbackStream.php', + 'Zend\\Diactoros\\Exception\\DeprecatedMethodException' => __DIR__ . '/..' . '/zendframework/zend-diactoros/src/Exception/DeprecatedMethodException.php', + 'Zend\\Diactoros\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/zendframework/zend-diactoros/src/Exception/ExceptionInterface.php', + 'Zend\\Diactoros\\HeaderSecurity' => __DIR__ . '/..' . '/zendframework/zend-diactoros/src/HeaderSecurity.php', + 'Zend\\Diactoros\\MessageTrait' => __DIR__ . '/..' . '/zendframework/zend-diactoros/src/MessageTrait.php', + 'Zend\\Diactoros\\PhpInputStream' => __DIR__ . '/..' . '/zendframework/zend-diactoros/src/PhpInputStream.php', + 'Zend\\Diactoros\\RelativeStream' => __DIR__ . '/..' . '/zendframework/zend-diactoros/src/RelativeStream.php', + 'Zend\\Diactoros\\Request' => __DIR__ . '/..' . '/zendframework/zend-diactoros/src/Request.php', + 'Zend\\Diactoros\\RequestTrait' => __DIR__ . '/..' . '/zendframework/zend-diactoros/src/RequestTrait.php', + 'Zend\\Diactoros\\Request\\ArraySerializer' => __DIR__ . '/..' . '/zendframework/zend-diactoros/src/Request/ArraySerializer.php', + 'Zend\\Diactoros\\Request\\Serializer' => __DIR__ . '/..' . '/zendframework/zend-diactoros/src/Request/Serializer.php', + 'Zend\\Diactoros\\Response' => __DIR__ . '/..' . '/zendframework/zend-diactoros/src/Response.php', + 'Zend\\Diactoros\\Response\\ArraySerializer' => __DIR__ . '/..' . '/zendframework/zend-diactoros/src/Response/ArraySerializer.php', + 'Zend\\Diactoros\\Response\\EmitterInterface' => __DIR__ . '/..' . '/zendframework/zend-diactoros/src/Response/EmitterInterface.php', + 'Zend\\Diactoros\\Response\\EmptyResponse' => __DIR__ . '/..' . '/zendframework/zend-diactoros/src/Response/EmptyResponse.php', + 'Zend\\Diactoros\\Response\\HtmlResponse' => __DIR__ . '/..' . '/zendframework/zend-diactoros/src/Response/HtmlResponse.php', + 'Zend\\Diactoros\\Response\\InjectContentTypeTrait' => __DIR__ . '/..' . '/zendframework/zend-diactoros/src/Response/InjectContentTypeTrait.php', + 'Zend\\Diactoros\\Response\\JsonResponse' => __DIR__ . '/..' . '/zendframework/zend-diactoros/src/Response/JsonResponse.php', + 'Zend\\Diactoros\\Response\\RedirectResponse' => __DIR__ . '/..' . '/zendframework/zend-diactoros/src/Response/RedirectResponse.php', + 'Zend\\Diactoros\\Response\\SapiEmitter' => __DIR__ . '/..' . '/zendframework/zend-diactoros/src/Response/SapiEmitter.php', + 'Zend\\Diactoros\\Response\\SapiEmitterTrait' => __DIR__ . '/..' . '/zendframework/zend-diactoros/src/Response/SapiEmitterTrait.php', + 'Zend\\Diactoros\\Response\\SapiStreamEmitter' => __DIR__ . '/..' . '/zendframework/zend-diactoros/src/Response/SapiStreamEmitter.php', + 'Zend\\Diactoros\\Response\\Serializer' => __DIR__ . '/..' . '/zendframework/zend-diactoros/src/Response/Serializer.php', + 'Zend\\Diactoros\\Response\\TextResponse' => __DIR__ . '/..' . '/zendframework/zend-diactoros/src/Response/TextResponse.php', + 'Zend\\Diactoros\\Response\\XmlResponse' => __DIR__ . '/..' . '/zendframework/zend-diactoros/src/Response/XmlResponse.php', + 'Zend\\Diactoros\\Server' => __DIR__ . '/..' . '/zendframework/zend-diactoros/src/Server.php', + 'Zend\\Diactoros\\ServerRequest' => __DIR__ . '/..' . '/zendframework/zend-diactoros/src/ServerRequest.php', + 'Zend\\Diactoros\\ServerRequestFactory' => __DIR__ . '/..' . '/zendframework/zend-diactoros/src/ServerRequestFactory.php', + 'Zend\\Diactoros\\Stream' => __DIR__ . '/..' . '/zendframework/zend-diactoros/src/Stream.php', + 'Zend\\Diactoros\\UploadedFile' => __DIR__ . '/..' . '/zendframework/zend-diactoros/src/UploadedFile.php', + 'Zend\\Diactoros\\Uri' => __DIR__ . '/..' . '/zendframework/zend-diactoros/src/Uri.php', 'nullx27\\Socialite\\EveOnline\\Providers\\EveOnlineServiceProvider' => __DIR__ . '/..' . '/nullx27/eveonline-socialite/src/Providers/EveOnlineServiceProvider.php', 'nullx27\\Socialite\\EveOnline\\Providers\\EveOnlineSocialiteProvider' => __DIR__ . '/..' . '/nullx27/eveonline-socialite/src/Providers/EveOnlineSocialiteProvider.php', 'nullx27\\Socialite\\EveOnline\\Traits\\EveAuth' => __DIR__ . '/..' . '/nullx27/eveonline-socialite/src/Traits/EveAuth.php', diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json index 242d98bcd..bb867e1e5 100644 --- a/vendor/composer/installed.json +++ b/vendor/composer/installed.json @@ -331,17 +331,17 @@ }, { "name": "egulias/email-validator", - "version": "2.1.6", - "version_normalized": "2.1.6.0", + "version": "2.1.7", + "version_normalized": "2.1.7.0", "source": { "type": "git", "url": "https://github.com/egulias/EmailValidator.git", - "reference": "0578b32b30b22de3e8664f797cf846fc9246f786" + "reference": "709f21f92707308cdf8f9bcfa1af4cb26586521e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/0578b32b30b22de3e8664f797cf846fc9246f786", - "reference": "0578b32b30b22de3e8664f797cf846fc9246f786", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/709f21f92707308cdf8f9bcfa1af4cb26586521e", + "reference": "709f21f92707308cdf8f9bcfa1af4cb26586521e", "shasum": "" }, "require": { @@ -356,7 +356,7 @@ "suggest": { "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" }, - "time": "2018-09-25T20:47:26+00:00", + "time": "2018-12-04T22:38:24+00:00", "type": "library", "extra": { "branch-alias": { @@ -547,17 +547,17 @@ }, { "name": "filp/whoops", - "version": "2.2.1", - "version_normalized": "2.2.1.0", + "version": "2.3.1", + "version_normalized": "2.3.1.0", "source": { "type": "git", "url": "https://github.com/filp/whoops.git", - "reference": "e79cd403fb77fc8963a99ecc30e80ddd885b3311" + "reference": "bc0fd11bc455cc20ee4b5edabc63ebbf859324c7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filp/whoops/zipball/e79cd403fb77fc8963a99ecc30e80ddd885b3311", - "reference": "e79cd403fb77fc8963a99ecc30e80ddd885b3311", + "url": "https://api.github.com/repos/filp/whoops/zipball/bc0fd11bc455cc20ee4b5edabc63ebbf859324c7", + "reference": "bc0fd11bc455cc20ee4b5edabc63ebbf859324c7", "shasum": "" }, "require": { @@ -573,7 +573,7 @@ "symfony/var-dumper": "Pretty print complex values better with var-dumper available", "whoops/soap": "Formats errors as SOAP responses" }, - "time": "2018-06-30T13:14:06+00:00", + "time": "2018-10-23T09:00:00+00:00", "type": "library", "extra": { "branch-alias": { @@ -782,34 +782,35 @@ }, { "name": "guzzlehttp/psr7", - "version": "1.4.2", - "version_normalized": "1.4.2.0", + "version": "1.5.2", + "version_normalized": "1.5.2.0", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c" + "reference": "9f83dded91781a01c63574e387eaa769be769115" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/f5b8a8512e2b58b0071a7280e39f14f72e05d87c", - "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/9f83dded91781a01c63574e387eaa769be769115", + "reference": "9f83dded91781a01c63574e387eaa769be769115", "shasum": "" }, "require": { "php": ">=5.4.0", - "psr/http-message": "~1.0" + "psr/http-message": "~1.0", + "ralouphie/getallheaders": "^2.0.5" }, "provide": { "psr/http-message-implementation": "1.0" }, "require-dev": { - "phpunit/phpunit": "~4.0" + "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8" }, - "time": "2017-03-20T17:10:46+00:00", + "time": "2018-12-04T20:46:45+00:00", "type": "library", "extra": { "branch-alias": { - "dev-master": "1.4-dev" + "dev-master": "1.5-dev" } }, "installation-source": "dist", @@ -840,6 +841,7 @@ "keywords": [ "http", "message", + "psr-7", "request", "response", "stream", @@ -943,36 +945,37 @@ }, { "name": "jakub-onderka/php-console-highlighter", - "version": "v0.3.2", - "version_normalized": "0.3.2.0", + "version": "v0.4", + "version_normalized": "0.4.0.0", "source": { "type": "git", "url": "https://github.com/JakubOnderka/PHP-Console-Highlighter.git", - "reference": "7daa75df45242c8d5b75a22c00a201e7954e4fb5" + "reference": "9f7a229a69d52506914b4bc61bfdb199d90c5547" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/JakubOnderka/PHP-Console-Highlighter/zipball/7daa75df45242c8d5b75a22c00a201e7954e4fb5", - "reference": "7daa75df45242c8d5b75a22c00a201e7954e4fb5", + "url": "https://api.github.com/repos/JakubOnderka/PHP-Console-Highlighter/zipball/9f7a229a69d52506914b4bc61bfdb199d90c5547", + "reference": "9f7a229a69d52506914b4bc61bfdb199d90c5547", "shasum": "" }, "require": { - "jakub-onderka/php-console-color": "~0.1", - "php": ">=5.3.0" + "ext-tokenizer": "*", + "jakub-onderka/php-console-color": "~0.2", + "php": ">=5.4.0" }, "require-dev": { "jakub-onderka/php-code-style": "~1.0", - "jakub-onderka/php-parallel-lint": "~0.5", + "jakub-onderka/php-parallel-lint": "~1.0", "jakub-onderka/php-var-dump-check": "~0.1", "phpunit/phpunit": "~4.0", "squizlabs/php_codesniffer": "~1.5" }, - "time": "2015-04-20T18:58:01+00:00", + "time": "2018-09-29T18:48:56+00:00", "type": "library", "installation-source": "dist", "autoload": { - "psr-0": { - "JakubOnderka\\PhpConsoleHighlighter": "src/" + "psr-4": { + "JakubOnderka\\PhpConsoleHighlighter\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -985,21 +988,22 @@ "email": "acci@acci.cz", "homepage": "http://www.acci.cz/" } - ] + ], + "description": "Highlight PHP code in terminal" }, { "name": "laravel/framework", - "version": "v5.7.8", - "version_normalized": "5.7.8.0", + "version": "v5.7.19", + "version_normalized": "5.7.19.0", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "763b64a43ebb6042e463aab4214d4cc9722147be" + "reference": "5c1d1ec7e8563ea31826fd5eb3f6791acf01160c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/763b64a43ebb6042e463aab4214d4cc9722147be", - "reference": "763b64a43ebb6042e463aab4214d4cc9722147be", + "url": "https://api.github.com/repos/laravel/framework/zipball/5c1d1ec7e8563ea31826fd5eb3f6791acf01160c", + "reference": "5c1d1ec7e8563ea31826fd5eb3f6791acf01160c", "shasum": "" }, "require": { @@ -1008,6 +1012,8 @@ "erusev/parsedown": "^1.7", "ext-mbstring": "*", "ext-openssl": "*", + "laravel/nexmo-notification-channel": "^1.0", + "laravel/slack-notification-channel": "^1.0", "league/flysystem": "^1.0.8", "monolog/monolog": "^1.12", "nesbot/carbon": "^1.26.3", @@ -1065,6 +1071,7 @@ "aws/aws-sdk-php": "^3.0", "doctrine/dbal": "^2.6", "filp/whoops": "^2.1.4", + "guzzlehttp/guzzle": "^6.3", "league/flysystem-cached-adapter": "^1.0", "mockery/mockery": "^1.0", "moontoast/math": "^1.1", @@ -1081,6 +1088,7 @@ "doctrine/dbal": "Required to rename columns and drop SQLite columns (^2.6).", "ext-pcntl": "Required to use all features of the queue worker.", "ext-posix": "Required to use all features of the queue worker.", + "filp/whoops": "Required for friendly error pages in development (^2.1.4).", "fzaninotto/faker": "Required to use the eloquent factory builder (^1.4).", "guzzlehttp/guzzle": "Required to use the Mailgun and Mandrill mail drivers and the ping methods on schedules (^6.0).", "laravel/tinker": "Required to use the tinker console command (^1.0).", @@ -1097,7 +1105,7 @@ "symfony/dom-crawler": "Required to use most of the crawler integration testing tools (^4.1).", "symfony/psr-http-message-bridge": "Required to psr7 bridging features (^1.0)." }, - "time": "2018-10-04T14:47:20+00:00", + "time": "2018-12-18T14:00:38+00:00", "type": "library", "extra": { "branch-alias": { @@ -1132,18 +1140,136 @@ ] }, { - "name": "laravel/socialite", - "version": "v3.1.1", - "version_normalized": "3.1.1.0", + "name": "laravel/nexmo-notification-channel", + "version": "v1.0.1", + "version_normalized": "1.0.1.0", "source": { "type": "git", - "url": "https://github.com/laravel/socialite.git", - "reference": "65f771ff4f266ebae23de1a3f18efd80a1da2f8d" + "url": "https://github.com/laravel/nexmo-notification-channel.git", + "reference": "03edd42a55b306ff980c9950899d5a2b03260d48" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/socialite/zipball/65f771ff4f266ebae23de1a3f18efd80a1da2f8d", - "reference": "65f771ff4f266ebae23de1a3f18efd80a1da2f8d", + "url": "https://api.github.com/repos/laravel/nexmo-notification-channel/zipball/03edd42a55b306ff980c9950899d5a2b03260d48", + "reference": "03edd42a55b306ff980c9950899d5a2b03260d48", + "shasum": "" + }, + "require": { + "nexmo/client": "^1.0", + "php": "^7.1.3" + }, + "require-dev": { + "illuminate/notifications": "~5.7", + "mockery/mockery": "^1.0", + "phpunit/phpunit": "^7.0" + }, + "time": "2018-12-04T12:57:08+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + }, + "laravel": { + "providers": [ + "Illuminate\\Notifications\\NexmoChannelServiceProvider" + ] + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Illuminate\\Notifications\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Nexmo Notification Channel for laravel.", + "keywords": [ + "laravel", + "nexmo", + "notifications" + ] + }, + { + "name": "laravel/slack-notification-channel", + "version": "v1.0.3", + "version_normalized": "1.0.3.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/slack-notification-channel.git", + "reference": "6e164293b754a95f246faf50ab2bbea3e4923cc9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/slack-notification-channel/zipball/6e164293b754a95f246faf50ab2bbea3e4923cc9", + "reference": "6e164293b754a95f246faf50ab2bbea3e4923cc9", + "shasum": "" + }, + "require": { + "guzzlehttp/guzzle": "^6.0", + "php": "^7.1.3" + }, + "require-dev": { + "illuminate/notifications": "~5.7", + "mockery/mockery": "^1.0", + "phpunit/phpunit": "^7.0" + }, + "time": "2018-12-12T13:12:06+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + }, + "laravel": { + "providers": [ + "Illuminate\\Notifications\\SlackChannelServiceProvider" + ] + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Illuminate\\Notifications\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Slack Notification Channel for laravel.", + "keywords": [ + "laravel", + "notifications", + "slack" + ] + }, + { + "name": "laravel/socialite", + "version": "v3.2.0", + "version_normalized": "3.2.0.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/socialite.git", + "reference": "7194c0cd9fb2ce449669252b8ec316b85b7de481" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/socialite/zipball/7194c0cd9fb2ce449669252b8ec316b85b7de481", + "reference": "7194c0cd9fb2ce449669252b8ec316b85b7de481", "shasum": "" }, "require": { @@ -1158,7 +1284,7 @@ "mockery/mockery": "~0.9", "phpunit/phpunit": "~4.0|~5.0" }, - "time": "2018-08-16T12:51:21+00:00", + "time": "2018-10-18T03:39:04+00:00", "type": "library", "extra": { "branch-alias": { @@ -1198,17 +1324,17 @@ }, { "name": "laravel/tinker", - "version": "v1.0.7", - "version_normalized": "1.0.7.0", + "version": "v1.0.8", + "version_normalized": "1.0.8.0", "source": { "type": "git", "url": "https://github.com/laravel/tinker.git", - "reference": "e3086ee8cb1f54a39ae8dcb72d1c37d10128997d" + "reference": "cafbf598a90acde68985660e79b2b03c5609a405" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/tinker/zipball/e3086ee8cb1f54a39ae8dcb72d1c37d10128997d", - "reference": "e3086ee8cb1f54a39ae8dcb72d1c37d10128997d", + "url": "https://api.github.com/repos/laravel/tinker/zipball/cafbf598a90acde68985660e79b2b03c5609a405", + "reference": "cafbf598a90acde68985660e79b2b03c5609a405", "shasum": "" }, "require": { @@ -1225,7 +1351,7 @@ "suggest": { "illuminate/database": "The Illuminate Database package (~5.1)." }, - "time": "2018-05-17T13:42:07+00:00", + "time": "2018-10-12T19:39:35+00:00", "type": "library", "extra": { "branch-alias": { @@ -1332,18 +1458,78 @@ "homepage": "https://laravelcollective.com" }, { - "name": "league/flysystem", - "version": "1.0.47", - "version_normalized": "1.0.47.0", + "name": "lcobucci/jwt", + "version": "3.2.5", + "version_normalized": "3.2.5.0", "source": { "type": "git", - "url": "https://github.com/thephpleague/flysystem.git", - "reference": "a11e4a75f256bdacf99d20780ce42d3b8272975c" + "url": "https://github.com/lcobucci/jwt.git", + "reference": "82be04b4753f8b7693b62852b7eab30f97524f9b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/a11e4a75f256bdacf99d20780ce42d3b8272975c", - "reference": "a11e4a75f256bdacf99d20780ce42d3b8272975c", + "url": "https://api.github.com/repos/lcobucci/jwt/zipball/82be04b4753f8b7693b62852b7eab30f97524f9b", + "reference": "82be04b4753f8b7693b62852b7eab30f97524f9b", + "shasum": "" + }, + "require": { + "ext-openssl": "*", + "php": ">=5.5" + }, + "require-dev": { + "mdanter/ecc": "~0.3.1", + "mikey179/vfsstream": "~1.5", + "phpmd/phpmd": "~2.2", + "phpunit/php-invoker": "~1.1", + "phpunit/phpunit": "~4.5", + "squizlabs/php_codesniffer": "~2.3" + }, + "suggest": { + "mdanter/ecc": "Required to use Elliptic Curves based algorithms." + }, + "time": "2018-11-11T12:22:26+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Lcobucci\\JWT\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Luís Otávio Cobucci Oblonczyk", + "email": "lcobucci@gmail.com", + "role": "developer" + } + ], + "description": "A simple library to work with JSON Web Token and JSON Web Signature", + "keywords": [ + "JWS", + "jwt" + ] + }, + { + "name": "league/flysystem", + "version": "1.0.49", + "version_normalized": "1.0.49.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem.git", + "reference": "a63cc83d8a931b271be45148fa39ba7156782ffd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/a63cc83d8a931b271be45148fa39ba7156782ffd", + "reference": "a63cc83d8a931b271be45148fa39ba7156782ffd", "shasum": "" }, "require": { @@ -1373,7 +1559,7 @@ "spatie/flysystem-dropbox": "Allows you to use Dropbox storage", "srmklive/flysystem-dropbox-v2": "Allows you to use Dropbox storage for PHP 5 applications" }, - "time": "2018-09-14T15:30:29+00:00", + "time": "2018-11-23T23:41:29+00:00", "type": "library", "extra": { "branch-alias": { @@ -1551,17 +1737,17 @@ }, { "name": "monolog/monolog", - "version": "1.23.0", - "version_normalized": "1.23.0.0", + "version": "1.24.0", + "version_normalized": "1.24.0.0", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "fd8c787753b3a2ad11bc60c063cff1358a32a3b4" + "reference": "bfc9ebb28f97e7a24c45bdc3f0ff482e47bb0266" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/fd8c787753b3a2ad11bc60c063cff1358a32a3b4", - "reference": "fd8c787753b3a2ad11bc60c063cff1358a32a3b4", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/bfc9ebb28f97e7a24c45bdc3f0ff482e47bb0266", + "reference": "bfc9ebb28f97e7a24c45bdc3f0ff482e47bb0266", "shasum": "" }, "require": { @@ -1597,7 +1783,7 @@ "ruflin/elastica": "Allow sending log messages to an Elastic Search server", "sentry/sentry": "Allow sending log messages to a Sentry server" }, - "time": "2017-06-19T01:22:40+00:00", + "time": "2018-11-05T09:00:11+00:00", "type": "library", "extra": { "branch-alias": { @@ -1681,17 +1867,17 @@ }, { "name": "nesbot/carbon", - "version": "1.34.0", - "version_normalized": "1.34.0.0", + "version": "1.36.1", + "version_normalized": "1.36.1.0", "source": { "type": "git", "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "1dbd3cb01c5645f3e7deda7aa46ef780d95fcc33" + "reference": "63da8cdf89d7a5efe43aabc794365f6e7b7b8983" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/1dbd3cb01c5645f3e7deda7aa46ef780d95fcc33", - "reference": "1dbd3cb01c5645f3e7deda7aa46ef780d95fcc33", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/63da8cdf89d7a5efe43aabc794365f6e7b7b8983", + "reference": "63da8cdf89d7a5efe43aabc794365f6e7b7b8983", "shasum": "" }, "require": { @@ -1699,10 +1885,13 @@ "symfony/translation": "~2.6 || ~3.0 || ~4.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "~2", "phpunit/phpunit": "^4.8.35 || ^5.7" }, - "time": "2018-09-20T19:36:25+00:00", + "suggest": { + "friendsofphp/php-cs-fixer": "Needed for the `composer phpcs` command. Allow to automatically fix code style.", + "phpstan/phpstan": "Needed for the `composer phpstan` command. Allow to detect potential errors." + }, + "time": "2018-11-22T18:23:02+00:00", "type": "library", "extra": { "laravel": { @@ -1737,18 +1926,68 @@ ] }, { - "name": "nikic/php-parser", - "version": "v4.0.4", - "version_normalized": "4.0.4.0", + "name": "nexmo/client", + "version": "1.6.0", + "version_normalized": "1.6.0.0", "source": { "type": "git", - "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "fa6ee28600d21d49b2b4e1006b48426cec8e579c" + "url": "https://github.com/Nexmo/nexmo-php.git", + "reference": "01809cc1e17a5af275913c49bb5d444eb6cc06d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/fa6ee28600d21d49b2b4e1006b48426cec8e579c", - "reference": "fa6ee28600d21d49b2b4e1006b48426cec8e579c", + "url": "https://api.github.com/repos/Nexmo/nexmo-php/zipball/01809cc1e17a5af275913c49bb5d444eb6cc06d4", + "reference": "01809cc1e17a5af275913c49bb5d444eb6cc06d4", + "shasum": "" + }, + "require": { + "lcobucci/jwt": "^3.2", + "php": ">=5.6", + "php-http/client-implementation": "^1.0", + "php-http/guzzle6-adapter": "^1.0", + "zendframework/zend-diactoros": "^1.3" + }, + "require-dev": { + "estahn/phpunit-json-assertions": "^1.0.0", + "php-http/mock-client": "^0.3.0", + "phpunit/phpunit": "^5.7", + "squizlabs/php_codesniffer": "^3.1" + }, + "time": "2018-12-17T10:47:50+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Nexmo\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Tim Lytle", + "email": "tim@nexmo.com", + "homepage": "http://twitter.com/tjlytle", + "role": "Developer" + } + ], + "description": "PHP Client for using Nexmo's API." + }, + { + "name": "nikic/php-parser", + "version": "v4.1.0", + "version_normalized": "4.1.0.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "d0230c5c77a7e3cfa69446febf340978540958c0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/d0230c5c77a7e3cfa69446febf340978540958c0", + "reference": "d0230c5c77a7e3cfa69446febf340978540958c0", "shasum": "" }, "require": { @@ -1758,14 +1997,14 @@ "require-dev": { "phpunit/phpunit": "^6.5 || ^7.0" }, - "time": "2018-09-18T07:03:24+00:00", + "time": "2018-10-10T09:24:14+00:00", "bin": [ "bin/php-parse" ], "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-master": "4.1-dev" } }, "installation-source": "dist", @@ -1838,31 +2077,32 @@ }, { "name": "nunomaduro/collision", - "version": "v2.1.0", - "version_normalized": "2.1.0.0", + "version": "v2.1.1", + "version_normalized": "2.1.1.0", "source": { "type": "git", "url": "https://github.com/nunomaduro/collision.git", - "reference": "1149ad9f36f61b121ae61f5f6de820fc77b51e6b" + "reference": "b5feb0c0d92978ec7169232ce5d70d6da6b29f63" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/collision/zipball/1149ad9f36f61b121ae61f5f6de820fc77b51e6b", - "reference": "1149ad9f36f61b121ae61f5f6de820fc77b51e6b", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/b5feb0c0d92978ec7169232ce5d70d6da6b29f63", + "reference": "b5feb0c0d92978ec7169232ce5d70d6da6b29f63", "shasum": "" }, "require": { "filp/whoops": "^2.1.4", - "jakub-onderka/php-console-highlighter": "0.3.*", + "jakub-onderka/php-console-highlighter": "0.3.*|0.4.*", "php": "^7.1", "symfony/console": "~2.8|~3.3|~4.0" }, "require-dev": { "laravel/framework": "5.7.*", + "nunomaduro/larastan": "^0.3.0", "phpstan/phpstan": "^0.10", "phpunit/phpunit": "~7.3" }, - "time": "2018-10-03T20:01:54+00:00", + "time": "2018-11-21T21:40:54+00:00", "type": "library", "extra": { "laravel": { @@ -1903,17 +2143,17 @@ }, { "name": "opis/closure", - "version": "3.1.1", - "version_normalized": "3.1.1.0", + "version": "3.1.2", + "version_normalized": "3.1.2.0", "source": { "type": "git", "url": "https://github.com/opis/closure.git", - "reference": "d3209e46ad6c69a969b705df0738fd0dbe26ef9e" + "reference": "de00c69a2328d3ee5baa71fc584dc643222a574c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/opis/closure/zipball/d3209e46ad6c69a969b705df0738fd0dbe26ef9e", - "reference": "d3209e46ad6c69a969b705df0738fd0dbe26ef9e", + "url": "https://api.github.com/repos/opis/closure/zipball/de00c69a2328d3ee5baa71fc584dc643222a574c", + "reference": "de00c69a2328d3ee5baa71fc584dc643222a574c", "shasum": "" }, "require": { @@ -1921,9 +2161,9 @@ }, "require-dev": { "jeremeamia/superclosure": "^2.0", - "phpunit/phpunit": "^4.0" + "phpunit/phpunit": "^4.0|^5.0|^6.0|^7.0" }, - "time": "2018-10-02T13:36:53+00:00", + "time": "2018-12-16T21:48:23+00:00", "type": "library", "extra": { "branch-alias": { @@ -2117,6 +2357,178 @@ ], "description": "Library for handling version information and constraints" }, + { + "name": "php-http/guzzle6-adapter", + "version": "v1.1.1", + "version_normalized": "1.1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/guzzle6-adapter.git", + "reference": "a56941f9dc6110409cfcddc91546ee97039277ab" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/guzzle6-adapter/zipball/a56941f9dc6110409cfcddc91546ee97039277ab", + "reference": "a56941f9dc6110409cfcddc91546ee97039277ab", + "shasum": "" + }, + "require": { + "guzzlehttp/guzzle": "^6.0", + "php": ">=5.5.0", + "php-http/httplug": "^1.0" + }, + "provide": { + "php-http/async-client-implementation": "1.0", + "php-http/client-implementation": "1.0" + }, + "require-dev": { + "ext-curl": "*", + "php-http/adapter-integration-tests": "^0.4" + }, + "time": "2016-05-10T06:13:32+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Http\\Adapter\\Guzzle6\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + }, + { + "name": "David de Boer", + "email": "david@ddeboer.nl" + } + ], + "description": "Guzzle 6 HTTP Adapter", + "homepage": "http://httplug.io", + "keywords": [ + "Guzzle", + "http" + ] + }, + { + "name": "php-http/httplug", + "version": "v1.1.0", + "version_normalized": "1.1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/httplug.git", + "reference": "1c6381726c18579c4ca2ef1ec1498fdae8bdf018" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/httplug/zipball/1c6381726c18579c4ca2ef1ec1498fdae8bdf018", + "reference": "1c6381726c18579c4ca2ef1ec1498fdae8bdf018", + "shasum": "" + }, + "require": { + "php": ">=5.4", + "php-http/promise": "^1.0", + "psr/http-message": "^1.0" + }, + "require-dev": { + "henrikbjorn/phpspec-code-coverage": "^1.0", + "phpspec/phpspec": "^2.4" + }, + "time": "2016-08-31T08:30:17+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eric GELOEN", + "email": "geloen.eric@gmail.com" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "HTTPlug, the HTTP client abstraction for PHP", + "homepage": "http://httplug.io", + "keywords": [ + "client", + "http" + ] + }, + { + "name": "php-http/promise", + "version": "v1.0.0", + "version_normalized": "1.0.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/promise.git", + "reference": "dc494cdc9d7160b9a09bd5573272195242ce7980" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/promise/zipball/dc494cdc9d7160b9a09bd5573272195242ce7980", + "reference": "dc494cdc9d7160b9a09bd5573272195242ce7980", + "shasum": "" + }, + "require-dev": { + "henrikbjorn/phpspec-code-coverage": "^1.0", + "phpspec/phpspec": "^2.4" + }, + "time": "2016-01-26T13:27:02+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Http\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + }, + { + "name": "Joel Wurtz", + "email": "joel.wurtz@gmail.com" + } + ], + "description": "Promise used for asynchronous HTTP requests", + "homepage": "http://httplug.io", + "keywords": [ + "promise" + ] + }, { "name": "phpdocumentor/reflection-common", "version": "1.0.1", @@ -2342,17 +2754,17 @@ }, { "name": "phpunit/php-code-coverage", - "version": "6.0.8", - "version_normalized": "6.0.8.0", + "version": "6.1.4", + "version_normalized": "6.1.4.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "848f78b3309780fef7ec8c4666b7ab4e6b09b22f" + "reference": "807e6013b00af69b6c5d9ceb4282d0393dbb9d8d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/848f78b3309780fef7ec8c4666b7ab4e6b09b22f", - "reference": "848f78b3309780fef7ec8c4666b7ab4e6b09b22f", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/807e6013b00af69b6c5d9ceb4282d0393dbb9d8d", + "reference": "807e6013b00af69b6c5d9ceb4282d0393dbb9d8d", "shasum": "" }, "require": { @@ -2363,7 +2775,7 @@ "phpunit/php-text-template": "^1.2.1", "phpunit/php-token-stream": "^3.0", "sebastian/code-unit-reverse-lookup": "^1.0.1", - "sebastian/environment": "^3.1", + "sebastian/environment": "^3.1 || ^4.0", "sebastian/version": "^2.0.1", "theseer/tokenizer": "^1.1" }, @@ -2373,11 +2785,11 @@ "suggest": { "ext-xdebug": "^2.6.0" }, - "time": "2018-10-04T03:41:23+00:00", + "time": "2018-10-31T16:06:48+00:00", "type": "library", "extra": { "branch-alias": { - "dev-master": "6.0-dev" + "dev-master": "6.1-dev" } }, "installation-source": "dist", @@ -2553,17 +2965,17 @@ }, { "name": "phpunit/php-token-stream", - "version": "3.0.0", - "version_normalized": "3.0.0.0", + "version": "3.0.1", + "version_normalized": "3.0.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "21ad88bbba7c3d93530d93994e0a33cd45f02ace" + "reference": "c99e3be9d3e85f60646f152f9002d46ed7770d18" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/21ad88bbba7c3d93530d93994e0a33cd45f02ace", - "reference": "21ad88bbba7c3d93530d93994e0a33cd45f02ace", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/c99e3be9d3e85f60646f152f9002d46ed7770d18", + "reference": "c99e3be9d3e85f60646f152f9002d46ed7770d18", "shasum": "" }, "require": { @@ -2573,7 +2985,7 @@ "require-dev": { "phpunit/phpunit": "^7.0" }, - "time": "2018-02-01T13:16:43+00:00", + "time": "2018-10-30T05:52:18+00:00", "type": "library", "extra": { "branch-alias": { @@ -2604,17 +3016,17 @@ }, { "name": "phpunit/phpunit", - "version": "7.4.0", - "version_normalized": "7.4.0.0", + "version": "7.5.1", + "version_normalized": "7.5.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "f3837fa1e07758057ae06e8ddec6d06ba183f126" + "reference": "c23d78776ad415d5506e0679723cb461d71f488f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/f3837fa1e07758057ae06e8ddec6d06ba183f126", - "reference": "f3837fa1e07758057ae06e8ddec6d06ba183f126", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c23d78776ad415d5506e0679723cb461d71f488f", + "reference": "c23d78776ad415d5506e0679723cb461d71f488f", "shasum": "" }, "require": { @@ -2635,7 +3047,7 @@ "phpunit/php-timer": "^2.0", "sebastian/comparator": "^3.0", "sebastian/diff": "^3.0", - "sebastian/environment": "^3.1", + "sebastian/environment": "^4.0", "sebastian/exporter": "^3.1", "sebastian/global-state": "^2.0", "sebastian/object-enumerator": "^3.0.3", @@ -2653,14 +3065,14 @@ "ext-xdebug": "*", "phpunit/php-invoker": "^2.0" }, - "time": "2018-10-05T04:05:24+00:00", + "time": "2018-12-12T07:20:32+00:00", "bin": [ "phpunit" ], "type": "library", "extra": { "branch-alias": { - "dev-master": "7.4-dev" + "dev-master": "7.5-dev" } }, "installation-source": "dist", @@ -2845,23 +3257,23 @@ }, { "name": "psr/log", - "version": "1.0.2", - "version_normalized": "1.0.2.0", + "version": "1.1.0", + "version_normalized": "1.1.0.0", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d" + "reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", - "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", + "url": "https://api.github.com/repos/php-fig/log/zipball/6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd", + "reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd", "shasum": "" }, "require": { "php": ">=5.3.0" }, - "time": "2016-10-10T12:19:37+00:00", + "time": "2018-11-20T15:27:04+00:00", "type": "library", "extra": { "branch-alias": { @@ -2944,24 +3356,24 @@ }, { "name": "psy/psysh", - "version": "v0.9.8", - "version_normalized": "0.9.8.0", + "version": "v0.9.9", + "version_normalized": "0.9.9.0", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "ed3c32c4304e1a678a6e0f9dc11dd2d927d89555" + "reference": "9aaf29575bb8293206bb0420c1e1c87ff2ffa94e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/ed3c32c4304e1a678a6e0f9dc11dd2d927d89555", - "reference": "ed3c32c4304e1a678a6e0f9dc11dd2d927d89555", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/9aaf29575bb8293206bb0420c1e1c87ff2ffa94e", + "reference": "9aaf29575bb8293206bb0420c1e1c87ff2ffa94e", "shasum": "" }, "require": { "dnoegel/php-xdg-base-dir": "0.1", "ext-json": "*", "ext-tokenizer": "*", - "jakub-onderka/php-console-highlighter": "0.3.*", + "jakub-onderka/php-console-highlighter": "0.3.*|0.4.*", "nikic/php-parser": "~1.3|~2.0|~3.0|~4.0", "php": ">=5.4.0", "symfony/console": "~2.3.10|^2.4.2|~3.0|~4.0", @@ -2979,7 +3391,7 @@ "ext-readline": "Enables support for arrow-key history navigation, and showing and manipulating command history.", "hoa/console": "A pure PHP readline implementation. You'll want this if your PHP install doesn't already support readline or libedit." }, - "time": "2018-09-05T11:40:09+00:00", + "time": "2018-10-13T15:16:03+00:00", "bin": [ "bin/psysh" ], @@ -3018,6 +3430,48 @@ "shell" ] }, + { + "name": "ralouphie/getallheaders", + "version": "2.0.5", + "version_normalized": "2.0.5.0", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "5601c8a83fbba7ef674a7369456d12f1e0d0eafa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/5601c8a83fbba7ef674a7369456d12f1e0d0eafa", + "reference": "5601c8a83fbba7ef674a7369456d12f1e0d0eafa", + "shasum": "" + }, + "require": { + "php": ">=5.3" + }, + "require-dev": { + "phpunit/phpunit": "~3.7.0", + "satooshi/php-coveralls": ">=1.0" + }, + "time": "2016-02-11T07:05:27+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders." + }, { "name": "ramsey/uuid", "version": "3.8.0", @@ -3275,30 +3729,30 @@ }, { "name": "sebastian/environment", - "version": "3.1.0", - "version_normalized": "3.1.0.0", + "version": "4.0.1", + "version_normalized": "4.0.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "cd0871b3975fb7fc44d11314fd1ee20925fce4f5" + "reference": "febd209a219cea7b56ad799b30ebbea34b71eb8f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/cd0871b3975fb7fc44d11314fd1ee20925fce4f5", - "reference": "cd0871b3975fb7fc44d11314fd1ee20925fce4f5", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/febd209a219cea7b56ad799b30ebbea34b71eb8f", + "reference": "febd209a219cea7b56ad799b30ebbea34b71eb8f", "shasum": "" }, "require": { - "php": "^7.0" + "php": "^7.1" }, "require-dev": { - "phpunit/phpunit": "^6.1" + "phpunit/phpunit": "^7.4" }, - "time": "2017-07-01T08:51:00+00:00", + "time": "2018-11-25T09:31:21+00:00", "type": "library", "extra": { "branch-alias": { - "dev-master": "3.1.x-dev" + "dev-master": "4.0-dev" } }, "installation-source": "dist", @@ -3750,21 +4204,22 @@ }, { "name": "symfony/console", - "version": "v4.1.6", - "version_normalized": "4.1.6.0", + "version": "v4.2.1", + "version_normalized": "4.2.1.0", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "dc7122fe5f6113cfaba3b3de575d31112c9aa60b" + "reference": "4dff24e5d01e713818805c1862d2e3f901ee7dd0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/dc7122fe5f6113cfaba3b3de575d31112c9aa60b", - "reference": "dc7122fe5f6113cfaba3b3de575d31112c9aa60b", + "url": "https://api.github.com/repos/symfony/console/zipball/4dff24e5d01e713818805c1862d2e3f901ee7dd0", + "reference": "4dff24e5d01e713818805c1862d2e3f901ee7dd0", "shasum": "" }, "require": { "php": "^7.1.3", + "symfony/contracts": "^1.0", "symfony/polyfill-mbstring": "~1.0" }, "conflict": { @@ -3785,11 +4240,11 @@ "symfony/lock": "", "symfony/process": "" }, - "time": "2018-10-03T08:15:46+00:00", + "time": "2018-11-27T07:40:44+00:00", "type": "library", "extra": { "branch-alias": { - "dev-master": "4.1-dev" + "dev-master": "4.2-dev" } }, "installation-source": "dist", @@ -3819,28 +4274,98 @@ "homepage": "https://symfony.com" }, { - "name": "symfony/css-selector", - "version": "v4.1.6", - "version_normalized": "4.1.6.0", + "name": "symfony/contracts", + "version": "v1.0.2", + "version_normalized": "1.0.2.0", "source": { "type": "git", - "url": "https://github.com/symfony/css-selector.git", - "reference": "d67de79a70a27d93c92c47f37ece958bf8de4d8a" + "url": "https://github.com/symfony/contracts.git", + "reference": "1aa7ab2429c3d594dd70689604b5cf7421254cdf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/d67de79a70a27d93c92c47f37ece958bf8de4d8a", - "reference": "d67de79a70a27d93c92c47f37ece958bf8de4d8a", + "url": "https://api.github.com/repos/symfony/contracts/zipball/1aa7ab2429c3d594dd70689604b5cf7421254cdf", + "reference": "1aa7ab2429c3d594dd70689604b5cf7421254cdf", "shasum": "" }, "require": { "php": "^7.1.3" }, - "time": "2018-10-02T16:36:10+00:00", + "require-dev": { + "psr/cache": "^1.0", + "psr/container": "^1.0" + }, + "suggest": { + "psr/cache": "When using the Cache contracts", + "psr/container": "When using the Service contracts", + "symfony/cache-contracts-implementation": "", + "symfony/service-contracts-implementation": "", + "symfony/translation-contracts-implementation": "" + }, + "time": "2018-12-05T08:06:11+00:00", "type": "library", "extra": { "branch-alias": { - "dev-master": "4.1-dev" + "dev-master": "1.0-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Contracts\\": "" + }, + "exclude-from-classmap": [ + "**/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A set of abstractions extracted out of the Symfony components", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ] + }, + { + "name": "symfony/css-selector", + "version": "v4.2.1", + "version_normalized": "4.2.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/css-selector.git", + "reference": "aa9fa526ba1b2ec087ffdfb32753803d999fcfcd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/aa9fa526ba1b2ec087ffdfb32753803d999fcfcd", + "reference": "aa9fa526ba1b2ec087ffdfb32753803d999fcfcd", + "shasum": "" + }, + "require": { + "php": "^7.1.3" + }, + "time": "2018-11-11T19:52:12+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.2-dev" } }, "installation-source": "dist", @@ -3875,17 +4400,17 @@ }, { "name": "symfony/debug", - "version": "v4.1.6", - "version_normalized": "4.1.6.0", + "version": "v4.2.1", + "version_normalized": "4.2.1.0", "source": { "type": "git", "url": "https://github.com/symfony/debug.git", - "reference": "e3f76ce6198f81994e019bb2b4e533e9de1b9b90" + "reference": "e0a2b92ee0b5b934f973d90c2f58e18af109d276" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/e3f76ce6198f81994e019bb2b4e533e9de1b9b90", - "reference": "e3f76ce6198f81994e019bb2b4e533e9de1b9b90", + "url": "https://api.github.com/repos/symfony/debug/zipball/e0a2b92ee0b5b934f973d90c2f58e18af109d276", + "reference": "e0a2b92ee0b5b934f973d90c2f58e18af109d276", "shasum": "" }, "require": { @@ -3898,11 +4423,11 @@ "require-dev": { "symfony/http-kernel": "~3.4|~4.0" }, - "time": "2018-10-02T16:36:10+00:00", + "time": "2018-11-28T18:24:18+00:00", "type": "library", "extra": { "branch-alias": { - "dev-master": "4.1-dev" + "dev-master": "4.2-dev" } }, "installation-source": "dist", @@ -3933,21 +4458,22 @@ }, { "name": "symfony/event-dispatcher", - "version": "v4.1.6", - "version_normalized": "4.1.6.0", + "version": "v4.2.1", + "version_normalized": "4.2.1.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "bfb30c2ad377615a463ebbc875eba64a99f6aa3e" + "reference": "921f49c3158a276d27c0d770a5a347a3b718b328" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/bfb30c2ad377615a463ebbc875eba64a99f6aa3e", - "reference": "bfb30c2ad377615a463ebbc875eba64a99f6aa3e", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/921f49c3158a276d27c0d770a5a347a3b718b328", + "reference": "921f49c3158a276d27c0d770a5a347a3b718b328", "shasum": "" }, "require": { - "php": "^7.1.3" + "php": "^7.1.3", + "symfony/contracts": "^1.0" }, "conflict": { "symfony/dependency-injection": "<3.4" @@ -3963,11 +4489,11 @@ "symfony/dependency-injection": "", "symfony/http-kernel": "" }, - "time": "2018-07-26T09:10:45+00:00", + "time": "2018-12-01T08:52:38+00:00", "type": "library", "extra": { "branch-alias": { - "dev-master": "4.1-dev" + "dev-master": "4.2-dev" } }, "installation-source": "dist", @@ -3998,27 +4524,27 @@ }, { "name": "symfony/finder", - "version": "v4.1.6", - "version_normalized": "4.1.6.0", + "version": "v4.2.1", + "version_normalized": "4.2.1.0", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "1f17195b44543017a9c9b2d437c670627e96ad06" + "reference": "e53d477d7b5c4982d0e1bfd2298dbee63d01441d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/1f17195b44543017a9c9b2d437c670627e96ad06", - "reference": "1f17195b44543017a9c9b2d437c670627e96ad06", + "url": "https://api.github.com/repos/symfony/finder/zipball/e53d477d7b5c4982d0e1bfd2298dbee63d01441d", + "reference": "e53d477d7b5c4982d0e1bfd2298dbee63d01441d", "shasum": "" }, "require": { "php": "^7.1.3" }, - "time": "2018-10-03T08:47:56+00:00", + "time": "2018-11-11T19:52:12+00:00", "type": "library", "extra": { "branch-alias": { - "dev-master": "4.1-dev" + "dev-master": "4.2-dev" } }, "installation-source": "dist", @@ -4049,17 +4575,17 @@ }, { "name": "symfony/http-foundation", - "version": "v4.1.6", - "version_normalized": "4.1.6.0", + "version": "v4.2.1", + "version_normalized": "4.2.1.0", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "d528136617ff24f530e70df9605acc1b788b08d4" + "reference": "1b31f3017fadd8cb05cf2c8aebdbf3b12a943851" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/d528136617ff24f530e70df9605acc1b788b08d4", - "reference": "d528136617ff24f530e70df9605acc1b788b08d4", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/1b31f3017fadd8cb05cf2c8aebdbf3b12a943851", + "reference": "1b31f3017fadd8cb05cf2c8aebdbf3b12a943851", "shasum": "" }, "require": { @@ -4070,11 +4596,11 @@ "predis/predis": "~1.0", "symfony/expression-language": "~3.4|~4.0" }, - "time": "2018-10-03T08:48:45+00:00", + "time": "2018-11-26T10:55:26+00:00", "type": "library", "extra": { "branch-alias": { - "dev-master": "4.1-dev" + "dev-master": "4.2-dev" } }, "installation-source": "dist", @@ -4105,22 +4631,23 @@ }, { "name": "symfony/http-kernel", - "version": "v4.1.6", - "version_normalized": "4.1.6.0", + "version": "v4.2.1", + "version_normalized": "4.2.1.0", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "f5e7c15a5d010be0e16ce798594c5960451d4220" + "reference": "b39ceffc0388232c309cbde3a7c3685f2ec0a624" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/f5e7c15a5d010be0e16ce798594c5960451d4220", - "reference": "f5e7c15a5d010be0e16ce798594c5960451d4220", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/b39ceffc0388232c309cbde3a7c3685f2ec0a624", + "reference": "b39ceffc0388232c309cbde3a7c3685f2ec0a624", "shasum": "" }, "require": { "php": "^7.1.3", "psr/log": "~1.0", + "symfony/contracts": "^1.0.2", "symfony/debug": "~3.4|~4.0", "symfony/event-dispatcher": "~4.1", "symfony/http-foundation": "^4.1.1", @@ -4128,7 +4655,8 @@ }, "conflict": { "symfony/config": "<3.4", - "symfony/dependency-injection": "<4.1", + "symfony/dependency-injection": "<4.2", + "symfony/translation": "<4.2", "symfony/var-dumper": "<4.1.1", "twig/twig": "<1.34|<2.4,>=2" }, @@ -4141,7 +4669,7 @@ "symfony/config": "~3.4|~4.0", "symfony/console": "~3.4|~4.0", "symfony/css-selector": "~3.4|~4.0", - "symfony/dependency-injection": "^4.1", + "symfony/dependency-injection": "^4.2", "symfony/dom-crawler": "~3.4|~4.0", "symfony/expression-language": "~3.4|~4.0", "symfony/finder": "~3.4|~4.0", @@ -4149,7 +4677,7 @@ "symfony/routing": "~3.4|~4.0", "symfony/stopwatch": "~3.4|~4.0", "symfony/templating": "~3.4|~4.0", - "symfony/translation": "~3.4|~4.0", + "symfony/translation": "~4.2", "symfony/var-dumper": "^4.1.1" }, "suggest": { @@ -4159,11 +4687,11 @@ "symfony/dependency-injection": "", "symfony/var-dumper": "" }, - "time": "2018-10-03T12:53:38+00:00", + "time": "2018-12-06T17:39:52+00:00", "type": "library", "extra": { "branch-alias": { - "dev-master": "4.1-dev" + "dev-master": "4.2-dev" } }, "installation-source": "dist", @@ -4194,8 +4722,8 @@ }, { "name": "symfony/polyfill-ctype", - "version": "v1.9.0", - "version_normalized": "1.9.0.0", + "version": "v1.10.0", + "version_normalized": "1.10.0.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", @@ -4254,17 +4782,17 @@ }, { "name": "symfony/polyfill-mbstring", - "version": "v1.9.0", - "version_normalized": "1.9.0.0", + "version": "v1.10.0", + "version_normalized": "1.10.0.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "d0cd638f4634c16d8df4508e847f14e9e43168b8" + "reference": "c79c051f5b3a46be09205c73b80b346e4153e494" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/d0cd638f4634c16d8df4508e847f14e9e43168b8", - "reference": "d0cd638f4634c16d8df4508e847f14e9e43168b8", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/c79c051f5b3a46be09205c73b80b346e4153e494", + "reference": "c79c051f5b3a46be09205c73b80b346e4153e494", "shasum": "" }, "require": { @@ -4273,7 +4801,7 @@ "suggest": { "ext-mbstring": "For best performance" }, - "time": "2018-08-06T14:22:27+00:00", + "time": "2018-09-21T13:07:52+00:00", "type": "library", "extra": { "branch-alias": { @@ -4315,23 +4843,23 @@ }, { "name": "symfony/polyfill-php72", - "version": "v1.9.0", - "version_normalized": "1.9.0.0", + "version": "v1.10.0", + "version_normalized": "1.10.0.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "95c50420b0baed23852452a7f0c7b527303ed5ae" + "reference": "9050816e2ca34a8e916c3a0ae8b9c2fccf68b631" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/95c50420b0baed23852452a7f0c7b527303ed5ae", - "reference": "95c50420b0baed23852452a7f0c7b527303ed5ae", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/9050816e2ca34a8e916c3a0ae8b9c2fccf68b631", + "reference": "9050816e2ca34a8e916c3a0ae8b9c2fccf68b631", "shasum": "" }, "require": { "php": ">=5.3.3" }, - "time": "2018-08-06T14:22:27+00:00", + "time": "2018-09-21T13:07:52+00:00", "type": "library", "extra": { "branch-alias": { @@ -4372,27 +4900,27 @@ }, { "name": "symfony/process", - "version": "v4.1.6", - "version_normalized": "4.1.6.0", + "version": "v4.2.1", + "version_normalized": "4.2.1.0", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "ee33c0322a8fee0855afcc11fff81e6b1011b529" + "reference": "2b341009ccec76837a7f46f59641b431e4d4c2b0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/ee33c0322a8fee0855afcc11fff81e6b1011b529", - "reference": "ee33c0322a8fee0855afcc11fff81e6b1011b529", + "url": "https://api.github.com/repos/symfony/process/zipball/2b341009ccec76837a7f46f59641b431e4d4c2b0", + "reference": "2b341009ccec76837a7f46f59641b431e4d4c2b0", "shasum": "" }, "require": { "php": "^7.1.3" }, - "time": "2018-10-02T12:40:59+00:00", + "time": "2018-11-20T16:22:05+00:00", "type": "library", "extra": { "branch-alias": { - "dev-master": "4.1-dev" + "dev-master": "4.2-dev" } }, "installation-source": "dist", @@ -4423,31 +4951,31 @@ }, { "name": "symfony/routing", - "version": "v4.1.6", - "version_normalized": "4.1.6.0", + "version": "v4.2.1", + "version_normalized": "4.2.1.0", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "537803f0bdfede36b9acef052d2e4d447d9fa0e9" + "reference": "649460207e77da6c545326c7f53618d23ad2c866" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/537803f0bdfede36b9acef052d2e4d447d9fa0e9", - "reference": "537803f0bdfede36b9acef052d2e4d447d9fa0e9", + "url": "https://api.github.com/repos/symfony/routing/zipball/649460207e77da6c545326c7f53618d23ad2c866", + "reference": "649460207e77da6c545326c7f53618d23ad2c866", "shasum": "" }, "require": { "php": "^7.1.3" }, "conflict": { - "symfony/config": "<3.4", + "symfony/config": "<4.2", "symfony/dependency-injection": "<3.4", "symfony/yaml": "<3.4" }, "require-dev": { "doctrine/annotations": "~1.0", "psr/log": "~1.0", - "symfony/config": "~3.4|~4.0", + "symfony/config": "~4.2", "symfony/dependency-injection": "~3.4|~4.0", "symfony/expression-language": "~3.4|~4.0", "symfony/http-foundation": "~3.4|~4.0", @@ -4461,11 +4989,11 @@ "symfony/http-foundation": "For using a Symfony Request object", "symfony/yaml": "For using the YAML loader" }, - "time": "2018-10-02T12:40:59+00:00", + "time": "2018-12-03T22:08:12+00:00", "type": "library", "extra": { "branch-alias": { - "dev-master": "4.1-dev" + "dev-master": "4.2-dev" } }, "installation-source": "dist", @@ -4502,21 +5030,22 @@ }, { "name": "symfony/translation", - "version": "v4.1.6", - "version_normalized": "4.1.6.0", + "version": "v4.2.1", + "version_normalized": "4.2.1.0", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "9f0b61e339160a466ebcde167a6c5521c810e304" + "reference": "c0e2191e9bed845946ab3d99767513b56ca7dcd6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/9f0b61e339160a466ebcde167a6c5521c810e304", - "reference": "9f0b61e339160a466ebcde167a6c5521c810e304", + "url": "https://api.github.com/repos/symfony/translation/zipball/c0e2191e9bed845946ab3d99767513b56ca7dcd6", + "reference": "c0e2191e9bed845946ab3d99767513b56ca7dcd6", "shasum": "" }, "require": { "php": "^7.1.3", + "symfony/contracts": "^1.0.2", "symfony/polyfill-mbstring": "~1.0" }, "conflict": { @@ -4524,6 +5053,9 @@ "symfony/dependency-injection": "<3.4", "symfony/yaml": "<3.4" }, + "provide": { + "symfony/translation-contracts-implementation": "1.0" + }, "require-dev": { "psr/log": "~1.0", "symfony/config": "~3.4|~4.0", @@ -4538,11 +5070,11 @@ "symfony/config": "", "symfony/yaml": "" }, - "time": "2018-10-02T16:36:10+00:00", + "time": "2018-12-06T10:45:32+00:00", "type": "library", "extra": { "branch-alias": { - "dev-master": "4.1-dev" + "dev-master": "4.2-dev" } }, "installation-source": "dist", @@ -4573,17 +5105,17 @@ }, { "name": "symfony/var-dumper", - "version": "v4.1.6", - "version_normalized": "4.1.6.0", + "version": "v4.2.1", + "version_normalized": "4.2.1.0", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "60319b45653580b0cdacca499344577d87732f16" + "reference": "db61258540350725f4beb6b84006e32398acd120" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/60319b45653580b0cdacca499344577d87732f16", - "reference": "60319b45653580b0cdacca499344577d87732f16", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/db61258540350725f4beb6b84006e32398acd120", + "reference": "db61258540350725f4beb6b84006e32398acd120", "shasum": "" }, "require": { @@ -4605,14 +5137,14 @@ "ext-intl": "To show region name in time zone dump", "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" }, - "time": "2018-10-02T16:36:10+00:00", + "time": "2018-11-25T12:50:42+00:00", "bin": [ "Resources/bin/var-dump-server" ], "type": "library", "extra": { "branch-alias": { - "dev-master": "4.1-dev" + "dev-master": "4.2-dev" } }, "installation-source": "dist", @@ -4895,5 +5427,71 @@ "check", "validate" ] + }, + { + "name": "zendframework/zend-diactoros", + "version": "1.8.6", + "version_normalized": "1.8.6.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-diactoros.git", + "reference": "20da13beba0dde8fb648be3cc19765732790f46e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-diactoros/zipball/20da13beba0dde8fb648be3cc19765732790f46e", + "reference": "20da13beba0dde8fb648be3cc19765732790f46e", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0", + "psr/http-message": "^1.0" + }, + "provide": { + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "ext-dom": "*", + "ext-libxml": "*", + "php-http/psr7-integration-tests": "dev-master", + "phpunit/phpunit": "^5.7.16 || ^6.0.8 || ^7.2.7", + "zendframework/zend-coding-standard": "~1.0" + }, + "time": "2018-09-05T19:29:37+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.8.x-dev", + "dev-develop": "1.9.x-dev", + "dev-release-2.0": "2.0.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "src/functions/create_uploaded_file.php", + "src/functions/marshal_headers_from_sapi.php", + "src/functions/marshal_method_from_sapi.php", + "src/functions/marshal_protocol_version_from_sapi.php", + "src/functions/marshal_uri_from_sapi.php", + "src/functions/normalize_server.php", + "src/functions/normalize_uploaded_files.php", + "src/functions/parse_cookie_header.php" + ], + "psr-4": { + "Zend\\Diactoros\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "description": "PSR HTTP Message implementations", + "homepage": "https://github.com/zendframework/zend-diactoros", + "keywords": [ + "http", + "psr", + "psr-7" + ] } ] diff --git a/vendor/egulias/email-validator/EmailValidator/Validation/MultipleValidationWithAnd.php b/vendor/egulias/email-validator/EmailValidator/Validation/MultipleValidationWithAnd.php index 43fa42a64..ce161ac84 100644 --- a/vendor/egulias/email-validator/EmailValidator/Validation/MultipleValidationWithAnd.php +++ b/vendor/egulias/email-validator/EmailValidator/Validation/MultipleValidationWithAnd.php @@ -62,7 +62,8 @@ class MultipleValidationWithAnd implements EmailValidation $errors = []; foreach ($this->validations as $validation) { $emailLexer->reset(); - $result = $result && $validation->isValid($email, $emailLexer); + $validationResult = $validation->isValid($email, $emailLexer); + $result = $result && $validationResult; $this->warnings = array_merge($this->warnings, $validation->getWarnings()); $errors = $this->addNewError($validation->getError(), $errors); diff --git a/vendor/egulias/email-validator/README.md b/vendor/egulias/email-validator/README.md index 8fcd2a6fe..008669c8b 100644 --- a/vendor/egulias/email-validator/README.md +++ b/vendor/egulias/email-validator/README.md @@ -1,12 +1,15 @@ # EmailValidator [![Build Status](https://travis-ci.org/egulias/EmailValidator.png?branch=master)](https://travis-ci.org/egulias/EmailValidator) [![Coverage Status](https://coveralls.io/repos/egulias/EmailValidator/badge.png?branch=master)](https://coveralls.io/r/egulias/EmailValidator?branch=master) [![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/egulias/EmailValidator/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/egulias/EmailValidator/?branch=master) [![SensioLabsInsight](https://insight.sensiolabs.com/projects/22ba6692-9c02-42e5-a65d-1c5696bfffc6/small.png)](https://insight.sensiolabs.com/projects/22ba6692-9c02-42e5-a65d-1c5696bfffc6) ============================= -With the help of [PHPStorm](https://www.jetbrains.com/phpstorm/) +## Suported RFCs ## +This library aims to support: + +RFC 5321, 5322, 6530, 6531, 6532. ## Requirements ## * [Composer](https://getcomposer.org) is required for installation - * [Spoofchecking](https://github.com/egulias/EmailValidator/blob/master/EmailValidator/Validation/SpoofCheckValidation.php) and [DNSCheckValidation](https://github.com/egulias/EmailValidator/blob/master/EmailValidator/Validation/DNSCheckValidation.php) validation requires that your PHP system have the [PHP Internationalization Libraries](https://php.net/manual/en/book.intl.php) (also known as PHP Intl) + * [Spoofchecking](https://github.com/egulias/EmailValidator/blob/master/EmailValidator/Validation/SpoofCheckValidation.php) and [DNSCheckValidation](https://github.com/egulias/EmailValidator/blob/master/EmailValidator/Validation/DNSCheckValidation.php) validation requires that your PHP system has the [PHP Internationalization Libraries](https://php.net/manual/en/book.intl.php) (also known as PHP Intl) ## Installation ## diff --git a/vendor/filp/whoops/CHANGELOG.md b/vendor/filp/whoops/CHANGELOG.md index d7693f0f4..1a872a1c6 100644 --- a/vendor/filp/whoops/CHANGELOG.md +++ b/vendor/filp/whoops/CHANGELOG.md @@ -1,3 +1,11 @@ +# 2.3.1 + +* Prevent exception in Whoops when caught exception frame is not related to real file + +# 2.3.0 + +* Show previous exception messages. + # 2.2.0 * Support PHP 7.2 diff --git a/vendor/filp/whoops/src/Whoops/Exception/Frame.php b/vendor/filp/whoops/src/Whoops/Exception/Frame.php index 4383583ce..0aad54685 100644 --- a/vendor/filp/whoops/src/Whoops/Exception/Frame.php +++ b/vendor/filp/whoops/src/Whoops/Exception/Frame.php @@ -112,15 +112,10 @@ class Frame implements Serializable public function getFileContents() { if ($this->fileContentsCache === null && $filePath = $this->getFile()) { - // Leave the stage early when 'Unknown' is passed + // Leave the stage early when 'Unknown' or '[internal]' is passed // this would otherwise raise an exception when // open_basedir is enabled. - if ($filePath === "Unknown") { - return null; - } - - // Return null if the file doesn't actually exist. - if (!is_file($filePath)) { + if ($filePath === "Unknown" || $filePath === '[internal]') { return null; } diff --git a/vendor/filp/whoops/src/Whoops/Exception/Inspector.php b/vendor/filp/whoops/src/Whoops/Exception/Inspector.php index c88323bef..96cb9b5ce 100644 --- a/vendor/filp/whoops/src/Whoops/Exception/Inspector.php +++ b/vendor/filp/whoops/src/Whoops/Exception/Inspector.php @@ -25,6 +25,11 @@ class Inspector */ private $previousExceptionInspector; + /** + * @var \Throwable[] + */ + private $previousExceptions; + /** * @param \Throwable $exception The exception to inspect */ @@ -57,6 +62,28 @@ class Inspector return $this->extractDocrefUrl($this->exception->getMessage())['message']; } + /** + * @return string[] + */ + public function getPreviousExceptionMessages() + { + return array_map(function ($prev) { + /** @var \Throwable $prev */ + return $this->extractDocrefUrl($prev->getMessage())['message']; + }, $this->getPreviousExceptions()); + } + + /** + * @return int[] + */ + public function getPreviousExceptionCodes() + { + return array_map(function ($prev) { + /** @var \Throwable $prev */ + return $prev->getCode(); + }, $this->getPreviousExceptions()); + } + /** * Returns a url to the php-manual related to the underlying error - when available. * @@ -117,6 +144,26 @@ class Inspector return $this->previousExceptionInspector; } + + /** + * Returns an array of all previous exceptions for this inspector's exception + * @return \Throwable[] + */ + public function getPreviousExceptions() + { + if ($this->previousExceptions === null) { + $this->previousExceptions = []; + + $prev = $this->exception->getPrevious(); + while ($prev !== null) { + $this->previousExceptions[] = $prev; + $prev = $prev->getPrevious(); + } + } + + return $this->previousExceptions; + } + /** * Returns an iterator for the inspected exception's * frames. @@ -188,7 +235,7 @@ class Inspector * * If xdebug is installed * - * @param \Throwable $exception + * @param \Throwable $e * @return array */ protected function getTrace($e) diff --git a/vendor/filp/whoops/src/Whoops/Handler/PrettyPageHandler.php b/vendor/filp/whoops/src/Whoops/Handler/PrettyPageHandler.php index 99ebe2bcb..9f0b655c9 100644 --- a/vendor/filp/whoops/src/Whoops/Handler/PrettyPageHandler.php +++ b/vendor/filp/whoops/src/Whoops/Handler/PrettyPageHandler.php @@ -205,16 +205,18 @@ class PrettyPageHandler extends Handler "frame_code" => $this->getResource("views/frame_code.html.php"), "env_details" => $this->getResource("views/env_details.html.php"), - "title" => $this->getPageTitle(), - "name" => explode("\\", $inspector->getExceptionName()), - "message" => $inspector->getExceptionMessage(), - "docref_url" => $inspector->getExceptionDocrefUrl(), - "code" => $code, - "plain_exception" => Formatter::formatExceptionPlain($inspector), - "frames" => $frames, - "has_frames" => !!count($frames), - "handler" => $this, - "handlers" => $this->getRun()->getHandlers(), + "title" => $this->getPageTitle(), + "name" => explode("\\", $inspector->getExceptionName()), + "message" => $inspector->getExceptionMessage(), + "previousMessages" => $inspector->getPreviousExceptionMessages(), + "docref_url" => $inspector->getExceptionDocrefUrl(), + "code" => $code, + "previousCodes" => $inspector->getPreviousExceptionCodes(), + "plain_exception" => Formatter::formatExceptionPlain($inspector), + "frames" => $frames, + "has_frames" => !!count($frames), + "handler" => $this, + "handlers" => $this->getRun()->getHandlers(), "active_frames_tab" => count($frames) && $frames->offsetGet(0)->isApplication() ? 'application' : 'all', "has_frames_tabs" => $this->getApplicationPaths(), diff --git a/vendor/filp/whoops/src/Whoops/Resources/css/whoops.base.css b/vendor/filp/whoops/src/Whoops/Resources/css/whoops.base.css index 8c08bbc9a..b86e2ae8d 100644 --- a/vendor/filp/whoops/src/Whoops/Resources/css/whoops.base.css +++ b/vendor/filp/whoops/src/Whoops/Resources/css/whoops.base.css @@ -52,7 +52,7 @@ header { color: #bebebe; font-size: 14px; } - .exc-title-primary { + .exc-title-primary, .exc-title-secondary { color: #e95353; } @@ -70,6 +70,25 @@ header { font-weight: 300; } +.prev-exc-title { + margin: 10px 0; +} + +.prev-exc-title + ul { + margin: 0; + padding: 0 0 0 20px; + line-height: 12px; +} + +.prev-exc-title + ul li { + font: 12px "Helvetica Neue", helvetica, arial, sans-serif; +} + +.prev-exc-title + ul li .prev-exc-code { + display: inline-block; + color: #bebebe; +} + .details-container { left: 30%; width: 70%; diff --git a/vendor/filp/whoops/src/Whoops/Resources/views/frame_code.html.php b/vendor/filp/whoops/src/Whoops/Resources/views/frame_code.html.php index 534f7c344..b7717d7a3 100644 --- a/vendor/filp/whoops/src/Whoops/Resources/views/frame_code.html.php +++ b/vendor/filp/whoops/src/Whoops/Resources/views/frame_code.html.php @@ -8,8 +8,8 @@
getFile(); ?> getEditorHref($filePath, (int) $line)): ?> - Open: getEditorAjax($filePath, (int) $line) ? ' data-ajax' : '') ?>> + Open: breakOnDelimiter('/', $tpl->escape($filePath ?: '<#unknown>')) ?> diff --git a/vendor/filp/whoops/src/Whoops/Resources/views/header.html.php b/vendor/filp/whoops/src/Whoops/Resources/views/header.html.php index 11e1c1dbe..aefbeac08 100644 --- a/vendor/filp/whoops/src/Whoops/Resources/views/header.html.php +++ b/vendor/filp/whoops/src/Whoops/Resources/views/header.html.php @@ -15,6 +15,25 @@
escape($message) ?> + + + +
+ Previous exceptions +
+ + + + + + No message diff --git a/vendor/guzzlehttp/psr7/.editorconfig b/vendor/guzzlehttp/psr7/.editorconfig new file mode 100644 index 000000000..677e36e29 --- /dev/null +++ b/vendor/guzzlehttp/psr7/.editorconfig @@ -0,0 +1,9 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 4 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true diff --git a/vendor/guzzlehttp/psr7/CHANGELOG.md b/vendor/guzzlehttp/psr7/CHANGELOG.md index 5c252b3a2..27b65f095 100644 --- a/vendor/guzzlehttp/psr7/CHANGELOG.md +++ b/vendor/guzzlehttp/psr7/CHANGELOG.md @@ -1,32 +1,82 @@ -# CHANGELOG +# Change Log -## 1.4.2 - 2017-03-20 -* Reverted BC break to `Uri::resolve` and `Uri::removeDotSegments` by removing +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) +and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). + + +## [Unreleased] + + +## [1.5.2] - 2018-12-04 + +### Fixed + +- Check body size when getting the message summary + + +## [1.5.1] - 2018-12-04 + +### Fixed + +- Get the summary of a body only if it is readable + + +## [1.5.0] - 2018-12-03 + +### Added + +- Response first-line to response string exception (fixes #145) +- A test for #129 behavior +- `get_message_body_summary` function in order to get the message summary +- `3gp` and `mkv` mime types + +### Changed + +- Clarify exception message when stream is detached + +### Deprecated + +- Deprecated parsing folded header lines as per RFC 7230 + +### Fixed + +- Fix `AppendStream::detach` to not close streams +- `InflateStream` preserves `isSeekable` attribute of the underlying stream +- `ServerRequest::getUriFromGlobals` to support URLs in query parameters + + +Several other fixes and improvements. + + +## [1.4.2] - 2017-03-20 + +### Fixed + +- Reverted BC break to `Uri::resolve` and `Uri::removeDotSegments` by removing calls to `trigger_error` when deprecated methods are invoked. -## 1.4.1 - 2017-02-27 -* Reverted BC break by reintroducing behavior to automagically fix a URI with a +## [1.4.1] - 2017-02-27 + +### Added + +- Rriggering of silenced deprecation warnings. + +### Fixed + +- Reverted BC break by reintroducing behavior to automagically fix a URI with a relative path and an authority by adding a leading slash to the path. It's only deprecated now. -* Added triggering of silenced deprecation warnings. -## 1.4.0 - 2017-02-21 -* Fix `Stream::read` when length parameter <= 0. -* `copy_to_stream` reads bytes in chunks instead of `maxLen` into memory. -* Fix `ServerRequest::getUriFromGlobals` when `Host` header contains port. -* Ensure `ServerRequest::getUriFromGlobals` returns a URI in absolute form. -* Allow `parse_response` to parse a response without delimiting space and reason. -* Ensure each URI modification results in a valid URI according to PSR-7 discussions. - Invalid modifications will throw an exception instead of returning a wrong URI or - doing some magic. - - `(new Uri)->withPath('foo')->withHost('example.com')` will throw an exception - because the path of a URI with an authority must start with a slash "/" or be empty - - `(new Uri())->withScheme('http')` will return `'http://localhost'` -* Fix compatibility of URIs with `file` scheme and empty host. -* Added common URI utility methods based on RFC 3986 (see documentation in the readme): +## [1.4.0] - 2017-02-21 + +### Added + +- Added common URI utility methods based on RFC 3986 (see documentation in the readme): - `Uri::isDefaultPort` - `Uri::isAbsolute` - `Uri::isNetworkPathReference` @@ -37,69 +87,117 @@ - `UriNormalizer::normalize` - `UriNormalizer::isEquivalent` - `UriResolver::relativize` -* Deprecated `Uri::resolve` in favor of `UriResolver::resolve` -* Deprecated `Uri::removeDotSegments` in favor of `UriResolver::removeDotSegments` -## 1.3.1 - 2016-06-25 +### Changed -* Fix `Uri::__toString` for network path references, e.g. `//example.org`. -* Fix missing lowercase normalization for host. -* Fix handling of URI components in case they are `'0'` in a lot of places, +- Ensure `ServerRequest::getUriFromGlobals` returns a URI in absolute form. +- Allow `parse_response` to parse a response without delimiting space and reason. +- Ensure each URI modification results in a valid URI according to PSR-7 discussions. + Invalid modifications will throw an exception instead of returning a wrong URI or + doing some magic. + - `(new Uri)->withPath('foo')->withHost('example.com')` will throw an exception + because the path of a URI with an authority must start with a slash "/" or be empty + - `(new Uri())->withScheme('http')` will return `'http://localhost'` + +### Deprecated + +- `Uri::resolve` in favor of `UriResolver::resolve` +- `Uri::removeDotSegments` in favor of `UriResolver::removeDotSegments` + +### Fixed + +- `Stream::read` when length parameter <= 0. +- `copy_to_stream` reads bytes in chunks instead of `maxLen` into memory. +- `ServerRequest::getUriFromGlobals` when `Host` header contains port. +- Compatibility of URIs with `file` scheme and empty host. + + +## [1.3.1] - 2016-06-25 + +### Fixed + +- `Uri::__toString` for network path references, e.g. `//example.org`. +- Missing lowercase normalization for host. +- Handling of URI components in case they are `'0'` in a lot of places, e.g. as a user info password. -* Fix `Uri::withAddedHeader` to correctly merge headers with different case. -* Fix trimming of header values in `Uri::withAddedHeader`. Header values may +- `Uri::withAddedHeader` to correctly merge headers with different case. +- Trimming of header values in `Uri::withAddedHeader`. Header values may be surrounded by whitespace which should be ignored according to RFC 7230 Section 3.2.4. This does not apply to header names. -* Fix `Uri::withAddedHeader` with an array of header values. -* Fix `Uri::resolve` when base path has no slash and handling of fragment. -* Fix handling of encoding in `Uri::with(out)QueryValue` so one can pass the +- `Uri::withAddedHeader` with an array of header values. +- `Uri::resolve` when base path has no slash and handling of fragment. +- Handling of encoding in `Uri::with(out)QueryValue` so one can pass the key/value both in encoded as well as decoded form to those methods. This is consistent with withPath, withQuery etc. -* Fix `ServerRequest::withoutAttribute` when attribute value is null. +- `ServerRequest::withoutAttribute` when attribute value is null. -## 1.3.0 - 2016-04-13 -* Added remaining interfaces needed for full PSR7 compatibility +## [1.3.0] - 2016-04-13 + +### Added + +- Remaining interfaces needed for full PSR7 compatibility (ServerRequestInterface, UploadedFileInterface, etc.). -* Added support for stream_for from scalars. -* Can now extend Uri. -* Fixed a bug in validating request methods by making it more permissive. +- Support for stream_for from scalars. -## 1.2.3 - 2016-02-18 +### Changed -* Fixed support in `GuzzleHttp\Psr7\CachingStream` for seeking forward on remote +- Can now extend Uri. + +### Fixed +- A bug in validating request methods by making it more permissive. + + +## [1.2.3] - 2016-02-18 + +### Fixed + +- Support in `GuzzleHttp\Psr7\CachingStream` for seeking forward on remote streams, which can sometimes return fewer bytes than requested with `fread`. -* Fixed handling of gzipped responses with FNAME headers. +- Handling of gzipped responses with FNAME headers. -## 1.2.2 - 2016-01-22 -* Added support for URIs without any authority. -* Added support for HTTP 451 'Unavailable For Legal Reasons.' -* Added support for using '0' as a filename. -* Added support for including non-standard ports in Host headers. +## [1.2.2] - 2016-01-22 -## 1.2.1 - 2015-11-02 +### Added -* Now supporting negative offsets when seeking to SEEK_END. +- Support for URIs without any authority. +- Support for HTTP 451 'Unavailable For Legal Reasons.' +- Support for using '0' as a filename. +- Support for including non-standard ports in Host headers. -## 1.2.0 - 2015-08-15 -* Body as `"0"` is now properly added to a response. -* Now allowing forward seeking in CachingStream. -* Now properly parsing HTTP requests that contain proxy targets in +## [1.2.1] - 2015-11-02 + +### Changes + +- Now supporting negative offsets when seeking to SEEK_END. + + +## [1.2.0] - 2015-08-15 + +### Changed + +- Body as `"0"` is now properly added to a response. +- Now allowing forward seeking in CachingStream. +- Now properly parsing HTTP requests that contain proxy targets in `parse_request`. -* functions.php is now conditionally required. -* user-info is no longer dropped when resolving URIs. +- functions.php is now conditionally required. +- user-info is no longer dropped when resolving URIs. -## 1.1.0 - 2015-06-24 -* URIs can now be relative. -* `multipart/form-data` headers are now overridden case-insensitively. -* URI paths no longer encode the following characters because they are allowed +## [1.1.0] - 2015-06-24 + +### Changed + +- URIs can now be relative. +- `multipart/form-data` headers are now overridden case-insensitively. +- URI paths no longer encode the following characters because they are allowed in URIs: "(", ")", "*", "!", "'" -* A port is no longer added to a URI when the scheme is missing and no port is +- A port is no longer added to a URI when the scheme is missing and no port is present. + ## 1.0.0 - 2015-05-19 Initial release. @@ -108,3 +206,20 @@ Currently unsupported: - `Psr\Http\Message\ServerRequestInterface` - `Psr\Http\Message\UploadedFileInterface` + + + +[Unreleased]: https://github.com/guzzle/psr7/compare/1.5.2...HEAD +[1.5.2]: https://github.com/guzzle/psr7/compare/1.5.1...1.5.2 +[1.5.1]: https://github.com/guzzle/psr7/compare/1.5.0...1.5.1 +[1.5.0]: https://github.com/guzzle/psr7/compare/1.4.2...1.5.0 +[1.4.2]: https://github.com/guzzle/psr7/compare/1.4.1...1.4.2 +[1.4.1]: https://github.com/guzzle/psr7/compare/1.4.0...1.4.1 +[1.4.0]: https://github.com/guzzle/psr7/compare/1.3.1...1.4.0 +[1.3.1]: https://github.com/guzzle/psr7/compare/1.3.0...1.3.1 +[1.3.0]: https://github.com/guzzle/psr7/compare/1.2.3...1.3.0 +[1.2.3]: https://github.com/guzzle/psr7/compare/1.2.2...1.2.3 +[1.2.2]: https://github.com/guzzle/psr7/compare/1.2.1...1.2.2 +[1.2.1]: https://github.com/guzzle/psr7/compare/1.2.0...1.2.1 +[1.2.0]: https://github.com/guzzle/psr7/compare/1.1.0...1.2.0 +[1.1.0]: https://github.com/guzzle/psr7/compare/1.0.0...1.1.0 diff --git a/vendor/guzzlehttp/psr7/README.md b/vendor/guzzlehttp/psr7/README.md index 16499358e..c60a6a38d 100644 --- a/vendor/guzzlehttp/psr7/README.md +++ b/vendor/guzzlehttp/psr7/README.md @@ -372,7 +372,7 @@ This method accepts the following `$resource` types: $stream = GuzzleHttp\Psr7\stream_for('foo'); $stream = GuzzleHttp\Psr7\stream_for(fopen('/path/to/file', 'r')); -$generator function ($bytes) { +$generator = function ($bytes) { for ($i = 0; $i < $bytes; $i++) { yield ' '; } @@ -606,6 +606,12 @@ Creates a new URI with a specific query string value. Any existing query string provided key are removed and replaced with the given key value pair. A value of null will set the query string key without a value, e.g. "key" instead of "key=value". +### `GuzzleHttp\Psr7\Uri::withQueryValues` + +`public static function withQueryValues(UriInterface $uri, array $keyValueArray): UriInterface` + +Creates a new URI with multiple query string values. It has the same behavior as `withQueryValue()` but for an +associative array of key => value. ### `GuzzleHttp\Psr7\Uri::withoutQueryValue` diff --git a/vendor/guzzlehttp/psr7/composer.json b/vendor/guzzlehttp/psr7/composer.json index b1c5a90ba..2add153ec 100644 --- a/vendor/guzzlehttp/psr7/composer.json +++ b/vendor/guzzlehttp/psr7/composer.json @@ -2,7 +2,7 @@ "name": "guzzlehttp/psr7", "type": "library", "description": "PSR-7 message implementation that also provides common utility methods", - "keywords": ["request", "response", "message", "stream", "http", "uri", "url"], + "keywords": ["request", "response", "message", "stream", "http", "uri", "url", "psr-7"], "license": "MIT", "authors": [ { @@ -17,10 +17,11 @@ ], "require": { "php": ">=5.4.0", - "psr/http-message": "~1.0" + "psr/http-message": "~1.0", + "ralouphie/getallheaders": "^2.0.5" }, "require-dev": { - "phpunit/phpunit": "~4.0" + "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8" }, "provide": { "psr/http-message-implementation": "1.0" @@ -31,9 +32,14 @@ }, "files": ["src/functions_include.php"] }, + "autoload-dev": { + "psr-4": { + "GuzzleHttp\\Tests\\Psr7\\": "tests/" + } + }, "extra": { "branch-alias": { - "dev-master": "1.4-dev" + "dev-master": "1.5-dev" } } } diff --git a/vendor/guzzlehttp/psr7/src/AppendStream.php b/vendor/guzzlehttp/psr7/src/AppendStream.php index 23039fd79..472a0d61b 100644 --- a/vendor/guzzlehttp/psr7/src/AppendStream.php +++ b/vendor/guzzlehttp/psr7/src/AppendStream.php @@ -16,7 +16,6 @@ class AppendStream implements StreamInterface private $seekable = true; private $current = 0; private $pos = 0; - private $detached = false; /** * @param StreamInterface[] $streams Streams to decorate. Each stream must @@ -73,6 +72,7 @@ class AppendStream implements StreamInterface public function close() { $this->pos = $this->current = 0; + $this->seekable = true; foreach ($this->streams as $stream) { $stream->close(); @@ -82,14 +82,22 @@ class AppendStream implements StreamInterface } /** - * Detaches each attached stream + * Detaches each attached stream. + * + * Returns null as it's not clear which underlying stream resource to return. * * {@inheritdoc} */ public function detach() { - $this->close(); - $this->detached = true; + $this->pos = $this->current = 0; + $this->seekable = true; + + foreach ($this->streams as $stream) { + $stream->detach(); + } + + $this->streams = []; } public function tell() diff --git a/vendor/guzzlehttp/psr7/src/FnStream.php b/vendor/guzzlehttp/psr7/src/FnStream.php index cc9b4453f..73daea6f3 100644 --- a/vendor/guzzlehttp/psr7/src/FnStream.php +++ b/vendor/guzzlehttp/psr7/src/FnStream.php @@ -52,6 +52,15 @@ class FnStream implements StreamInterface } } + /** + * An unserialize would allow the __destruct to run when the unserialized value goes out of scope. + * @throws \LogicException + */ + public function __wakeup() + { + throw new \LogicException('FnStream should never be unserialized'); + } + /** * Adds custom functionality to an underlying stream by intercepting * specific method calls. diff --git a/vendor/guzzlehttp/psr7/src/InflateStream.php b/vendor/guzzlehttp/psr7/src/InflateStream.php index 0051d3fec..5e4f6028c 100644 --- a/vendor/guzzlehttp/psr7/src/InflateStream.php +++ b/vendor/guzzlehttp/psr7/src/InflateStream.php @@ -27,7 +27,7 @@ class InflateStream implements StreamInterface $stream = new LimitStream($stream, -1, 10 + $filenameHeaderLength); $resource = StreamWrapper::getResource($stream); stream_filter_append($resource, 'zlib.inflate', STREAM_FILTER_READ); - $this->stream = new Stream($resource); + $this->stream = $stream->isSeekable() ? new Stream($resource) : new NoSeekStream(new Stream($resource)); } /** diff --git a/vendor/guzzlehttp/psr7/src/Request.php b/vendor/guzzlehttp/psr7/src/Request.php index 08285484d..000664240 100644 --- a/vendor/guzzlehttp/psr7/src/Request.php +++ b/vendor/guzzlehttp/psr7/src/Request.php @@ -45,7 +45,7 @@ class Request implements RequestInterface $this->setHeaders($headers); $this->protocol = $version; - if (!$this->hasHeader('Host')) { + if (!isset($this->headerNames['host'])) { $this->updateHostFromUri(); } @@ -110,7 +110,7 @@ class Request implements RequestInterface $new = clone $this; $new->uri = $uri; - if (!$preserveHost) { + if (!$preserveHost || !isset($this->headerNames['host'])) { $new->updateHostFromUri(); } diff --git a/vendor/guzzlehttp/psr7/src/Response.php b/vendor/guzzlehttp/psr7/src/Response.php index 2830c6c9e..6e72c06b8 100644 --- a/vendor/guzzlehttp/psr7/src/Response.php +++ b/vendor/guzzlehttp/psr7/src/Response.php @@ -93,6 +93,10 @@ class Response implements ResponseInterface $version = '1.1', $reason = null ) { + if (filter_var($status, FILTER_VALIDATE_INT) === false) { + throw new \InvalidArgumentException('Status code must be an integer value.'); + } + $this->statusCode = (int) $status; if ($body !== '' && $body !== null) { diff --git a/vendor/guzzlehttp/psr7/src/Rfc7230.php b/vendor/guzzlehttp/psr7/src/Rfc7230.php new file mode 100644 index 000000000..505e4742b --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/Rfc7230.php @@ -0,0 +1,18 @@ +@,;:\\\"/[\]?={}\x01-\x20\x7F]++):[ \t]*+((?:[ \t]*+[\x21-\x7E\x80-\xFF]++)*+)[ \t]*+\r?\n)m"; + const HEADER_FOLD_REGEX = "(\r?\n[ \t]++)"; +} diff --git a/vendor/guzzlehttp/psr7/src/ServerRequest.php b/vendor/guzzlehttp/psr7/src/ServerRequest.php index 575aab848..99f453a51 100644 --- a/vendor/guzzlehttp/psr7/src/ServerRequest.php +++ b/vendor/guzzlehttp/psr7/src/ServerRequest.php @@ -166,7 +166,7 @@ class ServerRequest extends Request implements ServerRequestInterface public static function fromGlobals() { $method = isset($_SERVER['REQUEST_METHOD']) ? $_SERVER['REQUEST_METHOD'] : 'GET'; - $headers = function_exists('getallheaders') ? getallheaders() : []; + $headers = getallheaders(); $uri = self::getUriFromGlobals(); $body = new LazyOpenStream('php://input', 'r+'); $protocol = isset($_SERVER['SERVER_PROTOCOL']) ? str_replace('HTTP/', '', $_SERVER['SERVER_PROTOCOL']) : '1.1'; @@ -180,23 +180,41 @@ class ServerRequest extends Request implements ServerRequestInterface ->withUploadedFiles(self::normalizeFiles($_FILES)); } + private static function extractHostAndPortFromAuthority($authority) + { + $uri = 'http://'.$authority; + $parts = parse_url($uri); + if (false === $parts) { + return [null, null]; + } + + $host = isset($parts['host']) ? $parts['host'] : null; + $port = isset($parts['port']) ? $parts['port'] : null; + + return [$host, $port]; + } + /** * Get a Uri populated with values from $_SERVER. * * @return UriInterface */ - public static function getUriFromGlobals() { + public static function getUriFromGlobals() + { $uri = new Uri(''); $uri = $uri->withScheme(!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' ? 'https' : 'http'); $hasPort = false; if (isset($_SERVER['HTTP_HOST'])) { - $hostHeaderParts = explode(':', $_SERVER['HTTP_HOST']); - $uri = $uri->withHost($hostHeaderParts[0]); - if (isset($hostHeaderParts[1])) { + list($host, $port) = self::extractHostAndPortFromAuthority($_SERVER['HTTP_HOST']); + if ($host !== null) { + $uri = $uri->withHost($host); + } + + if ($port !== null) { $hasPort = true; - $uri = $uri->withPort($hostHeaderParts[1]); + $uri = $uri->withPort($port); } } elseif (isset($_SERVER['SERVER_NAME'])) { $uri = $uri->withHost($_SERVER['SERVER_NAME']); @@ -210,7 +228,7 @@ class ServerRequest extends Request implements ServerRequestInterface $hasQuery = false; if (isset($_SERVER['REQUEST_URI'])) { - $requestUriParts = explode('?', $_SERVER['REQUEST_URI']); + $requestUriParts = explode('?', $_SERVER['REQUEST_URI'], 2); $uri = $uri->withPath($requestUriParts[0]); if (isset($requestUriParts[1])) { $hasQuery = true; diff --git a/vendor/guzzlehttp/psr7/src/Stream.php b/vendor/guzzlehttp/psr7/src/Stream.php index e33662879..111795eb0 100644 --- a/vendor/guzzlehttp/psr7/src/Stream.php +++ b/vendor/guzzlehttp/psr7/src/Stream.php @@ -24,11 +24,11 @@ class Stream implements StreamInterface 'r' => true, 'w+' => true, 'r+' => true, 'x+' => true, 'c+' => true, 'rb' => true, 'w+b' => true, 'r+b' => true, 'x+b' => true, 'c+b' => true, 'rt' => true, 'w+t' => true, 'r+t' => true, - 'x+t' => true, 'c+t' => true, 'a+' => true + 'x+t' => true, 'c+t' => true, 'a+' => true, 'rb+' => true, ], 'write' => [ 'w' => true, 'w+' => true, 'rw' => true, 'r+' => true, 'x+' => true, - 'c+' => true, 'wb' => true, 'w+b' => true, 'r+b' => true, + 'c+' => true, 'wb' => true, 'w+b' => true, 'r+b' => true, 'rb+' => true, 'x+b' => true, 'c+b' => true, 'w+t' => true, 'r+t' => true, 'x+t' => true, 'c+t' => true, 'a' => true, 'a+' => true ] @@ -70,15 +70,6 @@ class Stream implements StreamInterface $this->uri = $this->getMetadata('uri'); } - public function __get($name) - { - if ($name == 'stream') { - throw new \RuntimeException('The stream is detached'); - } - - throw new \BadMethodCallException('No value for ' . $name); - } - /** * Closes the stream when the destructed */ @@ -99,6 +90,10 @@ class Stream implements StreamInterface public function getContents() { + if (!isset($this->stream)) { + throw new \RuntimeException('Stream is detached'); + } + $contents = stream_get_contents($this->stream); if ($contents === false) { @@ -173,11 +168,19 @@ class Stream implements StreamInterface public function eof() { - return !$this->stream || feof($this->stream); + if (!isset($this->stream)) { + throw new \RuntimeException('Stream is detached'); + } + + return feof($this->stream); } public function tell() { + if (!isset($this->stream)) { + throw new \RuntimeException('Stream is detached'); + } + $result = ftell($this->stream); if ($result === false) { @@ -194,9 +197,13 @@ class Stream implements StreamInterface public function seek($offset, $whence = SEEK_SET) { + if (!isset($this->stream)) { + throw new \RuntimeException('Stream is detached'); + } if (!$this->seekable) { throw new \RuntimeException('Stream is not seekable'); - } elseif (fseek($this->stream, $offset, $whence) === -1) { + } + if (fseek($this->stream, $offset, $whence) === -1) { throw new \RuntimeException('Unable to seek to stream position ' . $offset . ' with whence ' . var_export($whence, true)); } @@ -204,6 +211,9 @@ class Stream implements StreamInterface public function read($length) { + if (!isset($this->stream)) { + throw new \RuntimeException('Stream is detached'); + } if (!$this->readable) { throw new \RuntimeException('Cannot read from non-readable stream'); } @@ -225,6 +235,9 @@ class Stream implements StreamInterface public function write($string) { + if (!isset($this->stream)) { + throw new \RuntimeException('Stream is detached'); + } if (!$this->writable) { throw new \RuntimeException('Cannot write to a non-writable stream'); } diff --git a/vendor/guzzlehttp/psr7/src/StreamWrapper.php b/vendor/guzzlehttp/psr7/src/StreamWrapper.php index cf7b2232e..0f3a2856a 100644 --- a/vendor/guzzlehttp/psr7/src/StreamWrapper.php +++ b/vendor/guzzlehttp/psr7/src/StreamWrapper.php @@ -38,9 +38,21 @@ class StreamWrapper . 'writable, or both.'); } - return fopen('guzzle://stream', $mode, null, stream_context_create([ + return fopen('guzzle://stream', $mode, null, self::createStreamContext($stream)); + } + + /** + * Creates a stream context that can be used to open a stream as a php stream resource. + * + * @param StreamInterface $stream + * + * @return resource + */ + public static function createStreamContext(StreamInterface $stream) + { + return stream_context_create([ 'guzzle' => ['stream' => $stream] - ])); + ]); } /** @@ -94,12 +106,21 @@ class StreamWrapper return true; } + public function stream_cast($cast_as) + { + $stream = clone($this->stream); + + return $stream->detach(); + } + public function stream_stat() { static $modeMap = [ 'r' => 33060, + 'rb' => 33060, 'r+' => 33206, - 'w' => 33188 + 'w' => 33188, + 'wb' => 33188 ]; return [ @@ -118,4 +139,23 @@ class StreamWrapper 'blocks' => 0 ]; } + + public function url_stat($path, $flags) + { + return [ + 'dev' => 0, + 'ino' => 0, + 'mode' => 0, + 'nlink' => 0, + 'uid' => 0, + 'gid' => 0, + 'rdev' => 0, + 'size' => 0, + 'atime' => 0, + 'mtime' => 0, + 'ctime' => 0, + 'blksize' => 0, + 'blocks' => 0 + ]; + } } diff --git a/vendor/guzzlehttp/psr7/src/Uri.php b/vendor/guzzlehttp/psr7/src/Uri.php index f46c1db9e..36219568c 100644 --- a/vendor/guzzlehttp/psr7/src/Uri.php +++ b/vendor/guzzlehttp/psr7/src/Uri.php @@ -301,15 +301,7 @@ class Uri implements UriInterface */ public static function withoutQueryValue(UriInterface $uri, $key) { - $current = $uri->getQuery(); - if ($current === '') { - return $uri; - } - - $decodedKey = rawurldecode($key); - $result = array_filter(explode('&', $current), function ($part) use ($decodedKey) { - return rawurldecode(explode('=', $part)[0]) !== $decodedKey; - }); + $result = self::getFilteredQueryString($uri, [$key]); return $uri->withQuery(implode('&', $result)); } @@ -331,26 +323,29 @@ class Uri implements UriInterface */ public static function withQueryValue(UriInterface $uri, $key, $value) { - $current = $uri->getQuery(); + $result = self::getFilteredQueryString($uri, [$key]); - if ($current === '') { - $result = []; - } else { - $decodedKey = rawurldecode($key); - $result = array_filter(explode('&', $current), function ($part) use ($decodedKey) { - return rawurldecode(explode('=', $part)[0]) !== $decodedKey; - }); - } + $result[] = self::generateQueryString($key, $value); - // Query string separators ("=", "&") within the key or value need to be encoded - // (while preventing double-encoding) before setting the query string. All other - // chars that need percent-encoding will be encoded by withQuery(). - $key = strtr($key, self::$replaceQuery); + return $uri->withQuery(implode('&', $result)); + } - if ($value !== null) { - $result[] = $key . '=' . strtr($value, self::$replaceQuery); - } else { - $result[] = $key; + /** + * Creates a new URI with multiple specific query string values. + * + * It has the same behavior as withQueryValue() but for an associative array of key => value. + * + * @param UriInterface $uri URI to use as a base. + * @param array $keyValueArray Associative array of key and values + * + * @return UriInterface + */ + public static function withQueryValues(UriInterface $uri, array $keyValueArray) + { + $result = self::getFilteredQueryString($uri, array_keys($keyValueArray)); + + foreach ($keyValueArray as $key => $value) { + $result[] = self::generateQueryString($key, $value); } return $uri->withQuery(implode('&', $result)); @@ -620,6 +615,47 @@ class Uri implements UriInterface return $port; } + /** + * @param UriInterface $uri + * @param array $keys + * + * @return array + */ + private static function getFilteredQueryString(UriInterface $uri, array $keys) + { + $current = $uri->getQuery(); + + if ($current === '') { + return []; + } + + $decodedKeys = array_map('rawurldecode', $keys); + + return array_filter(explode('&', $current), function ($part) use ($decodedKeys) { + return !in_array(rawurldecode(explode('=', $part)[0]), $decodedKeys, true); + }); + } + + /** + * @param string $key + * @param string|null $value + * + * @return string + */ + private static function generateQueryString($key, $value) + { + // Query string separators ("=", "&") within the key or value need to be encoded + // (while preventing double-encoding) before setting the query string. All other + // chars that need percent-encoding will be encoded by withQuery(). + $queryString = strtr($key, self::$replaceQuery); + + if ($value !== null) { + $queryString .= '=' . strtr($value, self::$replaceQuery); + } + + return $queryString; + } + private function removeDefaultPort() { if ($this->port !== null && self::isDefaultPort($this)) { diff --git a/vendor/guzzlehttp/psr7/src/functions.php b/vendor/guzzlehttp/psr7/src/functions.php index e40348d6a..957bfb42a 100644 --- a/vendor/guzzlehttp/psr7/src/functions.php +++ b/vendor/guzzlehttp/psr7/src/functions.php @@ -69,10 +69,10 @@ function uri_for($uri) * - metadata: Array of custom metadata. * - size: Size of the stream. * - * @param resource|string|null|int|float|bool|StreamInterface|callable $resource Entity body data - * @param array $options Additional options + * @param resource|string|null|int|float|bool|StreamInterface|callable|\Iterator $resource Entity body data + * @param array $options Additional options * - * @return Stream + * @return StreamInterface * @throws \InvalidArgumentException if the $resource arg is not valid. */ function stream_for($resource = '', array $options = []) @@ -238,7 +238,7 @@ function modify_request(RequestInterface $request, array $changes) } if ($request instanceof ServerRequestInterface) { - return new ServerRequest( + return (new ServerRequest( isset($changes['method']) ? $changes['method'] : $request->getMethod(), $uri, $headers, @@ -247,7 +247,11 @@ function modify_request(RequestInterface $request, array $changes) ? $changes['version'] : $request->getProtocolVersion(), $request->getServerParams() - ); + )) + ->withParsedBody($request->getParsedBody()) + ->withQueryParams($request->getQueryParams()) + ->withCookieParams($request->getCookieParams()) + ->withUploadedFiles($request->getUploadedFiles()); } return new Request( @@ -431,7 +435,7 @@ function hash( * @param StreamInterface $stream Stream to read from * @param int $maxLength Maximum buffer length * - * @return string|bool + * @return string */ function readline(StreamInterface $stream, $maxLength = null) { @@ -495,7 +499,7 @@ function parse_response($message) // between status-code and reason-phrase is required. But browsers accept // responses without space and reason as well. if (!preg_match('/^HTTP\/.* [0-9]{3}( .*|$)/', $data['start-line'])) { - throw new \InvalidArgumentException('Invalid response string'); + throw new \InvalidArgumentException('Invalid response string: ' . $data['start-line']); } $parts = explode(' ', $data['start-line'], 3); @@ -516,8 +520,8 @@ function parse_response($message) * PHP style arrays into an associative array (e.g., foo[a]=1&foo[b]=2 will * be parsed into ['foo[a]' => '1', 'foo[b]' => '2']). * - * @param string $str Query string to parse - * @param bool|string $urlEncoding How the query string is encoded + * @param string $str Query string to parse + * @param int|bool $urlEncoding How the query string is encoded * * @return array */ @@ -533,9 +537,9 @@ function parse_query($str, $urlEncoding = true) $decoder = function ($value) { return rawurldecode(str_replace('+', ' ', $value)); }; - } elseif ($urlEncoding == PHP_QUERY_RFC3986) { + } elseif ($urlEncoding === PHP_QUERY_RFC3986) { $decoder = 'rawurldecode'; - } elseif ($urlEncoding == PHP_QUERY_RFC1738) { + } elseif ($urlEncoding === PHP_QUERY_RFC1738) { $decoder = 'urldecode'; } else { $decoder = function ($str) { return $str; }; @@ -633,6 +637,7 @@ function mimetype_from_filename($filename) function mimetype_from_extension($extension) { static $mimetypes = [ + '3gp' => 'video/3gpp', '7z' => 'application/x-7z-compressed', 'aac' => 'audio/x-aac', 'ai' => 'application/postscript', @@ -680,6 +685,7 @@ function mimetype_from_extension($extension) 'mid' => 'audio/midi', 'midi' => 'audio/midi', 'mov' => 'video/quicktime', + 'mkv' => 'video/x-matroska', 'mp3' => 'audio/mpeg', 'mp4' => 'video/mp4', 'mp4a' => 'audio/mp4', @@ -758,29 +764,53 @@ function _parse_message($message) throw new \InvalidArgumentException('Invalid message'); } - // Iterate over each line in the message, accounting for line endings - $lines = preg_split('/(\\r?\\n)/', $message, -1, PREG_SPLIT_DELIM_CAPTURE); - $result = ['start-line' => array_shift($lines), 'headers' => [], 'body' => '']; - array_shift($lines); + $message = ltrim($message, "\r\n"); - for ($i = 0, $totalLines = count($lines); $i < $totalLines; $i += 2) { - $line = $lines[$i]; - // If two line breaks were encountered, then this is the end of body - if (empty($line)) { - if ($i < $totalLines - 1) { - $result['body'] = implode('', array_slice($lines, $i + 2)); - } - break; - } - if (strpos($line, ':')) { - $parts = explode(':', $line, 2); - $key = trim($parts[0]); - $value = isset($parts[1]) ? trim($parts[1]) : ''; - $result['headers'][$key][] = $value; - } + $messageParts = preg_split("/\r?\n\r?\n/", $message, 2); + + if ($messageParts === false || count($messageParts) !== 2) { + throw new \InvalidArgumentException('Invalid message: Missing header delimiter'); } - return $result; + list($rawHeaders, $body) = $messageParts; + $rawHeaders .= "\r\n"; // Put back the delimiter we split previously + $headerParts = preg_split("/\r?\n/", $rawHeaders, 2); + + if ($headerParts === false || count($headerParts) !== 2) { + throw new \InvalidArgumentException('Invalid message: Missing status line'); + } + + list($startLine, $rawHeaders) = $headerParts; + + if (preg_match("/(?:^HTTP\/|^[A-Z]+ \S+ HTTP\/)(\d+(?:\.\d+)?)/i", $startLine, $matches) && $matches[1] === '1.0') { + // Header folding is deprecated for HTTP/1.1, but allowed in HTTP/1.0 + $rawHeaders = preg_replace(Rfc7230::HEADER_FOLD_REGEX, ' ', $rawHeaders); + } + + /** @var array[] $headerLines */ + $count = preg_match_all(Rfc7230::HEADER_REGEX, $rawHeaders, $headerLines, PREG_SET_ORDER); + + // If these aren't the same, then one line didn't match and there's an invalid header. + if ($count !== substr_count($rawHeaders, "\n")) { + // Folding is deprecated, see https://tools.ietf.org/html/rfc7230#section-3.2.4 + if (preg_match(Rfc7230::HEADER_FOLD_REGEX, $rawHeaders)) { + throw new \InvalidArgumentException('Invalid header syntax: Obsolete line folding'); + } + + throw new \InvalidArgumentException('Invalid header syntax'); + } + + $headers = []; + + foreach ($headerLines as $headerLine) { + $headers[$headerLine[1]][] = $headerLine[2]; + } + + return [ + 'start-line' => $startLine, + 'headers' => $headers, + 'body' => $body, + ]; } /** @@ -809,6 +839,46 @@ function _parse_request_uri($path, array $headers) return $scheme . '://' . $host . '/' . ltrim($path, '/'); } +/** + * Get a short summary of the message body + * + * Will return `null` if the response is not printable. + * + * @param MessageInterface $message The message to get the body summary + * @param int $truncateAt The maximum allowed size of the summary + * + * @return null|string + */ +function get_message_body_summary(MessageInterface $message, $truncateAt = 120) +{ + $body = $message->getBody(); + + if (!$body->isSeekable() || !$body->isReadable()) { + return null; + } + + $size = $body->getSize(); + + if ($size === 0) { + return null; + } + + $summary = $body->read($truncateAt); + $body->rewind(); + + if ($size > $truncateAt) { + $summary .= ' (truncated...)'; + } + + // Matches any printable character, including unicode characters: + // letters, marks, numbers, punctuation, spacing, and separators. + if (preg_match('/[^\pL\pM\pN\pP\pS\pZ\n\r\t]/', $summary)) { + return null; + } + + return $summary; +} + /** @internal */ function _caseless_remove($keys, array $data) { diff --git a/vendor/jakub-onderka/php-console-highlighter/.travis.yml b/vendor/jakub-onderka/php-console-highlighter/.travis.yml index 2f7e8c89b..c88c4ec9d 100644 --- a/vendor/jakub-onderka/php-console-highlighter/.travis.yml +++ b/vendor/jakub-onderka/php-console-highlighter/.travis.yml @@ -1,21 +1,22 @@ language: php php: - - 5.3.3 - 5.4 - 5.5 - 5.6 - 7.0 - - hhvm - - hhvm-nightly + - 7.1 + - 7.2 + +sudo: false -matrix: - allowed_failures: - - php: 7.0 - - php: hhvm-nightly +cache: + directories: + - vendor + - $HOME/.composer/cache before_script: - composer install --no-interaction --prefer-source script: - - ant \ No newline at end of file + - ant diff --git a/vendor/jakub-onderka/php-console-highlighter/README.md b/vendor/jakub-onderka/php-console-highlighter/README.md index 432ea0a78..1ef3d1340 100644 --- a/vendor/jakub-onderka/php-console-highlighter/README.md +++ b/vendor/jakub-onderka/php-console-highlighter/README.md @@ -37,4 +37,6 @@ echo $highlighter->getWholeFile($fileContent); ------ +[![Downloads this Month](https://img.shields.io/packagist/dm/jakub-onderka/php-console-highlighter.svg)](https://packagist.org/packages/jakub-onderka/php-console-highlighter) [![Build Status](https://travis-ci.org/JakubOnderka/PHP-Console-Highlighter.svg?branch=master)](https://travis-ci.org/JakubOnderka/PHP-Console-Highlighter) +[![License](https://poser.pugx.org/jakub-onderka/php-console-highlighter/license.svg)](https://packagist.org/packages/jakub-onderka/php-console-highlighter) diff --git a/vendor/jakub-onderka/php-console-highlighter/composer.json b/vendor/jakub-onderka/php-console-highlighter/composer.json index bd2f47a28..21c29f710 100644 --- a/vendor/jakub-onderka/php-console-highlighter/composer.json +++ b/vendor/jakub-onderka/php-console-highlighter/composer.json @@ -1,5 +1,6 @@ { "name": "jakub-onderka/php-console-highlighter", + "description": "Highlight PHP code in terminal", "type": "library", "license": "MIT", "authors": [ @@ -10,15 +11,16 @@ } ], "autoload": { - "psr-0": {"JakubOnderka\\PhpConsoleHighlighter": "src/"} + "psr-4": {"JakubOnderka\\PhpConsoleHighlighter\\": "src/"} }, "require": { - "php": ">=5.3.0", - "jakub-onderka/php-console-color": "~0.1" + "php": ">=5.4.0", + "ext-tokenizer": "*", + "jakub-onderka/php-console-color": "~0.2" }, "require-dev": { "phpunit/phpunit": "~4.0", - "jakub-onderka/php-parallel-lint": "~0.5", + "jakub-onderka/php-parallel-lint": "~1.0", "jakub-onderka/php-var-dump-check": "~0.1", "squizlabs/php_codesniffer": "~1.5", "jakub-onderka/php-code-style": "~1.0" diff --git a/vendor/jakub-onderka/php-console-highlighter/phpunit.xml b/vendor/jakub-onderka/php-console-highlighter/phpunit.xml index 74011d9df..9c653a680 100644 --- a/vendor/jakub-onderka/php-console-highlighter/phpunit.xml +++ b/vendor/jakub-onderka/php-console-highlighter/phpunit.xml @@ -1,8 +1,8 @@ - + - tests/* + tests @@ -12,4 +12,4 @@ vendor - \ No newline at end of file + diff --git a/vendor/jakub-onderka/php-console-highlighter/src/JakubOnderka/PhpConsoleHighlighter/Highlighter.php b/vendor/jakub-onderka/php-console-highlighter/src/Highlighter.php similarity index 94% rename from vendor/jakub-onderka/php-console-highlighter/src/JakubOnderka/PhpConsoleHighlighter/Highlighter.php rename to vendor/jakub-onderka/php-console-highlighter/src/Highlighter.php index b908e9318..47ce30d2c 100644 --- a/vendor/jakub-onderka/php-console-highlighter/src/JakubOnderka/PhpConsoleHighlighter/Highlighter.php +++ b/vendor/jakub-onderka/php-console-highlighter/src/Highlighter.php @@ -31,6 +31,7 @@ class Highlighter /** * @param ConsoleColor $color + * @throws \JakubOnderka\PhpConsoleColor\InvalidStyleException */ public function __construct(ConsoleColor $color) { @@ -118,20 +119,6 @@ class Highlighter foreach ($tokens as $token) { if (is_array($token)) { switch ($token[0]) { - case T_INLINE_HTML: - $newType = self::TOKEN_HTML; - break; - - case T_COMMENT: - case T_DOC_COMMENT: - $newType = self::TOKEN_COMMENT; - break; - - case T_ENCAPSED_AND_WHITESPACE: - case T_CONSTANT_ENCAPSED_STRING: - $newType = self::TOKEN_STRING; - break; - case T_WHITESPACE: break; @@ -151,17 +138,26 @@ class Highlighter case T_LINE: case T_CLASS_C: case T_FUNC_C: - //case T_TRAIT_C: + case T_TRAIT_C: $newType = self::TOKEN_DEFAULT; break; + case T_COMMENT: + case T_DOC_COMMENT: + $newType = self::TOKEN_COMMENT; + break; + + case T_ENCAPSED_AND_WHITESPACE: + case T_CONSTANT_ENCAPSED_STRING: + $newType = self::TOKEN_STRING; + break; + + case T_INLINE_HTML: + $newType = self::TOKEN_HTML; + break; + default: - // Compatibility with PHP 5.3 - if (defined('T_TRAIT_C') && $token[0] === T_TRAIT_C) { - $newType = self::TOKEN_DEFAULT; - } else { - $newType = self::TOKEN_KEYWORD; - } + $newType = self::TOKEN_KEYWORD; } } else { $newType = $token === '"' ? self::TOKEN_STRING : self::TOKEN_KEYWORD; @@ -171,7 +167,7 @@ class Highlighter $currentType = $newType; } - if ($currentType != $newType) { + if ($currentType !== $newType) { $output[] = array($currentType, $buffer); $buffer = ''; $currentType = $newType; diff --git a/vendor/jakub-onderka/php-console-highlighter/tests/JakubOnderka/PhpConsoleHighligter/HigligterTest.php b/vendor/jakub-onderka/php-console-highlighter/tests/HigligterTest.php similarity index 93% rename from vendor/jakub-onderka/php-console-highlighter/tests/JakubOnderka/PhpConsoleHighligter/HigligterTest.php rename to vendor/jakub-onderka/php-console-highlighter/tests/HigligterTest.php index 269d03da5..187beb67b 100644 --- a/vendor/jakub-onderka/php-console-highlighter/tests/JakubOnderka/PhpConsoleHighligter/HigligterTest.php +++ b/vendor/jakub-onderka/php-console-highlighter/tests/HigligterTest.php @@ -8,7 +8,9 @@ class HighlighterTest extends \PHPUnit_Framework_TestCase protected function getConsoleColorMock() { - $mock = $this->getMock('\JakubOnderka\PhpConsoleColor\ConsoleColor'); + $mock = method_exists($this, 'createMock') + ? $this->createMock('\JakubOnderka\PhpConsoleColor\ConsoleColor') + : $this->getMock('\JakubOnderka\PhpConsoleColor\ConsoleColor'); $mock->expects($this->any()) ->method('apply') @@ -260,4 +262,13 @@ EOL '' ); } -} \ No newline at end of file + + public function testWhitespace() + { + $this->compare( + ' ' + , + ' ' + ); + } +} diff --git a/vendor/jakub-onderka/php-console-highlighter/tests/bootstrap.php b/vendor/jakub-onderka/php-console-highlighter/tests/bootstrap.php deleted file mode 100644 index 7500417ed..000000000 --- a/vendor/jakub-onderka/php-console-highlighter/tests/bootstrap.php +++ /dev/null @@ -1,2 +0,0 @@ - - +
@@ -57,9 +57,11 @@ {{ __('Login') }} - - {{ __('Forgot Your Password?') }} - + @if (Route::has('password.request')) + + {{ __('Forgot Your Password?') }} + + @endif
diff --git a/vendor/laravel/framework/src/Illuminate/Auth/Console/stubs/make/views/layouts/app.stub b/vendor/laravel/framework/src/Illuminate/Auth/Console/stubs/make/views/layouts/app.stub index dc245d980..ee7767c46 100644 --- a/vendor/laravel/framework/src/Illuminate/Auth/Console/stubs/make/views/layouts/app.stub +++ b/vendor/laravel/framework/src/Illuminate/Auth/Console/stubs/make/views/layouts/app.stub @@ -13,7 +13,7 @@ - + @@ -43,11 +43,11 @@ - + + @endif @else
  • Dashboard)
  • ' . "\n"; + $buffer .= ' ' . "\n"; } return $buffer; @@ -199,7 +199,7 @@ abstract class Renderer protected function getInactiveBreadcrumb(AbstractNode $node, string $pathToRoot): string { return \sprintf( - '
  • %s
  • ' . "\n", + ' ' . "\n", $pathToRoot, $node->getName() ); diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Dashboard.php b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Dashboard.php index fb89e84e0..68dfd4020 100644 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Dashboard.php +++ b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Dashboard.php @@ -273,8 +273,8 @@ final class Dashboard extends Renderer protected function getActiveBreadcrumb(AbstractNode $node): string { return \sprintf( - '
  • %s
  • ' . "\n" . - '
  • (Dashboard)
  • ' . "\n", + ' ' . "\n" . + ' ' . "\n", $node->getName() ); } diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Directory.php b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Directory.php index 23bf44913..711d15349 100644 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Directory.php +++ b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Directory.php @@ -74,7 +74,9 @@ final class Directory extends Renderer $node->getName() ); - $data['icon'] = ' '; + $up = \str_repeat('../', \count($node->getPathAsArray()) - 2); + + $data['icon'] = \sprintf('', $up); } else { $data['name'] = \sprintf( '%s', @@ -82,7 +84,9 @@ final class Directory extends Renderer $node->getName() ); - $data['icon'] = ' '; + $up = \str_repeat('../', \count($node->getPathAsArray()) - 2); + + $data['icon'] = \sprintf('', $up); } } diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/File.php b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/File.php index 06b3b06c4..2e88d198c 100644 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/File.php +++ b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/File.php @@ -130,7 +130,7 @@ final class File extends Renderer $buffer .= $this->renderItemTemplate( $template, [ - 'name' => $name, + 'name' => $this->abbreviateClassName($name), 'numClasses' => $numClasses, 'numTestedClasses' => $numTestedClasses, 'numMethods' => $numMethods, @@ -511,4 +511,19 @@ final class File extends Renderer return $result; } + + private function abbreviateClassName(string $className): string + { + $tmp = \explode('\\', $className); + + if (\count($tmp) > 1) { + $className = \sprintf( + '%s', + $className, + \array_pop($tmp) + ); + } + + return $className; + } } diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/coverage_bar.html.dist b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/coverage_bar.html.dist index 5a09c354d..7fcf6f490 100644 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/coverage_bar.html.dist +++ b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/coverage_bar.html.dist @@ -1,5 +1,5 @@
    -
    +
    {{percent}}% covered ({{level}})
    diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/bootstrap.min.css b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/bootstrap.min.css index ed3905e0e..74a3ca176 100644 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/bootstrap.min.css +++ b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/bootstrap.min.css @@ -1,6 +1,7 @@ /*! - * Bootstrap v3.3.7 (http://getbootstrap.com) - * Copyright 2011-2016 Twitter, Inc. + * Bootstrap v4.1.3 (https://getbootstrap.com/) + * Copyright 2011-2018 The Bootstrap Authors + * Copyright 2011-2018 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;filter:alpha(opacity=0);opacity:0;line-break:auto}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} -/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file + */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:transparent}@-ms-viewport{width:device-width}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent;-webkit-text-decoration-skip:objects}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-family:inherit;font-weight:500;line-height:1.2;color:inherit}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer::before{content:"\2014 \00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-break:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-ms-flex-order:-1;order:-1}.order-last{-ms-flex-order:13;order:13}.order-0{-ms-flex-order:0;order:0}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-sm-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-ms-flex-order:-1;order:-1}.order-sm-last{-ms-flex-order:13;order:13}.order-sm-0{-ms-flex-order:0;order:0}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-md-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-ms-flex-order:-1;order:-1}.order-md-last{-ms-flex-order:13;order:13}.order-md-0{-ms-flex-order:0;order:0}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-lg-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-ms-flex-order:-1;order:-1}.order-lg-last{-ms-flex-order:13;order:13}.order-lg-0{-ms-flex-order:0;order:0}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-xl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-ms-flex-order:-1;order:-1}.order-xl-last{-ms-flex-order:13;order:13}.order-xl-0{-ms-flex-order:0;order:0}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;margin-bottom:1rem;background-color:transparent}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table .table{background-color:#fff}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-hover .table-secondary:hover{background-color:#c8cbcf}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#212529;border-color:#32383e}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#212529}.table-dark td,.table-dark th,.table-dark thead th{border-color:#32383e}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{background-color:rgba(255,255,255,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(2.25rem + 2px);padding:.375rem .75rem;font-size:1rem;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding-top:.375rem;padding-bottom:.375rem;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.8125rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(2.875rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}select.form-control[multiple],select.form-control[size]{height:auto}textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(40,167,69,.9);border-radius:.25rem}.custom-select.is-valid,.form-control.is-valid,.was-validated .custom-select:valid,.was-validated .form-control:valid{border-color:#28a745}.custom-select.is-valid:focus,.form-control.is-valid:focus,.was-validated .custom-select:valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-select.is-valid~.valid-feedback,.custom-select.is-valid~.valid-tooltip,.form-control.is-valid~.valid-feedback,.form-control.is-valid~.valid-tooltip,.was-validated .custom-select:valid~.valid-feedback,.was-validated .custom-select:valid~.valid-tooltip,.was-validated .form-control:valid~.valid-feedback,.was-validated .form-control:valid~.valid-tooltip{display:block}.form-control-file.is-valid~.valid-feedback,.form-control-file.is-valid~.valid-tooltip,.was-validated .form-control-file:valid~.valid-feedback,.was-validated .form-control-file:valid~.valid-tooltip{display:block}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before{background-color:#71dd8a}.custom-control-input.is-valid~.valid-feedback,.custom-control-input.is-valid~.valid-tooltip,.was-validated .custom-control-input:valid~.valid-feedback,.was-validated .custom-control-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before{background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label::before,.was-validated .custom-control-input:valid:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(40,167,69,.25)}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid~.custom-file-label::after,.was-validated .custom-file-input:valid~.custom-file-label::after{border-color:inherit}.custom-file-input.is-valid~.valid-feedback,.custom-file-input.is-valid~.valid-tooltip,.was-validated .custom-file-input:valid~.valid-feedback,.was-validated .custom-file-input:valid~.valid-tooltip{display:block}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.custom-select.is-invalid,.form-control.is-invalid,.was-validated .custom-select:invalid,.was-validated .form-control:invalid{border-color:#dc3545}.custom-select.is-invalid:focus,.form-control.is-invalid:focus,.was-validated .custom-select:invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-select.is-invalid~.invalid-feedback,.custom-select.is-invalid~.invalid-tooltip,.form-control.is-invalid~.invalid-feedback,.form-control.is-invalid~.invalid-tooltip,.was-validated .custom-select:invalid~.invalid-feedback,.was-validated .custom-select:invalid~.invalid-tooltip,.was-validated .form-control:invalid~.invalid-feedback,.was-validated .form-control:invalid~.invalid-tooltip{display:block}.form-control-file.is-invalid~.invalid-feedback,.form-control-file.is-invalid~.invalid-tooltip,.was-validated .form-control-file:invalid~.invalid-feedback,.was-validated .form-control-file:invalid~.invalid-tooltip{display:block}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{background-color:#efa2a9}.custom-control-input.is-invalid~.invalid-feedback,.custom-control-input.is-invalid~.invalid-tooltip,.was-validated .custom-control-input:invalid~.invalid-feedback,.was-validated .custom-control-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(220,53,69,.25)}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-label::after,.was-validated .custom-file-input:invalid~.custom-file-label::after{border-color:inherit}.custom-file-input.is-invalid~.invalid-feedback,.custom-file-input.is-invalid~.invalid-tooltip,.was-validated .custom-file-input:invalid~.invalid-feedback,.was-validated .custom-file-input:invalid~.invalid-tooltip{display:block}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-ms-flexbox;display:flex;-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:focus,.btn:hover{text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-primary{color:#007bff;background-color:transparent;background-image:none;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;background-color:transparent;background-image:none;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;background-color:transparent;background-image:none;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;background-color:transparent;background-image:none;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;background-color:transparent;background-image:none;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;background-color:transparent;background-image:none;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;background-color:transparent;background-image:none;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;background-color:transparent;background-image:none;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;background-color:transparent}.btn-link:hover{color:#0056b3;text-decoration:underline;background-color:transparent;border-color:transparent}.btn-link.focus,.btn-link:focus{text-decoration:underline;border-color:transparent;box-shadow:none}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media screen and (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media screen and (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu-right{right:0;left:auto}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;width:0;height:0;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-ms-flex:0 1 auto;flex:0 1 auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:1}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:1}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group,.btn-group-vertical .btn+.btn,.btn-group-vertical .btn+.btn-group,.btn-group-vertical .btn-group+.btn,.btn-group-vertical .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:center;justify-content:center}.btn-group-vertical .btn,.btn-group-vertical .btn-group{width:100%}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;margin-bottom:0}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-select:not(:last-child),.input-group>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-append,.input-group-prepend{display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{height:calc(2.875rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{height:calc(1.8125rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;background-color:#007bff}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:active~.custom-control-label::before{color:#fff;background-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label::before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0}.custom-control-label::before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#dee2e6}.custom-control-label::after{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background-repeat:no-repeat;background-position:center center;background-size:50% 50%}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label::before{background-color:#007bff}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::before{background-color:#007bff}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(2.25rem + 2px);padding:.375rem 1.75rem .375rem .75rem;line-height:1.5;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right .75rem center;background-size:8px 10px;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(128,189,255,.5)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{opacity:0}.custom-select-sm{height:calc(1.8125rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:75%}.custom-select-lg{height:calc(2.875rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:125%}.custom-file{position:relative;display:inline-block;width:100%;height:calc(2.25rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(2.25rem + 2px);margin:0;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-file-input:focus~.custom-file-label::after{border-color:#80bdff}.custom-file-input:disabled~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(2.25rem + 2px);padding:.375rem .75rem;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:2.25rem;padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:1px solid #ced4da;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;padding-left:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media screen and (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#b3d7ff}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media screen and (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{transition:none}}.custom-range::-moz-range-thumb:active{background-color:#b3d7ff}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media screen and (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{transition:none}}.custom-range::-ms-thumb:active{background-color:#b3d7ff}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6;border-radius:1rem}.custom-control-label::before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.custom-control-label::before,.custom-file-label,.custom-select{transition:none}}.nav{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar>.container,.navbar>.container-fluid{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-ms-flex-positive:1;flex-grow:1;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler:not(:disabled):not(.disabled){cursor:pointer}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{display:-ms-flexbox;display:flex;-ms-flex:1 0 0%;flex:1 0 0%;-ms-flex-direction:column;flex-direction:column;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:first-child .card-header,.card-group>.card:first-child .card-img-top{border-top-right-radius:0}.card-group>.card:first-child .card-footer,.card-group>.card:first-child .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:last-child .card-header,.card-group>.card:last-child .card-img-top{border-top-left-radius:0}.card-group>.card:last-child .card-footer,.card-group>.card:last-child .card-img-bottom{border-bottom-left-radius:0}.card-group>.card:only-child{border-radius:.25rem}.card-group>.card:only-child .card-header,.card-group>.card:only-child .card-img-top{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-group>.card:only-child .card-footer,.card-group>.card:only-child .card-img-bottom{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-group>.card:not(:first-child):not(:last-child):not(:only-child){border-radius:0}.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-footer,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-header,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-bottom,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-top{border-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion .card:not(:first-of-type):not(:last-of-type){border-bottom:0;border-radius:0}.accordion .card:not(:first-of-type) .card-header:first-child{border-radius:0}.accordion .card:first-of-type{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion .card:last-of-type{border-top-left-radius:0;border-top-right-radius:0}.breadcrumb{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:2;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-link:not(:disabled):not(.disabled){cursor:pointer}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:1;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}.badge-primary[href]:focus,.badge-primary[href]:hover{color:#fff;text-decoration:none;background-color:#0062cc}.badge-secondary{color:#fff;background-color:#6c757d}.badge-secondary[href]:focus,.badge-secondary[href]:hover{color:#fff;text-decoration:none;background-color:#545b62}.badge-success{color:#fff;background-color:#28a745}.badge-success[href]:focus,.badge-success[href]:hover{color:#fff;text-decoration:none;background-color:#1e7e34}.badge-info{color:#fff;background-color:#17a2b8}.badge-info[href]:focus,.badge-info[href]:hover{color:#fff;text-decoration:none;background-color:#117a8b}.badge-warning{color:#212529;background-color:#ffc107}.badge-warning[href]:focus,.badge-warning[href]:hover{color:#212529;text-decoration:none;background-color:#d39e00}.badge-danger{color:#fff;background-color:#dc3545}.badge-danger[href]:focus,.badge-danger[href]:hover{color:#fff;text-decoration:none;background-color:#bd2130}.badge-light{color:#212529;background-color:#f8f9fa}.badge-light[href]:focus,.badge-light[href]:hover{color:#212529;text-decoration:none;background-color:#dae0e5}.badge-dark{color:#fff;background-color:#343a40}.badge-dark[href]:focus,.badge-dark[href]:hover{color:#fff;text-decoration:none;background-color:#1d2124}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-ms-flexbox;display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;transition:width .6s ease}@media screen and (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}.media{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start}.media-body{-ms-flex:1;flex:1}.list-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item:focus,.list-group-item:hover{z-index:1;text-decoration:none}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{border-bottom:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:not(:disabled):not(.disabled){cursor:pointer}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{color:#000;text-decoration:none;opacity:.75}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-25%);transform:translate(0,-25%)}@media screen and (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{-webkit-transform:translate(0,0);transform:translate(0,0)}.modal-dialog-centered{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;min-height:calc(100% - (.5rem * 2))}.modal-dialog-centered::before{display:block;height:calc(100vh - (.5rem * 2));content:""}.modal-content{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:justify;justify-content:space-between;padding:1rem;border-bottom:1px solid #e9ecef;border-top-left-radius:.3rem;border-top-right-radius:.3rem}.modal-header .close{padding:1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end;padding:1rem;border-top:1px solid #e9ecef}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-centered{min-height:calc(100% - (1.75rem * 2))}.modal-dialog-centered::before{height:calc(100vh - (1.75rem * 2))}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg{max-width:800px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow::before,.bs-tooltip-top .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow::before,.bs-tooltip-right .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.bs-tooltip-bottom .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow::before,.bs-tooltip-left .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top] .arrow,.bs-popover-top .arrow{bottom:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=top] .arrow::after,.bs-popover-auto[x-placement^=top] .arrow::before,.bs-popover-top .arrow::after,.bs-popover-top .arrow::before{border-width:.5rem .5rem 0}.bs-popover-auto[x-placement^=top] .arrow::before,.bs-popover-top .arrow::before{bottom:0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top] .arrow::after,.bs-popover-top .arrow::after{bottom:1px;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right] .arrow,.bs-popover-right .arrow{left:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right] .arrow::after,.bs-popover-auto[x-placement^=right] .arrow::before,.bs-popover-right .arrow::after,.bs-popover-right .arrow::before{border-width:.5rem .5rem .5rem 0}.bs-popover-auto[x-placement^=right] .arrow::before,.bs-popover-right .arrow::before{left:0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right] .arrow::after,.bs-popover-right .arrow::after{left:1px;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom] .arrow,.bs-popover-bottom .arrow{top:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=bottom] .arrow::after,.bs-popover-auto[x-placement^=bottom] .arrow::before,.bs-popover-bottom .arrow::after,.bs-popover-bottom .arrow::before{border-width:0 .5rem .5rem .5rem}.bs-popover-auto[x-placement^=bottom] .arrow::before,.bs-popover-bottom .arrow::before{top:0;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom] .arrow::after,.bs-popover-bottom .arrow::after{top:1px;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left] .arrow,.bs-popover-left .arrow{right:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left] .arrow::after,.bs-popover-auto[x-placement^=left] .arrow::before,.bs-popover-left .arrow::after,.bs-popover-left .arrow::before{border-width:.5rem 0 .5rem .5rem}.bs-popover-auto[x-placement^=left] .arrow::before,.bs-popover-left .arrow::before{right:0;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left] .arrow::after,.bs-popover-left .arrow::after{right:1px;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;color:inherit;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-item{position:relative;display:none;-ms-flex-align:center;align-items:center;width:100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block;transition:-webkit-transform .6s ease;transition:transform .6s ease;transition:transform .6s ease,-webkit-transform .6s ease}@media screen and (prefers-reduced-motion:reduce){.carousel-item-next,.carousel-item-prev,.carousel-item.active{transition:none}}.carousel-item-next,.carousel-item-prev{position:absolute;top:0}.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translateX(0);transform:translateX(0)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.active.carousel-item-right,.carousel-item-next{-webkit-transform:translateX(100%);transform:translateX(100%)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.active.carousel-item-right,.carousel-item-next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translateX(-100%);transform:translateX(-100%)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}.carousel-fade .carousel-item{opacity:0;transition-duration:.6s;transition-property:opacity}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{opacity:0}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-prev,.carousel-fade .carousel-item-next,.carousel-fade .carousel-item-prev,.carousel-fade .carousel-item.active{-webkit-transform:translateX(0);transform:translateX(0)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-prev,.carousel-fade .carousel-item-next,.carousel-fade .carousel-item-prev,.carousel-fade .carousel-item.active{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:transparent no-repeat center center;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E")}.carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E")}.carousel-indicators{position:absolute;right:0;bottom:10px;left:0;z-index:15;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{position:relative;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:rgba(255,255,255,.5)}.carousel-indicators li::before{position:absolute;top:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators li::after{position:absolute;bottom:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-circle{border-radius:50%!important}.rounded-0{border-radius:0!important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}.text-justify{text-align:justify!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0062cc!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#545b62!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#1e7e34!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#117a8b!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#d39e00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#bd2130!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#dae0e5!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#1d2124!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px!important}.container{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}} +/*# sourceMappingURL=bootstrap.min.css.map */ diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/octicons.css b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/octicons.css new file mode 100644 index 000000000..31d97867a --- /dev/null +++ b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/octicons.css @@ -0,0 +1,5 @@ +.octicon { + display: inline-block; + vertical-align: text-top; + fill: currentColor; +} diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/style.css b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/style.css index 824fb3171..6d9c21e89 100644 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/style.css +++ b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/style.css @@ -6,7 +6,7 @@ body { max-width: none; } -.glyphicon { +.octicon { margin-right:.25em; } @@ -64,7 +64,7 @@ td.small { } td.codeLine { - font-family: monospace; + font-family: "Source Code Pro", "SFMono-Regular", Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; white-space: pre; } diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/dashboard.html.dist b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/dashboard.html.dist index 39a0e9ae9..cfa57687c 100644 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/dashboard.html.dist +++ b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/dashboard.html.dist @@ -8,24 +8,22 @@ -
    -
    +
    - +
    -
    +

    Classes

    @@ -140,8 +138,6 @@
    - - - - diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/directory_item.html.dist b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/directory_item.html.dist index 78dbb3565..f6941a437 100644 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/directory_item.html.dist +++ b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/directory_item.html.dist @@ -1,13 +1,13 @@ - - {{icon}}{{name}} - {{lines_bar}} -
    {{lines_executed_percent}}
    -
    {{lines_number}}
    - {{methods_bar}} -
    {{methods_tested_percent}}
    -
    {{methods_number}}
    - {{classes_bar}} -
    {{classes_tested_percent}}
    -
    {{classes_number}}
    - + + {{icon}}{{name}} + {{lines_bar}} +
    {{lines_executed_percent}}
    +
    {{lines_number}}
    + {{methods_bar}} +
    {{methods_tested_percent}}
    +
    {{methods_number}}
    + {{classes_bar}} +
    {{classes_tested_percent}}
    +
    {{classes_number}}
    + diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/file.html.dist b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/file.html.dist index 1ea12e2a4..1c33503ca 100644 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/file.html.dist +++ b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/file.html.dist @@ -5,43 +5,44 @@ Code Coverage for {{full_path}} + -
    -
    +
    - +
    -
    - - - - - - - - - - - - - - +
    +
    +
     
    Code Coverage
     
    Classes and Traits
    Functions and Methods
    Lines
    + + + + + + + + + + + + + {{items}} - -
     
    Code Coverage
     
    Classes and Traits
    Functions and Methods
    Lines
    + + +
    {{lines}} @@ -58,12 +59,14 @@

    Generated by php-code-coverage {{version}} using {{runtime}}{{generator}} at {{date}}.

    - + + + + - diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/file_item.html.dist b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/file_item.html.dist index 756fdd69b..dc754b3c6 100644 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/file_item.html.dist +++ b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/file_item.html.dist @@ -1,14 +1,14 @@ - - - - - - - - - - - - - + + + + + + + + + + + + + diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/fonts/glyphicons-halflings-regular.eot b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/fonts/glyphicons-halflings-regular.eot deleted file mode 100644 index b93a4953f..000000000 Binary files a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/fonts/glyphicons-halflings-regular.eot and /dev/null differ diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/fonts/glyphicons-halflings-regular.svg b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/fonts/glyphicons-halflings-regular.svg deleted file mode 100644 index 94fb5490a..000000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/fonts/glyphicons-halflings-regular.svg +++ /dev/null @@ -1,288 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/fonts/glyphicons-halflings-regular.ttf b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/fonts/glyphicons-halflings-regular.ttf deleted file mode 100644 index 1413fc609..000000000 Binary files a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/fonts/glyphicons-halflings-regular.ttf and /dev/null differ diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/fonts/glyphicons-halflings-regular.woff b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/fonts/glyphicons-halflings-regular.woff deleted file mode 100644 index 9e612858f..000000000 Binary files a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/fonts/glyphicons-halflings-regular.woff and /dev/null differ diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/fonts/glyphicons-halflings-regular.woff2 b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/fonts/glyphicons-halflings-regular.woff2 deleted file mode 100644 index 64539b54c..000000000 Binary files a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/fonts/glyphicons-halflings-regular.woff2 and /dev/null differ diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/icons/file-code.svg b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/icons/file-code.svg new file mode 100644 index 000000000..5b4b19953 --- /dev/null +++ b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/icons/file-code.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/icons/file-directory.svg b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/icons/file-directory.svg new file mode 100644 index 000000000..4bf1f1caa --- /dev/null +++ b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/icons/file-directory.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/bootstrap.min.js b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/bootstrap.min.js index 9bcd2fcca..1a4771236 100644 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/bootstrap.min.js +++ b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/bootstrap.min.js @@ -1,7 +1,7 @@ /*! - * Bootstrap v3.3.7 (http://getbootstrap.com) - * Copyright 2011-2016 Twitter, Inc. - * Licensed under the MIT license - */ -if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1||b[0]>3)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){if(a(b.target).is(this))return b.handleObj.handler.apply(this,arguments)}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.7",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a("#"===f?[]:f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.7",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c).prop(c,!0)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c).prop(c,!1))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")?(c.prop("checked")&&(a=!1),b.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==c.prop("type")&&(c.prop("checked")!==this.$element.hasClass("active")&&(a=!1),this.$element.toggleClass("active")),c.prop("checked",this.$element.hasClass("active")),a&&c.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target).closest(".btn");b.call(d,"toggle"),a(c.target).is('input[type="radio"], input[type="checkbox"]')||(c.preventDefault(),d.is("input,button")?d.trigger("focus"):d.find("input:visible,button:visible").first().trigger("focus"))}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.7",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));if(!(a>this.$items.length-1||a<0))return this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){if(!this.sliding)return this.slide("next")},c.prototype.prev=function(){if(!this.sliding)return this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.7",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function c(c){c&&3===c.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=b(d),f={relatedTarget:this};e.hasClass("open")&&(c&&"click"==c.type&&/input|textarea/i.test(c.target.tagName)&&a.contains(e[0],c.target)||(e.trigger(c=a.Event("hide.bs.dropdown",f)),c.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger(a.Event("hidden.bs.dropdown",f)))))}))}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.7",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=b(e),g=f.hasClass("open");if(c(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click",c);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger(a.Event("shown.bs.dropdown",h))}return!1}},g.prototype.keydown=function(c){if(/(38|40|27|32)/.test(c.which)&&!/input|textarea/i.test(c.target.tagName)){var d=a(this);if(c.preventDefault(),c.stopPropagation(),!d.is(".disabled, :disabled")){var e=b(d),g=e.hasClass("open");if(!g&&27!=c.which||g&&27==c.which)return 27==c.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find(".dropdown-menu"+h);if(i.length){var j=i.index(c.target);38==c.which&&j>0&&j--,40==c.which&&jdocument.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth
    ',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(a.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusin"==b.type?"focus":"hover"]=!0),c.tip().hasClass("in")||"in"==c.hoverState?void(c.hoverState="in"):(clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.isInStateTrue=function(){for(var a in this.inState)if(this.inState[a])return!0;return!1},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);if(c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusout"==b.type?"focus":"hover"]=!1),!c.isInStateTrue())return clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.getPosition(this.$viewport);h="bottom"==h&&k.bottom+m>o.bottom?"top":"top"==h&&k.top-mo.width?"left":"left"==h&&k.left-lg.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;jg.right&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){if(!this.$tip&&(this.$tip=a(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),b?(c.inState.click=!c.inState.click,c.isInStateTrue()?c.enter(c):c.leave(c)):c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type),a.$tip&&a.$tip.detach(),a.$tip=null,a.$arrow=null,a.$viewport=null,a.$element=null})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;!e&&/destroy|hide/.test(b)||(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.7",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.7",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b=e[a]&&(void 0===e[a+1]||b .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.7",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return e=a-d&&"bottom"},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=Math.max(a(document).height(),a(document.body).height());"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery); \ No newline at end of file + * Bootstrap v4.1.3 (https://getbootstrap.com/) + * Copyright 2011-2018 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("jquery"),require("popper.js")):"function"==typeof define&&define.amd?define(["exports","jquery","popper.js"],e):e(t.bootstrap={},t.jQuery,t.Popper)}(this,function(t,e,h){"use strict";function i(t,e){for(var n=0;nthis._items.length-1||t<0))if(this._isSliding)P(this._element).one(Q.SLID,function(){return e.to(t)});else{if(n===t)return this.pause(),void this.cycle();var i=ndocument.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},t._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},t._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=t.left+t.right
    ',trigger:"hover focus",title:"",delay:0,html:!(Ie={AUTO:"auto",TOP:"top",RIGHT:"right",BOTTOM:"bottom",LEFT:"left"}),selector:!(Se={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"(number|string)",container:"(string|element|boolean)",fallbackPlacement:"(string|array)",boundary:"(string|element)"}),placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent"},we="out",Ne={HIDE:"hide"+Ee,HIDDEN:"hidden"+Ee,SHOW:(De="show")+Ee,SHOWN:"shown"+Ee,INSERTED:"inserted"+Ee,CLICK:"click"+Ee,FOCUSIN:"focusin"+Ee,FOCUSOUT:"focusout"+Ee,MOUSEENTER:"mouseenter"+Ee,MOUSELEAVE:"mouseleave"+Ee},Oe="fade",ke="show",Pe=".tooltip-inner",je=".arrow",He="hover",Le="focus",Re="click",xe="manual",We=function(){function i(t,e){if("undefined"==typeof h)throw new TypeError("Bootstrap tooltips require Popper.js (https://popper.js.org)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var t=i.prototype;return t.enable=function(){this._isEnabled=!0},t.disable=function(){this._isEnabled=!1},t.toggleEnabled=function(){this._isEnabled=!this._isEnabled},t.toggle=function(t){if(this._isEnabled)if(t){var e=this.constructor.DATA_KEY,n=pe(t.currentTarget).data(e);n||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),pe(t.currentTarget).data(e,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(pe(this.getTipElement()).hasClass(ke))return void this._leave(null,this);this._enter(null,this)}},t.dispose=function(){clearTimeout(this._timeout),pe.removeData(this.element,this.constructor.DATA_KEY),pe(this.element).off(this.constructor.EVENT_KEY),pe(this.element).closest(".modal").off("hide.bs.modal"),this.tip&&pe(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,(this._activeTrigger=null)!==this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},t.show=function(){var e=this;if("none"===pe(this.element).css("display"))throw new Error("Please use show on visible elements");var t=pe.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){pe(this.element).trigger(t);var n=pe.contains(this.element.ownerDocument.documentElement,this.element);if(t.isDefaultPrevented()||!n)return;var i=this.getTipElement(),r=Fn.getUID(this.constructor.NAME);i.setAttribute("id",r),this.element.setAttribute("aria-describedby",r),this.setContent(),this.config.animation&&pe(i).addClass(Oe);var o="function"==typeof this.config.placement?this.config.placement.call(this,i,this.element):this.config.placement,s=this._getAttachment(o);this.addAttachmentClass(s);var a=!1===this.config.container?document.body:pe(document).find(this.config.container);pe(i).data(this.constructor.DATA_KEY,this),pe.contains(this.element.ownerDocument.documentElement,this.tip)||pe(i).appendTo(a),pe(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new h(this.element,i,{placement:s,modifiers:{offset:{offset:this.config.offset},flip:{behavior:this.config.fallbackPlacement},arrow:{element:je},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){e._handlePopperPlacementChange(t)}}),pe(i).addClass(ke),"ontouchstart"in document.documentElement&&pe(document.body).children().on("mouseover",null,pe.noop);var l=function(){e.config.animation&&e._fixTransition();var t=e._hoverState;e._hoverState=null,pe(e.element).trigger(e.constructor.Event.SHOWN),t===we&&e._leave(null,e)};if(pe(this.tip).hasClass(Oe)){var c=Fn.getTransitionDurationFromElement(this.tip);pe(this.tip).one(Fn.TRANSITION_END,l).emulateTransitionEnd(c)}else l()}},t.hide=function(t){var e=this,n=this.getTipElement(),i=pe.Event(this.constructor.Event.HIDE),r=function(){e._hoverState!==De&&n.parentNode&&n.parentNode.removeChild(n),e._cleanTipClass(),e.element.removeAttribute("aria-describedby"),pe(e.element).trigger(e.constructor.Event.HIDDEN),null!==e._popper&&e._popper.destroy(),t&&t()};if(pe(this.element).trigger(i),!i.isDefaultPrevented()){if(pe(n).removeClass(ke),"ontouchstart"in document.documentElement&&pe(document.body).children().off("mouseover",null,pe.noop),this._activeTrigger[Re]=!1,this._activeTrigger[Le]=!1,this._activeTrigger[He]=!1,pe(this.tip).hasClass(Oe)){var o=Fn.getTransitionDurationFromElement(n);pe(n).one(Fn.TRANSITION_END,r).emulateTransitionEnd(o)}else r();this._hoverState=""}},t.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},t.isWithContent=function(){return Boolean(this.getTitle())},t.addAttachmentClass=function(t){pe(this.getTipElement()).addClass(Te+"-"+t)},t.getTipElement=function(){return this.tip=this.tip||pe(this.config.template)[0],this.tip},t.setContent=function(){var t=this.getTipElement();this.setElementContent(pe(t.querySelectorAll(Pe)),this.getTitle()),pe(t).removeClass(Oe+" "+ke)},t.setElementContent=function(t,e){var n=this.config.html;"object"==typeof e&&(e.nodeType||e.jquery)?n?pe(e).parent().is(t)||t.empty().append(e):t.text(pe(e).text()):t[n?"html":"text"](e)},t.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},t._getAttachment=function(t){return Ie[t.toUpperCase()]},t._setListeners=function(){var i=this;this.config.trigger.split(" ").forEach(function(t){if("click"===t)pe(i.element).on(i.constructor.Event.CLICK,i.config.selector,function(t){return i.toggle(t)});else if(t!==xe){var e=t===He?i.constructor.Event.MOUSEENTER:i.constructor.Event.FOCUSIN,n=t===He?i.constructor.Event.MOUSELEAVE:i.constructor.Event.FOCUSOUT;pe(i.element).on(e,i.config.selector,function(t){return i._enter(t)}).on(n,i.config.selector,function(t){return i._leave(t)})}pe(i.element).closest(".modal").on("hide.bs.modal",function(){return i.hide()})}),this.config.selector?this.config=l({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},t._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},t._enter=function(t,e){var n=this.constructor.DATA_KEY;(e=e||pe(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),pe(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusin"===t.type?Le:He]=!0),pe(e.getTipElement()).hasClass(ke)||e._hoverState===De?e._hoverState=De:(clearTimeout(e._timeout),e._hoverState=De,e.config.delay&&e.config.delay.show?e._timeout=setTimeout(function(){e._hoverState===De&&e.show()},e.config.delay.show):e.show())},t._leave=function(t,e){var n=this.constructor.DATA_KEY;(e=e||pe(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),pe(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusout"===t.type?Le:He]=!1),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState=we,e.config.delay&&e.config.delay.hide?e._timeout=setTimeout(function(){e._hoverState===we&&e.hide()},e.config.delay.hide):e.hide())},t._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},t._getConfig=function(t){return"number"==typeof(t=l({},this.constructor.Default,pe(this.element).data(),"object"==typeof t&&t?t:{})).delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),Fn.typeCheckConfig(ve,t,this.constructor.DefaultType),t},t._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},t._cleanTipClass=function(){var t=pe(this.getTipElement()),e=t.attr("class").match(be);null!==e&&e.length&&t.removeClass(e.join(""))},t._handlePopperPlacementChange=function(t){var e=t.instance;this.tip=e.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},t._fixTransition=function(){var t=this.getTipElement(),e=this.config.animation;null===t.getAttribute("x-placement")&&(pe(t).removeClass(Oe),this.config.animation=!1,this.hide(),this.show(),this.config.animation=e)},i._jQueryInterface=function(n){return this.each(function(){var t=pe(this).data(ye),e="object"==typeof n&&n;if((t||!/dispose|hide/.test(n))&&(t||(t=new i(this,e),pe(this).data(ye,t)),"string"==typeof n)){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.1.3"}},{key:"Default",get:function(){return Ae}},{key:"NAME",get:function(){return ve}},{key:"DATA_KEY",get:function(){return ye}},{key:"Event",get:function(){return Ne}},{key:"EVENT_KEY",get:function(){return Ee}},{key:"DefaultType",get:function(){return Se}}]),i}(),pe.fn[ve]=We._jQueryInterface,pe.fn[ve].Constructor=We,pe.fn[ve].noConflict=function(){return pe.fn[ve]=Ce,We._jQueryInterface},We),Jn=(qe="popover",Ke="."+(Fe="bs.popover"),Me=(Ue=e).fn[qe],Qe="bs-popover",Be=new RegExp("(^|\\s)"+Qe+"\\S+","g"),Ve=l({},zn.Default,{placement:"right",trigger:"click",content:"",template:''}),Ye=l({},zn.DefaultType,{content:"(string|element|function)"}),ze="fade",Ze=".popover-header",Ge=".popover-body",$e={HIDE:"hide"+Ke,HIDDEN:"hidden"+Ke,SHOW:(Je="show")+Ke,SHOWN:"shown"+Ke,INSERTED:"inserted"+Ke,CLICK:"click"+Ke,FOCUSIN:"focusin"+Ke,FOCUSOUT:"focusout"+Ke,MOUSEENTER:"mouseenter"+Ke,MOUSELEAVE:"mouseleave"+Ke},Xe=function(t){var e,n;function i(){return t.apply(this,arguments)||this}n=t,(e=i).prototype=Object.create(n.prototype),(e.prototype.constructor=e).__proto__=n;var r=i.prototype;return r.isWithContent=function(){return this.getTitle()||this._getContent()},r.addAttachmentClass=function(t){Ue(this.getTipElement()).addClass(Qe+"-"+t)},r.getTipElement=function(){return this.tip=this.tip||Ue(this.config.template)[0],this.tip},r.setContent=function(){var t=Ue(this.getTipElement());this.setElementContent(t.find(Ze),this.getTitle());var e=this._getContent();"function"==typeof e&&(e=e.call(this.element)),this.setElementContent(t.find(Ge),e),t.removeClass(ze+" "+Je)},r._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},r._cleanTipClass=function(){var t=Ue(this.getTipElement()),e=t.attr("class").match(Be);null!==e&&0=this._offsets[r]&&("undefined"==typeof this._offsets[r+1]||t>16&255)),e.push(String.fromCharCode(f>>8&255)),e.push(String.fromCharCode(255&f)),g=0,f=0),d+=1;return 12===g?(f>>=4,e.push(String.fromCharCode(255&f))):18===g&&(f>>=2,e.push(String.fromCharCode(f>>8&255)),e.push(String.fromCharCode(255&f))),e.join("")},a.btoa=a.btoa||function(a){a=String(a);var c,d,e,f,g,h,i,j=0,k=[];if(/[^\x00-\xFF]/.test(a))throw Error("InvalidCharacterError");for(;j>2,g=(3&c)<<4|d>>4,h=(15&d)<<2|e>>6,i=63&e,j===a.length+2?(h=64,i=64):j===a.length+1&&(i=64),k.push(b.charAt(f),b.charAt(g),b.charAt(h),b.charAt(i));return k.join("")}}(a),Object.prototype.hasOwnProperty||(Object.prototype.hasOwnProperty=function(a){var b=this.__proto__||this.constructor.prototype;return a in this&&(!(a in b)||b[a]!==this[a])}),function(){if("performance"in a==!1&&(a.performance={}),Date.now=Date.now||function(){return(new Date).getTime()},"now"in a.performance==!1){var b=Date.now();performance.timing&&performance.timing.navigationStart&&(b=performance.timing.navigationStart),a.performance.now=function(){return Date.now()-b}}}(),a.requestAnimationFrame||(a.webkitRequestAnimationFrame?!function(a){a.requestAnimationFrame=function(b){return webkitRequestAnimationFrame(function(){b(a.performance.now())})},a.cancelAnimationFrame=webkitCancelAnimationFrame}(a):a.mozRequestAnimationFrame?!function(a){a.requestAnimationFrame=function(b){return mozRequestAnimationFrame(function(){b(a.performance.now())})},a.cancelAnimationFrame=mozCancelAnimationFrame}(a):!function(a){a.requestAnimationFrame=function(b){return a.setTimeout(b,1e3/60)},a.cancelAnimationFrame=a.clearTimeout}(a))}}(this),function(a,b){"object"==typeof exports&&"object"==typeof module?module.exports=b():"function"==typeof define&&define.amd?define(b):"object"==typeof exports?exports.Holder=b():a.Holder=b()}(this,function(){return function(a){function b(d){if(c[d])return c[d].exports;var e=c[d]={exports:{},id:d,loaded:!1};return a[d].call(e.exports,e,e.exports,b),e.loaded=!0,e.exports}var c={};return b.m=a,b.c=c,b.p="",b(0)}([function(a,b,c){(function(b){function d(a,b,c,d){var f=e(c.substr(c.lastIndexOf(a.domain)),a);f&&h({mode:null,el:d,flags:f,engineSettings:b})}function e(a,b){var c={theme:B(J.settings.themes.gray,null),stylesheets:b.stylesheets,instanceOptions:b};return a.match(/([\d]+p?)x([\d]+p?)(?:\?|$)/)?f(a,c):g(a,c)}function f(a,b){var c=a.split("?"),d=c[0].split("/");b.holderURL=a;var e=d[1],f=e.match(/([\d]+p?)x([\d]+p?)/);if(!f)return!1;if(b.fluid=-1!==e.indexOf("p"),b.dimensions={width:f[1].replace("p","%"),height:f[2].replace("p","%")},2===c.length){var g=A.parse(c[1]);if(g.bg&&(b.theme.background=(-1===g.bg.indexOf("#")?"#":"")+g.bg),g.fg&&(b.theme.foreground=(-1===g.fg.indexOf("#")?"#":"")+g.fg),g.theme&&b.instanceOptions.themes.hasOwnProperty(g.theme)&&(b.theme=B(b.instanceOptions.themes[g.theme],null)),g.text&&(b.text=g.text),g.textmode&&(b.textmode=g.textmode),g.size&&(b.size=g.size),g.font&&(b.font=g.font),g.align&&(b.align=g.align),b.nowrap=z.truthy(g.nowrap),b.auto=z.truthy(g.auto),z.truthy(g.random)){J.vars.cache.themeKeys=J.vars.cache.themeKeys||Object.keys(b.instanceOptions.themes);var h=J.vars.cache.themeKeys[0|Math.random()*J.vars.cache.themeKeys.length];b.theme=B(b.instanceOptions.themes[h],null)}}return b}function g(a,b){var c=!1,d=String.fromCharCode(11),e=a.replace(/([^\\])\//g,"$1"+d).split(d),f=/%[0-9a-f]{2}/gi,g=b.instanceOptions;b.holderURL=[];for(var h=e.length,i=0;h>i;i++){var j=e[i];if(j.match(f))try{j=decodeURIComponent(j)}catch(k){j=e[i]}var l=!1;if(J.flags.dimensions.match(j))c=!0,b.dimensions=J.flags.dimensions.output(j),l=!0;else if(J.flags.fluid.match(j))c=!0,b.dimensions=J.flags.fluid.output(j),b.fluid=!0,l=!0;else if(J.flags.textmode.match(j))b.textmode=J.flags.textmode.output(j),l=!0;else if(J.flags.colors.match(j)){var m=J.flags.colors.output(j);b.theme=B(b.theme,m),l=!0}else if(g.themes[j])g.themes.hasOwnProperty(j)&&(b.theme=B(g.themes[j],null)),l=!0;else if(J.flags.font.match(j))b.font=J.flags.font.output(j),l=!0;else if(J.flags.auto.match(j))b.auto=!0,l=!0;else if(J.flags.text.match(j))b.text=J.flags.text.output(j),l=!0;else if(J.flags.size.match(j))b.size=J.flags.size.output(j),l=!0;else if(J.flags.random.match(j)){null==J.vars.cache.themeKeys&&(J.vars.cache.themeKeys=Object.keys(g.themes));var n=J.vars.cache.themeKeys[0|Math.random()*J.vars.cache.themeKeys.length];b.theme=B(g.themes[n],null),l=!0}l&&b.holderURL.push(j)}return b.holderURL.unshift(g.domain),b.holderURL=b.holderURL.join("/"),c?b:!1}function h(a){var b=a.mode,c=a.el,d=a.flags,e=a.engineSettings,f=d.dimensions,g=d.theme,h=f.width+"x"+f.height;if(b=null==b?d.fluid?"fluid":"image":b,null!=d.text&&(g.text=d.text,"object"===c.nodeName.toLowerCase())){for(var j=g.text.split("\\n"),k=0;k1){var n,o=0,p=0,q=0;j=new e.Group("line"+q),("left"===a.align||"right"===a.align)&&(m=a.width*(1-2*(1-J.setup.lineWrapRatio)));for(var r=0;r=m||t===!0)&&(b(g,j,o,g.properties.leading),g.add(j),o=0,p+=g.properties.leading,q+=1,j=new e.Group("line"+q),j.y=p),t!==!0&&(i.moveTo(o,0),o+=h.spaceWidth+s.width,j.add(i))}if(b(g,j,o,g.properties.leading),g.add(j),"left"===a.align)g.moveTo(a.width-l,null,null);else if("right"===a.align){for(n in g.children)j=g.children[n],j.moveTo(a.width-j.width,null,null);g.moveTo(0-(a.width-l),null,null)}else{for(n in g.children)j=g.children[n],j.moveTo((g.width-j.width)/2,null,null);g.moveTo((a.width-g.width)/2,null,null)}g.moveTo(null,(a.height-g.height)/2,null),(a.height-g.height)/2<0&&g.moveTo(null,0,null)}else i=new e.Text(a.text),j=new e.Group("line0"),j.add(i),g.add(j),"left"===a.align?g.moveTo(a.width-l,null,null):"right"===a.align?g.moveTo(0-(a.width-l),null,null):g.moveTo((a.width-h.boundingBox.width)/2,null,null),g.moveTo(null,(a.height-h.boundingBox.height)/2,null);return d}function k(a,b,c){var d=parseInt(a,10),e=parseInt(b,10),f=Math.max(d,e),g=Math.min(d,e),h=.8*Math.min(g,f*J.defaults.scale);return Math.round(Math.max(c,h))}function l(a){var b;b=null==a||null==a.nodeType?J.vars.resizableImages:[a];for(var c=0,d=b.length;d>c;c++){var e=b[c];if(e.holderData){var f=e.holderData.flags,g=D(e);if(g){if(!e.holderData.resizeUpdate)continue;if(f.fluid&&f.auto){var h=e.holderData.fluidConfig;switch(h.mode){case"width":g.height=g.width/h.ratio;break;case"height":g.width=g.height*h.ratio}}var j={mode:"image",holderSettings:{dimensions:g,theme:f.theme,flags:f},el:e,engineSettings:e.holderData.engineSettings};"exact"==f.textmode&&(f.exactDimensions=g,j.holderSettings.dimensions=f.dimensions),i(j)}else p(e)}}}function m(a){if(a.holderData){var b=D(a);if(b){var c=a.holderData.flags,d={fluidHeight:"%"==c.dimensions.height.slice(-1),fluidWidth:"%"==c.dimensions.width.slice(-1),mode:null,initialDimensions:b};d.fluidWidth&&!d.fluidHeight?(d.mode="width",d.ratio=d.initialDimensions.width/parseFloat(c.dimensions.height)):!d.fluidWidth&&d.fluidHeight&&(d.mode="height",d.ratio=parseFloat(c.dimensions.width)/d.initialDimensions.height),a.holderData.fluidConfig=d}else p(a)}}function n(){for(var a,c=[],d=Object.keys(J.vars.invisibleImages),e=0,f=d.length;f>e;e++)a=J.vars.invisibleImages[d[e]],D(a)&&"img"==a.nodeName.toLowerCase()&&(c.push(a),delete J.vars.invisibleImages[d[e]]);c.length&&I.run({images:c}),b.requestAnimationFrame(n)}function o(){J.vars.visibilityCheckStarted||(b.requestAnimationFrame(n),J.vars.visibilityCheckStarted=!0)}function p(a){a.holderData.invisibleId||(J.vars.invisibleId+=1,J.vars.invisibleImages["i"+J.vars.invisibleId]=a,a.holderData.invisibleId=J.vars.invisibleId)}function q(a,b){return null==b?document.createElement(a):document.createElementNS(b,a)}function r(a,b){for(var c in b)a.setAttribute(c,b[c])}function s(a,b,c){var d,e;null==a?(a=q("svg",E),d=q("defs",E),e=q("style",E),r(e,{type:"text/css"}),d.appendChild(e),a.appendChild(d)):e=a.querySelector("style"),a.webkitMatchesSelector&&a.setAttribute("xmlns",E);for(var f=0;f=0;h--){var i=g.createProcessingInstruction("xml-stylesheet",'href="'+f[h]+'" rel="stylesheet"');g.insertBefore(i,g.firstChild)}g.removeChild(g.documentElement),e=d.serializeToString(g)}var j=d.serializeToString(a);return j=j.replace(/\&(\#[0-9]{2,}\;)/g,"&$1"),e+j}}function u(){return b.DOMParser?(new DOMParser).parseFromString("","application/xml"):void 0}function v(a){J.vars.debounceTimer||a.call(this),J.vars.debounceTimer&&b.clearTimeout(J.vars.debounceTimer),J.vars.debounceTimer=b.setTimeout(function(){J.vars.debounceTimer=null,a.call(this)},J.setup.debounce)}function w(){v(function(){l(null)})}var x=c(1),y=c(2),z=c(3),A=c(4),B=z.extend,C=z.getNodeArray,D=z.dimensionCheck,E="http://www.w3.org/2000/svg",F=8,G="2.7.1",H="\nCreated with Holder.js "+G+".\nLearn more at http://holderjs.com\n(c) 2012-2015 Ivan Malopinsky - http://imsky.co\n",I={version:G,addTheme:function(a,b){return null!=a&&null!=b&&(J.settings.themes[a]=b),delete J.vars.cache.themeKeys,this},addImage:function(a,b){var c=document.querySelectorAll(b);if(c.length)for(var d=0,e=c.length;e>d;d++){var f=q("img"),g={};g[J.vars.dataAttr]=a,r(f,g),c[d].appendChild(f)}return this},setResizeUpdate:function(a,b){a.holderData&&(a.holderData.resizeUpdate=!!b,a.holderData.resizeUpdate&&l(a))},run:function(a){a=a||{};var c={},f=B(J.settings,a);J.vars.preempted=!0,J.vars.dataAttr=f.dataAttr||J.vars.dataAttr,c.renderer=f.renderer?f.renderer:J.setup.renderer,-1===J.setup.renderers.join(",").indexOf(c.renderer)&&(c.renderer=J.setup.supportsSVG?"svg":J.setup.supportsCanvas?"canvas":"html");var g=C(f.images),i=C(f.bgnodes),j=C(f.stylenodes),k=C(f.objects);c.stylesheets=[],c.svgXMLStylesheet=!0,c.noFontFallback=f.noFontFallback?f.noFontFallback:!1;for(var l=0;l1){c.nodeValue="";for(var u=0;u=0?b:1)}function f(a){v?e(a):w.push(a)}null==document.readyState&&document.addEventListener&&(document.addEventListener("DOMContentLoaded",function y(){document.removeEventListener("DOMContentLoaded",y,!1),document.readyState="complete"},!1),document.readyState="loading");var g=a.document,h=g.documentElement,i="load",j=!1,k="on"+i,l="complete",m="readyState",n="attachEvent",o="detachEvent",p="addEventListener",q="DOMContentLoaded",r="onreadystatechange",s="removeEventListener",t=p in g,u=j,v=j,w=[];if(g[m]===l)e(b);else if(t)g[p](q,c,j),a[p](i,c,j);else{g[n](r,c),a[n](k,c);try{u=null==a.frameElement&&h}catch(x){}u&&u.doScroll&&!function z(){if(!v){try{u.doScroll("left")}catch(a){return e(z,50)}d(),b()}}()}return f.version="1.4.0",f.isReady=function(){return v},f}a.exports="undefined"!=typeof window&&b(window)},function(a,b,c){var d=c(5),e=function(a){function b(a,b){for(var c in b)a[c]=b[c];return a}var c=1,e=d.defclass({constructor:function(a){c++,this.parent=null,this.children={},this.id=c,this.name="n"+c,null!=a&&(this.name=a),this.x=0,this.y=0,this.z=0,this.width=0,this.height=0},resize:function(a,b){null!=a&&(this.width=a),null!=b&&(this.height=b)},moveTo:function(a,b,c){this.x=null!=a?a:this.x,this.y=null!=b?b:this.y,this.z=null!=c?c:this.z},add:function(a){var b=a.name;if(null!=this.children[b])throw"SceneGraph: child with that name already exists: "+b;this.children[b]=a,a.parent=this}}),f=d(e,function(b){this.constructor=function(){b.constructor.call(this,"root"),this.properties=a}}),g=d(e,function(a){function c(c,d){if(a.constructor.call(this,c),this.properties={fill:"#000"},null!=d)b(this.properties,d);else if(null!=c&&"string"!=typeof c)throw"SceneGraph: invalid node name"}this.Group=d.extend(this,{constructor:c,type:"group"}),this.Rect=d.extend(this,{constructor:c,type:"rect"}),this.Text=d.extend(this,{constructor:function(a){c.call(this),this.properties.text=a},type:"text"})}),h=new f;return this.Shape=g,this.root=h,this};a.exports=e},function(a,b){(function(a){b.extend=function(a,b){var c={};for(var d in a)a.hasOwnProperty(d)&&(c[d]=a[d]);if(null!=b)for(var e in b)b.hasOwnProperty(e)&&(c[e]=b[e]);return c},b.cssProps=function(a){var b=[];for(var c in a)a.hasOwnProperty(c)&&b.push(c+":"+a[c]);return b.join(";")},b.encodeHtmlEntity=function(a){for(var b=[],c=0,d=a.length-1;d>=0;d--)c=a.charCodeAt(d),b.unshift(c>128?["&#",c,";"].join(""):a[d]);return b.join("")},b.getNodeArray=function(b){var c=null;return"string"==typeof b?c=document.querySelectorAll(b):a.NodeList&&b instanceof a.NodeList?c=b:a.Node&&b instanceof a.Node?c=[b]:a.HTMLCollection&&b instanceof a.HTMLCollection?c=b:b instanceof Array?c=b:null===b&&(c=[]),c},b.imageExists=function(a,b){var c=new Image;c.onerror=function(){b.call(this,!1)},c.onload=function(){b.call(this,!0)},c.src=a},b.decodeHtmlEntity=function(a){return a.replace(/&#(\d+);/g,function(a,b){return String.fromCharCode(b)})},b.dimensionCheck=function(a){var b={height:a.clientHeight,width:a.clientWidth};return b.height&&b.width?b:!1},b.truthy=function(a){return"string"==typeof a?"true"===a||"yes"===a||"1"===a||"on"===a||"✓"===a:!!a}}).call(b,function(){return this}())},function(a,b,c){var d=encodeURIComponent,e=decodeURIComponent,f=c(6),g=c(7),h=/(\w+)\[(\d+)\]/,i=/\w+\.\w+/;b.parse=function(a){if("string"!=typeof a)return{};if(a=f(a),""===a)return{};"?"===a.charAt(0)&&(a=a.slice(1));for(var b={},c=a.split("&"),d=0;d
    {{name}}{{classes_bar}}
    {{classes_tested_percent}}
    {{classes_number}}
    {{methods_bar}}
    {{methods_tested_percent}}
    {{methods_number}}
    {{crap}}{{lines_bar}}
    {{lines_executed_percent}}
    {{lines_number}}
    {{name}}{{classes_bar}}
    {{classes_tested_percent}}
    {{classes_number}}
    {{methods_bar}}
    {{methods_tested_percent}}
    {{methods_number}}
    {{crap}}{{lines_bar}}
    {{lines_executed_percent}}
    {{lines_number}}
    ","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};la.optgroup=la.option,la.tbody=la.tfoot=la.colgroup=la.caption=la.thead,la.th=la.td;function ma(a,b){var c;return c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[],void 0===b||b&&r.nodeName(a,b)?r.merge([a],c):c}function na(a,b){for(var c=0,d=a.length;c-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=ma(l.appendChild(f),"script"),j&&na(g),c){k=0;while(f=g[k++])ka.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var qa=d.documentElement,ra=/^key/,sa=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ta=/^([^.]*)(?:\.(.+)|)/;function ua(){return!0}function va(){return!1}function wa(){try{return d.activeElement}catch(a){}}function xa(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)xa(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=va;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=V.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(qa,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(K)||[""],j=b.length;while(j--)h=ta.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=V.hasData(a)&&V.get(a);if(q&&(i=q.events)){b=(b||"").match(K)||[""],j=b.length;while(j--)if(h=ta.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&V.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(V.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c=1))for(;j!==this;j=j.parentNode||this)if(1===j.nodeType&&("click"!==a.type||j.disabled!==!0)){for(f=[],g={},c=0;c-1:r.find(e,this,null,[j]).length),g[e]&&f.push(d);f.length&&h.push({elem:j,handlers:f})}return j=this,i\x20\t\r\n\f]*)[^>]*)\/>/gi,za=/\s*$/g;function Da(a,b){return r.nodeName(a,"table")&&r.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a:a}function Ea(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Fa(a){var b=Ba.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ga(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(V.hasData(a)&&(f=V.access(a),g=V.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;c1&&"string"==typeof q&&!o.checkClone&&Aa.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ia(f,b,c,d)});if(m&&(e=pa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(ma(e,"script"),Ea),i=h.length;l")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=ma(h),f=ma(a),d=0,e=f.length;d0&&na(g,!i&&ma(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(T(c)){if(b=c[V.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[V.expando]=void 0}c[W.expando]&&(c[W.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ja(this,a,!0)},remove:function(a){return Ja(this,a)},text:function(a){return S(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ia(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Da(this,a);b.appendChild(a)}})},prepend:function(){return Ia(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Da(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ia(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ia(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(r.cleanData(ma(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return S(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!za.test(a)&&!la[(ja.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;c1)}});function Ya(a,b,c,d,e){return new Ya.prototype.init(a,b,c,d,e)}r.Tween=Ya,Ya.prototype={constructor:Ya,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||r.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(r.cssNumber[c]?"":"px")},cur:function(){var a=Ya.propHooks[this.prop];return a&&a.get?a.get(this):Ya.propHooks._default.get(this)},run:function(a){var b,c=Ya.propHooks[this.prop];return this.options.duration?this.pos=b=r.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Ya.propHooks._default.set(this),this}},Ya.prototype.init.prototype=Ya.prototype,Ya.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=r.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){r.fx.step[a.prop]?r.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[r.cssProps[a.prop]]&&!r.cssHooks[a.prop]?a.elem[a.prop]=a.now:r.style(a.elem,a.prop,a.now+a.unit)}}},Ya.propHooks.scrollTop=Ya.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},r.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},r.fx=Ya.prototype.init,r.fx.step={};var Za,$a,_a=/^(?:toggle|show|hide)$/,ab=/queueHooks$/;function bb(){$a&&(a.requestAnimationFrame(bb),r.fx.tick())}function cb(){return a.setTimeout(function(){Za=void 0}),Za=r.now()}function db(a,b){var c,d=0,e={height:a};for(b=b?1:0;d<4;d+=2-b)c=ba[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function eb(a,b,c){for(var d,e=(hb.tweeners[b]||[]).concat(hb.tweeners["*"]),f=0,g=e.length;f1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?ib:void 0)), -void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&r.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(K);if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c)}}),ib={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=jb[b]||r.find.attr;jb[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=jb[g],jb[g]=e,e=null!=c(a,b,d)?g:null,jb[g]=f),e}});var kb=/^(?:input|select|textarea|button)$/i,lb=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return S(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):kb.test(a.nodeName)||lb.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});function mb(a){var b=a.match(K)||[];return b.join(" ")}function nb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,nb(this)))});if("string"==typeof a&&a){b=a.match(K)||[];while(c=this[i++])if(e=nb(c),d=1===c.nodeType&&" "+mb(e)+" "){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=mb(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,nb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(K)||[];while(c=this[i++])if(e=nb(c),d=1===c.nodeType&&" "+mb(e)+" "){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=mb(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,nb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(K)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=nb(this),b&&V.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":V.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+mb(nb(c))+" ").indexOf(b)>-1)return!0;return!1}});var ob=/\r/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":r.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(ob,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:mb(r.text(a))}},select:{get:function(a){var b,c,d,e=a.options,f=a.selectedIndex,g="select-one"===a.type,h=g?null:[],i=g?f+1:e.length;for(d=f<0?i:g?f:0;d-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){if(r.isArray(b))return a.checked=r.inArray(r(a).val(),b)>-1}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var pb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!pb.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,pb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(V.get(h,"events")||{})[b.type]&&V.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&T(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!T(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];if(c)return r.event.trigger(a,b,c,!0)}}),r.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=V.access(d,b);e||d.addEventListener(a,c,!0),V.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=V.access(d,b)-1;e?V.access(d,b,e):(d.removeEventListener(a,c,!0),V.remove(d,b))}}});var qb=a.location,rb=r.now(),sb=/\?/;r.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return c&&!c.getElementsByTagName("parsererror").length||r.error("Invalid XML: "+b),c};var tb=/\[\]$/,ub=/\r?\n/g,vb=/^(?:submit|button|image|reset|file)$/i,wb=/^(?:input|select|textarea|keygen)/i;function xb(a,b,c,d){var e;if(r.isArray(b))r.each(b,function(b,e){c||tb.test(a)?d(a,e):xb(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)xb(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(r.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)xb(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&wb.test(this.nodeName)&&!vb.test(a)&&(this.checked||!ia.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:r.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(ub,"\r\n")}}):{name:b.name,value:c.replace(ub,"\r\n")}}).get()}});var yb=/%20/g,zb=/#.*$/,Ab=/([?&])_=[^&]*/,Bb=/^(.*?):[ \t]*([^\r\n]*)$/gm,Cb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Db=/^(?:GET|HEAD)$/,Eb=/^\/\//,Fb={},Gb={},Hb="*/".concat("*"),Ib=d.createElement("a");Ib.href=qb.href;function Jb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(K)||[];if(r.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Kb(a,b,c,d){var e={},f=a===Gb;function g(h){var i;return e[h]=!0,r.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Lb(a,b){var c,d,e=r.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&r.extend(!0,a,d),a}function Mb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}if(f)return f!==i[0]&&i.unshift(f),c[f]}function Nb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}r.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:qb.href,type:"GET",isLocal:Cb.test(qb.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Hb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":r.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Lb(Lb(a,r.ajaxSettings),b):Lb(r.ajaxSettings,a)},ajaxPrefilter:Jb(Fb),ajaxTransport:Jb(Gb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m,n,o=r.ajaxSetup({},c),p=o.context||o,q=o.context&&(p.nodeType||p.jquery)?r(p):r.event,s=r.Deferred(),t=r.Callbacks("once memory"),u=o.statusCode||{},v={},w={},x="canceled",y={readyState:0,getResponseHeader:function(a){var b;if(k){if(!h){h={};while(b=Bb.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return k?g:null},setRequestHeader:function(a,b){return null==k&&(a=w[a.toLowerCase()]=w[a.toLowerCase()]||a,v[a]=b),this},overrideMimeType:function(a){return null==k&&(o.mimeType=a),this},statusCode:function(a){var b;if(a)if(k)y.always(a[y.status]);else for(b in a)u[b]=[u[b],a[b]];return this},abort:function(a){var b=a||x;return e&&e.abort(b),A(0,b),this}};if(s.promise(y),o.url=((b||o.url||qb.href)+"").replace(Eb,qb.protocol+"//"),o.type=c.method||c.type||o.method||o.type,o.dataTypes=(o.dataType||"*").toLowerCase().match(K)||[""],null==o.crossDomain){j=d.createElement("a");try{j.href=o.url,j.href=j.href,o.crossDomain=Ib.protocol+"//"+Ib.host!=j.protocol+"//"+j.host}catch(z){o.crossDomain=!0}}if(o.data&&o.processData&&"string"!=typeof o.data&&(o.data=r.param(o.data,o.traditional)),Kb(Fb,o,c,y),k)return y;l=r.event&&o.global,l&&0===r.active++&&r.event.trigger("ajaxStart"),o.type=o.type.toUpperCase(),o.hasContent=!Db.test(o.type),f=o.url.replace(zb,""),o.hasContent?o.data&&o.processData&&0===(o.contentType||"").indexOf("application/x-www-form-urlencoded")&&(o.data=o.data.replace(yb,"+")):(n=o.url.slice(f.length),o.data&&(f+=(sb.test(f)?"&":"?")+o.data,delete o.data),o.cache===!1&&(f=f.replace(Ab,"$1"),n=(sb.test(f)?"&":"?")+"_="+rb++ +n),o.url=f+n),o.ifModified&&(r.lastModified[f]&&y.setRequestHeader("If-Modified-Since",r.lastModified[f]),r.etag[f]&&y.setRequestHeader("If-None-Match",r.etag[f])),(o.data&&o.hasContent&&o.contentType!==!1||c.contentType)&&y.setRequestHeader("Content-Type",o.contentType),y.setRequestHeader("Accept",o.dataTypes[0]&&o.accepts[o.dataTypes[0]]?o.accepts[o.dataTypes[0]]+("*"!==o.dataTypes[0]?", "+Hb+"; q=0.01":""):o.accepts["*"]);for(m in o.headers)y.setRequestHeader(m,o.headers[m]);if(o.beforeSend&&(o.beforeSend.call(p,y,o)===!1||k))return y.abort();if(x="abort",t.add(o.complete),y.done(o.success),y.fail(o.error),e=Kb(Gb,o,c,y)){if(y.readyState=1,l&&q.trigger("ajaxSend",[y,o]),k)return y;o.async&&o.timeout>0&&(i=a.setTimeout(function(){y.abort("timeout")},o.timeout));try{k=!1,e.send(v,A)}catch(z){if(k)throw z;A(-1,z)}}else A(-1,"No Transport");function A(b,c,d,h){var j,m,n,v,w,x=c;k||(k=!0,i&&a.clearTimeout(i),e=void 0,g=h||"",y.readyState=b>0?4:0,j=b>=200&&b<300||304===b,d&&(v=Mb(o,y,d)),v=Nb(o,v,y,j),j?(o.ifModified&&(w=y.getResponseHeader("Last-Modified"),w&&(r.lastModified[f]=w),w=y.getResponseHeader("etag"),w&&(r.etag[f]=w)),204===b||"HEAD"===o.type?x="nocontent":304===b?x="notmodified":(x=v.state,m=v.data,n=v.error,j=!n)):(n=x,!b&&x||(x="error",b<0&&(b=0))),y.status=b,y.statusText=(c||x)+"",j?s.resolveWith(p,[m,x,y]):s.rejectWith(p,[y,x,n]),y.statusCode(u),u=void 0,l&&q.trigger(j?"ajaxSuccess":"ajaxError",[y,o,j?m:n]),t.fireWith(p,[y,x]),l&&(q.trigger("ajaxComplete",[y,o]),--r.active||r.event.trigger("ajaxStop")))}return y},getJSON:function(a,b,c){return r.get(a,b,c,"json")},getScript:function(a,b){return r.get(a,void 0,b,"script")}}),r.each(["get","post"],function(a,b){r[b]=function(a,c,d,e){return r.isFunction(c)&&(e=e||d,d=c,c=void 0),r.ajax(r.extend({url:a,type:b,dataType:e,data:c,success:d},r.isPlainObject(a)&&a))}}),r._evalUrl=function(a){return r.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},r.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Ob={0:200,1223:204},Pb=r.ajaxSettings.xhr();o.cors=!!Pb&&"withCredentials"in Pb,o.ajax=Pb=!!Pb,r.ajaxTransport(function(b){var c,d;if(o.cors||Pb&&!b.crossDomain)return{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Ob[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}}),r.ajaxPrefilter(function(a){a.crossDomain&&(a.contents.script=!1)}),r.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return r.globalEval(a),a}}}),r.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),r.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=r(" + - diff --git a/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForBankAccount/dashboard.html b/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForBankAccount/dashboard.html index c1ce40d16..6605ff96d 100644 --- a/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForBankAccount/dashboard.html +++ b/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForBankAccount/dashboard.html @@ -8,26 +8,24 @@ -
    -
    +
    - +
    -
    +

    Classes

    @@ -146,8 +144,6 @@
    - - - - diff --git a/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForClassWithAnonymousFunction/dashboard.html b/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForClassWithAnonymousFunction/dashboard.html index 2a8c91c48..07f7eaeb7 100644 --- a/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForClassWithAnonymousFunction/dashboard.html +++ b/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForClassWithAnonymousFunction/dashboard.html @@ -8,26 +8,24 @@ -
    -
    +
    - +
    -
    +

    Classes

    @@ -144,8 +142,6 @@
    - - - - diff --git a/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForClassWithAnonymousFunction/source_with_class_and_anonymous_function.php.html b/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForClassWithAnonymousFunction/source_with_class_and_anonymous_function.php.html index debc561ae..85c431604 100644 --- a/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForClassWithAnonymousFunction/source_with_class_and_anonymous_function.php.html +++ b/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForClassWithAnonymousFunction/source_with_class_and_anonymous_function.php.html @@ -2,127 +2,128 @@ - Code Coverage for %s/source_with_class_and_anonymous_function.php + Code Coverage for %s%esource_with_class_and_anonymous_function.php + -
    -
    +
    - +
    -
    - - - - - - - - - - - - - - - - - +
     
    Code Coverage
     
    Classes and Traits
    Functions and Methods
    Lines
    Total
    -
    +
    +
    + + + + + + + + + + + + + + + + + - - - + + - - - - + + + - - - + + + - - - + + - - - + + - - - - + + + - - - + + + - - - + + - - - - + + + - - - + + + - -
     
    Code Coverage
     
    Classes and Traits
    Functions and Methods
    Lines
    Total
    +
    0.00% covered (danger)
    0.00%
    0 / 1
    -
    +
    0.00%
    0 / 1
    +
    0.00% covered (danger)
    0.00%
    0 / 1
    CRAP
    -
    +
    0.00%
    0 / 1
    CRAP
    +
    87.50% covered (warning)
    87.50%
    7 / 8
    87.50%
    7 / 8
    CoveredClassWithAnonymousFunctionInStaticMethod
    -
    +
    CoveredClassWithAnonymousFunctionInStaticMethod
    +
    0.00% covered (danger)
    0.00%
    0 / 1
    -
    +
    0.00%
    0 / 1
    +
    0.00% covered (danger)
    0.00%
    0 / 1
    1.00
    -
    +
    0.00%
    0 / 1
    1.00
    +
    87.50% covered (warning)
    87.50%
    7 / 8
    87.50%
    7 / 8
     runAnonymous
    -
    +
     runAnonymous
    +
    0.00% covered (danger)
    0.00%
    0 / 1
    1.00
    -
    +
    0.00%
    0 / 1
    1.00
    +
    87.50% covered (warning)
    87.50%
    7 / 8
    87.50%
    7 / 8
    +
    +
    @@ -158,12 +159,14 @@

    Generated by php-code-coverage %s using %s at %s.

    - + + + + - diff --git a/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForFileWithIgnoredLines/dashboard.html b/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForFileWithIgnoredLines/dashboard.html index fbff16949..360409afd 100644 --- a/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForFileWithIgnoredLines/dashboard.html +++ b/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForFileWithIgnoredLines/dashboard.html @@ -8,26 +8,24 @@ -
    -
    +
    - +
    -
    +

    Classes

    @@ -142,8 +140,6 @@
    - - - - diff --git a/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForFileWithIgnoredLines/source_with_ignore.php.html b/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForFileWithIgnoredLines/source_with_ignore.php.html index 6e92c0f0c..0949edad3 100644 --- a/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForFileWithIgnoredLines/source_with_ignore.php.html +++ b/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForFileWithIgnoredLines/source_with_ignore.php.html @@ -2,133 +2,134 @@ - Code Coverage for %s + Code Coverage for %s/source_with_ignore.php + -
    -
    +
    - +
    -
    -
    <?php
    - - - - - - - - - - - - - - - - - - - +
     
    Code Coverage
     
    Classes and Traits
    Functions and Methods
    Lines
    Total
    n/a
    0 / 0
    -
    +
    +
    + + + + + + + + + + + + + + + + + + + + - - - - + + + - - - + + + - - - - - - - - - - + + + + + + + + + + - - - - - - - - - - - - - + + + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + - - - - - - - - - - - - - + + + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + - -
     
    Code Coverage
     
    Classes and Traits
    Functions and Methods
    Lines
    Total
    n/a
    0 / 0
    +
    100.00% covered (success)
    100.00%
    1 / 1
    CRAP
    -
    +
    100.00%
    1 / 1
    CRAP
    +
    50.00% covered (danger)
    50.00%
    1 / 2
    50.00%
    1 / 2
    baz
    n/a
    0 / 0
    1
    n/a
    0 / 0
    baz
    n/a
    0 / 0
    1
    n/a
    0 / 0
    Foo
    n/a
    0 / 0
    n/a
    0 / 0
    1
    n/a
    0 / 0
    Foo
    n/a
    0 / 0
    n/a
    0 / 0
    1
    n/a
    0 / 0
     bar
    n/a
    0 / 0
    1
    n/a
    0 / 0
     bar
    n/a
    0 / 0
    1
    n/a
    0 / 0
    Bar
    n/a
    0 / 0
    n/a
    0 / 0
    1
    n/a
    0 / 0
    Bar
    n/a
    0 / 0
    n/a
    0 / 0
    1
    n/a
    0 / 0
     foo
    n/a
    0 / 0
    1
    n/a
    0 / 0
     foo
    n/a
    0 / 0
    1
    n/a
    0 / 0
    +
    +
    @@ -182,12 +183,14 @@

    Generated by php-code-coverage %s using %s at %s.

    - + + + + - diff --git a/vendor/phpunit/php-code-coverage/tests/_files/Report/XML/CoverageForBankAccount/BankAccount.php.xml b/vendor/phpunit/php-code-coverage/tests/_files/Report/XML/CoverageForBankAccount/BankAccount.php.xml index 7601beb81..359f6a3cd 100644 --- a/vendor/phpunit/php-code-coverage/tests/_files/Report/XML/CoverageForBankAccount/BankAccount.php.xml +++ b/vendor/phpunit/php-code-coverage/tests/_files/Report/XML/CoverageForBankAccount/BankAccount.php.xml @@ -1,6 +1,6 @@ - + diff --git a/vendor/phpunit/php-code-coverage/tests/_files/Report/XML/CoverageForClassWithAnonymousFunction/source_with_class_and_anonymous_function.php.xml b/vendor/phpunit/php-code-coverage/tests/_files/Report/XML/CoverageForClassWithAnonymousFunction/source_with_class_and_anonymous_function.php.xml index d23ab2726..a4131745d 100644 --- a/vendor/phpunit/php-code-coverage/tests/_files/Report/XML/CoverageForClassWithAnonymousFunction/source_with_class_and_anonymous_function.php.xml +++ b/vendor/phpunit/php-code-coverage/tests/_files/Report/XML/CoverageForClassWithAnonymousFunction/source_with_class_and_anonymous_function.php.xml @@ -1,6 +1,6 @@ - + diff --git a/vendor/phpunit/php-code-coverage/tests/_files/Report/XML/CoverageForFileWithIgnoredLines/source_with_ignore.php.xml b/vendor/phpunit/php-code-coverage/tests/_files/Report/XML/CoverageForFileWithIgnoredLines/source_with_ignore.php.xml index 74e0f0df5..5ff1d6b82 100644 --- a/vendor/phpunit/php-code-coverage/tests/_files/Report/XML/CoverageForFileWithIgnoredLines/source_with_ignore.php.xml +++ b/vendor/phpunit/php-code-coverage/tests/_files/Report/XML/CoverageForFileWithIgnoredLines/source_with_ignore.php.xml @@ -1,6 +1,6 @@ - + diff --git a/vendor/phpunit/php-code-coverage/tests/_files/class-with-anonymous-function-clover.xml b/vendor/phpunit/php-code-coverage/tests/_files/class-with-anonymous-function-clover.xml index 847dd9fb0..008db55f1 100644 --- a/vendor/phpunit/php-code-coverage/tests/_files/class-with-anonymous-function-clover.xml +++ b/vendor/phpunit/php-code-coverage/tests/_files/class-with-anonymous-function-clover.xml @@ -1,7 +1,7 @@ - + diff --git a/vendor/phpunit/php-code-coverage/tests/_files/ignored-lines-clover.xml b/vendor/phpunit/php-code-coverage/tests/_files/ignored-lines-clover.xml index a35cc4b2d..efd38014a 100644 --- a/vendor/phpunit/php-code-coverage/tests/_files/ignored-lines-clover.xml +++ b/vendor/phpunit/php-code-coverage/tests/_files/ignored-lines-clover.xml @@ -1,7 +1,7 @@ - + diff --git a/vendor/phpunit/php-code-coverage/tests/bootstrap.php b/vendor/phpunit/php-code-coverage/tests/bootstrap.php index 8e6d4134f..6c372e66d 100644 --- a/vendor/phpunit/php-code-coverage/tests/bootstrap.php +++ b/vendor/phpunit/php-code-coverage/tests/bootstrap.php @@ -2,4 +2,7 @@ require __DIR__ . '/../vendor/autoload.php'; require __DIR__ . '/TestCase.php'; -define('TEST_FILES_PATH', __DIR__ . '/_files/'); +define( + 'TEST_FILES_PATH', + __DIR__ . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR +); diff --git a/vendor/phpunit/php-code-coverage/tests/tests/BuilderTest.php b/vendor/phpunit/php-code-coverage/tests/tests/BuilderTest.php index 1a4b6f351..303aa9c45 100644 --- a/vendor/phpunit/php-code-coverage/tests/tests/BuilderTest.php +++ b/vendor/phpunit/php-code-coverage/tests/tests/BuilderTest.php @@ -10,6 +10,9 @@ namespace SebastianBergmann\CodeCoverage\Report; +use SebastianBergmann\CodeCoverage\Driver\Driver; +use SebastianBergmann\CodeCoverage\CodeCoverage; +use SebastianBergmann\CodeCoverage\Filter; use SebastianBergmann\CodeCoverage\TestCase; use SebastianBergmann\CodeCoverage\Node\Builder; @@ -125,8 +128,25 @@ class BuilderTest extends TestCase $this->assertEquals([], $root->getFunctions()); } + public function testNotCrashParsing() + { + $coverage = $this->getCoverageForCrashParsing(); + $root = $coverage->getReport(); + + $expectedPath = rtrim(TEST_FILES_PATH, DIRECTORY_SEPARATOR); + $this->assertEquals($expectedPath, $root->getName()); + $this->assertEquals($expectedPath, $root->getPath()); + $this->assertEquals(2, $root->getNumExecutableLines()); + $this->assertEquals(0, $root->getNumExecutedLines()); + $data = $coverage->getData(); + $expectedFile = $expectedPath . DIRECTORY_SEPARATOR . 'Crash.php'; + $this->assertSame([$expectedFile => [1 => [], 2 => []]], $data); + } + public function testBuildDirectoryStructure() { + $s = \DIRECTORY_SEPARATOR; + $method = new \ReflectionMethod( Builder::class, 'buildDirectoryStructure' @@ -138,12 +158,23 @@ class BuilderTest extends TestCase [ 'src' => [ 'Money.php/f' => [], - 'MoneyBag.php/f' => [] + 'MoneyBag.php/f' => [], + 'Foo' => [ + 'Bar' => [ + 'Baz' => [ + 'Foo.php/f' => [], + ], + ], + ], ] ], $method->invoke( $this->factory, - ['src/Money.php' => [], 'src/MoneyBag.php' => []] + [ + "src{$s}Money.php" => [], + "src{$s}MoneyBag.php" => [], + "src{$s}Foo{$s}Bar{$s}Baz{$s}Foo.php" => [], + ] ) ); } @@ -168,45 +199,52 @@ class BuilderTest extends TestCase public function reducePathsProvider() { - return [ - [ - [ - 'Money.php' => [], - 'MoneyBag.php' => [] - ], - '/home/sb/Money', - [ - '/home/sb/Money/Money.php' => [], - '/home/sb/Money/MoneyBag.php' => [] - ] - ], - [ - [ - 'Money.php' => [] - ], - '/home/sb/Money/', - [ - '/home/sb/Money/Money.php' => [] - ] - ], - [ - [], - '.', - [] - ], - [ - [ - 'Money.php' => [], - 'MoneyBag.php' => [], - 'Cash.phar/Cash.php' => [], - ], - '/home/sb/Money', - [ - '/home/sb/Money/Money.php' => [], - '/home/sb/Money/MoneyBag.php' => [], - 'phar:///home/sb/Money/Cash.phar/Cash.php' => [], - ], - ], + $s = \DIRECTORY_SEPARATOR; + + yield [ + [], + ".", + [] ]; + + $prefixes = ["C:$s", "$s"]; + + foreach($prefixes as $p){ + yield [ + [ + "Money.php" => [] + ], + "{$p}home{$s}sb{$s}Money{$s}", + [ + "{$p}home{$s}sb{$s}Money{$s}Money.php" => [] + ] + ]; + + yield [ + [ + "Money.php" => [], + "MoneyBag.php" => [] + ], + "{$p}home{$s}sb{$s}Money", + [ + "{$p}home{$s}sb{$s}Money{$s}Money.php" => [], + "{$p}home{$s}sb{$s}Money{$s}MoneyBag.php" => [] + ] + ]; + + yield [ + [ + "Money.php" => [], + "MoneyBag.php" => [], + "Cash.phar{$s}Cash.php" => [], + ], + "{$p}home{$s}sb{$s}Money", + [ + "{$p}home{$s}sb{$s}Money{$s}Money.php" => [], + "{$p}home{$s}sb{$s}Money{$s}MoneyBag.php" => [], + "phar://{$p}home{$s}sb{$s}Money{$s}Cash.phar{$s}Cash.php" => [], + ], + ]; + } } } diff --git a/vendor/phpunit/php-code-coverage/tests/tests/FilterTest.php b/vendor/phpunit/php-code-coverage/tests/tests/FilterTest.php index 5663a05e7..4c90fca65 100644 --- a/vendor/phpunit/php-code-coverage/tests/tests/FilterTest.php +++ b/vendor/phpunit/php-code-coverage/tests/tests/FilterTest.php @@ -52,6 +52,7 @@ class FilterTest extends TestCase TEST_FILES_PATH . 'CoverageTwoDefaultClassAnnotations.php', TEST_FILES_PATH . 'CoveredClass.php', TEST_FILES_PATH . 'CoveredFunction.php', + TEST_FILES_PATH . 'Crash.php', TEST_FILES_PATH . 'NamespaceCoverageClassExtendedTest.php', TEST_FILES_PATH . 'NamespaceCoverageClassTest.php', TEST_FILES_PATH . 'NamespaceCoverageCoversClassPublicTest.php', diff --git a/vendor/phpunit/php-token-stream/.github/stale.yml b/vendor/phpunit/php-token-stream/.github/stale.yml new file mode 100644 index 000000000..4eadca327 --- /dev/null +++ b/vendor/phpunit/php-token-stream/.github/stale.yml @@ -0,0 +1,40 @@ +# Configuration for probot-stale - https://github.com/probot/stale + +# Number of days of inactivity before an Issue or Pull Request becomes stale +daysUntilStale: 60 + +# Number of days of inactivity before a stale Issue or Pull Request is closed. +# Set to false to disable. If disabled, issues still need to be closed manually, but will remain marked as stale. +daysUntilClose: 7 + +# Issues or Pull Requests with these labels will never be considered stale. Set to `[]` to disable +exemptLabels: + - enhancement + +# Set to true to ignore issues in a project (defaults to false) +exemptProjects: false + +# Set to true to ignore issues in a milestone (defaults to false) +exemptMilestones: false + +# Label to use when marking as stale +staleLabel: stale + +# Comment to post when marking as stale. Set to `false` to disable +markComment: > + This issue has been automatically marked as stale because it has not had activity within the last 60 days. It will be closed after 7 days if no further activity occurs. Thank you for your contributions. + +# Comment to post when removing the stale label. +# unmarkComment: > +# Your comment here. + +# Comment to post when closing a stale Issue or Pull Request. +closeComment: > + This issue has been automatically closed because it has not had activity since it was marked as stale. Thank you for your contributions. + +# Limit the number of actions per hour, from 1-30. Default is 30 +limitPerRun: 30 + +# Limit to only `issues` or `pulls` +only: issues + diff --git a/vendor/phpunit/php-token-stream/.travis.yml b/vendor/phpunit/php-token-stream/.travis.yml index 340a5adc5..3f92d4a93 100644 --- a/vendor/phpunit/php-token-stream/.travis.yml +++ b/vendor/phpunit/php-token-stream/.travis.yml @@ -3,6 +3,7 @@ language: php php: - 7.1 - 7.2 + - 7.3 - master sudo: false diff --git a/vendor/phpunit/php-token-stream/ChangeLog.md b/vendor/phpunit/php-token-stream/ChangeLog.md index 190f5ff4a..3a8967d7d 100644 --- a/vendor/phpunit/php-token-stream/ChangeLog.md +++ b/vendor/phpunit/php-token-stream/ChangeLog.md @@ -2,6 +2,12 @@ All notable changes to `sebastianbergmann/php-token-stream` are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. +## [3.0.1] - 2018-10-30 + +### Fixed + +* Fixed [#78](https://github.com/sebastianbergmann/php-token-stream/pull/78): `getEndTokenId()` does not handle string-dollar (`"${var}"`) interpolation + ## [3.0.0] - 2018-02-01 ### Removed @@ -11,6 +17,8 @@ All notable changes to `sebastianbergmann/php-token-stream` are documented in th ## [2.0.2] - 2017-11-27 +### Fixed + * Fixed [#69](https://github.com/sebastianbergmann/php-token-stream/issues/69): `PHP_Token_USE_FUNCTION` does not serialize correctly ## [2.0.1] - 2017-08-20 @@ -21,6 +29,7 @@ All notable changes to `sebastianbergmann/php-token-stream` are documented in th ## [2.0.0] - 2017-08-03 +[3.0.1]: https://github.com/sebastianbergmann/php-token-stream/compare/3.0.0...3.0.1 [3.0.0]: https://github.com/sebastianbergmann/php-token-stream/compare/2.0...3.0.0 [2.0.2]: https://github.com/sebastianbergmann/php-token-stream/compare/2.0.1...2.0.2 [2.0.1]: https://github.com/sebastianbergmann/php-token-stream/compare/2.0.0...2.0.1 diff --git a/vendor/phpunit/php-token-stream/LICENSE b/vendor/phpunit/php-token-stream/LICENSE index cdd1374f0..a54c54c2e 100644 --- a/vendor/phpunit/php-token-stream/LICENSE +++ b/vendor/phpunit/php-token-stream/LICENSE @@ -1,6 +1,6 @@ -PHP_TokenStream +php-token-stream -Copyright (c) 2009-2017, Sebastian Bergmann . +Copyright (c) 2009-2018, Sebastian Bergmann . All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/vendor/phpunit/php-token-stream/src/Token.php b/vendor/phpunit/php-token-stream/src/Token.php index 8ec2b211c..c63a1b90b 100644 --- a/vendor/phpunit/php-token-stream/src/Token.php +++ b/vendor/phpunit/php-token-stream/src/Token.php @@ -135,6 +135,7 @@ abstract class PHP_TokenWithScope extends PHP_Token while ($this->endTokenId === null && isset($tokens[$i])) { if ($tokens[$i] instanceof PHP_Token_OPEN_CURLY || + $tokens[$i] instanceof PHP_Token_DOLLAR_OPEN_CURLY_BRACES || $tokens[$i] instanceof PHP_Token_CURLY_OPEN) { $block++; } elseif ($tokens[$i] instanceof PHP_Token_CLOSE_CURLY) { diff --git a/vendor/phpunit/php-token-stream/tests/Token/FunctionTest.php b/vendor/phpunit/php-token-stream/tests/Token/FunctionTest.php index 539f827c1..5d09e4fb1 100644 --- a/vendor/phpunit/php-token-stream/tests/Token/FunctionTest.php +++ b/vendor/phpunit/php-token-stream/tests/Token/FunctionTest.php @@ -74,6 +74,7 @@ class PHP_Token_FunctionTest extends TestCase $this->assertEquals(17, $this->functions[2]->getLine()); $this->assertEquals(21, $this->functions[3]->getLine()); $this->assertEquals(29, $this->functions[4]->getLine()); + $this->assertEquals(37, $this->functions[6]->getLine()); } /** @@ -86,6 +87,7 @@ class PHP_Token_FunctionTest extends TestCase $this->assertEquals(19, $this->functions[2]->getEndLine()); $this->assertEquals(23, $this->functions[3]->getEndLine()); $this->assertEquals(31, $this->functions[4]->getEndLine()); + $this->assertEquals(41, $this->functions[6]->getEndLine()); } /** diff --git a/vendor/phpunit/php-token-stream/tests/Token/InterfaceTest.php b/vendor/phpunit/php-token-stream/tests/Token/InterfaceTest.php index 9e8cb248e..6beb2ef99 100644 --- a/vendor/phpunit/php-token-stream/tests/Token/InterfaceTest.php +++ b/vendor/phpunit/php-token-stream/tests/Token/InterfaceTest.php @@ -156,7 +156,7 @@ class PHP_Token_InterfaceTest extends TestCase return; } } - $this->fail('Seachring for 2 classes failed'); + $this->fail('Searching for 2 classes failed'); } public function testGetPackageNamespaceIsEmptyForInterfacesThatAreNotWithinNamespaces() diff --git a/vendor/phpunit/php-token-stream/tests/_fixture/source.php b/vendor/phpunit/php-token-stream/tests/_fixture/source.php index 0c9b87f65..3db0a22d1 100644 --- a/vendor/phpunit/php-token-stream/tests/_fixture/source.php +++ b/vendor/phpunit/php-token-stream/tests/_fixture/source.php @@ -33,4 +33,10 @@ class Foo{function foo(){} public function blaz($x, $y) { } + + public function buzz($foo) + { + echo "${foo}"; + return true; + } } diff --git a/vendor/phpunit/phpunit/.editorconfig b/vendor/phpunit/phpunit/.editorconfig index d3fcdc607..421bd83a9 100644 --- a/vendor/phpunit/phpunit/.editorconfig +++ b/vendor/phpunit/phpunit/.editorconfig @@ -6,3 +6,6 @@ insert_final_newline = true indent_style = space indent_size = 4 charset = utf-8 + +[tests/_files/*_result_cache.txt] +insert_final_newline = false diff --git a/vendor/phpunit/phpunit/.php_cs.dist b/vendor/phpunit/phpunit/.php_cs.dist index b41d7b7c8..283cbfba2 100644 --- a/vendor/phpunit/phpunit/.php_cs.dist +++ b/vendor/phpunit/phpunit/.php_cs.dist @@ -156,7 +156,7 @@ return PhpCsFixer\Config::create() 'phpdoc_to_comment' => true, 'phpdoc_trim' => true, 'phpdoc_trim_consecutive_blank_line_separation' => true, - 'phpdoc_types' => true, + 'phpdoc_types' => ['groups' => ['simple', 'meta']], 'phpdoc_types_order' => true, 'phpdoc_var_without_name' => true, 'pow_to_exponentiation' => true, @@ -177,7 +177,13 @@ return PhpCsFixer\Config::create() 'trailing_comma_in_multiline_array' => true, 'trim_array_spaces' => true, 'unary_operator_spaces' => true, - 'visibility_required' => true, + 'visibility_required' => [ + 'elements' => [ + 'const', + 'method', + 'property', + ], + ], //'void_return' => true, 'whitespace_after_comma_in_array' => true, ] diff --git a/vendor/phpunit/phpunit/.travis.yml b/vendor/phpunit/phpunit/.travis.yml index d403d21e1..f4bc5d123 100644 --- a/vendor/phpunit/phpunit/.travis.yml +++ b/vendor/phpunit/phpunit/.travis.yml @@ -10,6 +10,7 @@ addons: php: - 7.1 - 7.2 + - 7.3 - master matrix: diff --git a/vendor/phpunit/phpunit/ChangeLog-7.0.md b/vendor/phpunit/phpunit/ChangeLog-7.0.md deleted file mode 100644 index 8f9b541ba..000000000 --- a/vendor/phpunit/phpunit/ChangeLog-7.0.md +++ /dev/null @@ -1,56 +0,0 @@ -# Changes in PHPUnit 7.0 - -All notable changes of the PHPUnit 7.0 release series are documented in this file using the [Keep a CHANGELOG](https://keepachangelog.com/) principles. - -## [7.0.3] - 2018-03-26 - -* Fixed [#3028](https://github.com/sebastianbergmann/phpunit/pull/3028): TestDox name prettifier does not handle test case classes correctly that are in a `Tests\*` namespace - -## [7.0.2] - 2018-02-26 - -### Fixed - -* Fixed [#2974](https://github.com/sebastianbergmann/phpunit/issues/2974): JUnit XML logfile contains invalid characters when test output contains binary data -* Fixed [#3014](https://github.com/sebastianbergmann/phpunit/issues/3014): `TypeError` in `PHPUnit\Framework\TestCase::getActualOutput()` when callback registered using `setOutputCallback()` does not return a string -* Removed more superfluous `@throws \Exception` annotations - -## [7.0.1] - 2018-02-13 - -### Fixed - -* Fixed [#3000](https://github.com/sebastianbergmann/phpunit/issues/3000): Directories are not created recursively -* Removed superfluous `@throws \Exception` annotations from assertion methods - -## [7.0.0] - 2018-02-02 - -### Added - -* Implemented [#2967](https://github.com/sebastianbergmann/phpunit/pull/2967): Added support for PHP configuration settings to `@requires` annotation - -### Changed - -* Implemented [#2566](https://github.com/sebastianbergmann/phpunit/issues/2566): Use `Throwable` instead of `Exception` in `PHPUnit\Framework\TestListener` method signatures -* Implemented [#2920](https://github.com/sebastianbergmann/phpunit/pull/2920): Replace CLI TestDox printer with `rpkamp/fancy-testdox-printer` -* Scalar Type Declarations and Return Type Declarations are now used where possible (as a result, the API of `PHPUnit\Framework\TestListener`, for instance, has changed) -* Some classes are now `final` -* The visibility of some methods has been changed from `protected` to `private` - -### Removed - -* Implemented [#2473](https://github.com/sebastianbergmann/phpunit/issues/2473): Drop support for PHP 7.0 -* `@scenario` is no longer an alias for `@test` -* The `PHPUnit\Framework\BaseTestListener` class has been removed (deprecated in PHPUnit 6.4) -* The `PHPUnit\Framework\TestCase::prepareTemplate` template method has been removed - -### Fixed - -* Fixed [#2169](https://github.com/sebastianbergmann/phpunit/issues/2169): `assertSame()` does not show differences when used on two arrays that are not identical -* Fixed [#2902](https://github.com/sebastianbergmann/phpunit/issues/2902): `@test` annotation gets accepted no matter what -* Fixed [#2907](https://github.com/sebastianbergmann/phpunit/issues/2907): `StringMatchesFormatDescription` constraint does not handle escaped `%` correctly -* Fixed [#2919](https://github.com/sebastianbergmann/phpunit/issues/2919): `assertJsonStringEqualsJsonString()` matches empty object as empty array - -[7.0.3]: https://github.com/sebastianbergmann/phpunit/compare/7.0.2...7.0.3 -[7.0.2]: https://github.com/sebastianbergmann/phpunit/compare/7.0.1...7.0.2 -[7.0.1]: https://github.com/sebastianbergmann/phpunit/compare/7.0.0...7.0.1 -[7.0.0]: https://github.com/sebastianbergmann/phpunit/compare/6.5...7.0.0 - diff --git a/vendor/phpunit/phpunit/ChangeLog-7.1.md b/vendor/phpunit/phpunit/ChangeLog-7.1.md deleted file mode 100644 index 9aa10e8a9..000000000 --- a/vendor/phpunit/phpunit/ChangeLog-7.1.md +++ /dev/null @@ -1,63 +0,0 @@ -# Changes in PHPUnit 7.1 - -All notable changes of the PHPUnit 7.1 release series are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. - -## [7.1.6] - 2018-MM-DD - -### Fixed - -* Fixed [#3107](https://github.com/sebastianbergmann/phpunit/issues/3107): `CliTestDoxPrinter::addError()` cannot handle errors in `setUpBeforeClass()` -* Fixed [#3142](https://github.com/sebastianbergmann/phpunit/issues/3142): Method-level annotations (`@backupGlobals`, `@backupStaticAttributes`, `@errorHandler`, `@preserveGlobalState`) do not override class-level annotations - -## [7.1.5] - 2018-04-29 - -### Fixed - -* Fixed [#3105](https://github.com/sebastianbergmann/phpunit/pull/3105): Name is prettified inconsistently when snake_case notation is used - -## [7.1.4] - 2018-04-18 - -### Fixed - -* Fixed [#3034](https://github.com/sebastianbergmann/phpunit/pull/3034): `$this->getStatus()` returns `STATUS_PASSED` in `tearDown()` after unexpected exception - -## [7.1.3] - 2018-04-13 - -### Fixed - -* Fixed [#3094](https://github.com/sebastianbergmann/phpunit/issues/3094): Faulty dependency constraint affecting `getObjectForTrait()` (failure using `--prefer-lowest`) - -## [7.1.2] - 2018-04-10 - -### Fixed - -* Fixed [#2830](https://github.com/sebastianbergmann/phpunit/issues/2830): `@runClassInSeparateProcess` does not work for tests that use `@dataProvider` -* Fixed [#3059](https://github.com/sebastianbergmann/phpunit/pull/3059): `StringMatchesFormatDescription` constraint fails when matching multiline with `\r\n` -* Fixed [#3087](https://github.com/sebastianbergmann/phpunit/pull/3087): `TestCase::getTestResultObject()` can return `null` - -## [7.1.1] - 2018-04-06 - -### Fixed - -* `CliTestDoxPrinter::writeProgress()` and `TeamCity::writeProgress()` are not compatible with `ResultPrinter::writeProgress()` (on PHP 7.1) - -## [7.1.0] - 2018-04-06 - -### Added - -* Implemented [#3002](https://github.com/sebastianbergmann/phpunit/issues/3002): Support for test runner extensions -* Implemented [#3035](https://github.com/sebastianbergmann/phpunit/pull/3035): Add support for `iterable` in `assertInternalType()` - -### Changed - -* `PHPUnit\Framework\Assert` is no longer searched for test methods -* `ReflectionMethod::invokeArgs()` is no longer used to invoke test methods - -[7.1.6]: https://github.com/sebastianbergmann/phpunit/compare/7.1.5...7.1.6 -[7.1.5]: https://github.com/sebastianbergmann/phpunit/compare/7.1.4...7.1.5 -[7.1.4]: https://github.com/sebastianbergmann/phpunit/compare/7.1.3...7.1.4 -[7.1.3]: https://github.com/sebastianbergmann/phpunit/compare/7.1.2...7.1.3 -[7.1.2]: https://github.com/sebastianbergmann/phpunit/compare/7.1.1...7.1.2 -[7.1.1]: https://github.com/sebastianbergmann/phpunit/compare/7.1.0...7.1.1 -[7.1.0]: https://github.com/sebastianbergmann/phpunit/compare/7.0...7.1.0 - diff --git a/vendor/phpunit/phpunit/ChangeLog-7.2.md b/vendor/phpunit/phpunit/ChangeLog-7.2.md deleted file mode 100644 index a99350d1c..000000000 --- a/vendor/phpunit/phpunit/ChangeLog-7.2.md +++ /dev/null @@ -1,78 +0,0 @@ -# Changes in PHPUnit 7.2 - -All notable changes of the PHPUnit 7.2 release series are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. - -## [7.2.7] - 2018-07-15 - -### Fixed - -* Fixed [#3154](https://github.com/sebastianbergmann/phpunit/issues/3154): Global constants as default parameter values are not handled correctly in namespace -* Fixed [#3189](https://github.com/sebastianbergmann/phpunit/issues/3189): PHPUnit 7.2 potentially leaves a messy libxmlerror state -* Fixed [#3199](https://github.com/sebastianbergmann/phpunit/pull/3199): Code Coverage for PHPT tests does not work when PHPDBG is used - -## [7.2.6] - 2018-06-21 - -### Fixed - -* Fixed [#3176](https://github.com/sebastianbergmann/phpunit/issues/3176): PHPUnit 7.2.5 breaks backward compatibility - -## [7.2.5] - 2018-06-21 - -### Fixed - -* Fixed [#3093](https://github.com/sebastianbergmann/phpunit/issues/3093): Unable to chain a `@dataProvider` in method `a` with a `@depends` in method `b` -* Fixed [#3174](https://github.com/sebastianbergmann/phpunit/issues/3174): Code generator for test doubles does not handle proxied methods with variadic parameters correctly - -## [7.2.4] - 2018-06-05 - -### Fixed - -* Fixed [#3160](https://github.com/sebastianbergmann/phpunit/issues/3160): TeamCity logfile writer broken on Windows - -## [7.2.3] - 2018-06-03 - -### Fixed - -* Fixed [#3156](https://github.com/sebastianbergmann/phpunit/issues/3156): Combined use of `@depends` and `@dataProvider` is not handled correctly - -## [7.2.2] - 2018-06-01 - -### Changed - -* Ensure that `phpunit/php-code-coverage` is used in version `^6.0.7` - -## [7.2.1] - 2018-06-01 - -### Fixed - -* Fixed [#3155](https://github.com/sebastianbergmann/phpunit/issues/3155): Calling `getStatus()` on a `TestCase` object before the respective test has been executed results in type error - -## [7.2.0] - 2018-06-01 - -### Added - -* Implemented [#3042](https://github.com/sebastianbergmann/phpunit/pull/3042): Add `TestCase::expectNotToPerformAssertions()` method as alternative to `@doesNotPerformAssertions` annotation -* Implemented [#3064](https://github.com/sebastianbergmann/phpunit/issues/3064): Mark tests as risky when they claim not to perform assertions but do -* Implemented [#3066](https://github.com/sebastianbergmann/phpunit/issues/3066): Validate XML configuration against XSD -* Implemented [#3076](https://github.com/sebastianbergmann/phpunit/issues/3076): Extensions can be configured via PHPUnit's XML configuration -* Implemented [#3080](https://github.com/sebastianbergmann/phpunit/issues/3080): The XML configuration arguments can have boolean elements -* Implemented [#3092](https://github.com/sebastianbergmann/phpunit/pull/3092): Ability to run tests in random order, reverse order, ordered using dependency resolution - -### Changed - -* Implemented [#3103](https://github.com/sebastianbergmann/phpunit/issues/3103): Merge `phpunit-mock-objects` back into PHPUnit's Git repository -* Implemented [#3115](https://github.com/sebastianbergmann/phpunit/pull/3115): Method-level `@covers` annotation overrides class-level `@coversNothing` annotation - -### Removed - -* Fixed [#3069](https://github.com/sebastianbergmann/phpunit/issues/3069): Method `ResultPrinter::printWaitPrompt()` seems to be unused - -[7.2.7]: https://github.com/sebastianbergmann/phpunit/compare/7.2.6...7.2.7 -[7.2.6]: https://github.com/sebastianbergmann/phpunit/compare/7.2.5...7.2.6 -[7.2.5]: https://github.com/sebastianbergmann/phpunit/compare/7.2.4...7.2.5 -[7.2.4]: https://github.com/sebastianbergmann/phpunit/compare/7.2.3...7.2.4 -[7.2.3]: https://github.com/sebastianbergmann/phpunit/compare/7.2.2...7.2.3 -[7.2.2]: https://github.com/sebastianbergmann/phpunit/compare/7.2.1...7.2.2 -[7.2.1]: https://github.com/sebastianbergmann/phpunit/compare/7.2.0...7.2.1 -[7.2.0]: https://github.com/sebastianbergmann/phpunit/compare/7.1...7.2.0 - diff --git a/vendor/phpunit/phpunit/ChangeLog-7.3.md b/vendor/phpunit/phpunit/ChangeLog-7.3.md deleted file mode 100644 index 58bdac7d3..000000000 --- a/vendor/phpunit/phpunit/ChangeLog-7.3.md +++ /dev/null @@ -1,82 +0,0 @@ -# Changes in PHPUnit 7.3 - -All notable changes of the PHPUnit 7.3 release series are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. - -## [7.3.6] - 2018-MM-DD - -### Fixed - -* Fixed [#3310](https://github.com/sebastianbergmann/phpunit/issues/3310): Inconsistent `@throws` annotations in `Assert/Functions.php` - -## [7.3.5] - 2018-09-08 - -### Fixed - -* Fixed [#3181](https://github.com/sebastianbergmann/phpunit/issues/3181): `--filter` should be case-insensitive -* Fixed [#3234](https://github.com/sebastianbergmann/phpunit/issues/3234): `assertArraySubset()` with `$strict=true` does not display differences properly -* Fixed [#3254](https://github.com/sebastianbergmann/phpunit/issues/3254): TextUI test runner cannot run a `Test` instance that is not a `TestSuite` - -## [7.3.4] - 2018-09-05 - -### Fixed - -* Fixed [#3270](https://github.com/sebastianbergmann/phpunit/issues/3270): Array / Object to string conversion in `NamePrettifier` - -## [7.3.3] - 2018-09-01 - -### Fixed - -* Fixed [#3265](https://github.com/sebastianbergmann/phpunit/pull/3265): Slashes are unnecessarily escaped in prettified JSON -* Fixed [#3267](https://github.com/sebastianbergmann/phpunit/pull/3267): `%` not escaped correctly for `StringMatchesFormat` constraint - -## [7.3.2] - 2018-08-22 - -### Fixed - -* Fixed [#3219](https://github.com/sebastianbergmann/phpunit/issues/3219): `getMockFromWsdl()` generates invalid PHP code when WSDL filename contains special characters -* Fixed [#3248](https://github.com/sebastianbergmann/phpunit/issues/3248) and [#3233](https://github.com/sebastianbergmann/phpunit/issues/3233): `phpunit.xsd` dictates element order where it should not -* Fixed [#3251](https://github.com/sebastianbergmann/phpunit/issues/3251): TeamCity result logger is missing test duration information - -## [7.3.1] - 2018-08-07 - -### Changed - -* Reverted [#3161](https://github.com/sebastianbergmann/phpunit/pull/3161) (because of [#3240](https://github.com/sebastianbergmann/phpunit/issues/3240)): Support for indexed arrays in `PHPUnit\Framework\Constraint\ArraySubset` - -### Fixed - -* Fixed [#3237](https://github.com/sebastianbergmann/phpunit/issues/3237): Result caching enabled by default -* Fixed [#3240](https://github.com/sebastianbergmann/phpunit/issues/3240): `assertArraySubset()` does not work as expected - -## [7.3.0] - 2018-08-03 - -### Added - -* Implemented [#3147](https://github.com/sebastianbergmann/phpunit/pull/3147): Support for running tests first that failed in a previous run - * Implemented `cacheResult` configuration directive and `--cache-result` CLI option to control test result cache required for "run defects first" functionality (disabled by default) - * Implemented `cacheResultFile` configuration directive and `--cache-result-file` CLI option to configure test result cache file (default: `.phpunit.result.cache`) - * Implemented `stopOnDefect` configuration directive and `--stop-on-defect` CLI option for aborting test suite execution upon first defective test - * Implemented `executionOrder` configuration directive and `--order-by` CLI option for sorting the test suite before execution - * The `--order-by=random` CLI option should now be used instead of `--random-order` - * The `--order-by=depends` CLI option should now be used instead of `--resolve-dependencies` - * The `--order-by=reverse` CLI option should now be used instead of `--reverse-order` -* Implemented [#3161](https://github.com/sebastianbergmann/phpunit/pull/3161): Support for indexed arrays in `PHPUnit\Framework\Constraint\ArraySubset` -* Implemented [#3194](https://github.com/sebastianbergmann/phpunit/issues/3194): `@covers class` (and `@uses class`) should include traits used by class -* Implemented [#3196](https://github.com/sebastianbergmann/phpunit/issues/3196): Support for replacing placeholders in `@testdox` text with data provider values -* Implemented [#3198](https://github.com/sebastianbergmann/phpunit/pull/3198): Provide source location for useless tests - -### Fixed - -* Fixed [#3154](https://github.com/sebastianbergmann/phpunit/issues/3154): Global constants as default parameter values are not handled correctly in namespace -* Fixed [#3218](https://github.com/sebastianbergmann/phpunit/issues/3218): `prefix` attribute for `directory` node missing from `phpunit.xml` XSD -* Fixed [#3222](https://github.com/sebastianbergmann/phpunit/pull/3222): Priority of `@covers` and `@coversNothing` is wrong -* Fixed [#3225](https://github.com/sebastianbergmann/phpunit/issues/3225): `coverage-php` missing from `phpunit.xsd` - -[7.3.6]: https://github.com/sebastianbergmann/phpunit/compare/7.3.5...7.3.6 -[7.3.5]: https://github.com/sebastianbergmann/phpunit/compare/7.3.4...7.3.5 -[7.3.4]: https://github.com/sebastianbergmann/phpunit/compare/7.3.3...7.3.4 -[7.3.3]: https://github.com/sebastianbergmann/phpunit/compare/7.3.2...7.3.3 -[7.3.2]: https://github.com/sebastianbergmann/phpunit/compare/7.3.1...7.3.2 -[7.3.1]: https://github.com/sebastianbergmann/phpunit/compare/7.3.0...7.3.1 -[7.3.0]: https://github.com/sebastianbergmann/phpunit/compare/7.2...7.3.0 - diff --git a/vendor/phpunit/phpunit/ChangeLog-7.4.md b/vendor/phpunit/phpunit/ChangeLog-7.4.md deleted file mode 100644 index 65f9d469d..000000000 --- a/vendor/phpunit/phpunit/ChangeLog-7.4.md +++ /dev/null @@ -1,16 +0,0 @@ -# Changes in PHPUnit 7.4 - -All notable changes of the PHPUnit 7.4 release series are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. - -## [7.4.0] - 2018-10-05 - -### Added - -* Implemented [#3127](https://github.com/sebastianbergmann/phpunit/issues/3127): Emit error when mocked method is not really mocked -* Implemented [#3224](https://github.com/sebastianbergmann/phpunit/pulls/3224): Ability to enforce a time limit for tests not annotated with `@small`, `@medium`, or `@large` -* Implemented [#3272](https://github.com/sebastianbergmann/phpunit/issues/3272): Ability to generate code coverage whitelist filter script for Xdebug -* Implemented [#3284](https://github.com/sebastianbergmann/phpunit/issues/3284): Ability to reorder tests based on execution time -* Implemented [#3290](https://github.com/sebastianbergmann/phpunit/issues/3290): Ability to load a PHP script before any code of PHPUnit itself is loaded - -[7.4.0]: https://github.com/sebastianbergmann/phpunit/compare/7.3...7.4.0 - diff --git a/vendor/phpunit/phpunit/ChangeLog-7.5.md b/vendor/phpunit/phpunit/ChangeLog-7.5.md new file mode 100644 index 000000000..e761cae7c --- /dev/null +++ b/vendor/phpunit/phpunit/ChangeLog-7.5.md @@ -0,0 +1,38 @@ +# Changes in PHPUnit 7.5 + +All notable changes of the PHPUnit 7.5 release series are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. + +## [7.5.1] - 2018-12-12 + +### Fixed + +* Fixed [#3441](https://github.com/sebastianbergmann/phpunit/issues/3441): Call to undefined method `DataProviderTestSuite::usesDataProvider()` + +## [7.5.0] - 2018-12-07 + +### Added + +* Implemented [#3340](https://github.com/sebastianbergmann/phpunit/issues/3340): Added `assertEqualsCanonicalizing()`, `assertEqualsIgnoringCase()`, `assertEqualsWithDelta()`, `assertNotEqualsCanonicalizing()`, `assertNotEqualsIgnoringCase()`, and `assertNotEqualsWithDelta()` as alternatives to using `assertEquals()` and `assertNotEquals()` with the `$delta`, `$canonicalize`, or `$ignoreCase` parameters +* Implemented [#3368](https://github.com/sebastianbergmann/phpunit/issues/3368): Added `assertIsArray()`, `assertIsBool()`, `assertIsFloat()`, `assertIsInt()`, `assertIsNumeric()`, `assertIsObject()`, `assertIsResource()`, `assertIsString()`, `assertIsScalar()`, `assertIsCallable()`, `assertIsIterable()`, `assertIsNotArray()`, `assertIsNotBool()`, `assertIsNotFloat()`, `assertIsNotInt()`, `assertIsNotNumeric()`, `assertIsNotObject()`, `assertIsNotResource()`, `assertIsNotString()`, `assertIsNotScalar()`, `assertIsNotCallable()`, `assertIsNotIterable()` as alternatives to `assertInternalType()` and `assertNotInternalType()` +* Implemented [#3391](https://github.com/sebastianbergmann/phpunit/issues/3391): Added a `TestHook` that fires after each test, regardless of result +* Implemented [#3417](https://github.com/sebastianbergmann/phpunit/pull/3417): Refinements related to test suite sorting and TestDox result printer +* Implemented [#3422](https://github.com/sebastianbergmann/phpunit/issues/3422): Added `assertStringContainsString()`, `assertStringContainsStringIgnoringCase()`, `assertStringNotContainsString()`, and `assertStringNotContainsStringIgnoringCase()` + +### Deprecated + +* The methods `assertInternalType()` and `assertNotInternalType()` are now deprecated. There is no behavioral change in this version of PHPUnit. Using these methods will trigger a deprecation warning in PHPUnit 8 and in PHPUnit 9 these methods will be removed. +* The methods `assertAttributeContains()`, `assertAttributeNotContains()`, `assertAttributeContainsOnly()`, `assertAttributeNotContainsOnly()`, `assertAttributeCount()`, `assertAttributeNotCount()`, `assertAttributeEquals()`, `assertAttributeNotEquals()`, `assertAttributeEmpty()`, `assertAttributeNotEmpty()`, `assertAttributeGreaterThan()`, `assertAttributeGreaterThanOrEqual()`, `assertAttributeLessThan()`, `assertAttributeLessThanOrEqual()`, `assertAttributeSame()`, `assertAttributeNotSame()`, `assertAttributeInstanceOf()`, `assertAttributeNotInstanceOf()`, `assertAttributeInternalType()`, `assertAttributeNotInternalType()`, `attributeEqualTo()`, `readAttribute()`, `getStaticAttribute()`, and `getObjectAttribute()` are now deprecated. There is no behavioral change in this version of PHPUnit. Using these methods will trigger a deprecation warning in PHPUnit 8 and in PHPUnit 9 these methods will be removed. +* The optional parameters `$delta`, `$maxDepth`, `$canonicalize`, and `$ignoreCase` of `assertEquals()` and `assertNotEquals()` are now deprecated. There is no behavioral change in this version of PHPUnit. Using these parameters will trigger a deprecation warning in PHPUnit 8 and in PHPUnit 9 these parameters will be removed. +* The annotations `@expectedException`, `@expectedExceptionCode`, `@expectedExceptionMessage`, and `@expectedExceptionMessageRegExp` are now deprecated. There is no behavioral change in this version of PHPUnit. Using these annotations will trigger a deprecation warning in PHPUnit 8 and in PHPUnit 9 these annotations will be removed. +* Using the methods `assertContains()` and `assertNotContains()` on `string` haystacks is now deprecated. There is no behavioral change in this version of PHPUnit. Using these methods on `string` haystacks will trigger a deprecation warning in PHPUnit 8 and in PHPUnit 9 these methods cannot be used on on `string` haystacks anymore. +* The optional parameters `$ignoreCase`, `$checkForObjectIdentity`, and `$checkForNonObjectIdentity` of `assertContains()` and `assertNotContains()` are now deprecated. There is no behavioral change in this version of PHPUnit. Using these parameters will trigger a deprecation warning in PHPUnit 8 and in PHPUnit 9 these parameters will be removed. + +### Fixed + +* Fixed [#3428](https://github.com/sebastianbergmann/phpunit/pull/3428): `TestSuite` setup failures are not logged correctly +* Fixed [#3429](https://github.com/sebastianbergmann/phpunit/pull/3429): Inefficient loop in `getHookMethods()` +* Fixed [#3437](https://github.com/sebastianbergmann/phpunit/pull/3437): JUnit logger skips PHPT tests + +[7.5.1]: https://github.com/sebastianbergmann/phpunit/compare/7.5.0...7.5.1 +[7.5.0]: https://github.com/sebastianbergmann/phpunit/compare/7.4.5...7.5.0 + diff --git a/vendor/phpunit/phpunit/README.md b/vendor/phpunit/phpunit/README.md index 0e0d057ca..ac52cee8c 100644 --- a/vendor/phpunit/phpunit/README.md +++ b/vendor/phpunit/phpunit/README.md @@ -4,16 +4,16 @@ PHPUnit is a programmer-oriented testing framework for PHP. It is an instance of [![Latest Stable Version](https://img.shields.io/packagist/v/phpunit/phpunit.svg?style=flat-square)](https://packagist.org/packages/phpunit/phpunit) [![Minimum PHP Version](https://img.shields.io/badge/php-%3E%3D%207.1-8892BF.svg?style=flat-square)](https://php.net/) -[![Build Status](https://img.shields.io/travis/sebastianbergmann/phpunit/7.4.svg?style=flat-square)](https://phpunit.de/build-status.html) +[![Build Status](https://img.shields.io/travis/sebastianbergmann/phpunit/7.5.svg?style=flat-square)](https://phpunit.de/build-status.html) ## Installation -We distribute a [PHP Archive (PHAR)](https://php.net/phar) that has all required (as well as some optional) dependencies of PHPUnit 7.4 bundled in a single file: +We distribute a [PHP Archive (PHAR)](https://php.net/phar) that has all required (as well as some optional) dependencies of PHPUnit 7.5 bundled in a single file: ```bash -$ wget https://phar.phpunit.de/phpunit-7.4.phar +$ wget https://phar.phpunit.de/phpunit-7.5.phar -$ php phpunit-7.4.phar --version +$ php phpunit-7.5.phar --version ``` Alternatively, you may use [Composer](https://getcomposer.org/) to download and install PHPUnit as well as its dependencies. Please refer to the "[Getting Started](https://phpunit.de/getting-started-with-phpunit.html)" guide for details on how to install PHPUnit. diff --git a/vendor/phpunit/phpunit/build.xml b/vendor/phpunit/phpunit/build.xml index 91844ad27..4e9635bf2 100644 --- a/vendor/phpunit/phpunit/build.xml +++ b/vendor/phpunit/phpunit/build.xml @@ -60,6 +60,17 @@ + + + + + + + + + + + @@ -109,7 +120,7 @@ - + diff --git a/vendor/phpunit/phpunit/composer.json b/vendor/phpunit/phpunit/composer.json index 76336de4b..4104e42b6 100644 --- a/vendor/phpunit/phpunit/composer.json +++ b/vendor/phpunit/phpunit/composer.json @@ -38,7 +38,7 @@ "phpunit/php-timer": "^2.0", "sebastian/comparator": "^3.0", "sebastian/diff": "^3.0", - "sebastian/environment": "^3.1", + "sebastian/environment": "^4.0", "sebastian/exporter": "^3.1", "sebastian/global-state": "^2.0", "sebastian/object-enumerator": "^3.0.3", @@ -84,7 +84,7 @@ }, "extra": { "branch-alias": { - "dev-master": "7.4-dev" + "dev-master": "7.5-dev" } } } diff --git a/vendor/phpunit/phpunit/phive.xml b/vendor/phpunit/phpunit/phive.xml index d5bff01ae..10a6223ab 100644 --- a/vendor/phpunit/phpunit/phive.xml +++ b/vendor/phpunit/phpunit/phive.xml @@ -1,7 +1,7 @@ - - + + diff --git a/vendor/phpunit/phpunit/phpunit.xsd b/vendor/phpunit/phpunit/phpunit.xsd index 30dd1920a..07bd13a8e 100644 --- a/vendor/phpunit/phpunit/phpunit.xsd +++ b/vendor/phpunit/phpunit/phpunit.xsd @@ -2,7 +2,7 @@ - This Schema file defines the rules by which the XML configuration file of PHPUnit 7.4 may be structured. + This Schema file defines the rules by which the XML configuration file of PHPUnit 7.5 may be structured. diff --git a/vendor/phpunit/phpunit/src/Framework/Assert.php b/vendor/phpunit/phpunit/src/Framework/Assert.php index 0f0cfa155..a74c8022f 100644 --- a/vendor/phpunit/phpunit/src/Framework/Assert.php +++ b/vendor/phpunit/phpunit/src/Framework/Assert.php @@ -209,6 +209,8 @@ abstract class Assert * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 */ public static function assertAttributeContains($needle, string $haystackAttributeName, $haystackClassOrObject, string $message = '', bool $ignoreCase = false, bool $checkForObjectIdentity = true, bool $checkForNonObjectIdentity = false): void { @@ -271,6 +273,8 @@ abstract class Assert * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 */ public static function assertAttributeNotContains($needle, string $haystackAttributeName, $haystackClassOrObject, string $message = '', bool $ignoreCase = false, bool $checkForObjectIdentity = true, bool $checkForNonObjectIdentity = false): void { @@ -333,6 +337,8 @@ abstract class Assert * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 */ public static function assertAttributeContainsOnly(string $type, string $haystackAttributeName, $haystackClassOrObject, ?bool $isNativeType = null, string $message = ''): void { @@ -378,6 +384,8 @@ abstract class Assert * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 */ public static function assertAttributeNotContainsOnly(string $type, string $haystackAttributeName, $haystackClassOrObject, ?bool $isNativeType = null, string $message = ''): void { @@ -418,6 +426,8 @@ abstract class Assert * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 */ public static function assertAttributeCount(int $expectedCount, string $haystackAttributeName, $haystackClassOrObject, string $message = ''): void { @@ -457,6 +467,8 @@ abstract class Assert * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 */ public static function assertAttributeNotCount(int $expectedCount, string $haystackAttributeName, $haystackClassOrObject, string $message = ''): void { @@ -486,6 +498,60 @@ abstract class Assert static::assertThat($actual, $constraint, $message); } + /** + * Asserts that two variables are equal (canonicalizing). + * + * @throws ExpectationFailedException + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + */ + public static function assertEqualsCanonicalizing($expected, $actual, string $message = ''): void + { + $constraint = new IsEqual( + $expected, + 0.0, + 10, + true, + false + ); + + static::assertThat($actual, $constraint, $message); + } + + /** + * Asserts that two variables are equal (ignoring case). + * + * @throws ExpectationFailedException + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + */ + public static function assertEqualsIgnoringCase($expected, $actual, string $message = ''): void + { + $constraint = new IsEqual( + $expected, + 0.0, + 10, + false, + true + ); + + static::assertThat($actual, $constraint, $message); + } + + /** + * Asserts that two variables are equal (with delta). + * + * @throws ExpectationFailedException + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + */ + public static function assertEqualsWithDelta($expected, $actual, float $delta, string $message = ''): void + { + $constraint = new IsEqual( + $expected, + $delta + ); + + static::assertThat($actual, $constraint, $message); + } + /** * Asserts that a variable is equal to an attribute of an object. * @@ -493,6 +559,8 @@ abstract class Assert * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 */ public static function assertAttributeEquals($expected, string $actualAttributeName, $actualClassOrObject, string $message = '', float $delta = 0.0, int $maxDepth = 10, bool $canonicalize = false, bool $ignoreCase = false): void { @@ -533,6 +601,66 @@ abstract class Assert static::assertThat($actual, $constraint, $message); } + /** + * Asserts that two variables are not equal (canonicalizing). + * + * @throws ExpectationFailedException + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + */ + public static function assertNotEqualsCanonicalizing($expected, $actual, string $message = ''): void + { + $constraint = new LogicalNot( + new IsEqual( + $expected, + 0.0, + 10, + true, + false + ) + ); + + static::assertThat($actual, $constraint, $message); + } + + /** + * Asserts that two variables are not equal (ignoring case). + * + * @throws ExpectationFailedException + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + */ + public static function assertNotEqualsIgnoringCase($expected, $actual, string $message = ''): void + { + $constraint = new LogicalNot( + new IsEqual( + $expected, + 0.0, + 10, + false, + true + ) + ); + + static::assertThat($actual, $constraint, $message); + } + + /** + * Asserts that two variables are not equal (with delta). + * + * @throws ExpectationFailedException + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + */ + public static function assertNotEqualsWithDelta($expected, $actual, float $delta, string $message = ''): void + { + $constraint = new LogicalNot( + new IsEqual( + $expected, + $delta + ) + ); + + static::assertThat($actual, $constraint, $message); + } + /** * Asserts that a variable is not equal to an attribute of an object. * @@ -540,6 +668,8 @@ abstract class Assert * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 */ public static function assertAttributeNotEquals($expected, string $actualAttributeName, $actualClassOrObject, string $message = '', float $delta = 0.0, int $maxDepth = 10, bool $canonicalize = false, bool $ignoreCase = false): void { @@ -573,6 +703,8 @@ abstract class Assert * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 */ public static function assertAttributeEmpty(string $haystackAttributeName, $haystackClassOrObject, string $message = ''): void { @@ -601,6 +733,8 @@ abstract class Assert * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 */ public static function assertAttributeNotEmpty(string $haystackAttributeName, $haystackClassOrObject, string $message = ''): void { @@ -628,6 +762,8 @@ abstract class Assert * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 */ public static function assertAttributeGreaterThan($expected, string $actualAttributeName, $actualClassOrObject, string $message = ''): void { @@ -660,6 +796,8 @@ abstract class Assert * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 */ public static function assertAttributeGreaterThanOrEqual($expected, string $actualAttributeName, $actualClassOrObject, string $message = ''): void { @@ -688,6 +826,8 @@ abstract class Assert * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 */ public static function assertAttributeLessThan($expected, string $actualAttributeName, $actualClassOrObject, string $message = ''): void { @@ -716,6 +856,8 @@ abstract class Assert * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 */ public static function assertAttributeLessThanOrEqual($expected, string $actualAttributeName, $actualClassOrObject, string $message = ''): void { @@ -1269,6 +1411,8 @@ abstract class Assert * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 */ public static function assertAttributeSame($expected, string $actualAttributeName, $actualClassOrObject, string $message = ''): void { @@ -1310,6 +1454,8 @@ abstract class Assert * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 */ public static function assertAttributeNotSame($expected, string $actualAttributeName, $actualClassOrObject, string $message = ''): void { @@ -1346,6 +1492,8 @@ abstract class Assert * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 */ public static function assertAttributeInstanceOf(string $expected, string $attributeName, $classOrObject, string $message = ''): void { @@ -1384,6 +1532,8 @@ abstract class Assert * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 */ public static function assertAttributeNotInstanceOf(string $expected, string $attributeName, $classOrObject, string $message = ''): void { @@ -1399,6 +1549,8 @@ abstract class Assert * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3369 */ public static function assertInternalType(string $expected, $actual, string $message = ''): void { @@ -1416,6 +1568,8 @@ abstract class Assert * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 */ public static function assertAttributeInternalType(string $expected, string $attributeName, $classOrObject, string $message = ''): void { @@ -1426,11 +1580,145 @@ abstract class Assert ); } + /** + * Asserts that a variable is of type array. + */ + public static function assertIsArray($actual, string $message = ''): void + { + static::assertThat( + $actual, + new IsType(IsType::TYPE_ARRAY), + $message + ); + } + + /** + * Asserts that a variable is of type bool. + */ + public static function assertIsBool($actual, string $message = ''): void + { + static::assertThat( + $actual, + new IsType(IsType::TYPE_BOOL), + $message + ); + } + + /** + * Asserts that a variable is of type float. + */ + public static function assertIsFloat($actual, string $message = ''): void + { + static::assertThat( + $actual, + new IsType(IsType::TYPE_FLOAT), + $message + ); + } + + /** + * Asserts that a variable is of type int. + */ + public static function assertIsInt($actual, string $message = ''): void + { + static::assertThat( + $actual, + new IsType(IsType::TYPE_INT), + $message + ); + } + + /** + * Asserts that a variable is of type numeric. + */ + public static function assertIsNumeric($actual, string $message = ''): void + { + static::assertThat( + $actual, + new IsType(IsType::TYPE_NUMERIC), + $message + ); + } + + /** + * Asserts that a variable is of type object. + */ + public static function assertIsObject($actual, string $message = ''): void + { + static::assertThat( + $actual, + new IsType(IsType::TYPE_OBJECT), + $message + ); + } + + /** + * Asserts that a variable is of type resource. + */ + public static function assertIsResource($actual, string $message = ''): void + { + static::assertThat( + $actual, + new IsType(IsType::TYPE_RESOURCE), + $message + ); + } + + /** + * Asserts that a variable is of type string. + */ + public static function assertIsString($actual, string $message = ''): void + { + static::assertThat( + $actual, + new IsType(IsType::TYPE_STRING), + $message + ); + } + + /** + * Asserts that a variable is of type scalar. + */ + public static function assertIsScalar($actual, string $message = ''): void + { + static::assertThat( + $actual, + new IsType(IsType::TYPE_SCALAR), + $message + ); + } + + /** + * Asserts that a variable is of type callable. + */ + public static function assertIsCallable($actual, string $message = ''): void + { + static::assertThat( + $actual, + new IsType(IsType::TYPE_CALLABLE), + $message + ); + } + + /** + * Asserts that a variable is of type iterable. + */ + public static function assertIsIterable($actual, string $message = ''): void + { + static::assertThat( + $actual, + new IsType(IsType::TYPE_ITERABLE), + $message + ); + } + /** * Asserts that a variable is not of a given type. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3369 */ public static function assertNotInternalType(string $expected, $actual, string $message = ''): void { @@ -1443,6 +1731,138 @@ abstract class Assert ); } + /** + * Asserts that a variable is not of type array. + */ + public static function assertIsNotArray($actual, string $message = ''): void + { + static::assertThat( + $actual, + new LogicalNot(new IsType(IsType::TYPE_ARRAY)), + $message + ); + } + + /** + * Asserts that a variable is not of type bool. + */ + public static function assertIsNotBool($actual, string $message = ''): void + { + static::assertThat( + $actual, + new LogicalNot(new IsType(IsType::TYPE_BOOL)), + $message + ); + } + + /** + * Asserts that a variable is not of type float. + */ + public static function assertIsNotFloat($actual, string $message = ''): void + { + static::assertThat( + $actual, + new LogicalNot(new IsType(IsType::TYPE_FLOAT)), + $message + ); + } + + /** + * Asserts that a variable is not of type int. + */ + public static function assertIsNotInt($actual, string $message = ''): void + { + static::assertThat( + $actual, + new LogicalNot(new IsType(IsType::TYPE_INT)), + $message + ); + } + + /** + * Asserts that a variable is not of type numeric. + */ + public static function assertIsNotNumeric($actual, string $message = ''): void + { + static::assertThat( + $actual, + new LogicalNot(new IsType(IsType::TYPE_NUMERIC)), + $message + ); + } + + /** + * Asserts that a variable is not of type object. + */ + public static function assertIsNotObject($actual, string $message = ''): void + { + static::assertThat( + $actual, + new LogicalNot(new IsType(IsType::TYPE_OBJECT)), + $message + ); + } + + /** + * Asserts that a variable is not of type resource. + */ + public static function assertIsNotResource($actual, string $message = ''): void + { + static::assertThat( + $actual, + new LogicalNot(new IsType(IsType::TYPE_RESOURCE)), + $message + ); + } + + /** + * Asserts that a variable is not of type string. + */ + public static function assertIsNotString($actual, string $message = ''): void + { + static::assertThat( + $actual, + new LogicalNot(new IsType(IsType::TYPE_STRING)), + $message + ); + } + + /** + * Asserts that a variable is not of type scalar. + */ + public static function assertIsNotScalar($actual, string $message = ''): void + { + static::assertThat( + $actual, + new LogicalNot(new IsType(IsType::TYPE_SCALAR)), + $message + ); + } + + /** + * Asserts that a variable is not of type callable. + */ + public static function assertIsNotCallable($actual, string $message = ''): void + { + static::assertThat( + $actual, + new LogicalNot(new IsType(IsType::TYPE_CALLABLE)), + $message + ); + } + + /** + * Asserts that a variable is not of type iterable. + */ + public static function assertIsNotIterable($actual, string $message = ''): void + { + static::assertThat( + $actual, + new LogicalNot(new IsType(IsType::TYPE_ITERABLE)), + $message + ); + } + /** * Asserts that an attribute is of a given type. * @@ -1450,6 +1870,8 @@ abstract class Assert * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 */ public static function assertAttributeNotInternalType(string $expected, string $attributeName, $classOrObject, string $message = ''): void { @@ -1643,6 +2065,34 @@ abstract class Assert ); } + public static function assertStringContainsString(string $needle, string $haystack, string $message = ''): void + { + $constraint = new StringContains($needle, false); + + static::assertThat($haystack, $constraint, $message); + } + + public static function assertStringContainsStringIgnoringCase(string $needle, string $haystack, string $message = ''): void + { + $constraint = new StringContains($needle, true); + + static::assertThat($haystack, $constraint, $message); + } + + public static function assertStringNotContainsString(string $needle, string $haystack, string $message = ''): void + { + $constraint = new LogicalNot(new StringContains($needle)); + + static::assertThat($haystack, $constraint, $message); + } + + public static function assertStringNotContainsStringIgnoringCase(string $needle, string $haystack, string $message = ''): void + { + $constraint = new LogicalNot(new StringContains($needle, true)); + + static::assertThat($haystack, $constraint, $message); + } + /** * Asserts that a string ends with a given suffix. * @@ -2077,6 +2527,9 @@ abstract class Assert return new IsNan; } + /** + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 + */ public static function attribute(Constraint $constraint, string $attributeName): Attribute { return new Attribute($constraint, $attributeName); @@ -2110,6 +2563,9 @@ abstract class Assert return new IsEqual($value, $delta, $maxDepth, $canonicalize, $ignoreCase); } + /** + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 + */ public static function attributeEqualTo(string $attributeName, $value, float $delta = 0.0, int $maxDepth = 10, bool $canonicalize = false, bool $ignoreCase = false): Attribute { return static::attribute( @@ -2254,6 +2710,8 @@ abstract class Assert * @param object|string $classOrObject * * @throws Exception + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 */ public static function readAttribute($classOrObject, string $attributeName) { @@ -2294,6 +2752,8 @@ abstract class Assert * * @throws Exception * @throws ReflectionException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 */ public static function getStaticAttribute(string $className, string $attributeName) { @@ -2332,6 +2792,8 @@ abstract class Assert * @param object $object * * @throws Exception + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 */ public static function getObjectAttribute($object, string $attributeName) { @@ -2413,4 +2875,15 @@ abstract class Assert { return \preg_match('/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/', $attributeName); } + + private static function createWarning(string $warning): void + { + foreach (\debug_backtrace() as $step) { + if (isset($step['object']) && $step['object'] instanceof TestCase) { + $step['object']->addWarning($warning); + + break; + } + } + } } diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/IsEqual.php b/vendor/phpunit/phpunit/src/Framework/Constraint/IsEqual.php index 930fd74ec..0cc999e68 100644 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/IsEqual.php +++ b/vendor/phpunit/phpunit/src/Framework/Constraint/IsEqual.php @@ -129,7 +129,7 @@ class IsEqual extends Constraint } return \sprintf( - 'is equal to "%s"', + "is equal to '%s'", $this->value ); } diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Generator.php index 51988fb68..351ed913f 100644 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator.php +++ b/vendor/phpunit/phpunit/src/Framework/MockObject/Generator.php @@ -772,7 +772,7 @@ class Generator $cloneTemplate = $cloneTemplate->render(); } - if (\is_array($explicitMethods) && empty($explicitMethods) && + if ($explicitMethods === [] && ($isClass || $isInterface)) { $mockMethods->addMethods( ...$this->mockClassMethods($mockClassName['fullClassName'], $callOriginalMethods, $cloneArguments) diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/MockObject.php b/vendor/phpunit/phpunit/src/Framework/MockObject/MockObject.php index 9bcb5dd11..cb5e51e27 100644 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/MockObject.php +++ b/vendor/phpunit/phpunit/src/Framework/MockObject/MockObject.php @@ -17,6 +17,8 @@ use PHPUnit\Framework\MockObject\Matcher\Invocation; * MockBuilder. * * @method InvocationMocker method($constraint) + * + * @deprecated Use PHPUnit\Framework\MockObject\MockObject instead */ interface PHPUnit_Framework_MockObject_MockObject /*extends Verifiable*/ { diff --git a/vendor/phpunit/phpunit/src/Framework/TestCase.php b/vendor/phpunit/phpunit/src/Framework/TestCase.php index 8e1da9b43..0d30afc49 100644 --- a/vendor/phpunit/phpunit/src/Framework/TestCase.php +++ b/vendor/phpunit/phpunit/src/Framework/TestCase.php @@ -686,11 +686,9 @@ abstract class TestCase extends Assert implements Test, SelfDescribing return $result; } - $runEntireClass = $this->runClassInSeparateProcess && !$this->runTestInSeparateProcess; + if ($this->runInSeparateProcess()) { + $runEntireClass = $this->runClassInSeparateProcess && !$this->runTestInSeparateProcess; - if (($this->runTestInSeparateProcess === true || $this->runClassInSeparateProcess === true) && - $this->inIsolation !== true && - !$this instanceof PhptTestCase) { $class = new ReflectionClass($this); if ($runEntireClass) { @@ -1125,6 +1123,11 @@ abstract class TestCase extends Assert implements Test, SelfDescribing return $this->data; } + public function addWarning(string $warning): void + { + $this->warnings[] = $warning; + } + /** * Override to run the test and assert its state. * @@ -1720,7 +1723,10 @@ abstract class TestCase extends Assert implements Test, SelfDescribing } if (!isset($passedKeys[$dependency])) { + $this->status = BaseTestRunner::STATUS_SKIPPED; + $this->result->startTest($this); + $this->result->addError( $this, new SkippedTestError( @@ -1731,6 +1737,7 @@ abstract class TestCase extends Assert implements Test, SelfDescribing ), 0 ); + $this->result->endTest($this, 0); return false; @@ -1985,13 +1992,7 @@ abstract class TestCase extends Assert implements Test, SelfDescribing return true; } - foreach ($enumerator->enumerate($this->testResult) as $object) { - if ($mock === $object) { - return false; - } - } - - return true; + return !\in_array($mock, $enumerator->enumerate($this->testResult), true); } /** @@ -2110,4 +2111,10 @@ abstract class TestCase extends Assert implements Test, SelfDescribing return $result; } + + private function runInSeparateProcess(): bool + { + return ($this->runTestInSeparateProcess === true || $this->runClassInSeparateProcess === true) && + $this->inIsolation !== true && !$this instanceof PhptTestCase; + } } diff --git a/vendor/phpunit/phpunit/src/Framework/TestSuite.php b/vendor/phpunit/phpunit/src/Framework/TestSuite.php index 59d129c8d..74d3ddb82 100644 --- a/vendor/phpunit/phpunit/src/Framework/TestSuite.php +++ b/vendor/phpunit/phpunit/src/Framework/TestSuite.php @@ -704,12 +704,10 @@ class TestSuite implements Test, SelfDescribing, IteratorAggregate } } } catch (SkippedTestSuiteError $e) { - $numTests = \count($this); - - for ($i = 0; $i < $numTests; $i++) { - $result->startTest($this); - $result->addFailure($this, $e, 0); - $result->endTest($this, 0); + foreach ($this->tests() as $test) { + $result->startTest($test); + $result->addFailure($test, $e, 0); + $result->endTest($test, 0); } $this->tearDown(); @@ -717,16 +715,14 @@ class TestSuite implements Test, SelfDescribing, IteratorAggregate return $result; } catch (Throwable $t) { - $numTests = \count($this); - - for ($i = 0; $i < $numTests; $i++) { + foreach ($this->tests() as $test) { if ($result->shouldStop()) { break; } - $result->startTest($this); - $result->addError($this, $t, 0); - $result->endTest($this, 0); + $result->startTest($test); + $result->addError($test, $t, 0); + $result->endTest($test, 0); } $this->tearDown(); diff --git a/vendor/phpunit/phpunit/src/Runner/Hook/AfterTestHook.php b/vendor/phpunit/phpunit/src/Runner/Hook/AfterTestHook.php new file mode 100644 index 000000000..f463732a7 --- /dev/null +++ b/vendor/phpunit/phpunit/src/Runner/Hook/AfterTestHook.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Runner; + +interface AfterTestHook extends Hook +{ + /** + * This hook will fire after any test, regardless of the result. + * + * For more fine grained control, have a look at the other hooks + * that extend PHPUnit\Runner\Hook. + */ + public function executeAfterTest(string $test, float $time): void; +} diff --git a/vendor/phpunit/phpunit/src/Runner/Hook/TestListenerAdapter.php b/vendor/phpunit/phpunit/src/Runner/Hook/TestListenerAdapter.php index 3f922056d..02ed7006b 100644 --- a/vendor/phpunit/phpunit/src/Runner/Hook/TestListenerAdapter.php +++ b/vendor/phpunit/phpunit/src/Runner/Hook/TestListenerAdapter.php @@ -112,13 +112,17 @@ final class TestListenerAdapter implements TestListener public function endTest(Test $test, float $time): void { - if ($this->lastTestWasNotSuccessful === true) { - return; + if ($this->lastTestWasNotSuccessful !== true) { + foreach ($this->hooks as $hook) { + if ($hook instanceof AfterSuccessfulTestHook) { + $hook->executeAfterSuccessfulTest(TestUtil::describeAsString($test), $time); + } + } } foreach ($this->hooks as $hook) { - if ($hook instanceof AfterSuccessfulTestHook) { - $hook->executeAfterSuccessfulTest(TestUtil::describeAsString($test), $time); + if ($hook instanceof AfterTestHook) { + $hook->executeAfterTest(TestUtil::describeAsString($test), $time); } } } diff --git a/vendor/phpunit/phpunit/src/Runner/PhptTestCase.php b/vendor/phpunit/phpunit/src/Runner/PhptTestCase.php index 069331b38..bbc1a2397 100644 --- a/vendor/phpunit/phpunit/src/Runner/PhptTestCase.php +++ b/vendor/phpunit/phpunit/src/Runner/PhptTestCase.php @@ -62,6 +62,11 @@ class PhptTestCase implements Test, SelfDescribing */ private $phpUtil; + /** + * @var string + */ + private $output = ''; + /** * Constructs a test case with the given filename. * @@ -155,8 +160,9 @@ class PhptTestCase implements Test, SelfDescribing Timer::start(); - $jobResult = $this->phpUtil->runJob($code, $this->stringifyIni($settings)); - $time = Timer::stop(); + $jobResult = $this->phpUtil->runJob($code, $this->stringifyIni($settings)); + $time = Timer::stop(); + $this->output = $jobResult['stdout'] ?? ''; if ($result->getCollectCodeCoverageInformation() && ($coverage = $this->cleanupForCoverage())) { $result->getCodeCoverage()->append($coverage, $this, true, [], [], true); @@ -202,6 +208,26 @@ class PhptTestCase implements Test, SelfDescribing return $this->filename; } + public function usesDataProvider(): bool + { + return false; + } + + public function getNumAssertions(): int + { + return 1; + } + + public function getActualOutput(): string + { + return $this->output; + } + + public function hasOutput(): bool + { + return !empty($this->output); + } + /** * Parse --INI-- section key value pairs and return as array. * @@ -475,8 +501,8 @@ class PhptTestCase implements Test, SelfDescribing private function getCoverageFiles(): array { - $baseDir = \dirname(\realpath($this->filename)) . \DIRECTORY_SEPARATOR; - $basename = \basename($this->filename, 'phpt'); + $baseDir = \dirname(\realpath($this->filename)) . \DIRECTORY_SEPARATOR; + $basename = \basename($this->filename, 'phpt'); return [ 'coverage' => $baseDir . $basename . 'coverage', @@ -507,7 +533,10 @@ class PhptTestCase implements Test, SelfDescribing $globals = ''; if (!empty($GLOBALS['__PHPUNIT_BOOTSTRAP'])) { - $globals = '$GLOBALS[\'__PHPUNIT_BOOTSTRAP\'] = ' . \var_export($GLOBALS['__PHPUNIT_BOOTSTRAP'], true) . ";\n"; + $globals = '$GLOBALS[\'__PHPUNIT_BOOTSTRAP\'] = ' . \var_export( + $GLOBALS['__PHPUNIT_BOOTSTRAP'], + true + ) . ";\n"; } $template->setVar( diff --git a/vendor/phpunit/phpunit/src/Runner/ResultCacheExtension.php b/vendor/phpunit/phpunit/src/Runner/ResultCacheExtension.php index 80fbc190e..962bbc07e 100644 --- a/vendor/phpunit/phpunit/src/Runner/ResultCacheExtension.php +++ b/vendor/phpunit/phpunit/src/Runner/ResultCacheExtension.php @@ -95,8 +95,8 @@ final class ResultCacheExtension implements AfterSuccessfulTestHook, AfterSkippe { $matches = []; - if (\preg_match('/^(?:\S+::)?(?\S+)(?:(? with data set (?:#\d+|"[^"]+"))\s\()?/', $test, $matches)) { - $test = $matches['name'] . ($matches['data'] ?? ''); + if (\preg_match('/^(?\S+::\S+)(?:(? with data set (?:#\d+|"[^"]+"))\s\()?/', $test, $matches)) { + $test = $matches['name'] . ($matches['dataname'] ?? ''); } return $test; diff --git a/vendor/phpunit/phpunit/src/Runner/TestSuiteSorter.php b/vendor/phpunit/phpunit/src/Runner/TestSuiteSorter.php index 7785701ca..9607d1d3f 100644 --- a/vendor/phpunit/phpunit/src/Runner/TestSuiteSorter.php +++ b/vendor/phpunit/phpunit/src/Runner/TestSuiteSorter.php @@ -64,6 +64,35 @@ final class TestSuiteSorter */ private $cache; + /** + * @var array array A list of normalized names of tests before reordering + */ + private $originalExecutionOrder = []; + + /** + * @var array array A list of normalized names of tests affected by reordering + */ + private $executionOrder = []; + + public static function getTestSorterUID(Test $test): string + { + if ($test instanceof PhptTestCase) { + return $test->getName(); + } + + if ($test instanceof TestCase) { + $testName = $test->getName(true); + + if (\strpos($testName, '::') === false) { + $testName = \get_class($test) . '::' . $testName; + } + + return $testName; + } + + return $test->getName(); + } + public function __construct(?TestResultCacheInterface $cache = null) { $this->cache = $cache ?? new NullTestResultCache; @@ -72,7 +101,7 @@ final class TestSuiteSorter /** * @throws Exception */ - public function reorderTestsInSuite(Test $suite, int $order, bool $resolveDependencies, int $orderDefects): void + public function reorderTestsInSuite(Test $suite, int $order, bool $resolveDependencies, int $orderDefects, bool $isRootTestSuite = true): void { $allowedOrders = [ self::ORDER_DEFAULT, @@ -98,9 +127,13 @@ final class TestSuiteSorter ); } + if ($isRootTestSuite) { + $this->originalExecutionOrder = $this->calculateTestExecutionOrder($suite); + } + if ($suite instanceof TestSuite) { foreach ($suite as $_suite) { - $this->reorderTestsInSuite($_suite, $order, $resolveDependencies, $orderDefects); + $this->reorderTestsInSuite($_suite, $order, $resolveDependencies, $orderDefects, false); } if ($orderDefects === self::ORDER_DEFECTS_FIRST) { @@ -109,6 +142,20 @@ final class TestSuiteSorter $this->sort($suite, $order, $resolveDependencies, $orderDefects); } + + if ($isRootTestSuite) { + $this->executionOrder = $this->calculateTestExecutionOrder($suite); + } + } + + public function getOriginalExecutionOrder(): array + { + return $this->originalExecutionOrder; + } + + public function getExecutionOrder(): array + { + return $this->executionOrder; } private function sort(TestSuite $suite, int $order, bool $resolveDependencies, int $orderDefects): void @@ -139,9 +186,11 @@ final class TestSuiteSorter $max = 0; foreach ($suite->tests() as $test) { - if (!isset($this->defectSortOrder[$test->getName()])) { - $this->defectSortOrder[$test->getName()] = self::DEFECT_SORT_WEIGHT[$this->cache->getState($test->getName())]; - $max = \max($max, $this->defectSortOrder[$test->getName()]); + $testname = self::getTestSorterUID($test); + + if (!isset($this->defectSortOrder[$testname])) { + $this->defectSortOrder[$testname] = self::DEFECT_SORT_WEIGHT[$this->cache->getState($testname)]; + $max = \max($max, $this->defectSortOrder[$testname]); } } @@ -203,12 +252,8 @@ final class TestSuiteSorter */ private function cmpDefectPriorityAndTime(Test $a, Test $b): int { - if (!$a instanceof TestCase || !$b instanceof TestCase) { - return 0; - } - - $priorityA = $this->defectSortOrder[$a->getName()] ?? 0; - $priorityB = $this->defectSortOrder[$b->getName()] ?? 0; + $priorityA = $this->defectSortOrder[self::getTestSorterUID($a)] ?? 0; + $priorityB = $this->defectSortOrder[self::getTestSorterUID($b)] ?? 0; if ($priorityB <=> $priorityA) { // Sort defect weight descending @@ -228,11 +273,7 @@ final class TestSuiteSorter */ private function cmpDuration(Test $a, Test $b): int { - if (!$a instanceof TestCase || !$b instanceof TestCase) { - return 0; - } - - return $this->cache->getTime($a->getName()) <=> $this->cache->getTime($b->getName()); + return $this->cache->getTime(self::getTestSorterUID($a)) <=> $this->cache->getTime(self::getTestSorterUID($b)); } /** @@ -258,7 +299,7 @@ final class TestSuiteSorter do { $todoNames = \array_map( function ($test) { - return $this->getNormalizedTestName($test); + return self::getTestSorterUID($test); }, $tests ); @@ -274,20 +315,6 @@ final class TestSuiteSorter return \array_merge($newTestOrder, $tests); } - /** - * @param DataProviderTestSuite|TestCase $test - * - * @return string Full test name as "TestSuiteClassName::testMethodName" - */ - private function getNormalizedTestName($test): string - { - if (\strpos($test->getName(), '::') !== false) { - return $test->getName(); - } - - return \get_class($test) . '::' . $test->getName(); - } - /** * @param DataProviderTestSuite|TestCase $test * @@ -310,4 +337,21 @@ final class TestSuiteSorter return $names; } + + private function calculateTestExecutionOrder(Test $suite): array + { + $tests = []; + + if ($suite instanceof TestSuite) { + foreach ($suite->tests() as $test) { + if (!($test instanceof TestSuite)) { + $tests[] = self::getTestSorterUID($test); + } else { + $tests = \array_merge($tests, $this->calculateTestExecutionOrder($test)); + } + } + } + + return $tests; + } } diff --git a/vendor/phpunit/phpunit/src/Runner/Version.php b/vendor/phpunit/phpunit/src/Runner/Version.php index 2b7a2e4ad..5cd94c0a5 100644 --- a/vendor/phpunit/phpunit/src/Runner/Version.php +++ b/vendor/phpunit/phpunit/src/Runner/Version.php @@ -30,7 +30,7 @@ class Version } if (self::$version === null) { - $version = new VersionId('7.4.0', \dirname(__DIR__, 2)); + $version = new VersionId('7.5.1', \dirname(__DIR__, 2)); self::$version = $version->getVersion(); } diff --git a/vendor/phpunit/phpunit/src/TextUI/Command.php b/vendor/phpunit/phpunit/src/TextUI/Command.php index 1733172f5..9b66bc192 100644 --- a/vendor/phpunit/phpunit/src/TextUI/Command.php +++ b/vendor/phpunit/phpunit/src/TextUI/Command.php @@ -1173,7 +1173,7 @@ Configuration Options: --include-path Prepend PHP's include_path with given path(s) -d key[=value] Sets a php.ini value --generate-configuration Generate configuration file with suggested settings - --cache-result-file== Specify result cache path and filename + --cache-result-file= Specify result cache path and filename Miscellaneous Options: diff --git a/vendor/phpunit/phpunit/src/TextUI/TestRunner.php b/vendor/phpunit/phpunit/src/TextUI/TestRunner.php index ebcdb9768..69cfa96ad 100644 --- a/vendor/phpunit/phpunit/src/TextUI/TestRunner.php +++ b/vendor/phpunit/phpunit/src/TextUI/TestRunner.php @@ -39,6 +39,7 @@ use PHPUnit\Util\Configuration; use PHPUnit\Util\Log\JUnit; use PHPUnit\Util\Log\TeamCity; use PHPUnit\Util\Printer; +use PHPUnit\Util\TestDox\CliTestDoxPrinter; use PHPUnit\Util\TestDox\HtmlResultPrinter; use PHPUnit\Util\TestDox\TextResultPrinter; use PHPUnit\Util\TestDox\XmlResultPrinter; @@ -158,6 +159,11 @@ class TestRunner extends BaseTestRunner $this->handleConfiguration($arguments); + if (\is_int($arguments['columns']) && $arguments['columns'] < 16) { + $arguments['columns'] = 16; + $tooFewColumnsRequested = true; + } + if (isset($arguments['bootstrap'])) { $GLOBALS['__PHPUNIT_BOOTSTRAP'] = $arguments['bootstrap']; } @@ -198,6 +204,7 @@ class TestRunner extends BaseTestRunner $sorter = new TestSuiteSorter($cache); $sorter->reorderTestsInSuite($suite, $arguments['executionOrder'], $arguments['resolveDependencies'], $arguments['executionOrderDefects']); + $originalExecutionOrder = $sorter->getOriginalExecutionOrder(); unset($sorter); } @@ -304,6 +311,11 @@ class TestRunner extends BaseTestRunner $arguments['columns'], $arguments['reverseList'] ); + + if (isset($originalExecutionOrder) && ($this->printer instanceof CliTestDoxPrinter)) { + /* @var CliTestDoxPrinter */ + $this->printer->setOriginalExecutionOrder($originalExecutionOrder); + } } } @@ -354,6 +366,10 @@ class TestRunner extends BaseTestRunner } } + if (isset($tooFewColumnsRequested)) { + $this->writeMessage('Error', 'Less than 16 columns requested, number of columns set to 16'); + } + if ($this->runtime->discardsComments()) { $this->writeMessage('Warning', 'opcache.save_comments=0 set; annotations will not work'); } diff --git a/vendor/phpunit/phpunit/src/Util/Log/JUnit.php b/vendor/phpunit/phpunit/src/Util/Log/JUnit.php index f81402e4a..13b950902 100644 --- a/vendor/phpunit/phpunit/src/Util/Log/JUnit.php +++ b/vendor/phpunit/phpunit/src/Util/Log/JUnit.php @@ -15,7 +15,6 @@ use PHPUnit\Framework\AssertionFailedError; use PHPUnit\Framework\ExceptionWrapper; use PHPUnit\Framework\SelfDescribing; use PHPUnit\Framework\Test; -use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestFailure; use PHPUnit\Framework\TestListener; use PHPUnit\Framework\TestSuite; @@ -291,15 +290,17 @@ class JUnit extends Printer implements TestListener */ public function startTest(Test $test): void { - if (!$test instanceof TestCase) { - return; + $usesDataprovider = false; + + if (\method_exists($test, 'usesDataProvider')) { + $usesDataprovider = $test->usesDataProvider(); } $testCase = $this->document->createElement('testcase'); $testCase->setAttribute('name', $test->getName()); $class = new ReflectionClass($test); - $methodName = $test->getName(!$test->usesDataProvider()); + $methodName = $test->getName(!$usesDataprovider); if ($class->hasMethod($methodName)) { $method = $class->getMethod($methodName); @@ -318,11 +319,12 @@ class JUnit extends Printer implements TestListener */ public function endTest(Test $test, float $time): void { - if (!$test instanceof TestCase) { - return; + $numAssertions = 0; + + if (\method_exists($test, 'getNumAssertions')) { + $numAssertions = $test->getNumAssertions(); } - $numAssertions = $test->getNumAssertions(); $this->testSuiteAssertions[$this->testSuiteLevel] += $numAssertions; $this->currentTestCase->setAttribute( @@ -342,10 +344,16 @@ class JUnit extends Printer implements TestListener $this->testSuiteTests[$this->testSuiteLevel]++; $this->testSuiteTimes[$this->testSuiteLevel] += $time; - if ($test->hasOutput()) { + $testOutput = ''; + + if (\method_exists($test, 'hasOutput') && \method_exists($test, 'getActualOutput')) { + $testOutput = $test->hasOutput() ? $test->getActualOutput() : ''; + } + + if (!empty($testOutput)) { $systemOut = $this->document->createElement( 'system-out', - Xml::prepareString($test->getActualOutput()) + Xml::prepareString($testOutput) ); $this->currentTestCase->appendChild($systemOut); diff --git a/vendor/phpunit/phpunit/src/Util/Log/TeamCity.php b/vendor/phpunit/phpunit/src/Util/Log/TeamCity.php index a6c27b8a9..4e8f446c4 100644 --- a/vendor/phpunit/phpunit/src/Util/Log/TeamCity.php +++ b/vendor/phpunit/phpunit/src/Util/Log/TeamCity.php @@ -57,10 +57,6 @@ class TeamCity extends ResultPrinter */ public function addError(Test $test, \Throwable $t, float $time): void { - if (!$test instanceof TestCase) { - return; - } - $this->printEvent( 'testFailed', [ @@ -79,10 +75,6 @@ class TeamCity extends ResultPrinter */ public function addWarning(Test $test, Warning $e, float $time): void { - if (!$test instanceof TestCase) { - return; - } - $this->printEvent( 'testFailed', [ @@ -101,10 +93,6 @@ class TeamCity extends ResultPrinter */ public function addFailure(Test $test, AssertionFailedError $e, float $time): void { - if (!$test instanceof TestCase) { - return; - } - $parameters = [ 'name' => $test->getName(), 'message' => self::getMessage($e), @@ -144,10 +132,6 @@ class TeamCity extends ResultPrinter */ public function addIncompleteTest(Test $test, \Throwable $t, float $time): void { - if (!$test instanceof TestCase) { - return; - } - $this->printIgnoredTest($test->getName(), $t, $time); } @@ -158,10 +142,6 @@ class TeamCity extends ResultPrinter */ public function addRiskyTest(Test $test, \Throwable $t, float $time): void { - if (!$test instanceof TestCase) { - return; - } - $this->addError($test, $t, $time); } @@ -172,10 +152,6 @@ class TeamCity extends ResultPrinter */ public function addSkippedTest(Test $test, \Throwable $t, float $time): void { - if (!$test instanceof TestCase) { - return; - } - $testName = $test->getName(); if ($this->startedTestName !== $testName) { @@ -277,10 +253,6 @@ class TeamCity extends ResultPrinter */ public function startTest(Test $test): void { - if (!$test instanceof TestCase) { - return; - } - $testName = $test->getName(); $this->startedTestName = $testName; $params = ['name' => $testName]; @@ -299,10 +271,6 @@ class TeamCity extends ResultPrinter */ public function endTest(Test $test, float $time): void { - if (!$test instanceof TestCase) { - return; - } - parent::endTest($test, $time); $this->printEvent( diff --git a/vendor/phpunit/phpunit/src/Util/Test.php b/vendor/phpunit/phpunit/src/Util/Test.php index 71d93168a..9b853f929 100644 --- a/vendor/phpunit/phpunit/src/Util/Test.php +++ b/vendor/phpunit/phpunit/src/Util/Test.php @@ -10,6 +10,7 @@ namespace PHPUnit\Util; use PharIo\Version\VersionConstraintParser; +use PHPUnit\Framework\Assert; use PHPUnit\Framework\CodeCoverageException; use PHPUnit\Framework\Exception; use PHPUnit\Framework\InvalidCoversTargetException; @@ -276,7 +277,7 @@ final class Test } } - if (!empty($required['OSFAMILY']) && $required['OSFAMILY'] !== (new OperatingSystem())->getFamily()) { + if (!empty($required['OSFAMILY']) && $required['OSFAMILY'] !== (new OperatingSystem)->getFamily()) { $missing[] = \sprintf('Operating system %s is required.', $required['OSFAMILY']); } @@ -413,7 +414,7 @@ final class Test $data = self::getDataFromTestWithAnnotation($docComment); } - if (\is_array($data) && empty($data)) { + if ($data === []) { throw new SkippedTestError; } @@ -706,26 +707,38 @@ final class Test $class = new ReflectionClass($className); foreach ($class->getMethods() as $method) { - if (self::isBeforeClassMethod($method)) { - \array_unshift( - self::$hookMethods[$className]['beforeClass'], - $method->getName() - ); + if ($method->getDeclaringClass()->getName() === Assert::class) { + continue; } - if (self::isBeforeMethod($method)) { - \array_unshift( - self::$hookMethods[$className]['before'], - $method->getName() - ); + if ($method->getDeclaringClass()->getName() === TestCase::class) { + continue; } - if (self::isAfterMethod($method)) { - self::$hookMethods[$className]['after'][] = $method->getName(); - } + if ($methodComment = $method->getDocComment()) { + if ($method->isStatic()) { + if (\strpos($methodComment, '@beforeClass') !== false) { + \array_unshift( + self::$hookMethods[$className]['beforeClass'], + $method->getName() + ); + } - if (self::isAfterClassMethod($method)) { - self::$hookMethods[$className]['afterClass'][] = $method->getName(); + if (\strpos($methodComment, '@afterClass') !== false) { + self::$hookMethods[$className]['afterClass'][] = $method->getName(); + } + } + + if (\preg_match('/@before\b/', $methodComment) > 0) { + \array_unshift( + self::$hookMethods[$className]['before'], + $method->getName() + ); + } + + if (\preg_match('/@after\b/', $methodComment) > 0) { + self::$hookMethods[$className]['after'][] = $method->getName(); + } } } } catch (ReflectionException $e) { @@ -1076,26 +1089,6 @@ final class Test return $result; } - private static function isBeforeClassMethod(ReflectionMethod $method): bool - { - return $method->isStatic() && \strpos($method->getDocComment(), '@beforeClass') !== false; - } - - private static function isBeforeMethod(ReflectionMethod $method): bool - { - return \preg_match('/@before\b/', $method->getDocComment()) > 0; - } - - private static function isAfterClassMethod(ReflectionMethod $method): bool - { - return $method->isStatic() && \strpos($method->getDocComment(), '@afterClass') !== false; - } - - private static function isAfterMethod(ReflectionMethod $method): bool - { - return \preg_match('/@after\b/', $method->getDocComment()) > 0; - } - /** * Trims any extensions from version string that follows after * the .[.] format diff --git a/vendor/phpunit/phpunit/src/Util/TestDox/CliTestDoxPrinter.php b/vendor/phpunit/phpunit/src/Util/TestDox/CliTestDoxPrinter.php index 209ae2552..217377e72 100644 --- a/vendor/phpunit/phpunit/src/Util/TestDox/CliTestDoxPrinter.php +++ b/vendor/phpunit/phpunit/src/Util/TestDox/CliTestDoxPrinter.php @@ -16,8 +16,8 @@ use PHPUnit\Framework\TestResult; use PHPUnit\Framework\TestSuite; use PHPUnit\Framework\Warning; use PHPUnit\Runner\PhptTestCase; +use PHPUnit\Runner\TestSuiteSorter; use PHPUnit\TextUI\ResultPrinter; -use PHPUnit\Util\TestDox\TestResult as TestDoxTestResult; use SebastianBergmann\Timer\Timer; /** @@ -27,17 +27,7 @@ use SebastianBergmann\Timer\Timer; class CliTestDoxPrinter extends ResultPrinter { /** - * @var TestDoxTestResult - */ - private $currentTestResult; - - /** - * @var TestDoxTestResult - */ - private $previousTestResult; - - /** - * @var TestDoxTestResult[] + * @var int[] */ private $nonSuccessfulTestResults = []; @@ -46,42 +36,95 @@ class CliTestDoxPrinter extends ResultPrinter */ private $prettifier; - public function __construct($out = null, bool $verbose = false, $colors = self::COLOR_DEFAULT, bool $debug = false, $numberOfColumns = 80, bool $reverse = false) - { + /** + * @var int The number of test results received from the TestRunner + */ + private $testIndex = 0; + + /** + * @var int The number of test results already sent to the output + */ + private $testFlushIndex = 0; + + /** + * @var array Buffer for write() + */ + private $outputBuffer = []; + + /** + * @var bool + */ + private $bufferExecutionOrder = false; + + /** + * @var array array + */ + private $originalExecutionOrder = []; + + /** + * @var string Classname of the current test + */ + private $className = ''; + + /** + * @var string Classname of the previous test; empty for first test + */ + private $lastClassName = ''; + + /** + * @var string Prettified test name of current test + */ + private $testMethod; + + /** + * @var string Test result message of current test + */ + private $testResultMessage; + + /** + * @var bool Test result message of current test contains a verbose dump + */ + private $lastFlushedTestWasVerbose = false; + + public function __construct( + $out = null, + bool $verbose = false, + $colors = self::COLOR_DEFAULT, + bool $debug = false, + $numberOfColumns = 80, + bool $reverse = false + ) { parent::__construct($out, $verbose, $colors, $debug, $numberOfColumns, $reverse); $this->prettifier = new NamePrettifier; } + public function setOriginalExecutionOrder(array $order): void + { + $this->originalExecutionOrder = $order; + $this->bufferExecutionOrder = !empty($order); + } + public function startTest(Test $test): void { if (!$test instanceof TestCase && !$test instanceof PhptTestCase && !$test instanceof TestSuite) { return; } - $class = \get_class($test); + $this->lastTestFailed = false; + $this->lastClassName = $this->className; + $this->testResultMessage = ''; if ($test instanceof TestCase) { - $className = $this->prettifier->prettifyTestClass($class); + $className = $this->prettifier->prettifyTestClass(\get_class($test)); $testMethod = $this->prettifier->prettifyTestCase($test); - } elseif ($test instanceof TestSuite) { - $className = $test->getName(); - $testMethod = \sprintf( - 'Error bootstapping suite (most likely in %s::setUpBeforeClass)', - $test->getName() - ); } elseif ($test instanceof PhptTestCase) { - $className = $class; + $className = \get_class($test); $testMethod = $test->getName(); } - $this->currentTestResult = new TestDoxTestResult( - function (string $color, string $buffer) { - return $this->formatWithColor($color, $buffer); - }, - $className, - $testMethod - ); + $this->className = $className; + $this->testMethod = $testMethod; parent::startTest($test); } @@ -92,70 +135,120 @@ class CliTestDoxPrinter extends ResultPrinter return; } - parent::endTest($test, $time); - - $this->currentTestResult->setRuntime($time); - - $this->write($this->currentTestResult->toString($this->previousTestResult, $this->verbose)); - - $this->previousTestResult = $this->currentTestResult; - - if (!$this->currentTestResult->isTestSuccessful()) { - $this->nonSuccessfulTestResults[] = $this->currentTestResult; + if ($test instanceof TestCase || $test instanceof PhptTestCase) { + $this->testIndex++; } + + if ($this->lastTestFailed) { + $resultMessage = $this->testResultMessage; + $this->nonSuccessfulTestResults[] = $this->testIndex; + } else { + $resultMessage = $this->formatTestResultMessage( + $this->formatWithColor('fg-green', '✔'), + '', + $time, + $this->verbose + ); + } + + if ($this->bufferExecutionOrder) { + $this->bufferTestResult($test, $resultMessage); + $this->flushOutputBuffer(); + } else { + $this->writeTestResult($resultMessage); + + if ($this->lastTestFailed) { + $this->bufferTestResult($test, $resultMessage); + } + } + + parent::endTest($test, $time); } public function addError(Test $test, \Throwable $t, float $time): void { - $this->currentTestResult->fail( + $this->lastTestFailed = true; + $this->testResultMessage = $this->formatTestResultMessage( $this->formatWithColor('fg-yellow', '✘'), - (string) $t + (string) $t, + $time, + true ); } public function addWarning(Test $test, Warning $e, float $time): void { - $this->currentTestResult->fail( + $this->lastTestFailed = true; + $this->testResultMessage = $this->formatTestResultMessage( $this->formatWithColor('fg-yellow', '✘'), - (string) $e + (string) $e, + $time, + true ); } public function addFailure(Test $test, AssertionFailedError $e, float $time): void { - $this->currentTestResult->fail( + $this->lastTestFailed = true; + $this->testResultMessage = $this->formatTestResultMessage( $this->formatWithColor('fg-red', '✘'), - (string) $e + (string) $e, + $time, + true ); } public function addIncompleteTest(Test $test, \Throwable $t, float $time): void { - $this->currentTestResult->fail( + $this->lastTestFailed = true; + $this->testResultMessage = $this->formatTestResultMessage( $this->formatWithColor('fg-yellow', '∅'), (string) $t, - true + $time, + false ); } public function addRiskyTest(Test $test, \Throwable $t, float $time): void { - $this->currentTestResult->fail( + $this->lastTestFailed = true; + $this->testResultMessage = $this->formatTestResultMessage( $this->formatWithColor('fg-yellow', '☢'), (string) $t, - true + $time, + false ); } public function addSkippedTest(Test $test, \Throwable $t, float $time): void { - $this->currentTestResult->fail( + $this->lastTestFailed = true; + $this->testResultMessage = $this->formatTestResultMessage( $this->formatWithColor('fg-yellow', '→'), (string) $t, - true + $time, + false ); } + public function bufferTestResult(Test $test, string $msg): void + { + $this->outputBuffer[$this->testIndex] = [ + 'className' => $this->className, + 'testName' => TestSuiteSorter::getTestSorterUID($test), + 'testMethod' => $this->testMethod, + 'message' => $msg, + 'failed' => $this->lastTestFailed, + 'verbose' => $this->lastFlushedTestWasVerbose, + ]; + } + + public function writeTestResult(string $msg): void + { + $msg = $this->formatTestSuiteHeader($this->lastClassName, $this->className, $msg); + $this->write($msg); + } + public function writeProgress(string $progress): void { } @@ -178,26 +271,159 @@ class CliTestDoxPrinter extends ResultPrinter $this->write("\n" . Timer::resourceUsage() . "\n\n"); } - private function printNonSuccessfulTestsSummary(int $numberOfExecutedTests): void + private function flushOutputBuffer(): void { - $numberOfNonSuccessfulTests = \count($this->nonSuccessfulTestResults); - - if ($numberOfNonSuccessfulTests === 0) { + if ($this->testFlushIndex === $this->testIndex) { return; } - if (($numberOfNonSuccessfulTests / $numberOfExecutedTests) >= 0.7) { + if ($this->testFlushIndex > 0) { + $prevResult = $this->getTestResultByName($this->originalExecutionOrder[$this->testFlushIndex - 1]); + } else { + $prevResult = $this->getEmptyTestResult(); + } + + do { + $flushed = false; + $result = $this->getTestResultByName($this->originalExecutionOrder[$this->testFlushIndex]); + + if (!empty($result)) { + $this->writeBufferTestResult($prevResult, $result); + $this->testFlushIndex++; + $prevResult = $result; + $flushed = true; + } + } while ($flushed && $this->testFlushIndex < $this->testIndex); + } + + private function writeBufferTestResult(array $prevResult, array $result): void + { + // Write spacer line for new suite headers and after verbose messages + if ($prevResult['testName'] !== '' && + ($prevResult['verbose'] === true || $prevResult['className'] !== $result['className'])) { + $this->write("\n"); + } + + // Write suite header + if ($prevResult['className'] !== $result['className']) { + $this->write($result['className'] . "\n"); + } + + // Write the test result itself + $this->write($result['message']); + } + + private function getTestResultByName(string $testName): array + { + foreach ($this->outputBuffer as $result) { + if ($result['testName'] === $testName) { + return $result; + } + } + + return []; + } + + private function formatTestSuiteHeader(?string $lastClassName, string $className, string $msg): string + { + if ($lastClassName === null || $className !== $lastClassName) { + return \sprintf( + "%s%s\n%s", + ($this->lastClassName !== '') ? "\n" : '', + $className, + $msg + ); + } + + return $msg; + } + + private function formatTestResultMessage( + string $symbol, + string $resultMessage, + float $time, + bool $alwaysVerbose = false + ): string { + $additionalInformation = $this->getFormattedAdditionalInformation($resultMessage, $alwaysVerbose); + $msg = \sprintf( + " %s %s%s\n%s", + $symbol, + $this->testMethod, + $this->verbose ? ' ' . $this->getFormattedRuntime($time) : '', + $additionalInformation + ); + + $this->lastFlushedTestWasVerbose = !empty($additionalInformation); + + return $msg; + } + + private function getFormattedRuntime(float $time): string + { + if ($time > 5) { + return $this->formatWithColor('fg-red', \sprintf('[%.2f ms]', $time * 1000)); + } + + if ($time > 1) { + return $this->formatWithColor('fg-yellow', \sprintf('[%.2f ms]', $time * 1000)); + } + + return \sprintf('[%.2f ms]', $time * 1000); + } + + private function getFormattedAdditionalInformation(string $resultMessage, bool $verbose): string + { + if ($resultMessage === '') { + return ''; + } + + if (!($this->verbose || $verbose)) { + return ''; + } + + return \sprintf( + " │\n%s\n", + \implode( + "\n", + \array_map( + function (string $text) { + return \sprintf(' │ %s', $text); + }, + \explode("\n", $resultMessage) + ) + ) + ); + } + + private function printNonSuccessfulTestsSummary(int $numberOfExecutedTests): void + { + if (empty($this->nonSuccessfulTestResults)) { + return; + } + + if ((\count($this->nonSuccessfulTestResults) / $numberOfExecutedTests) >= 0.7) { return; } $this->write("Summary of non-successful tests:\n\n"); - $previousTestResult = null; + $prevResult = $this->getEmptyTestResult(); - foreach ($this->nonSuccessfulTestResults as $testResult) { - $this->write($testResult->toString($previousTestResult, $this->verbose)); - - $previousTestResult = $testResult; + foreach ($this->nonSuccessfulTestResults as $testIndex) { + $result = $this->outputBuffer[$testIndex]; + $this->writeBufferTestResult($prevResult, $result); + $prevResult = $result; } } + + private function getEmptyTestResult(): array + { + return [ + 'className' => '', + 'testName' => '', + 'message' => '', + 'failed' => '', + 'verbose' => '', + ]; + } } diff --git a/vendor/phpunit/phpunit/src/Util/TestDox/NamePrettifier.php b/vendor/phpunit/phpunit/src/Util/TestDox/NamePrettifier.php index 3cf85af02..fc5a1fe4a 100644 --- a/vendor/phpunit/phpunit/src/Util/TestDox/NamePrettifier.php +++ b/vendor/phpunit/phpunit/src/Util/TestDox/NamePrettifier.php @@ -63,20 +63,19 @@ final class NamePrettifier $annotations = $test->getAnnotations(); $annotationWithPlaceholders = false; + $callback = static function (string $variable): string { + return \sprintf('/%s(?=\b)/', \preg_quote($variable, '/')); + }; + if (isset($annotations['method']['testdox'][0])) { $result = $annotations['method']['testdox'][0]; if (\strpos($result, '$') !== false) { $annotation = $annotations['method']['testdox'][0]; $providedData = $this->mapTestMethodParameterNamesToProvidedDataValues($test); + $variables = \array_map($callback, \array_keys($providedData)); - $result = \trim( - \str_replace( - \array_keys($providedData), - $providedData, - $annotation - ) - ); + $result = \trim(\preg_replace($variables, $providedData, $annotation)); $annotationWithPlaceholders = true; } @@ -85,7 +84,7 @@ final class NamePrettifier } if ($test->usesDataProvider() && !$annotationWithPlaceholders) { - $result .= ' data set "' . $test->dataDescription() . '"'; + $result .= $test->getDataSetAsString(false); } return $result; @@ -158,11 +157,15 @@ final class NamePrettifier { $reflector = new \ReflectionMethod(\get_class($test), $test->getName(false)); $providedData = []; - $providedDataValues = $test->getProvidedData(); + $providedDataValues = \array_values($test->getProvidedData()); $i = 0; foreach ($reflector->getParameters() as $parameter) { - $value = $providedDataValues[$i++]; + if (!\array_key_exists($i, $providedDataValues) && $parameter->isDefaultValueAvailable()) { + $providedDataValues[$i] = $parameter->getDefaultValue(); + } + + $value = $providedDataValues[$i++] ?? null; if (\is_object($value)) { $reflector = new \ReflectionObject($value); @@ -176,7 +179,7 @@ final class NamePrettifier $value = \gettype($value); } - if (\is_bool($value) || \is_numeric($value)) { + if (\is_bool($value) || \is_int($value) || \is_float($value)) { $exporter = new Exporter; $value = $exporter->export($value); diff --git a/vendor/phpunit/phpunit/src/Util/TestResultCache.php b/vendor/phpunit/phpunit/src/Util/TestResultCache.php index e711e5b6d..8cb290091 100644 --- a/vendor/phpunit/phpunit/src/Util/TestResultCache.php +++ b/vendor/phpunit/phpunit/src/Util/TestResultCache.php @@ -9,6 +9,8 @@ */ namespace PHPUnit\Runner; +use PHPUnit\Framework\Test; + class TestResultCache implements \Serializable, TestResultCacheInterface { /** @@ -77,6 +79,15 @@ class TestResultCache implements \Serializable, TestResultCacheInterface return; } + if (!$this->createDirectory(\dirname($this->cacheFilename))) { + throw new Exception( + \sprintf( + 'Cannot create directory "%s" for result cache file', + $this->cacheFilename + ) + ); + } + \file_put_contents( $this->cacheFilename, \serialize($this) @@ -176,4 +187,9 @@ class TestResultCache implements \Serializable, TestResultCacheInterface } } } + + private function createDirectory(string $directory): bool + { + return !(!\is_dir($directory) && !@\mkdir($directory, 0777, true) && !\is_dir($directory)); + } } diff --git a/vendor/phpunit/phpunit/tests/_files/CountConstraint.php b/vendor/phpunit/phpunit/tests/_files/CountConstraint.php index a0abea911..8262e4432 100644 --- a/vendor/phpunit/phpunit/tests/_files/CountConstraint.php +++ b/vendor/phpunit/phpunit/tests/_files/CountConstraint.php @@ -18,7 +18,7 @@ final class CountConstraint extends Constraint public static function fromCount(int $count): self { - $instance = new self(); + $instance = new self; $instance->count = $count; diff --git a/vendor/phpunit/phpunit/tests/_files/DataProviderDebugTest.php b/vendor/phpunit/phpunit/tests/_files/DataProviderDebugTest.php index 720f8993a..de14779be 100644 --- a/vendor/phpunit/phpunit/tests/_files/DataProviderDebugTest.php +++ b/vendor/phpunit/phpunit/tests/_files/DataProviderDebugTest.php @@ -13,12 +13,12 @@ class DataProviderDebugTest extends TestCase { public static function provider() { - $obj2 = new \stdClass(); + $obj2 = new \stdClass; $obj2->foo = 'bar'; $obj3 = (object) [1, 2, "Test\r\n", 4, 5, 6, 7, 8]; - $obj = new \stdClass(); + $obj = new \stdClass; //@codingStandardsIgnoreStart $obj->null = null; //@codingStandardsIgnoreEnd @@ -32,7 +32,7 @@ class DataProviderDebugTest extends TestCase $obj->array = ['foo' => 'bar']; $obj->self = $obj; - $storage = new \SplObjectStorage(); + $storage = new \SplObjectStorage; $storage->attach($obj2); $storage->foo = $obj; @@ -42,7 +42,7 @@ class DataProviderDebugTest extends TestCase [[[1, 2, 3], [3, 4, 5]]], // \n\r and \r is converted to \n ["this\nis\na\nvery\nvery\nvery\nvery\nvery\nvery\rlong\n\rtext"], - [new \stdClass(), $obj, [], $storage, $obj3], + [new \stdClass, $obj, [], $storage, $obj3], [\chr(0) . \chr(1) . \chr(2) . \chr(3) . \chr(4) . \chr(5), \implode('', \array_map('chr', \range(0x0e, 0x1f)))], [\chr(0x00) . \chr(0x09)], ]; diff --git a/vendor/phpunit/phpunit/tests/_files/DataProviderIssue2833/SecondTest.php b/vendor/phpunit/phpunit/tests/_files/DataProviderIssue2833/SecondTest.php index bbe2d10cf..8fa706cc6 100644 --- a/vendor/phpunit/phpunit/tests/_files/DataProviderIssue2833/SecondTest.php +++ b/vendor/phpunit/phpunit/tests/_files/DataProviderIssue2833/SecondTest.php @@ -13,7 +13,7 @@ use PHPUnit\Framework\TestCase; class SecondTest extends TestCase { - const DUMMY = 'dummy'; + public const DUMMY = 'dummy'; public function testSecond(): void { diff --git a/vendor/phpunit/phpunit/tests/_files/DataProviderIssue2922/FirstTest.php b/vendor/phpunit/phpunit/tests/_files/DataProviderIssue2922/FirstTest.php index 019418c87..fe6202e2c 100644 --- a/vendor/phpunit/phpunit/tests/_files/DataProviderIssue2922/FirstTest.php +++ b/vendor/phpunit/phpunit/tests/_files/DataProviderIssue2922/FirstTest.php @@ -26,6 +26,6 @@ class FirstTest extends TestCase public function provide(): void { - throw new \Exception(); + throw new \Exception; } } diff --git a/vendor/phpunit/phpunit/tests/_files/DataProviderTestDoxTest.php b/vendor/phpunit/phpunit/tests/_files/DataProviderTestDoxTest.php index ed61ae2bf..72515b251 100644 --- a/vendor/phpunit/phpunit/tests/_files/DataProviderTestDoxTest.php +++ b/vendor/phpunit/phpunit/tests/_files/DataProviderTestDoxTest.php @@ -13,7 +13,7 @@ class DataProviderTestDoxTest extends TestCase { /** * @dataProvider provider - * @testdox Does something with + * @testdox Does something */ public function testOne(): void { @@ -23,7 +23,15 @@ class DataProviderTestDoxTest extends TestCase /** * @dataProvider provider */ - public function testDoesSomethingElseWith(): void + public function testDoesSomethingElse(): void + { + $this->assertTrue(true); + } + + /** + * @dataProvider providerWithIndexedArray + */ + public function testWithProviderWithIndexedArray($value): void { $this->assertTrue(true); } @@ -45,6 +53,14 @@ class DataProviderTestDoxTest extends TestCase ]; } + public function providerWithIndexedArray() + { + return [ + ['first'], + ['second'], + ]; + } + public function placeHolderprovider(): array { return [ diff --git a/vendor/phpunit/phpunit/tests/_files/DataproviderExecutionOrderTest.php b/vendor/phpunit/phpunit/tests/_files/DataproviderExecutionOrderTest.php new file mode 100644 index 000000000..b920d7171 --- /dev/null +++ b/vendor/phpunit/phpunit/tests/_files/DataproviderExecutionOrderTest.php @@ -0,0 +1,48 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +use PHPUnit\Framework\TestCase; + +class DataproviderExecutionOrderTest extends TestCase +{ + public function testFirstTestThatAlwaysWorks() + { + $this->assertTrue(true); + } + + /** + * @dataProvider dataproviderAdditions + */ + public function testAddNumbersWithADataprovider(int $a, int $b, int $sum) + { + $this->assertSame($sum, $a + $b); + } + + public function testTestInTheMiddleThatAlwaysWorks() + { + $this->assertTrue(true); + } + + /** + * @dataProvider dataproviderAdditions + */ + public function testAddMoreNumbersWithADataprovider(int $a, int $b, int $sum) + { + $this->assertSame($sum, $a + $b); + } + + public function dataproviderAdditions() + { + return [ + '1+2=3' => [1, 2, 3], + '2+1=3' => [2, 1, 3], + '1+1=3' => [1, 1, 3], + ]; + } +} diff --git a/vendor/phpunit/phpunit/tests/_files/DataproviderExecutionOrderTest_result_cache.txt b/vendor/phpunit/phpunit/tests/_files/DataproviderExecutionOrderTest_result_cache.txt new file mode 100644 index 000000000..516a9eb64 --- /dev/null +++ b/vendor/phpunit/phpunit/tests/_files/DataproviderExecutionOrderTest_result_cache.txt @@ -0,0 +1 @@ +C:30:"PHPUnit\Runner\TestResultCache":2119:{a:2:{s:7:"defects";a:5:{s:60:"tests/end-to-end/regression/GitHub/3396/issue-3396-test.phpt";i:3;s:88:"MultiDependencyExecutionOrderTest::testAddNumbersWithADataprovider with data set "1+1=3"";i:3;s:92:"MultiDependencyExecutionOrderTest::testAddMoreNumbersWithADataprovider with data set "1+1=3"";i:3;s:85:"DataproviderExecutionOrderTest::testAddNumbersWithADataprovider with data set "1+1=3"";i:3;s:89:"DataproviderExecutionOrderTest::testAddMoreNumbersWithADataprovider with data set "1+1=3"";i:3;}s:5:"times";a:17:{s:60:"tests/end-to-end/regression/GitHub/3396/issue-3396-test.phpt";d:0.115;s:63:"MultiDependencyExecutionOrderTest::testFirstTestThatAlwaysWorks";d:0;s:88:"MultiDependencyExecutionOrderTest::testAddNumbersWithADataprovider with data set "1+2=3"";d:0;s:88:"MultiDependencyExecutionOrderTest::testAddNumbersWithADataprovider with data set "2+1=3"";d:0;s:88:"MultiDependencyExecutionOrderTest::testAddNumbersWithADataprovider with data set "1+1=3"";d:0.003;s:69:"MultiDependencyExecutionOrderTest::testTestInTheMiddleThatAlwaysWorks";d:0;s:92:"MultiDependencyExecutionOrderTest::testAddMoreNumbersWithADataprovider with data set "1+2=3"";d:0;s:92:"MultiDependencyExecutionOrderTest::testAddMoreNumbersWithADataprovider with data set "2+1=3"";d:0;s:92:"MultiDependencyExecutionOrderTest::testAddMoreNumbersWithADataprovider with data set "1+1=3"";d:0;s:60:"DataproviderExecutionOrderTest::testFirstTestThatAlwaysWorks";d:0.002;s:85:"DataproviderExecutionOrderTest::testAddNumbersWithADataprovider with data set "1+2=3"";d:0;s:85:"DataproviderExecutionOrderTest::testAddNumbersWithADataprovider with data set "2+1=3"";d:0;s:85:"DataproviderExecutionOrderTest::testAddNumbersWithADataprovider with data set "1+1=3"";d:0.001;s:66:"DataproviderExecutionOrderTest::testTestInTheMiddleThatAlwaysWorks";d:0;s:89:"DataproviderExecutionOrderTest::testAddMoreNumbersWithADataprovider with data set "1+2=3"";d:0;s:89:"DataproviderExecutionOrderTest::testAddMoreNumbersWithADataprovider with data set "2+1=3"";d:0;s:89:"DataproviderExecutionOrderTest::testAddMoreNumbersWithADataprovider with data set "1+1=3"";d:0;}}} \ No newline at end of file diff --git a/vendor/phpunit/phpunit/tests/_files/ExceptionNamespaceTest.php b/vendor/phpunit/phpunit/tests/_files/ExceptionNamespaceTest.php index 7713a5d85..88a7d2f31 100644 --- a/vendor/phpunit/phpunit/tests/_files/ExceptionNamespaceTest.php +++ b/vendor/phpunit/phpunit/tests/_files/ExceptionNamespaceTest.php @@ -16,14 +16,14 @@ class ExceptionNamespaceTest extends \PHPUnit\Framework\TestCase * * @var string */ - const ERROR_MESSAGE = 'Exception namespace message'; + public const ERROR_MESSAGE = 'Exception namespace message'; /** * Exception code * * @var int */ - const ERROR_CODE = 200; + public const ERROR_CODE = 200; /** * @expectedException Class diff --git a/vendor/phpunit/phpunit/tests/_files/ExceptionTest.php b/vendor/phpunit/phpunit/tests/_files/ExceptionTest.php index 47855f1ef..244a53c28 100644 --- a/vendor/phpunit/phpunit/tests/_files/ExceptionTest.php +++ b/vendor/phpunit/phpunit/tests/_files/ExceptionTest.php @@ -16,21 +16,21 @@ class ExceptionTest extends TestCase * * @var string */ - const ERROR_MESSAGE = 'Exception message'; + public const ERROR_MESSAGE = 'Exception message'; /** * Exception message * * @var string */ - const ERROR_MESSAGE_REGEX = '#regex#'; + public const ERROR_MESSAGE_REGEX = '#regex#'; /** * Exception code * * @var int */ - const ERROR_CODE = 500; + public const ERROR_CODE = 500; /** * @expectedException FooBarBaz diff --git a/vendor/phpunit/phpunit/tests/_files/IgnoreCodeCoverageClassTest.php b/vendor/phpunit/phpunit/tests/_files/IgnoreCodeCoverageClassTest.php index 73cc027b6..d14fea2af 100644 --- a/vendor/phpunit/phpunit/tests/_files/IgnoreCodeCoverageClassTest.php +++ b/vendor/phpunit/phpunit/tests/_files/IgnoreCodeCoverageClassTest.php @@ -13,13 +13,13 @@ class IgnoreCodeCoverageClassTest extends TestCase { public function testReturnTrue(): void { - $sut = new IgnoreCodeCoverageClass(); + $sut = new IgnoreCodeCoverageClass; $this->assertTrue($sut->returnTrue()); } public function testReturnFalse(): void { - $sut = new IgnoreCodeCoverageClass(); + $sut = new IgnoreCodeCoverageClass; $this->assertFalse($sut->returnFalse()); } } diff --git a/vendor/phpunit/phpunit/tests/_files/MultiDependencyTest_result_cache.txt b/vendor/phpunit/phpunit/tests/_files/MultiDependencyTest_result_cache.txt index 61378e255..2b0bb9629 100644 --- a/vendor/phpunit/phpunit/tests/_files/MultiDependencyTest_result_cache.txt +++ b/vendor/phpunit/phpunit/tests/_files/MultiDependencyTest_result_cache.txt @@ -1 +1 @@ -C:30:"PHPUnit\Runner\TestResultCache":157:{a:2:{s:7:"defects";a:1:{s:8:"testFive";i:1;}s:5:"times";a:5:{s:7:"testOne";d:0;s:7:"testTwo";d:0;s:9:"testThree";d:0;s:8:"testFour";d:0;s:8:"testFive";d:0;}}} \ No newline at end of file +C:30:"PHPUnit\Runner\TestResultCache":289:{a:2:{s:7:"defects";a:1:{s:29:"MultiDependencyTest::testFive";i:1;}s:5:"times";a:5:{s:28:"MultiDependencyTest::testOne";d:0;s:28:"MultiDependencyTest::testTwo";d:0;s:30:"MultiDependencyTest::testThree";d:0;s:29:"MultiDependencyTest::testFour";d:0;s:29:"MultiDependencyTest::testFive";d:0;}}} \ No newline at end of file diff --git a/vendor/phpunit/phpunit/tests/_files/MyTestListener.php b/vendor/phpunit/phpunit/tests/_files/MyTestListener.php new file mode 100644 index 000000000..7e8e17d7f --- /dev/null +++ b/vendor/phpunit/phpunit/tests/_files/MyTestListener.php @@ -0,0 +1,121 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +use PHPUnit\Framework\AssertionFailedError; +use PHPUnit\Framework\Test; +use PHPUnit\Framework\TestListener; +use PHPUnit\Framework\TestSuite; +use PHPUnit\Framework\Warning; + +final class MyTestListener implements TestListener +{ + private $endCount = 0; + + private $errorCount = 0; + + private $failureCount = 0; + + private $warningCount = 0; + + private $notImplementedCount = 0; + + private $riskyCount = 0; + + private $skippedCount = 0; + + private $startCount = 0; + + public function addError(Test $test, \Throwable $t, float $time): void + { + $this->errorCount++; + } + + public function addWarning(Test $test, Warning $e, float $time): void + { + $this->warningCount++; + } + + public function addFailure(Test $test, AssertionFailedError $e, float $time): void + { + $this->failureCount++; + } + + public function addIncompleteTest(Test $test, \Throwable $t, float $time): void + { + $this->notImplementedCount++; + } + + public function addRiskyTest(Test $test, \Throwable $t, float $time): void + { + $this->riskyCount++; + } + + public function addSkippedTest(Test $test, \Throwable $t, float $time): void + { + $this->skippedCount++; + } + + public function startTestSuite(TestSuite $suite): void + { + } + + public function endTestSuite(TestSuite $suite): void + { + } + + public function startTest(Test $test): void + { + $this->startCount++; + } + + public function endTest(Test $test, float $time): void + { + $this->endCount++; + } + + public function endCount(): int + { + return $this->endCount; + } + + public function errorCount(): int + { + return $this->errorCount; + } + + public function failureCount(): int + { + return $this->failureCount; + } + + public function warningCount(): int + { + return $this->warningCount; + } + + public function notImplementedCount(): int + { + return $this->notImplementedCount; + } + + public function riskyCount(): int + { + return $this->riskyCount; + } + + public function skippedCount(): int + { + return $this->skippedCount; + } + + public function startCount(): int + { + return $this->startCount; + } +} diff --git a/vendor/phpunit/phpunit/tests/_files/NamedConstraint.php b/vendor/phpunit/phpunit/tests/_files/NamedConstraint.php index 4916cd79b..4cf5b3ab1 100644 --- a/vendor/phpunit/phpunit/tests/_files/NamedConstraint.php +++ b/vendor/phpunit/phpunit/tests/_files/NamedConstraint.php @@ -18,7 +18,7 @@ final class NamedConstraint extends Constraint public static function fromName(string $name): self { - $instance = new self(); + $instance = new self; $instance->name = $name; diff --git a/vendor/phpunit/phpunit/tests/_files/NotSelfDescribingTest.php b/vendor/phpunit/phpunit/tests/_files/NotSelfDescribingTest.php new file mode 100644 index 000000000..4ac5999b0 --- /dev/null +++ b/vendor/phpunit/phpunit/tests/_files/NotSelfDescribingTest.php @@ -0,0 +1,29 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +use PHPUnit\Framework\Test; +use PHPUnit\Framework\TestResult; + +class NotSelfDescribingTest implements Test +{ + public function log($msg): void + { + print $msg; + } + + public function count(): int + { + return 0; + } + + public function run(TestResult $result = null): TestResult + { + return new TestResult(); + } +} diff --git a/vendor/phpunit/phpunit/tests/_files/TestWarning.php b/vendor/phpunit/phpunit/tests/_files/TestWarning.php index 22dd01b4f..337a6d8ea 100644 --- a/vendor/phpunit/phpunit/tests/_files/TestWarning.php +++ b/vendor/phpunit/phpunit/tests/_files/TestWarning.php @@ -8,11 +8,12 @@ * file that was distributed with this source code. */ use PHPUnit\Framework\TestCase; +use PHPUnit\Framework\Warning; class TestWarning extends TestCase { protected function runTest(): void { - throw new \PHPUnit\Framework\Warning(); + throw new Warning; } } diff --git a/vendor/phpunit/phpunit/tests/bootstrap.php b/vendor/phpunit/phpunit/tests/bootstrap.php index 22639815a..f10c55de0 100644 --- a/vendor/phpunit/phpunit/tests/bootstrap.php +++ b/vendor/phpunit/phpunit/tests/bootstrap.php @@ -39,6 +39,8 @@ require_once TEST_FILES_PATH . 'NoTestCases.php'; require_once TEST_FILES_PATH . 'NotPublicTestCase.php'; +require_once TEST_FILES_PATH . 'NotSelfDescribingTest.php'; + require_once TEST_FILES_PATH . 'NotVoidTestCase.php'; require_once TEST_FILES_PATH . 'OverrideTestCase.php'; diff --git a/vendor/phpunit/phpunit/tests/end-to-end/_files/Extension.php b/vendor/phpunit/phpunit/tests/end-to-end/_files/Extension.php index ea0f70708..9b215d6ed 100644 --- a/vendor/phpunit/phpunit/tests/end-to-end/_files/Extension.php +++ b/vendor/phpunit/phpunit/tests/end-to-end/_files/Extension.php @@ -16,11 +16,12 @@ use PHPUnit\Runner\AfterSkippedTestHook; use PHPUnit\Runner\AfterSuccessfulTestHook; use PHPUnit\Runner\AfterTestErrorHook; use PHPUnit\Runner\AfterTestFailureHook; +use PHPUnit\Runner\AfterTestHook; use PHPUnit\Runner\AfterTestWarningHook; use PHPUnit\Runner\BeforeFirstTestHook; use PHPUnit\Runner\BeforeTestHook; -final class Extension implements BeforeFirstTestHook, BeforeTestHook, AfterSuccessfulTestHook, AfterSkippedTestHook, AfterRiskyTestHook, AfterIncompleteTestHook, AfterTestErrorHook, AfterTestWarningHook, AfterTestFailureHook, AfterLastTestHook +final class Extension implements BeforeFirstTestHook, BeforeTestHook, AfterTestHook, AfterSuccessfulTestHook, AfterSkippedTestHook, AfterRiskyTestHook, AfterIncompleteTestHook, AfterTestErrorHook, AfterTestWarningHook, AfterTestFailureHook, AfterLastTestHook { private $amountOfInjectedArguments = 0; @@ -45,6 +46,11 @@ final class Extension implements BeforeFirstTestHook, BeforeTestHook, AfterSucce print __METHOD__ . ': ' . $test . \PHP_EOL; } + public function executeAfterTest(string $test, float $time): void + { + print __METHOD__ . ': ' . $test . \PHP_EOL; + } + public function executeAfterSuccessfulTest(string $test, float $time): void { print __METHOD__ . ': ' . $test . \PHP_EOL; diff --git a/vendor/phpunit/phpunit/tests/end-to-end/cache-result.phpt b/vendor/phpunit/phpunit/tests/end-to-end/cache-result.phpt index 55320c82b..222f19edf 100644 --- a/vendor/phpunit/phpunit/tests/end-to-end/cache-result.phpt +++ b/vendor/phpunit/phpunit/tests/end-to-end/cache-result.phpt @@ -26,4 +26,4 @@ Time: %s, Memory: %s OK, but incomplete, skipped, or risky tests! Tests: 5, Assertions: 3, Skipped: 2. -C:30:"PHPUnit\Runner\TestResultCache":%d:{a:2:{s:7:"defects";a:2:{s:8:"testFour";i:1;s:9:"testThree";i:1;}s:5:"times";a:5:{s:8:"testFive";d:%f;s:8:"testFour";d:%f;s:9:"testThree";d:%f;s:7:"testTwo";d:%f;s:7:"testOne";d:%f;}}} +C:30:"PHPUnit\Runner\TestResultCache":%d:{a:2:{s:7:"defects";a:2:{s:29:"MultiDependencyTest::testFour";i:1;s:30:"MultiDependencyTest::testThree";i:1;}s:5:"times";a:5:{s:29:"MultiDependencyTest::testFive";d:%f;s:29:"MultiDependencyTest::testFour";d:%f;s:30:"MultiDependencyTest::testThree";d:%f;s:28:"MultiDependencyTest::testTwo";d:%f;s:28:"MultiDependencyTest::testOne";d:%f;}}} diff --git a/vendor/phpunit/phpunit/tests/end-to-end/dataprovider-testdox.phpt b/vendor/phpunit/phpunit/tests/end-to-end/dataprovider-testdox.phpt index 8de7184c8..3eeefc565 100644 --- a/vendor/phpunit/phpunit/tests/end-to-end/dataprovider-testdox.phpt +++ b/vendor/phpunit/phpunit/tests/end-to-end/dataprovider-testdox.phpt @@ -17,6 +17,8 @@ DataProviderTestDox ✔ Does something with data set "two" ✔ Does something else with data set "one" ✔ Does something else with data set "two" + ✔ With provider with indexed array with data set #0 + ✔ With provider with indexed array with data set #1 ✔ ... true ... ✔ ... 1 ... ✔ ... 1.0 ... @@ -29,4 +31,4 @@ DataProviderTestDox Time: %s, Memory: %s -OK (13 tests, 13 assertions) +OK (15 tests, 15 assertions) diff --git a/vendor/phpunit/phpunit/tests/end-to-end/help.phpt b/vendor/phpunit/phpunit/tests/end-to-end/help.phpt index fbf58aac4..fb069f0e4 100644 --- a/vendor/phpunit/phpunit/tests/end-to-end/help.phpt +++ b/vendor/phpunit/phpunit/tests/end-to-end/help.phpt @@ -103,7 +103,7 @@ Configuration Options: --include-path Prepend PHP's include_path with given path(s) -d key[=value] Sets a php.ini value --generate-configuration Generate configuration file with suggested settings - --cache-result-file== Specify result cache path and filename + --cache-result-file= Specify result cache path and filename Miscellaneous Options: diff --git a/vendor/phpunit/phpunit/tests/end-to-end/help2.phpt b/vendor/phpunit/phpunit/tests/end-to-end/help2.phpt index 1852d1659..b0c6ecb9e 100644 --- a/vendor/phpunit/phpunit/tests/end-to-end/help2.phpt +++ b/vendor/phpunit/phpunit/tests/end-to-end/help2.phpt @@ -104,7 +104,7 @@ Configuration Options: --include-path Prepend PHP's include_path with given path(s) -d key[=value] Sets a php.ini value --generate-configuration Generate configuration file with suggested settings - --cache-result-file== Specify result cache path and filename + --cache-result-file= Specify result cache path and filename Miscellaneous Options: diff --git a/vendor/phpunit/phpunit/tests/end-to-end/hooks.phpt b/vendor/phpunit/phpunit/tests/end-to-end/hooks.phpt index f54f7b33b..731e9c65f 100644 --- a/vendor/phpunit/phpunit/tests/end-to-end/hooks.phpt +++ b/vendor/phpunit/phpunit/tests/end-to-end/hooks.phpt @@ -16,16 +16,23 @@ PHPUnit\Test\Extension::tellAmountOfInjectedArguments: %d PHPUnit\Test\Extension::executeBeforeFirstTest PHPUnit\Test\Extension::executeBeforeTest: PHPUnit\Test\HookTest::testSuccess PHPUnit\Test\Extension::executeAfterSuccessfulTest: PHPUnit\Test\HookTest::testSuccess +PHPUnit\Test\Extension::executeAfterTest: PHPUnit\Test\HookTest::testSuccess PHPUnit\Test\Extension::executeBeforeTest: PHPUnit\Test\HookTest::testFailure PHPUnit\Test\Extension::executeAfterTestFailure: PHPUnit\Test\HookTest::testFailure: Failed asserting that false is true. +PHPUnit\Test\Extension::executeAfterTest: PHPUnit\Test\HookTest::testFailure PHPUnit\Test\Extension::executeBeforeTest: PHPUnit\Test\HookTest::testError PHPUnit\Test\Extension::executeAfterTestError: PHPUnit\Test\HookTest::testError: message +PHPUnit\Test\Extension::executeAfterTest: PHPUnit\Test\HookTest::testError PHPUnit\Test\Extension::executeBeforeTest: PHPUnit\Test\HookTest::testIncomplete PHPUnit\Test\Extension::executeAfterIncompleteTest: PHPUnit\Test\HookTest::testIncomplete: message +PHPUnit\Test\Extension::executeAfterTest: PHPUnit\Test\HookTest::testIncomplete PHPUnit\Test\Extension::executeBeforeTest: PHPUnit\Test\HookTest::testRisky PHPUnit\Test\Extension::executeAfterRiskyTest: PHPUnit\Test\HookTest::testRisky: message +PHPUnit\Test\Extension::executeAfterTest: PHPUnit\Test\HookTest::testRisky PHPUnit\Test\Extension::executeBeforeTest: PHPUnit\Test\HookTest::testSkipped PHPUnit\Test\Extension::executeAfterSkippedTest: PHPUnit\Test\HookTest::testSkipped: message +PHPUnit\Test\Extension::executeAfterTest: PHPUnit\Test\HookTest::testSkipped PHPUnit\Test\Extension::executeBeforeTest: PHPUnit\Test\HookTest::testWarning PHPUnit\Test\Extension::executeAfterTestWarning: PHPUnit\Test\HookTest::testWarning: message +PHPUnit\Test\Extension::executeAfterTest: PHPUnit\Test\HookTest::testWarning PHPUnit\Test\Extension::executeAfterLastTest diff --git a/vendor/phpunit/phpunit/tests/end-to-end/log-junit-phpt.phpt b/vendor/phpunit/phpunit/tests/end-to-end/log-junit-phpt.phpt new file mode 100644 index 000000000..d3310dd54 --- /dev/null +++ b/vendor/phpunit/phpunit/tests/end-to-end/log-junit-phpt.phpt @@ -0,0 +1,28 @@ +--TEST-- +phpunit --log-junit php://stdout ../end-to-end/phpt-stderr.phpt +--FILE-- + +--EXPECTF-- +PHPUnit %s by Sebastian Bergmann and contributors. + +. 1 / 1 (100%) + + + + PHPUnit must look at STDERR when running PHPT tests. + + + + + +Time: %s, Memory: %s + +OK (1 test, 1 assertion) diff --git a/vendor/phpunit/phpunit/tests/end-to-end/log-teamcity-phpt.phpt b/vendor/phpunit/phpunit/tests/end-to-end/log-teamcity-phpt.phpt new file mode 100644 index 000000000..70fa1fa97 --- /dev/null +++ b/vendor/phpunit/phpunit/tests/end-to-end/log-teamcity-phpt.phpt @@ -0,0 +1,25 @@ +--TEST-- +phpunit --log-teamcity php://stdout ../end-to-end/phpt-stderr.phpt +--FILE-- +instance = new ChildProcessClass1351(); + $this->instance = new ChildProcessClass1351; $this->assertFalse(true, 'Expected failure.'); } @@ -33,7 +33,7 @@ class Issue1351Test extends TestCase */ public function testExceptionPre(): void { - $this->instance = new ChildProcessClass1351(); + $this->instance = new ChildProcessClass1351; try { throw new LogicException('Expected exception.'); diff --git a/vendor/phpunit/phpunit/tests/end-to-end/regression/GitHub/2137/Issue2137Test.php b/vendor/phpunit/phpunit/tests/end-to-end/regression/GitHub/2137/Issue2137Test.php index 21e51442d..617e66f68 100644 --- a/vendor/phpunit/phpunit/tests/end-to-end/regression/GitHub/2137/Issue2137Test.php +++ b/vendor/phpunit/phpunit/tests/end-to-end/regression/GitHub/2137/Issue2137Test.php @@ -25,7 +25,7 @@ class Issue2137Test extends PHPUnit\Framework\TestCase { return [ //[true, true] - new stdClass(), // not valid + new stdClass, // not valid ]; } diff --git a/vendor/phpunit/phpunit/tests/end-to-end/regression/GitHub/2145.phpt b/vendor/phpunit/phpunit/tests/end-to-end/regression/GitHub/2145.phpt index 477acce90..862b70962 100644 --- a/vendor/phpunit/phpunit/tests/end-to-end/regression/GitHub/2145.phpt +++ b/vendor/phpunit/phpunit/tests/end-to-end/regression/GitHub/2145.phpt @@ -20,8 +20,8 @@ Time: %s, Memory: %s There was 1 error: -1) Issue2145Test +1) Issue2145Test::testOne Exception in %s%eIssue2145Test.php:%d %A ERRORS! -Tests: 2, Assertions: 0, Errors: 1. +Tests: 1, Assertions: 0, Errors: 1. diff --git a/vendor/phpunit/phpunit/tests/end-to-end/regression/GitHub/2591-separate-function-no-preserve-no-bootstrap-xdebug.phpt b/vendor/phpunit/phpunit/tests/end-to-end/regression/GitHub/2591-separate-function-no-preserve-no-bootstrap-xdebug.phpt index 0003ff256..866f10f23 100644 --- a/vendor/phpunit/phpunit/tests/end-to-end/regression/GitHub/2591-separate-function-no-preserve-no-bootstrap-xdebug.phpt +++ b/vendor/phpunit/phpunit/tests/end-to-end/regression/GitHub/2591-separate-function-no-preserve-no-bootstrap-xdebug.phpt @@ -5,6 +5,8 @@ Expected result is to have an error, because of no classes loaded. =')) { + print 'skip: PHP < 7.3 required'; } --FILE-- assertStringEndsWith('/', '/'); - return new stdClass(); + return new stdClass; } public function dataSelectOperatorsProvider(): array diff --git a/vendor/phpunit/phpunit/tests/end-to-end/regression/GitHub/3364/issue-3364-test.phpt b/vendor/phpunit/phpunit/tests/end-to-end/regression/GitHub/3364/issue-3364-test.phpt new file mode 100644 index 000000000..89881ee31 --- /dev/null +++ b/vendor/phpunit/phpunit/tests/end-to-end/regression/GitHub/3364/issue-3364-test.phpt @@ -0,0 +1,58 @@ +--TEST-- +https://github.com/sebastianbergmann/phpunit/issues/3364 +--FILE-- + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use PHPUnit\Framework\TestCase; + +class Issue3364SetupBeforeClassTest extends TestCase +{ + public static function setUpBeforeClass(): void + { + throw new \RuntimeException('throw exception in setUpBeforeClass'); + } + + public function testOneWithClassSetupException(): void + { + $this->fail(); + } + + public function testTwoWithClassSetupException(): void + { + $this->fail(); + } +} diff --git a/vendor/phpunit/phpunit/tests/end-to-end/regression/GitHub/3364/tests/Issue3364SetupTest.php b/vendor/phpunit/phpunit/tests/end-to-end/regression/GitHub/3364/tests/Issue3364SetupTest.php new file mode 100644 index 000000000..da89f4424 --- /dev/null +++ b/vendor/phpunit/phpunit/tests/end-to-end/regression/GitHub/3364/tests/Issue3364SetupTest.php @@ -0,0 +1,30 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use PHPUnit\Framework\TestCase; + +class Issue3364SetupTest extends TestCase +{ + public function setUp(): void + { + throw new \RuntimeException('throw exception in setUp'); + } + + public function testOneWithSetupException(): void + { + $this->fail(); + } + + public function testTwoWithSetupException(): void + { + $this->fail(); + } +} diff --git a/vendor/phpunit/phpunit/tests/end-to-end/regression/GitHub/3379.phpt b/vendor/phpunit/phpunit/tests/end-to-end/regression/GitHub/3379.phpt new file mode 100644 index 000000000..6808142b4 --- /dev/null +++ b/vendor/phpunit/phpunit/tests/end-to-end/regression/GitHub/3379.phpt @@ -0,0 +1,20 @@ +--TEST-- +GH-3379: Dependent test of skipped test has status -1 +--FILE-- + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace Test; + +use PHPUnit\Framework\TestCase; + +class Issue3379Test extends TestCase +{ + public function testOne(): void + { + $this->markTestSkipped(); + } + + /** + * @depends testOne + */ + public function testTwo(): void + { + $this->assertTrue(true); + } +} diff --git a/vendor/phpunit/phpunit/tests/end-to-end/regression/GitHub/3379/Issue3379TestListener.php b/vendor/phpunit/phpunit/tests/end-to-end/regression/GitHub/3379/Issue3379TestListener.php new file mode 100644 index 000000000..b4206deff --- /dev/null +++ b/vendor/phpunit/phpunit/tests/end-to-end/regression/GitHub/3379/Issue3379TestListener.php @@ -0,0 +1,26 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use PHPUnit\Framework\Test; +use PHPUnit\Framework\TestCase; +use PHPUnit\Framework\TestListener; +use PHPUnit\Framework\TestListenerDefaultImplementation; + +class Issue3379TestListener implements TestListener +{ + use TestListenerDefaultImplementation; + + public function addSkippedTest(Test $test, \Throwable $t, float $time): void + { + if ($test instanceof TestCase) { + print 'Skipped test ' . $test->getName() . ', status: ' . $test->getStatus() . \PHP_EOL; + } + } +} diff --git a/vendor/phpunit/phpunit/tests/end-to-end/regression/GitHub/3379/phpunit.xml b/vendor/phpunit/phpunit/tests/end-to-end/regression/GitHub/3379/phpunit.xml new file mode 100644 index 000000000..c5fdce9e9 --- /dev/null +++ b/vendor/phpunit/phpunit/tests/end-to-end/regression/GitHub/3379/phpunit.xml @@ -0,0 +1,13 @@ + + + + + . + + + + + + + diff --git a/vendor/phpunit/phpunit/tests/end-to-end/regression/GitHub/3380/issue-3380-test.phpt b/vendor/phpunit/phpunit/tests/end-to-end/regression/GitHub/3380/issue-3380-test.phpt new file mode 100644 index 000000000..0aca1c4f1 --- /dev/null +++ b/vendor/phpunit/phpunit/tests/end-to-end/regression/GitHub/3380/issue-3380-test.phpt @@ -0,0 +1,63 @@ +--TEST-- +https://github.com/sebastianbergmann/phpunit/issues/3380 +--FILE-- +assertAttributeEquals('foo', 'field', new Issue523()); + $this->assertAttributeEquals('foo', 'field', new Issue523); } } diff --git a/vendor/phpunit/phpunit/tests/unit/Framework/AssertTest.php b/vendor/phpunit/phpunit/tests/unit/Framework/AssertTest.php index 73d3da2eb..dfde4ea6c 100644 --- a/vendor/phpunit/phpunit/tests/unit/Framework/AssertTest.php +++ b/vendor/phpunit/phpunit/tests/unit/Framework/AssertTest.php @@ -81,7 +81,7 @@ class AssertTest extends TestCase $test = [new \Book, new \Book]; $this->assertContainsOnlyInstancesOf(\Book::class, $test); - $this->assertContainsOnlyInstancesOf(\stdClass::class, [new \stdClass()]); + $this->assertContainsOnlyInstancesOf(\stdClass::class, [new \stdClass]); $test2 = [new \Author('Test')]; @@ -113,6 +113,20 @@ class AssertTest extends TestCase $this->assertContains('', 'test'); } + public function testAssertStringContainsNonString(): void + { + $this->expectException(Exception::class); + + $this->assertContains(null, ''); + } + + public function testAssertStringNotContainsNonString(): void + { + $this->expectException(Exception::class); + + $this->assertNotContains(null, ''); + } + public function testAssertArrayHasKeyThrowsExceptionForInvalidFirstArgument(): void { $this->expectException(Exception::class); @@ -844,6 +858,8 @@ XML; public function testAssertNotIsReadable(): void { + $this->assertNotIsReadable(__DIR__ . \DIRECTORY_SEPARATOR . 'NotExisting'); + $this->expectException(AssertionFailedError::class); $this->assertNotIsReadable(__FILE__); @@ -860,6 +876,8 @@ XML; public function testAssertNotIsWritable(): void { + $this->assertNotIsWritable(__DIR__ . \DIRECTORY_SEPARATOR . 'NotExisting'); + $this->expectException(AssertionFailedError::class); $this->assertNotIsWritable(__FILE__); @@ -1582,6 +1600,13 @@ XML; $this->assertClassHasAttribute('1', \ClassWithNonPublicAttributes::class); } + public function testAssertClassHasAttributeThrowsExceptionIfClassDoesNotExist(): void + { + $this->expectException(Exception::class); + + $this->assertClassHasAttribute('attribute', 'ClassThatDoesNotExist'); + } + public function testAssertClassNotHasAttributeThrowsExceptionIfAttributeNameIsNotValid(): void { $this->expectException(Exception::class); @@ -1589,6 +1614,13 @@ XML; $this->assertClassNotHasAttribute('1', \ClassWithNonPublicAttributes::class); } + public function testAssertClassNotHasAttributeThrowsExceptionIfClassDoesNotExist(): void + { + $this->expectException(Exception::class); + + $this->assertClassNotHasAttribute('attribute', 'ClassThatDoesNotExist'); + } + public function testAssertClassHasStaticAttributeThrowsExceptionIfAttributeNameIsNotValid(): void { $this->expectException(Exception::class); @@ -1596,6 +1628,13 @@ XML; $this->assertClassHasStaticAttribute('1', \ClassWithNonPublicAttributes::class); } + public function testAssertClassHasStaticAttributeThrowsExceptionIfClassDoesNotExist(): void + { + $this->expectException(Exception::class); + + $this->assertClassHasStaticAttribute('attribute', 'ClassThatDoesNotExist'); + } + public function testAssertClassNotHasStaticAttributeThrowsExceptionIfAttributeNameIsNotValid(): void { $this->expectException(Exception::class); @@ -1603,6 +1642,13 @@ XML; $this->assertClassNotHasStaticAttribute('1', \ClassWithNonPublicAttributes::class); } + public function testAssertClassNotHasStaticAttributeThrowsExceptionIfClassDoesNotExist(): void + { + $this->expectException(Exception::class); + + $this->assertClassNotHasStaticAttribute('attribute', 'ClassThatDoesNotExist'); + } + public function testAssertObjectHasAttributeThrowsException2(): void { $this->expectException(Exception::class); @@ -2397,6 +2443,13 @@ XML; $this->assertJsonFileEqualsJsonFile($file, $file, $message); } + public function testAssertInstanceOfThrowsExceptionIfTypeDoesNotExist(): void + { + $this->expectException(Exception::class); + + $this->assertInstanceOf('ClassThatDoesNotExist', new \stdClass); + } + public function testAssertInstanceOf(): void { $this->assertInstanceOf(\stdClass::class, new \stdClass); @@ -2414,6 +2467,13 @@ XML; $this->assertAttributeInstanceOf(\stdClass::class, 'a', $o); } + public function testAssertNotInstanceOfThrowsExceptionIfTypeDoesNotExist(): void + { + $this->expectException(Exception::class); + + $this->assertNotInstanceOf('ClassThatDoesNotExist', new \stdClass); + } + public function testAssertNotInstanceOf(): void { $this->assertNotInstanceOf(\Exception::class, new \stdClass); @@ -2506,6 +2566,444 @@ XML; $this->assertStringNotMatchesFormatFile(TEST_FILES_PATH . 'expectedFileFormat.txt', "FOO\n"); } + public function testStringsCanBeComparedForEqualityIgnoringCase(): void + { + $this->assertEqualsIgnoringCase('a', 'A'); + + $this->assertNotEqualsIgnoringCase('a', 'B'); + } + + public function testArraysOfStringsCanBeComparedForEqualityIgnoringCase(): void + { + $this->assertEqualsIgnoringCase(['a'], ['A']); + + $this->assertNotEqualsIgnoringCase(['a'], ['B']); + } + + public function testStringsCanBeComparedForEqualityWithDelta(): void + { + $this->assertEqualsWithDelta(2.3, 2.5, 0.5); + + $this->assertNotEqualsWithDelta(2.3, 3.5, 0.5); + } + + public function testArraysOfStringsCanBeComparedForEqualityWithDelta(): void + { + $this->assertEqualsWithDelta([2.3], [2.5], 0.5); + + $this->assertNotEqualsWithDelta([2.3], [3.5], 0.5); + } + + public function testArraysCanBeComparedForEqualityWithCanonicalization(): void + { + $this->assertEqualsCanonicalizing([3, 2, 1], [2, 3, 1]); + + $this->assertNotEqualsCanonicalizing([3, 2, 1], [2, 3, 4]); + } + + public function testArrayTypeCanBeAsserted(): void + { + $this->assertIsArray([]); + + try { + $this->assertIsArray(null); + } catch (AssertionFailedError $e) { + return; + } + + $this->fail(); + } + + public function testBoolTypeCanBeAsserted(): void + { + $this->assertIsBool(true); + + try { + $this->assertIsBool(null); + } catch (AssertionFailedError $e) { + return; + } + + $this->fail(); + } + + public function testFloatTypeCanBeAsserted(): void + { + $this->assertIsFloat(0.0); + + try { + $this->assertIsFloat(null); + } catch (AssertionFailedError $e) { + return; + } + + $this->fail(); + } + + public function testIntTypeCanBeAsserted(): void + { + $this->assertIsInt(1); + + try { + $this->assertIsInt(null); + } catch (AssertionFailedError $e) { + return; + } + + $this->fail(); + } + + public function testNumericTypeCanBeAsserted(): void + { + $this->assertIsNumeric('1.0'); + + try { + $this->assertIsNumeric('abc'); + } catch (AssertionFailedError $e) { + return; + } + + $this->fail(); + } + + public function testObjectTypeCanBeAsserted(): void + { + $this->assertIsObject(new \stdClass); + + try { + $this->assertIsObject(null); + } catch (AssertionFailedError $e) { + return; + } + + $this->fail(); + } + + public function testResourceTypeCanBeAsserted(): void + { + $this->assertIsResource(\fopen(__FILE__, 'r')); + + try { + $this->assertIsResource(null); + } catch (AssertionFailedError $e) { + return; + } + + $this->fail(); + } + + public function testStringTypeCanBeAsserted(): void + { + $this->assertIsString(''); + + try { + $this->assertIsString(null); + } catch (AssertionFailedError $e) { + return; + } + + $this->fail(); + } + + public function testScalarTypeCanBeAsserted(): void + { + $this->assertIsScalar(true); + + try { + $this->assertIsScalar(new \stdClass); + } catch (AssertionFailedError $e) { + return; + } + + $this->fail(); + } + + public function testCallableTypeCanBeAsserted(): void + { + $this->assertIsCallable(function () { + }); + + try { + $this->assertIsCallable(null); + } catch (AssertionFailedError $e) { + return; + } + + $this->fail(); + } + + public function testIterableTypeCanBeAsserted(): void + { + $this->assertIsIterable([]); + + try { + $this->assertIsIterable(null); + } catch (AssertionFailedError $e) { + return; + } + + $this->fail(); + } + + public function testNotArrayTypeCanBeAsserted(): void + { + $this->assertIsNotArray(null); + + try { + $this->assertIsNotArray([]); + } catch (AssertionFailedError $e) { + return; + } + + $this->fail(); + } + + public function testNotBoolTypeCanBeAsserted(): void + { + $this->assertIsNotBool(null); + + try { + $this->assertIsNotBool(true); + } catch (AssertionFailedError $e) { + return; + } + + $this->fail(); + } + + public function testNotFloatTypeCanBeAsserted(): void + { + $this->assertIsNotFloat(null); + + try { + $this->assertIsNotFloat(0.0); + } catch (AssertionFailedError $e) { + return; + } + + $this->fail(); + } + + public function testNotIntTypeCanBeAsserted(): void + { + $this->assertIsNotInt(null); + + try { + $this->assertIsNotInt(1); + } catch (AssertionFailedError $e) { + return; + } + + $this->fail(); + } + + public function testNotNumericTypeCanBeAsserted(): void + { + $this->assertIsNotNumeric('abc'); + + try { + $this->assertIsNotNumeric('1.0'); + } catch (AssertionFailedError $e) { + return; + } + + $this->fail(); + } + + public function testNotObjectTypeCanBeAsserted(): void + { + $this->assertIsNotObject(null); + + try { + $this->assertIsNotObject(new \stdClass); + } catch (AssertionFailedError $e) { + return; + } + + $this->fail(); + } + + public function testNotResourceTypeCanBeAsserted(): void + { + $this->assertIsNotResource(null); + + try { + $this->assertIsNotResource(\fopen(__FILE__, 'r')); + } catch (AssertionFailedError $e) { + return; + } + + $this->fail(); + } + + public function testNotScalarTypeCanBeAsserted(): void + { + $this->assertIsNotScalar(new \stdClass); + + try { + $this->assertIsNotScalar(true); + } catch (AssertionFailedError $e) { + return; + } + + $this->fail(); + } + + public function testNotStringTypeCanBeAsserted(): void + { + $this->assertIsNotString(null); + + try { + $this->assertIsNotString(''); + } catch (AssertionFailedError $e) { + return; + } + + $this->fail(); + } + + public function testNotCallableTypeCanBeAsserted(): void + { + $this->assertIsNotCallable(null); + + try { + $this->assertIsNotCallable(function () { + }); + } catch (AssertionFailedError $e) { + return; + } + + $this->fail(); + } + + public function testNotIterableTypeCanBeAsserted(): void + { + $this->assertIsNotIterable(null); + + try { + $this->assertIsNotIterable([]); + } catch (AssertionFailedError $e) { + return; + } + + $this->fail(); + } + + public function testLogicalAnd(): void + { + $this->assertThat( + true, + $this->logicalAnd( + $this->isTrue(), + $this->isTrue() + ) + ); + + $this->expectException(AssertionFailedError::class); + + $this->assertThat( + true, + $this->logicalAnd( + $this->isTrue(), + $this->isFalse() + ) + ); + } + + public function testLogicalOr(): void + { + $this->assertThat( + true, + $this->logicalOr( + $this->isTrue(), + $this->isFalse() + ) + ); + + $this->expectException(AssertionFailedError::class); + + $this->assertThat( + true, + $this->logicalOr( + $this->isFalse(), + $this->isFalse() + ) + ); + } + + public function testLogicalXor(): void + { + $this->assertThat( + true, + $this->logicalXor( + $this->isTrue(), + $this->isFalse() + ) + ); + + $this->expectException(AssertionFailedError::class); + + $this->assertThat( + true, + $this->logicalXor( + $this->isTrue(), + $this->isTrue() + ) + ); + } + + public function testStringContainsStringCanBeAsserted(): void + { + $this->assertStringContainsString('bar', 'foobarbaz'); + + try { + $this->assertStringContainsString('barbara', 'foobarbaz'); + } catch (AssertionFailedError $e) { + return; + } + + $this->fail(); + } + + public function testStringNotContainsStringCanBeAsserted(): void + { + $this->assertStringNotContainsString('barbara', 'foobarbaz'); + + try { + $this->assertStringNotContainsString('bar', 'foobarbaz'); + } catch (AssertionFailedError $e) { + return; + } + + $this->fail(); + } + + public function testStringContainsStringCanBeAssertedIgnoringCase(): void + { + $this->assertStringContainsStringIgnoringCase('BAR', 'foobarbaz'); + + try { + $this->assertStringContainsStringIgnoringCase('BARBARA', 'foobarbaz'); + } catch (AssertionFailedError $e) { + return; + } + + $this->fail(); + } + + public function testStringNotContainsStringCanBeAssertedIgnoringCase(): void + { + $this->assertStringNotContainsStringIgnoringCase('BARBARA', 'foobarbaz'); + + try { + $this->assertStringNotContainsStringIgnoringCase('BAR', 'foobarbaz'); + } catch (AssertionFailedError $e) { + return; + } + + $this->fail(); + } + protected function sameValues(): array { $object = new \SampleClass(4, 8, 15); diff --git a/vendor/phpunit/phpunit/tests/unit/Framework/Constraint/DirectoryExistsTest.php b/vendor/phpunit/phpunit/tests/unit/Framework/Constraint/DirectoryExistsTest.php index 98eae50f5..256aa85a9 100644 --- a/vendor/phpunit/phpunit/tests/unit/Framework/Constraint/DirectoryExistsTest.php +++ b/vendor/phpunit/phpunit/tests/unit/Framework/Constraint/DirectoryExistsTest.php @@ -16,7 +16,7 @@ class DirectoryExistsTest extends ConstraintTestCase { public function testDefaults(): void { - $constraint = new DirectoryExists(); + $constraint = new DirectoryExists; $this->assertCount(1, $constraint); $this->assertSame('directory exists', $constraint->toString()); @@ -26,7 +26,7 @@ class DirectoryExistsTest extends ConstraintTestCase { $directory = __DIR__ . '/NonExistentDirectory'; - $constraint = new DirectoryExists(); + $constraint = new DirectoryExists; $this->assertFalse($constraint->evaluate($directory, '', true)); } @@ -35,7 +35,7 @@ class DirectoryExistsTest extends ConstraintTestCase { $directory = __DIR__; - $constraint = new DirectoryExists(); + $constraint = new DirectoryExists; $this->assertTrue($constraint->evaluate($directory, '', true)); } @@ -44,7 +44,7 @@ class DirectoryExistsTest extends ConstraintTestCase { $directory = __DIR__ . '/NonExistentDirectory'; - $constraint = new DirectoryExists(); + $constraint = new DirectoryExists; try { $constraint->evaluate($directory); diff --git a/vendor/phpunit/phpunit/tests/unit/Framework/Constraint/FileExistsTest.php b/vendor/phpunit/phpunit/tests/unit/Framework/Constraint/FileExistsTest.php index 7c6911d87..dee7435e7 100644 --- a/vendor/phpunit/phpunit/tests/unit/Framework/Constraint/FileExistsTest.php +++ b/vendor/phpunit/phpunit/tests/unit/Framework/Constraint/FileExistsTest.php @@ -16,7 +16,7 @@ class FileExistsTest extends ConstraintTestCase { public function testConstraintFileExists(): void { - $constraint = new FileExists(); + $constraint = new FileExists; $this->assertFalse($constraint->evaluate('foo', '', true)); $this->assertEquals('file exists', $constraint->toString()); @@ -42,7 +42,7 @@ EOF public function testConstraintFileExists2(): void { - $constraint = new FileExists(); + $constraint = new FileExists; try { $constraint->evaluate('foo', 'custom message'); diff --git a/vendor/phpunit/phpunit/tests/unit/Framework/Constraint/IsEmptyTest.php b/vendor/phpunit/phpunit/tests/unit/Framework/Constraint/IsEmptyTest.php index d5a03d416..a0db50807 100644 --- a/vendor/phpunit/phpunit/tests/unit/Framework/Constraint/IsEmptyTest.php +++ b/vendor/phpunit/phpunit/tests/unit/Framework/Constraint/IsEmptyTest.php @@ -16,7 +16,7 @@ class IsEmptyTest extends ConstraintTestCase { public function testConstraintIsEmpty(): void { - $constraint = new IsEmpty(); + $constraint = new IsEmpty; $this->assertFalse($constraint->evaluate(['foo'], '', true)); $this->assertTrue($constraint->evaluate([], '', true)); @@ -45,7 +45,7 @@ EOF public function testConstraintIsEmpty2(): void { - $constraint = new IsEmpty(); + $constraint = new IsEmpty; try { $constraint->evaluate(['foo'], 'custom message'); diff --git a/vendor/phpunit/phpunit/tests/unit/Framework/Constraint/IsNullTest.php b/vendor/phpunit/phpunit/tests/unit/Framework/Constraint/IsNullTest.php index cc5e01a4e..70a642aa6 100644 --- a/vendor/phpunit/phpunit/tests/unit/Framework/Constraint/IsNullTest.php +++ b/vendor/phpunit/phpunit/tests/unit/Framework/Constraint/IsNullTest.php @@ -16,7 +16,7 @@ class IsNullTest extends ConstraintTestCase { public function testConstraintIsNull(): void { - $constraint = new IsNull(); + $constraint = new IsNull; $this->assertFalse($constraint->evaluate(0, '', true)); $this->assertTrue($constraint->evaluate(null, '', true)); @@ -43,7 +43,7 @@ EOF public function testConstraintIsNull2(): void { - $constraint = new IsNull(); + $constraint = new IsNull; try { $constraint->evaluate(0, 'custom message'); diff --git a/vendor/phpunit/phpunit/tests/unit/Framework/Constraint/IsReadableTest.php b/vendor/phpunit/phpunit/tests/unit/Framework/Constraint/IsReadableTest.php index 30c5593e6..da9d80b89 100644 --- a/vendor/phpunit/phpunit/tests/unit/Framework/Constraint/IsReadableTest.php +++ b/vendor/phpunit/phpunit/tests/unit/Framework/Constraint/IsReadableTest.php @@ -16,7 +16,7 @@ class IsReadableTest extends ConstraintTestCase { public function testConstraintIsReadable(): void { - $constraint = new IsReadable(); + $constraint = new IsReadable; $this->assertFalse($constraint->evaluate('foo', '', true)); $this->assertEquals('is readable', $constraint->toString()); diff --git a/vendor/phpunit/phpunit/tests/unit/Framework/Constraint/IsWritableTest.php b/vendor/phpunit/phpunit/tests/unit/Framework/Constraint/IsWritableTest.php index e2e2476ac..806a363f7 100644 --- a/vendor/phpunit/phpunit/tests/unit/Framework/Constraint/IsWritableTest.php +++ b/vendor/phpunit/phpunit/tests/unit/Framework/Constraint/IsWritableTest.php @@ -16,7 +16,7 @@ class IsWritableTest extends ConstraintTestCase { public function testConstraintIsWritable(): void { - $constraint = new IsWritable(); + $constraint = new IsWritable; $this->assertFalse($constraint->evaluate('foo', '', true)); $this->assertEquals('is writable', $constraint->toString()); diff --git a/vendor/phpunit/phpunit/tests/unit/Framework/Constraint/LogicalAndTest.php b/vendor/phpunit/phpunit/tests/unit/Framework/Constraint/LogicalAndTest.php index 6f94da374..87d8db5b4 100644 --- a/vendor/phpunit/phpunit/tests/unit/Framework/Constraint/LogicalAndTest.php +++ b/vendor/phpunit/phpunit/tests/unit/Framework/Constraint/LogicalAndTest.php @@ -18,12 +18,12 @@ final class LogicalAndTest extends ConstraintTestCase public function testSetConstraintsRejectsInvalidConstraint(): void { $constraints = [ - new \TruthyConstraint(), - new \FalsyConstraint(), - new \stdClass(), + new \TruthyConstraint, + new \FalsyConstraint, + new \stdClass, ]; - $constraint = new LogicalAnd(); + $constraint = new LogicalAnd; $this->expectException(Exception::class); $this->expectExceptionMessage(\sprintf( @@ -46,7 +46,7 @@ final class LogicalAndTest extends ConstraintTestCase return \CountConstraint::fromCount($count); }, $counts); - $constraint = new LogicalAnd(); + $constraint = new LogicalAnd; $constraint->setConstraints($constraints); @@ -67,7 +67,7 @@ final class LogicalAndTest extends ConstraintTestCase return \NamedConstraint::fromName($name); }, $names); - $constraint = new LogicalAnd(); + $constraint = new LogicalAnd; $constraint->setConstraints($constraints); @@ -83,7 +83,7 @@ final class LogicalAndTest extends ConstraintTestCase */ public function testEvaluateReturnsFalseIfAnyOfTheComposedConstraintsEvaluateToFalse(array $constraints): void { - $constraint = new LogicalAnd(); + $constraint = new LogicalAnd; $constraint->setConstraints($constraints); @@ -97,7 +97,7 @@ final class LogicalAndTest extends ConstraintTestCase */ public function testEvaluateReturnsTrueIfAllOfTheComposedConstraintsEvaluateToTrue(array $constraints): void { - $constraint = new LogicalAnd(); + $constraint = new LogicalAnd; $constraint->setConstraints($constraints); @@ -113,7 +113,7 @@ final class LogicalAndTest extends ConstraintTestCase { $other = 'whatever'; - $constraint = new LogicalAnd(); + $constraint = new LogicalAnd; $constraint->setConstraints($constraints); @@ -145,7 +145,7 @@ EOF; $other = 'whatever'; $customDescription = 'Not very happy about the results at this point in time, I have to admit!'; - $constraint = new LogicalAnd(); + $constraint = new LogicalAnd; $constraint->setConstraints($constraints); @@ -178,7 +178,7 @@ EOF; */ public function testEvaluateReturnsNothingIfAllOfTheComposedConstraintsEvaluateToTrue(array $constraints): void { - $constraint = new LogicalAnd(); + $constraint = new LogicalAnd; $constraint->setConstraints($constraints); @@ -189,12 +189,12 @@ EOF; { $values = [ 'single' => [ - new \FalsyConstraint(), + new \FalsyConstraint, ], 'multiple' => [ - new \TruthyConstraint(), - new \FalsyConstraint(), - new \TruthyConstraint(), + new \TruthyConstraint, + new \FalsyConstraint, + new \TruthyConstraint, ], ]; @@ -209,12 +209,12 @@ EOF; { $values = [ 'single' => [ - new \TruthyConstraint(), + new \TruthyConstraint, ], 'multiple' => [ - new \TruthyConstraint(), - new \TruthyConstraint(), - new \TruthyConstraint(), + new \TruthyConstraint, + new \TruthyConstraint, + new \TruthyConstraint, ], ]; diff --git a/vendor/phpunit/phpunit/tests/unit/Framework/Constraint/LogicalOrTest.php b/vendor/phpunit/phpunit/tests/unit/Framework/Constraint/LogicalOrTest.php index db9437caf..f9a5318be 100644 --- a/vendor/phpunit/phpunit/tests/unit/Framework/Constraint/LogicalOrTest.php +++ b/vendor/phpunit/phpunit/tests/unit/Framework/Constraint/LogicalOrTest.php @@ -17,14 +17,14 @@ final class LogicalOrTest extends ConstraintTestCase public function testSetConstraintsDecoratesNonConstraintWithIsEqual(): void { $constraints = [ - new \stdClass(), + new \stdClass, ]; - $constraint = new LogicalOr(); + $constraint = new LogicalOr; $constraint->setConstraints($constraints); - $this->assertTrue($constraint->evaluate(new \stdClass(), '', true)); + $this->assertTrue($constraint->evaluate(new \stdClass, '', true)); } public function testCountReturnsCountOfComposedConstraints(): void @@ -39,7 +39,7 @@ final class LogicalOrTest extends ConstraintTestCase return \CountConstraint::fromCount($count); }, $counts); - $constraint = new LogicalOr(); + $constraint = new LogicalOr; $constraint->setConstraints($constraints); @@ -60,7 +60,7 @@ final class LogicalOrTest extends ConstraintTestCase return \NamedConstraint::fromName($name); }, $names); - $constraint = new LogicalOr(); + $constraint = new LogicalOr; $constraint->setConstraints($constraints); @@ -76,7 +76,7 @@ final class LogicalOrTest extends ConstraintTestCase */ public function testEvaluateReturnsFalseIfAllOfTheComposedConstraintsEvaluateToFalse(array $constraints): void { - $constraint = new LogicalOr(); + $constraint = new LogicalOr; $constraint->setConstraints($constraints); @@ -90,7 +90,7 @@ final class LogicalOrTest extends ConstraintTestCase */ public function testEvaluateReturnsTrueIfAnyOfTheComposedConstraintsEvaluateToTrue(array $constraints): void { - $constraint = new LogicalOr(); + $constraint = new LogicalOr; $constraint->setConstraints($constraints); @@ -106,7 +106,7 @@ final class LogicalOrTest extends ConstraintTestCase { $other = 'whatever'; - $constraint = new LogicalOr(); + $constraint = new LogicalOr; $constraint->setConstraints($constraints); @@ -138,7 +138,7 @@ EOF; $other = 'whatever'; $customDescription = 'Not very happy about the results at this point in time, I have to admit!'; - $constraint = new LogicalOr(); + $constraint = new LogicalOr; $constraint->setConstraints($constraints); @@ -171,7 +171,7 @@ EOF; */ public function testEvaluateReturnsNothingIfAnyOfTheComposedConstraintsEvaluateToTrue(array $constraints): void { - $constraint = new LogicalOr(); + $constraint = new LogicalOr; $constraint->setConstraints($constraints); @@ -182,14 +182,14 @@ EOF; { $values = [ 'single' => [ - new \FalsyConstraint(), - new \FalsyConstraint(), - new \FalsyConstraint(), + new \FalsyConstraint, + new \FalsyConstraint, + new \FalsyConstraint, ], 'multiple' => [ - new \FalsyConstraint(), - new \FalsyConstraint(), - new \FalsyConstraint(), + new \FalsyConstraint, + new \FalsyConstraint, + new \FalsyConstraint, ], ]; @@ -204,12 +204,12 @@ EOF; { $values = [ 'single' => [ - new \TruthyConstraint(), + new \TruthyConstraint, ], 'multiple' => [ - new \FalsyConstraint(), - new \TruthyConstraint(), - new \FalsyConstraint(), + new \FalsyConstraint, + new \TruthyConstraint, + new \FalsyConstraint, ], ]; diff --git a/vendor/phpunit/phpunit/tests/unit/Framework/MockObject/MockObjectTest.php b/vendor/phpunit/phpunit/tests/unit/Framework/MockObject/MockObjectTest.php index da9cd04e6..cad33c568 100644 --- a/vendor/phpunit/phpunit/tests/unit/Framework/MockObject/MockObjectTest.php +++ b/vendor/phpunit/phpunit/tests/unit/Framework/MockObject/MockObjectTest.php @@ -171,7 +171,7 @@ class MockObjectTest extends TestCase $mock->expects($this->any()) ->method('doSomething') - ->will($this->throwException(new \Exception())); + ->will($this->throwException(new \Exception)); $this->expectException(\Exception::class); @@ -185,7 +185,7 @@ class MockObjectTest extends TestCase $mock->expects($this->any()) ->method('doSomething') - ->willThrowException(new \Exception()); + ->willThrowException(new \Exception); $this->expectException(\Exception::class); @@ -660,7 +660,7 @@ class MockObjectTest extends TestCase $this->fail('Expected exception'); } catch (ExpectationFailedException $e) { $this->assertSame( - 'Expectation failed for method name is equal to "right" when invoked 1 time(s).' . "\n" . + "Expectation failed for method name is equal to 'right' when invoked 1 time(s).\n" . 'Method was expected to be called 1 times, actually called 0 times.' . "\n", $e->getMessage() ); @@ -685,7 +685,7 @@ class MockObjectTest extends TestCase $this->fail('Expected exception'); } catch (ExpectationFailedException $e) { $this->assertSame( - 'Expectation failed for method name is equal to "right" when invoked 1 time(s).' . "\n" . + "Expectation failed for method name is equal to 'right' when invoked 1 time(s).\n" . 'Method was expected to be called 1 times, actually called 0 times.' . "\n", $e->getMessage() ); @@ -708,7 +708,7 @@ class MockObjectTest extends TestCase $mock->right(['second']); } catch (ExpectationFailedException $e) { $this->assertSame( - 'Expectation failed for method name is equal to "right" when invoked 1 time(s)' . "\n" . + "Expectation failed for method name is equal to 'right' when invoked 1 time(s)\n" . 'Parameter 0 for invocation SomeClass::right(Array (...)) does not match expected value.' . "\n" . 'Failed asserting that two arrays are equal.', $e->getMessage() @@ -722,7 +722,7 @@ class MockObjectTest extends TestCase // $this->fail('Expected exception'); } catch (ExpectationFailedException $e) { $this->assertSame( - 'Expectation failed for method name is equal to "right" when invoked 1 time(s).' . "\n" . + "Expectation failed for method name is equal to 'right' when invoked 1 time(s).\n" . 'Parameter 0 for invocation SomeClass::right(Array (...)) does not match expected value.' . "\n" . 'Failed asserting that two arrays are equal.' . "\n" . '--- Expected' . "\n" . @@ -801,7 +801,7 @@ class MockObjectTest extends TestCase $this->fail('Expected exception'); } catch (ExpectationFailedException $e) { $this->assertSame( - 'Expectation failed for method name is equal to "right" when invoked 1 time(s)' . "\n" . + "Expectation failed for method name is equal to 'right' when invoked 1 time(s)\n" . 'Parameter count for invocation SomeClass::right() is too low.' . "\n" . 'To allow 0 or more parameters with any value, omit ->with() or use ->withAnyParameters() instead.', $e->getMessage() @@ -947,7 +947,7 @@ class MockObjectTest extends TestCase */ public function testCreateMockOfWsdlFileWithSpecialChars(): void { - $mock = $this->getMockFromWsdl(__DIR__ . '/_fixture/Go ogle-Sea.rch.wsdl'); + $mock = $this->getMockFromWsdl(TEST_FILES_PATH . 'Go ogle-Sea.rch.wsdl'); $this->assertStringStartsWith('Mock_GoogleSearch_', \get_class($mock)); } @@ -1000,7 +1000,7 @@ class MockObjectTest extends TestCase /** @var PHPUnit\Framework\MockObject\MockObject|StringableClass $mock */ $mock = $this->getMockBuilder(StringableClass::class)->getMock(); - $this->assertInternalType('string', (string) $mock); + $this->assertIsString((string) $mock); } public function testStringableClassCanBeMocked(): void diff --git a/vendor/phpunit/phpunit/tests/unit/Framework/TestCaseTest.php b/vendor/phpunit/phpunit/tests/unit/Framework/TestCaseTest.php index 874d4208c..71076eac9 100644 --- a/vendor/phpunit/phpunit/tests/unit/Framework/TestCaseTest.php +++ b/vendor/phpunit/phpunit/tests/unit/Framework/TestCaseTest.php @@ -723,7 +723,7 @@ class TestCaseTest extends TestCase $test = new \TestAutoreferenced('testJsonEncodeException', $this->getAutoreferencedArray()); $test->runBare(); - $this->assertInternalType('array', $test->myTestData); + $this->assertIsArray($test->myTestData); $this->assertArrayHasKey('data', $test->myTestData); $this->assertEquals($test->myTestData['data'][0], $test->myTestData['data']); } @@ -739,13 +739,13 @@ class TestCaseTest extends TestCase $test = new \TestAutoreferenced('testJsonEncodeException', [$data]); $test->runBare(); - $this->assertInternalType('array', $test->myTestData); + $this->assertIsArray($test->myTestData); $this->assertSame($data, $test->myTestData); } public function testGettingNullTestResultObject(): void { - $test = new \Success(); + $test = new \Success; $this->assertNull($test->getTestResultObject()); } diff --git a/vendor/phpunit/phpunit/tests/unit/Framework/TestFailureTest.php b/vendor/phpunit/phpunit/tests/unit/Framework/TestFailureTest.php index 5654a1a23..57a32a541 100644 --- a/vendor/phpunit/phpunit/tests/unit/Framework/TestFailureTest.php +++ b/vendor/phpunit/phpunit/tests/unit/Framework/TestFailureTest.php @@ -9,6 +9,9 @@ */ namespace PHPUnit\Framework; +use PHPUnit\Framework\Error\Error; +use SebastianBergmann\Comparator\ComparisonFailure; + class TestFailureTest extends TestCase { public function testToString(): void @@ -29,6 +32,15 @@ class TestFailureTest extends TestCase $this->assertEquals(__METHOD__ . ': message', $failure->toString()); } + public function testToStringForNonSelfDescribing(): void + { + $test = new \NotSelfDescribingTest(); + $exception = new Exception('message'); + $failure = new TestFailure($test, $exception); + + $this->assertEquals('NotSelfDescribingTest: message', $failure->toString()); + } + public function testgetExceptionAsString(): void { $test = new self(__FUNCTION__); @@ -37,4 +49,93 @@ class TestFailureTest extends TestCase $this->assertEquals("Error: message\n", $failure->getExceptionAsString()); } + + public function testExceptionToString(): void + { + $exception = new AssertionFailedError('message'); + + $this->assertEquals("message\n", TestFailure::exceptionToString($exception)); + } + + public function testExceptionToStringForExpectationFailedException(): void + { + $exception = new ExpectationFailedException('message'); + + $this->assertEquals("message\n", TestFailure::exceptionToString($exception)); + } + + public function testExceptionToStringForExpectationFailedExceptionWithComparisonFailure(): void + { + $exception = new ExpectationFailedException('message', new ComparisonFailure('expected', 'actual', 'expected', 'actual')); + + $this->assertEquals("message\n--- Expected\n+++ Actual\n@@ @@\n-expected\n+actual\n", TestFailure::exceptionToString($exception)); + } + + public function testExceptionToStringForFrameworkError(): void + { + $exception = new Error('message', 0, 'file', 1); + + $this->assertEquals("message\n", TestFailure::exceptionToString($exception)); + } + + public function testExceptionToStringForExceptionWrapper(): void + { + $exception = new ExceptionWrapper(new \Error('message')); + + $this->assertEquals("Error: message\n", TestFailure::exceptionToString($exception)); + } + + public function testGetTestName(): void + { + $test = new self(__FUNCTION__); + $exception = new Exception('message'); + $failure = new TestFailure($test, $exception); + + $this->assertEquals($this->toString(), $failure->getTestName()); + } + + public function testFailedTest(): void + { + $test = new self(__FUNCTION__); + $exception = new Exception('message'); + $failure = new TestFailure($test, $exception); + + $this->assertEquals($test, $failure->failedTest()); + } + + public function testThrownException(): void + { + $test = new self(__FUNCTION__); + $exception = new Exception('message'); + $failure = new TestFailure($test, $exception); + + $this->assertEquals($exception, $failure->thrownException()); + } + + public function testExceptionMessage(): void + { + $test = new self(__FUNCTION__); + $exception = new Exception('message'); + $failure = new TestFailure($test, $exception); + + $this->assertEquals('message', $failure->exceptionMessage()); + } + + public function testIsFailure(): void + { + $test = new self(__FUNCTION__); + $exception = new ExpectationFailedException('message'); + $failure = new TestFailure($test, $exception); + + $this->assertTrue($failure->isFailure()); + } + + public function testIsFailureFalse(): void + { + $test = new self(__FUNCTION__); + $exception = new Warning('message'); + $failure = new TestFailure($test, $exception); + + $this->assertFalse($failure->isFailure()); + } } diff --git a/vendor/phpunit/phpunit/tests/unit/Framework/TestListenerTest.php b/vendor/phpunit/phpunit/tests/unit/Framework/TestListenerTest.php index f0ac40792..d4e725f8d 100644 --- a/vendor/phpunit/phpunit/tests/unit/Framework/TestListenerTest.php +++ b/vendor/phpunit/phpunit/tests/unit/Framework/TestListenerTest.php @@ -9,85 +9,26 @@ */ namespace PHPUnit\Framework; -class TestListenerTest extends TestCase implements TestListener +use MyTestListener; + +final class TestListenerTest extends TestCase { - protected $endCount; + /** + * @var TestResult + */ + private $result; - protected $errorCount; - - protected $failureCount; - - protected $warningCount; - - protected $notImplementedCount; - - protected $riskyCount; - - protected $skippedCount; - - protected $result; - - protected $startCount; + /** + * @var MyTestListener + */ + private $listener; protected function setUp(): void { - $this->result = new TestResult; - $this->result->addListener($this); + $this->result = new TestResult; + $this->listener = new MyTestListener; - $this->endCount = 0; - $this->failureCount = 0; - $this->notImplementedCount = 0; - $this->riskyCount = 0; - $this->skippedCount = 0; - $this->startCount = 0; - } - - public function addError(Test $test, \Throwable $t, float $time): void - { - $this->errorCount++; - } - - public function addWarning(Test $test, Warning $e, float $time): void - { - $this->warningCount++; - } - - public function addFailure(Test $test, AssertionFailedError $e, float $time): void - { - $this->failureCount++; - } - - public function addIncompleteTest(Test $test, \Throwable $t, float $time): void - { - $this->notImplementedCount++; - } - - public function addRiskyTest(Test $test, \Throwable $t, float $time): void - { - $this->riskyCount++; - } - - public function addSkippedTest(Test $test, \Throwable $t, float $time): void - { - $this->skippedCount++; - } - - public function startTestSuite(TestSuite $suite): void - { - } - - public function endTestSuite(TestSuite $suite): void - { - } - - public function startTest(Test $test): void - { - $this->startCount++; - } - - public function endTest(Test $test, float $time): void - { - $this->endCount++; + $this->result->addListener($this->listener); } public function testError(): void @@ -95,8 +36,8 @@ class TestListenerTest extends TestCase implements TestListener $test = new \TestError; $test->run($this->result); - $this->assertEquals(1, $this->errorCount); - $this->assertEquals(1, $this->endCount); + $this->assertEquals(1, $this->listener->errorCount()); + $this->assertEquals(1, $this->listener->endCount()); } public function testFailure(): void @@ -104,8 +45,8 @@ class TestListenerTest extends TestCase implements TestListener $test = new \Failure; $test->run($this->result); - $this->assertEquals(1, $this->failureCount); - $this->assertEquals(1, $this->endCount); + $this->assertEquals(1, $this->listener->failureCount()); + $this->assertEquals(1, $this->listener->endCount()); } public function testStartStop(): void @@ -113,7 +54,7 @@ class TestListenerTest extends TestCase implements TestListener $test = new \Success; $test->run($this->result); - $this->assertEquals(1, $this->startCount); - $this->assertEquals(1, $this->endCount); + $this->assertEquals(1, $this->listener->startCount()); + $this->assertEquals(1, $this->listener->endCount()); } } diff --git a/vendor/phpunit/phpunit/tests/unit/Framework/TestResultTest.php b/vendor/phpunit/phpunit/tests/unit/Framework/TestResultTest.php index ce8797809..e84c5167b 100644 --- a/vendor/phpunit/phpunit/tests/unit/Framework/TestResultTest.php +++ b/vendor/phpunit/phpunit/tests/unit/Framework/TestResultTest.php @@ -13,7 +13,7 @@ class TestResultTest extends TestCase { public function testRemoveListenerRemovesOnlyExpectedListener(): void { - $result = new TestResult(); + $result = new TestResult; $firstListener = $this->getMockBuilder(TestListener::class)->getMock(); $secondListener = $this->getMockBuilder(TestListener::class)->getMock(); $thirdListener = $this->getMockBuilder(TestListener::class)->getMock(); @@ -37,8 +37,8 @@ class TestResultTest extends TestCase public function testAddErrorOfTypeIncompleteTest(): void { $time = 17; - $throwable = new IncompleteTestError(); - $result = new TestResult(); + $throwable = new IncompleteTestError; + $result = new TestResult; $test = $this->getMockBuilder(Test::class)->getMock(); $listener = $this->getMockBuilder(TestListener::class)->getMock(); @@ -79,7 +79,7 @@ class TestResultTest extends TestCase { require_once TEST_FILES_PATH . $testCase . '.php'; - $test = new $testCase(); + $test = new $testCase; $canSkipCoverage = TestResult::isAnyCoverageRequired($test); $this->assertEquals($expectedCanSkip, $canSkipCoverage); } diff --git a/vendor/phpunit/phpunit/tests/unit/Runner/PhptTestCaseTest.php b/vendor/phpunit/phpunit/tests/unit/Runner/PhptTestCaseTest.php index 78c434d82..ca20f2ea1 100644 --- a/vendor/phpunit/phpunit/tests/unit/Runner/PhptTestCaseTest.php +++ b/vendor/phpunit/phpunit/tests/unit/Runner/PhptTestCaseTest.php @@ -84,6 +84,16 @@ EOF; $this->testCase = null; } + public function testAlwaysReportsNumberOfAssertionsIsOne(): void + { + $this->assertSame(1, $this->testCase->getNumAssertions()); + } + + public function testAlwaysReportsItDoesNotUseADataprovider(): void + { + $this->assertSame(false, $this->testCase->usesDataProvider()); + } + public function testShouldRunFileSectionAsTest(): void { $this->setPhpContent($this->ensureCorrectEndOfLine(self::EXPECT_CONTENT)); diff --git a/vendor/phpunit/phpunit/tests/unit/Runner/ResultCacheExtensionTest.php b/vendor/phpunit/phpunit/tests/unit/Runner/ResultCacheExtensionTest.php index 76e84acff..4a1edc3e6 100644 --- a/vendor/phpunit/phpunit/tests/unit/Runner/ResultCacheExtensionTest.php +++ b/vendor/phpunit/phpunit/tests/unit/Runner/ResultCacheExtensionTest.php @@ -61,14 +61,14 @@ class ResultCacheExtensionTest extends TestCase { return [ 'ClassName::testMethod' => [ - TestCaseTest::class . '::testSomething', - 'testSomething', ], + 'testSomething', + TestCaseTest::class . '::testSomething', ], 'ClassName::testMethod and data set number and vardump' => [ - TestCaseTest::class . '::testMethod with data set #123 (\'a\', "A", 0, false)', - 'testMethod with data set #123', ], + 'testMethod with data set #123 (\'a\', "A", 0, false)', + TestCaseTest::class . '::testMethod with data set #123', ], 'ClassName::testMethod and data set name and vardump' => [ - TestCaseTest::class . '::testMethod with data set "data name" (\'a\', "A\", 0, false)', - 'testMethod with data set "data name"', ], + 'testMethod with data set "data name" (\'a\', "A\", 0, false)', + TestCaseTest::class . '::testMethod with data set "data name"', ], ]; } @@ -77,7 +77,7 @@ class ResultCacheExtensionTest extends TestCase $test = new \TestError('test_name'); $test->run($this->result); - $this->assertSame(BaseTestRunner::STATUS_ERROR, $this->cache->getState('test_name')); + $this->assertSame(BaseTestRunner::STATUS_ERROR, $this->cache->getState(\TestError::class . '::test_name')); } public function testFailure(): void @@ -85,7 +85,7 @@ class ResultCacheExtensionTest extends TestCase $test = new \Failure('test_name'); $test->run($this->result); - $this->assertSame(BaseTestRunner::STATUS_FAILURE, $this->cache->getState('test_name')); + $this->assertSame(BaseTestRunner::STATUS_FAILURE, $this->cache->getState(\Failure::class . '::test_name')); } public function testSkipped(): void @@ -93,7 +93,7 @@ class ResultCacheExtensionTest extends TestCase $test = new \TestSkipped('test_name'); $test->run($this->result); - $this->assertSame(BaseTestRunner::STATUS_SKIPPED, $this->cache->getState('test_name')); + $this->assertSame(BaseTestRunner::STATUS_SKIPPED, $this->cache->getState(\TestSkipped::class . '::test_name')); } public function testIncomplete(): void @@ -101,7 +101,7 @@ class ResultCacheExtensionTest extends TestCase $test = new \TestIncomplete('test_name'); $test->run($this->result); - $this->assertSame(BaseTestRunner::STATUS_INCOMPLETE, $this->cache->getState('test_name')); + $this->assertSame(BaseTestRunner::STATUS_INCOMPLETE, $this->cache->getState(\TestIncomplete::class . '::test_name')); } public function testPassedTestsOnlyCacheTime(): void @@ -109,7 +109,7 @@ class ResultCacheExtensionTest extends TestCase $test = new \Success('test_name'); $test->run($this->result); - $this->assertSame(BaseTestRunner::STATUS_UNKNOWN, $this->cache->getState('test_name')); + $this->assertSame(BaseTestRunner::STATUS_UNKNOWN, $this->cache->getState(\Success::class . '::test_name')); } public function testWarning(): void @@ -117,7 +117,7 @@ class ResultCacheExtensionTest extends TestCase $test = new \TestWarning('test_name'); $test->run($this->result); - $this->assertSame(BaseTestRunner::STATUS_WARNING, $this->cache->getState('test_name')); + $this->assertSame(BaseTestRunner::STATUS_WARNING, $this->cache->getState(\TestWarning::class . '::test_name')); } public function testRisky(): void @@ -125,7 +125,7 @@ class ResultCacheExtensionTest extends TestCase $test = new \TestRisky('test_name'); $test->run($this->result); - $this->assertSame(BaseTestRunner::STATUS_RISKY, $this->cache->getState('test_name')); + $this->assertSame(BaseTestRunner::STATUS_RISKY, $this->cache->getState(\TestRisky::class . '::test_name')); } public function testEmptySuite(): void diff --git a/vendor/phpunit/phpunit/tests/unit/Runner/TestSuiteSorterTest.php b/vendor/phpunit/phpunit/tests/unit/Runner/TestSuiteSorterTest.php index aa64e9887..165af2117 100644 --- a/vendor/phpunit/phpunit/tests/unit/Runner/TestSuiteSorterTest.php +++ b/vendor/phpunit/phpunit/tests/unit/Runner/TestSuiteSorterTest.php @@ -24,11 +24,19 @@ class TestSuiteSorterTest extends TestCase private const RESOLVE_DEPENDENCIES = true; + private const MULTIDEPENDENCYTEST_EXECUTION_ORDER = [ + \MultiDependencyTest::class . '::testOne', + \MultiDependencyTest::class . '::testTwo', + \MultiDependencyTest::class . '::testThree', + \MultiDependencyTest::class . '::testFour', + \MultiDependencyTest::class . '::testFive', + ]; + public function testThrowsExceptionWhenUsingInvalidOrderOption(): void { $suite = new TestSuite; $suite->addTestSuite(\MultiDependencyTest::class); - $sorter = new TestSuiteSorter(); + $sorter = new TestSuiteSorter; $this->expectException(Exception::class); $this->expectExceptionMessage('$order must be one of TestSuiteSorter::ORDER_DEFAULT, TestSuiteSorter::ORDER_REVERSED, or TestSuiteSorter::ORDER_RANDOMIZED, or TestSuiteSorter::ORDER_DURATION'); @@ -39,7 +47,7 @@ class TestSuiteSorterTest extends TestCase { $suite = new TestSuite; $suite->addTestSuite(\MultiDependencyTest::class); - $sorter = new TestSuiteSorter(); + $sorter = new TestSuiteSorter; $this->expectException(Exception::class); $this->expectExceptionMessage('$orderDefects must be one of TestSuiteSorter::ORDER_DEFAULT, TestSuiteSorter::ORDER_DEFECTS_FIRST'); @@ -54,49 +62,66 @@ class TestSuiteSorterTest extends TestCase $sorter = new TestSuiteSorter; $suite = new TestSuite; - $this->assertSame([], $suite->tests()); - $sorter->reorderTestsInSuite($suite, $order, $resolveDependencies, $orderDefects); - $this->assertSame([], $suite->tests()); + $this->assertEmpty($suite->tests()); + $this->assertEmpty($sorter->getOriginalExecutionOrder()); + $this->assertEmpty($sorter->getExecutionOrder()); } /** * @dataProvider commonSorterOptionsProvider */ - public function testBasicExecutionOrderOptions(int $order, bool $resolveDependencies, array $expected): void + public function testBasicExecutionOrderOptions(int $order, bool $resolveDependencies, array $expectedOrder): void { $suite = new TestSuite; $suite->addTestSuite(\MultiDependencyTest::class); - $sorter = new TestSuiteSorter(); + $sorter = new TestSuiteSorter; $sorter->reorderTestsInSuite($suite, $order, $resolveDependencies, TestSuiteSorter::ORDER_DEFAULT); - $this->assertSame($expected, $this->getTestExecutionOrder($suite)); + $this->assertSame(self::MULTIDEPENDENCYTEST_EXECUTION_ORDER, $sorter->getOriginalExecutionOrder()); + $this->assertSame($expectedOrder, $sorter->getExecutionOrder()); } public function testCanSetRandomizationWithASeed(): void { $suite = new TestSuite; $suite->addTestSuite(\MultiDependencyTest::class); - $sorter = new TestSuiteSorter(); + $sorter = new TestSuiteSorter; \mt_srand(54321); $sorter->reorderTestsInSuite($suite, TestSuiteSorter::ORDER_RANDOMIZED, false, TestSuiteSorter::ORDER_DEFAULT); - $this->assertSame(['testTwo', 'testFour', 'testFive', 'testThree', 'testOne'], $this->getTestExecutionOrder($suite)); + $expectedOrder = [ + \MultiDependencyTest::class . '::testTwo', + \MultiDependencyTest::class . '::testFour', + \MultiDependencyTest::class . '::testFive', + \MultiDependencyTest::class . '::testThree', + \MultiDependencyTest::class . '::testOne', + ]; + + $this->assertSame($expectedOrder, $sorter->getExecutionOrder()); } public function testCanSetRandomizationWithASeedAndResolveDependencies(): void { $suite = new TestSuite; $suite->addTestSuite(\MultiDependencyTest::class); - $sorter = new TestSuiteSorter(); + $sorter = new TestSuiteSorter; \mt_srand(54321); $sorter->reorderTestsInSuite($suite, TestSuiteSorter::ORDER_RANDOMIZED, true, TestSuiteSorter::ORDER_DEFAULT); - $this->assertSame(['testTwo', 'testFive', 'testOne', 'testThree', 'testFour'], $this->getTestExecutionOrder($suite)); + $expectedOrder = [ + \MultiDependencyTest::class . '::testTwo', + \MultiDependencyTest::class . '::testFive', + \MultiDependencyTest::class . '::testOne', + \MultiDependencyTest::class . '::testThree', + \MultiDependencyTest::class . '::testFour', + ]; + + $this->assertSame($expectedOrder, $sorter->getExecutionOrder()); } /** @@ -108,7 +133,7 @@ class TestSuiteSorterTest extends TestCase $suite->addTestSuite(\MultiDependencyTest::class); - $sorter = new TestSuiteSorter(); + $sorter = new TestSuiteSorter; $sorter->reorderTestsInSuite( $suite, @@ -117,7 +142,7 @@ class TestSuiteSorterTest extends TestCase TestSuiteSorter::ORDER_DEFAULT ); - $this->assertSame($expected, $this->getTestExecutionOrder($suite)); + $this->assertSame($expected, $sorter->getExecutionOrder()); } public function orderDurationWithoutCacheProvider(): array @@ -126,21 +151,21 @@ class TestSuiteSorterTest extends TestCase 'dependency-ignore' => [ self::IGNORE_DEPENDENCIES, [ - 'testOne', - 'testTwo', - 'testThree', - 'testFour', - 'testFive', + \MultiDependencyTest::class . '::testOne', + \MultiDependencyTest::class . '::testTwo', + \MultiDependencyTest::class . '::testThree', + \MultiDependencyTest::class . '::testFour', + \MultiDependencyTest::class . '::testFive', ], ], 'dependency-resolve' => [ self::RESOLVE_DEPENDENCIES, [ - 'testOne', - 'testTwo', - 'testThree', - 'testFour', - 'testFive', + \MultiDependencyTest::class . '::testOne', + \MultiDependencyTest::class . '::testTwo', + \MultiDependencyTest::class . '::testThree', + \MultiDependencyTest::class . '::testFour', + \MultiDependencyTest::class . '::testFive', ], ], ]; @@ -155,10 +180,10 @@ class TestSuiteSorterTest extends TestCase $suite->addTestSuite(\MultiDependencyTest::class); - $cache = new TestResultCache(); + $cache = new TestResultCache; foreach ($testTimes as $testName => $time) { - $cache->setTime($testName, $time); + $cache->setTime(\MultiDependencyTest::class . '::' . $testName, $time); } $sorter = new TestSuiteSorter($cache); @@ -170,7 +195,7 @@ class TestSuiteSorterTest extends TestCase TestSuiteSorter::ORDER_DEFAULT ); - $this->assertSame($expected, $this->getTestExecutionOrder($suite)); + $this->assertSame($expected, $sorter->getExecutionOrder()); } public function orderDurationWithCacheProvider(): array @@ -186,11 +211,11 @@ class TestSuiteSorterTest extends TestCase 'testFive' => 1, ], [ - 'testOne', - 'testTwo', - 'testThree', - 'testFour', - 'testFive', + \MultiDependencyTest::class . '::testOne', + \MultiDependencyTest::class . '::testTwo', + \MultiDependencyTest::class . '::testThree', + \MultiDependencyTest::class . '::testFour', + \MultiDependencyTest::class . '::testFive', ], ], 'duration-same-dependency-resolve' => [ @@ -203,11 +228,11 @@ class TestSuiteSorterTest extends TestCase 'testFive' => 1, ], [ - 'testOne', - 'testTwo', - 'testThree', - 'testFour', - 'testFive', + \MultiDependencyTest::class . '::testOne', + \MultiDependencyTest::class . '::testTwo', + \MultiDependencyTest::class . '::testThree', + \MultiDependencyTest::class . '::testFour', + \MultiDependencyTest::class . '::testFive', ], ], 'duration-different-dependency-ignore' => [ @@ -220,11 +245,11 @@ class TestSuiteSorterTest extends TestCase 'testFive' => 2, ], [ - 'testFour', - 'testFive', - 'testTwo', - 'testThree', - 'testOne', + \MultiDependencyTest::class . '::testFour', + \MultiDependencyTest::class . '::testFive', + \MultiDependencyTest::class . '::testTwo', + \MultiDependencyTest::class . '::testThree', + \MultiDependencyTest::class . '::testOne', ], ], 'duration-different-dependency-resolve' => [ @@ -237,11 +262,11 @@ class TestSuiteSorterTest extends TestCase 'testFive' => 2, ], [ - 'testFive', - 'testTwo', - 'testOne', - 'testThree', - 'testFour', + \MultiDependencyTest::class . '::testFive', + \MultiDependencyTest::class . '::testTwo', + \MultiDependencyTest::class . '::testOne', + \MultiDependencyTest::class . '::testThree', + \MultiDependencyTest::class . '::testFour', ], ], ]; @@ -255,17 +280,17 @@ class TestSuiteSorterTest extends TestCase $suite = new TestSuite; $suite->addTestSuite(\MultiDependencyTest::class); - $cache = new TestResultCache(); + $cache = new TestResultCache; foreach ($runState as $testName => $data) { - $cache->setState($testName, $data['state']); - $cache->setTime($testName, $data['time']); + $cache->setState(\MultiDependencyTest::class . '::' . $testName, $data['state']); + $cache->setTime(\MultiDependencyTest::class . '::' . $testName, $data['time']); } $sorter = new TestSuiteSorter($cache); $sorter->reorderTestsInSuite($suite, $order, $resolveDependencies, TestSuiteSorter::ORDER_DEFECTS_FIRST); - $this->assertSame($expected, $this->getTestExecutionOrder($suite)); + $this->assertSame($expected, $sorter->getExecutionOrder()); } /** @@ -282,28 +307,52 @@ class TestSuiteSorterTest extends TestCase 'default' => [ TestSuiteSorter::ORDER_DEFAULT, self::IGNORE_DEPENDENCIES, - ['testOne', 'testTwo', 'testThree', 'testFour', 'testFive'], + [ + \MultiDependencyTest::class . '::testOne', + \MultiDependencyTest::class . '::testTwo', + \MultiDependencyTest::class . '::testThree', + \MultiDependencyTest::class . '::testFour', + \MultiDependencyTest::class . '::testFive', + ], ], // Activating dependency resolution should have no effect under normal circumstances 'resolve default' => [ TestSuiteSorter::ORDER_DEFAULT, self::RESOLVE_DEPENDENCIES, - ['testOne', 'testTwo', 'testThree', 'testFour', 'testFive'], + [ + \MultiDependencyTest::class . '::testOne', + \MultiDependencyTest::class . '::testTwo', + \MultiDependencyTest::class . '::testThree', + \MultiDependencyTest::class . '::testFour', + \MultiDependencyTest::class . '::testFive', + ], ], // Reversing without checks should give a simple reverse order 'reverse' => [ TestSuiteSorter::ORDER_REVERSED, self::IGNORE_DEPENDENCIES, - ['testFive', 'testFour', 'testThree', 'testTwo', 'testOne'], + [ + \MultiDependencyTest::class . '::testFive', + \MultiDependencyTest::class . '::testFour', + \MultiDependencyTest::class . '::testThree', + \MultiDependencyTest::class . '::testTwo', + \MultiDependencyTest::class . '::testOne', + ], ], // Reversing with resolution still allows testFive to move to front, testTwo before testOne 'resolve reverse' => [ TestSuiteSorter::ORDER_REVERSED, self::RESOLVE_DEPENDENCIES, - ['testFive', 'testTwo', 'testOne', 'testThree', 'testFour'], + [ + \MultiDependencyTest::class . '::testFive', + \MultiDependencyTest::class . '::testTwo', + \MultiDependencyTest::class . '::testOne', + \MultiDependencyTest::class . '::testThree', + \MultiDependencyTest::class . '::testFour', + ], ], ]; } @@ -330,7 +379,14 @@ class TestSuiteSorterTest extends TestCase 'testFour' => ['state' => BaseTestRunner::STATUS_PASSED, 'time' => 1], 'testFive' => ['state' => BaseTestRunner::STATUS_PASSED, 'time' => 1], ], - ['testOne', 'testTwo', 'testThree', 'testFour', 'testFive'], ], + [ + \MultiDependencyTest::class . '::testOne', + \MultiDependencyTest::class . '::testTwo', + \MultiDependencyTest::class . '::testThree', + \MultiDependencyTest::class . '::testFour', + \MultiDependencyTest::class . '::testFive', + ], + ], // Running with an empty cache should not spook the TestSuiteSorter 'default, empty result cache' => [ @@ -339,7 +395,14 @@ class TestSuiteSorterTest extends TestCase [ // empty result cache ], - ['testOne', 'testTwo', 'testThree', 'testFour', 'testFive'], ], + [ + \MultiDependencyTest::class . '::testOne', + \MultiDependencyTest::class . '::testTwo', + \MultiDependencyTest::class . '::testThree', + \MultiDependencyTest::class . '::testFour', + \MultiDependencyTest::class . '::testFive', + ], + ], // testFive is independent and can be moved to the front 'default, testFive skipped' => [ @@ -352,7 +415,14 @@ class TestSuiteSorterTest extends TestCase 'testFour' => ['state' => BaseTestRunner::STATUS_PASSED, 'time' => 1], 'testFive' => ['state' => BaseTestRunner::STATUS_SKIPPED, 'time' => 1], ], - ['testFive', 'testOne', 'testTwo', 'testThree', 'testFour'], ], + [ + \MultiDependencyTest::class . '::testFive', + \MultiDependencyTest::class . '::testOne', + \MultiDependencyTest::class . '::testTwo', + \MultiDependencyTest::class . '::testThree', + \MultiDependencyTest::class . '::testFour', + ], + ], // Defects in testFive and testTwo, but the faster testFive should be run first 'default, testTwo testFive skipped' => [ @@ -365,7 +435,14 @@ class TestSuiteSorterTest extends TestCase 'testFour' => ['state' => BaseTestRunner::STATUS_PASSED, 'time' => 1], 'testFive' => ['state' => BaseTestRunner::STATUS_SKIPPED, 'time' => 0], ], - ['testFive', 'testTwo', 'testOne', 'testThree', 'testFour'], ], + [ + \MultiDependencyTest::class . '::testFive', + \MultiDependencyTest::class . '::testTwo', + \MultiDependencyTest::class . '::testOne', + \MultiDependencyTest::class . '::testThree', + \MultiDependencyTest::class . '::testFour', + ], + ], // Skipping testThree will move it to the front when ignoring dependencies 'default, testThree skipped' => [ @@ -378,7 +455,14 @@ class TestSuiteSorterTest extends TestCase 'testFour' => ['state' => BaseTestRunner::STATUS_PASSED, 'time' => 1], 'testFive' => ['state' => BaseTestRunner::STATUS_PASSED, 'time' => 1], ], - ['testThree', 'testOne', 'testTwo', 'testFour', 'testFive'], ], + [ + \MultiDependencyTest::class . '::testThree', + \MultiDependencyTest::class . '::testOne', + \MultiDependencyTest::class . '::testTwo', + \MultiDependencyTest::class . '::testFour', + \MultiDependencyTest::class . '::testFive', + ], + ], // Skipping testThree will move it to the front but behind its dependencies 'default resolve, testThree skipped' => [ @@ -391,7 +475,14 @@ class TestSuiteSorterTest extends TestCase 'testFour' => ['state' => BaseTestRunner::STATUS_PASSED, 'time' => 1], 'testFive' => ['state' => BaseTestRunner::STATUS_PASSED, 'time' => 1], ], - ['testOne', 'testTwo', 'testThree', 'testFour', 'testFive'], ], + [ + \MultiDependencyTest::class . '::testOne', + \MultiDependencyTest::class . '::testTwo', + \MultiDependencyTest::class . '::testThree', + \MultiDependencyTest::class . '::testFour', + \MultiDependencyTest::class . '::testFive', + ], + ], // Skipping testThree will move it to the front and keep the others reversed 'reverse, testThree skipped' => [ @@ -404,7 +495,14 @@ class TestSuiteSorterTest extends TestCase 'testFour' => ['state' => BaseTestRunner::STATUS_PASSED, 'time' => 1], 'testFive' => ['state' => BaseTestRunner::STATUS_PASSED, 'time' => 1], ], - ['testThree', 'testFive', 'testFour', 'testTwo', 'testOne'], ], + [ + \MultiDependencyTest::class . '::testThree', + \MultiDependencyTest::class . '::testFive', + \MultiDependencyTest::class . '::testFour', + \MultiDependencyTest::class . '::testTwo', + \MultiDependencyTest::class . '::testOne', + ], + ], // Demonstrate a limit of the dependency resolver: after sorting defects to the front, // the resolver will mark testFive done before testThree because of dependencies @@ -418,7 +516,14 @@ class TestSuiteSorterTest extends TestCase 'testFour' => ['state' => BaseTestRunner::STATUS_PASSED, 'time' => 1], 'testFive' => ['state' => BaseTestRunner::STATUS_SKIPPED, 'time' => 1], ], - ['testFive', 'testOne', 'testTwo', 'testThree', 'testFour'], ], + [ + \MultiDependencyTest::class . '::testFive', + \MultiDependencyTest::class . '::testOne', + \MultiDependencyTest::class . '::testTwo', + \MultiDependencyTest::class . '::testThree', + \MultiDependencyTest::class . '::testFour', + ], + ], // Torture test // - incomplete TestResultCache @@ -433,7 +538,14 @@ class TestSuiteSorterTest extends TestCase 'testTwo' => ['state' => BaseTestRunner::STATUS_PASSED, 'time' => 1], 'testThree' => ['state' => BaseTestRunner::STATUS_SKIPPED, 'time' => 1], ], - ['testFive', 'testTwo', 'testOne', 'testThree', 'testFour'], ], + [ + \MultiDependencyTest::class . '::testFive', + \MultiDependencyTest::class . '::testTwo', + \MultiDependencyTest::class . '::testOne', + \MultiDependencyTest::class . '::testThree', + \MultiDependencyTest::class . '::testFour', + ], + ], // Make sure the dependency resolver is not confused by failing tests. // Scenario: Four has a @depends on Three and fails. Result: Three is still run first @@ -448,7 +560,14 @@ class TestSuiteSorterTest extends TestCase 'testFour' => ['state' => BaseTestRunner::STATUS_FAILURE, 'time' => 1], 'testFive' => ['state' => BaseTestRunner::STATUS_FAILURE, 'time' => 1], ], - ['testFive', 'testOne', 'testTwo', 'testThree', 'testFour'], ], + [ + \MultiDependencyTest::class . '::testFive', + \MultiDependencyTest::class . '::testOne', + \MultiDependencyTest::class . '::testTwo', + \MultiDependencyTest::class . '::testThree', + \MultiDependencyTest::class . '::testFour', + ], + ], ]; } @@ -460,7 +579,7 @@ class TestSuiteSorterTest extends TestCase $suite = new TestSuite; $suite->addTestSuite(\EmptyTestCaseTest::class); - $sorter = new TestSuiteSorter(); + $sorter = new TestSuiteSorter; $sorter->reorderTestsInSuite($suite, TestSuiteSorter::ORDER_DEFAULT, false, TestSuiteSorter::ORDER_DEFAULT); @@ -486,11 +605,4 @@ class TestSuiteSorterTest extends TestCase return $data; } - - private function getTestExecutionOrder(TestSuite $suite): array - { - return \array_map(function ($test) { - return $test->getName(); - }, $suite->tests()[0]->tests()); - } } diff --git a/vendor/phpunit/phpunit/tests/unit/TextUI/TestRunnerTest.php b/vendor/phpunit/phpunit/tests/unit/TextUI/TestRunnerTest.php index a16bc2c79..e0fe8623e 100644 --- a/vendor/phpunit/phpunit/tests/unit/TextUI/TestRunnerTest.php +++ b/vendor/phpunit/phpunit/tests/unit/TextUI/TestRunnerTest.php @@ -15,14 +15,14 @@ class TestRunnerTest extends TestCase { public function testTestIsRunnable(): void { - $runner = new TestRunner(); + $runner = new TestRunner; $runner->setPrinter($this->getResultPrinterMock()); - $runner->doRun(new \Success(), ['filter' => 'foo'], false); + $runner->doRun(new \Success, ['filter' => 'foo'], false); } public function testSuiteIsRunnable(): void { - $runner = new TestRunner(); + $runner = new TestRunner; $runner->setPrinter($this->getResultPrinterMock()); $runner->doRun($this->getSuiteMock(), ['filter' => 'foo'], false); } diff --git a/vendor/phpunit/phpunit/tests/unit/Util/ConfigurationTest.php b/vendor/phpunit/phpunit/tests/unit/Util/ConfigurationTest.php index 95d8652eb..8e34e85ee 100644 --- a/vendor/phpunit/phpunit/tests/unit/Util/ConfigurationTest.php +++ b/vendor/phpunit/phpunit/tests/unit/Util/ConfigurationTest.php @@ -428,11 +428,19 @@ class ConfigurationTest extends TestCase */ public function testHandlePHPConfigurationDoesNotOverriteVariablesFromPutEnv(): void { + $backupFoo = \getenv('foo'); + \putenv('foo=putenv'); $this->configuration->handlePHPConfiguration(); $this->assertEquals('putenv', $_ENV['foo']); $this->assertEquals('putenv', \getenv('foo')); + + if ($backupFoo === false) { + \putenv('foo'); // delete variable from environment + } else { + \putenv("foo=$backupFoo"); + } } /** diff --git a/vendor/phpunit/phpunit/tests/unit/Util/TestDox/CliTestDoxPrinterTest.php b/vendor/phpunit/phpunit/tests/unit/Util/TestDox/CliTestDoxPrinterTest.php index 6429459d0..39b913d6c 100644 --- a/vendor/phpunit/phpunit/tests/unit/Util/TestDox/CliTestDoxPrinterTest.php +++ b/vendor/phpunit/phpunit/tests/unit/Util/TestDox/CliTestDoxPrinterTest.php @@ -73,7 +73,7 @@ final class CliTestDoxPrinterTest extends TestCase public function testPrintsCrossForTestWithError(): void { $this->printer->startTest($this); - $this->printer->addError($this, new Exception(), 0); + $this->printer->addError($this, new Exception, 0); $this->printer->endTest($this, 0.001); $this->assertContains('✘', $this->printer->getBuffer()); @@ -82,7 +82,7 @@ final class CliTestDoxPrinterTest extends TestCase public function testPrintsAdditionalInformationForTestWithError(): void { $this->printer->startTest($this); - $this->printer->addError($this, new Exception(), 0); + $this->printer->addError($this, new Exception, 0); $this->printer->endTest($this, 0.001); $this->assertContains('│', $this->printer->getBuffer()); @@ -91,7 +91,7 @@ final class CliTestDoxPrinterTest extends TestCase public function testPrintsCrossForTestWithWarning(): void { $this->printer->startTest($this); - $this->printer->addWarning($this, new Warning(), 0); + $this->printer->addWarning($this, new Warning, 0); $this->printer->endTest($this, 0.001); $this->assertContains('✘', $this->printer->getBuffer()); @@ -100,7 +100,7 @@ final class CliTestDoxPrinterTest extends TestCase public function testPrintsAdditionalInformationForTestWithWarning(): void { $this->printer->startTest($this); - $this->printer->addWarning($this, new Warning(), 0); + $this->printer->addWarning($this, new Warning, 0); $this->printer->endTest($this, 0.001); $this->assertContains('│', $this->printer->getBuffer()); @@ -109,7 +109,7 @@ final class CliTestDoxPrinterTest extends TestCase public function testPrintsCrossForTestWithFailure(): void { $this->printer->startTest($this); - $this->printer->addFailure($this, new AssertionFailedError(), 0); + $this->printer->addFailure($this, new AssertionFailedError, 0); $this->printer->endTest($this, 0.001); $this->assertContains('✘', $this->printer->getBuffer()); @@ -118,7 +118,7 @@ final class CliTestDoxPrinterTest extends TestCase public function testPrintsAdditionalInformationForTestWithFailure(): void { $this->printer->startTest($this); - $this->printer->addFailure($this, new AssertionFailedError(), 0); + $this->printer->addFailure($this, new AssertionFailedError, 0); $this->printer->endTest($this, 0.001); $this->assertContains('│', $this->printer->getBuffer()); @@ -127,7 +127,7 @@ final class CliTestDoxPrinterTest extends TestCase public function testPrintsEmptySetSymbolForTestWithFailure(): void { $this->printer->startTest($this); - $this->printer->addIncompleteTest($this, new Exception(), 0); + $this->printer->addIncompleteTest($this, new Exception, 0); $this->printer->endTest($this, 0.001); $this->assertContains('∅', $this->printer->getBuffer()); @@ -136,7 +136,7 @@ final class CliTestDoxPrinterTest extends TestCase public function testDoesNotPrintAdditionalInformationForIncompleteTestByDefault(): void { $this->printer->startTest($this); - $this->printer->addIncompleteTest($this, new Exception(), 0); + $this->printer->addIncompleteTest($this, new Exception, 0); $this->printer->endTest($this, 0.001); $this->assertNotContains('│', $this->printer->getBuffer()); @@ -155,7 +155,7 @@ final class CliTestDoxPrinterTest extends TestCase public function testPrintsRadioactiveSymbolForRiskyTest(): void { $this->printer->startTest($this); - $this->printer->addRiskyTest($this, new Exception(), 0); + $this->printer->addRiskyTest($this, new Exception, 0); $this->printer->endTest($this, 0.001); $this->assertContains('☢', $this->printer->getBuffer()); @@ -164,7 +164,7 @@ final class CliTestDoxPrinterTest extends TestCase public function testDoesNotPrintAdditionalInformationForRiskyTestByDefault(): void { $this->printer->startTest($this); - $this->printer->addRiskyTest($this, new Exception(), 0); + $this->printer->addRiskyTest($this, new Exception, 0); $this->printer->endTest($this, 0.001); $this->assertNotContains('│', $this->printer->getBuffer()); @@ -173,7 +173,7 @@ final class CliTestDoxPrinterTest extends TestCase public function testPrintsAdditionalInformationForRiskyTestInVerboseMode(): void { $this->verbosePrinter->startTest($this); - $this->verbosePrinter->addRiskyTest($this, new Exception(), 0); + $this->verbosePrinter->addRiskyTest($this, new Exception, 0); $this->verbosePrinter->endTest($this, 0.001); $this->assertContains('│', $this->verbosePrinter->getBuffer()); @@ -182,7 +182,7 @@ final class CliTestDoxPrinterTest extends TestCase public function testPrintsArrowForSkippedTest(): void { $this->printer->startTest($this); - $this->printer->addSkippedTest($this, new Exception(), 0); + $this->printer->addSkippedTest($this, new Exception, 0); $this->printer->endTest($this, 0.001); $this->assertContains('→', $this->printer->getBuffer()); @@ -191,7 +191,7 @@ final class CliTestDoxPrinterTest extends TestCase public function testDoesNotPrintAdditionalInformationForSkippedTestByDefault(): void { $this->printer->startTest($this); - $this->printer->addSkippedTest($this, new Exception(), 0); + $this->printer->addSkippedTest($this, new Exception, 0); $this->printer->endTest($this, 0.001); $this->assertNotContains('│', $this->printer->getBuffer()); diff --git a/vendor/phpunit/phpunit/tests/unit/Util/TestDox/NamePrettifierTest.php b/vendor/phpunit/phpunit/tests/unit/Util/TestDox/NamePrettifierTest.php index 1c215bff3..a09704713 100644 --- a/vendor/phpunit/phpunit/tests/unit/Util/TestDox/NamePrettifierTest.php +++ b/vendor/phpunit/phpunit/tests/unit/Util/TestDox/NamePrettifierTest.php @@ -57,4 +57,116 @@ class NamePrettifierTest extends TestCase $this->assertEquals('Sets redirect header on 301', $this->namePrettifier->prettifyTestMethod('testSetsRedirectHeaderOn301')); $this->assertEquals('Sets redirect header on 302', $this->namePrettifier->prettifyTestMethod('testSetsRedirectHeaderOn302')); } + + public function testPhpDoxIgnoreDataKeys(): void + { + $test = new class extends TestCase { + public function __construct() + { + parent::__construct('testAddition', [ + 'augend' => 1, + 'addend' => 2, + 'result' => 3, + ]); + } + + public function testAddition(int $augend, int $addend, int $result): void + { + } + + public function getAnnotations(): array + { + return [ + 'method' => [ + 'testdox' => ['$augend + $addend = $result'], + ], + ]; + } + }; + + $this->assertEquals('1 + 2 = 3', $this->namePrettifier->prettifyTestCase($test)); + } + + public function testPhpDoxUsesDefaultValue(): void + { + $test = new class extends TestCase { + public function __construct() + { + parent::__construct('testAddition', []); + } + + public function testAddition(int $augend = 1, int $addend = 2, int $result = 3): void + { + } + + public function getAnnotations(): array + { + return [ + 'method' => [ + 'testdox' => ['$augend + $addend = $result'], + ], + ]; + } + }; + + $this->assertEquals('1 + 2 = 3', $this->namePrettifier->prettifyTestCase($test)); + } + + public function testPhpDoxArgumentExporting(): void + { + $test = new class extends TestCase { + public function __construct() + { + parent::__construct('testExport', [ + 'int' => 1234, + 'strInt' => '1234', + 'float' => 2.123, + 'strFloat' => '2.123', + 'string' => 'foo', + 'bool' => true, + 'null' => null, + ]); + } + + public function testExport($int, $strInt, $float, $strFloat, $string, $bool, $null): void + { + } + + public function getAnnotations(): array + { + return [ + 'method' => [ + 'testdox' => ['$int, $strInt, $float, $strFloat, $string, $bool, $null'], + ], + ]; + } + }; + + $this->assertEquals('1234, 1234, 2.123, 2.123, foo, true, NULL', $this->namePrettifier->prettifyTestCase($test)); + } + + public function testPhpDoxReplacesLongerVariablesFirst(): void + { + $test = new class extends TestCase { + public function __construct() + { + parent::__construct('testFoo', []); + } + + public function testFoo(int $a = 1, int $ab = 2, int $abc = 3): void + { + } + + public function getAnnotations(): array + { + return [ + 'method' => [ + 'testdox' => ['$a, "$a", $a$ab, $abc, $abcd, $ab'], + ], + ]; + } + }; + + $this->assertEquals('1, "1", 12, 3, $abcd, 2', $this->namePrettifier->prettifyTestCase($test)); + } } diff --git a/vendor/phpunit/phpunit/tests/unit/Util/TestResultCacheTest.php b/vendor/phpunit/phpunit/tests/unit/Util/TestResultCacheTest.php index 3d3d987b9..442a49721 100644 --- a/vendor/phpunit/phpunit/tests/unit/Util/TestResultCacheTest.php +++ b/vendor/phpunit/phpunit/tests/unit/Util/TestResultCacheTest.php @@ -22,8 +22,8 @@ class TestResultCacheTest extends TestCase $cache = new TestResultCache($cacheFile); $cache->load(); - $this->assertSame(BaseTestRunner::STATUS_UNKNOWN, $cache->getState('testOne')); - $this->assertSame(BaseTestRunner::STATUS_SKIPPED, $cache->getState('testFive')); + $this->assertSame(BaseTestRunner::STATUS_UNKNOWN, $cache->getState(\MultiDependencyTest::class . '::testOne')); + $this->assertSame(BaseTestRunner::STATUS_SKIPPED, $cache->getState(\MultiDependencyTest::class . '::testFive')); } public function testDoesClearCacheBeforeLoad(): void @@ -32,12 +32,12 @@ class TestResultCacheTest extends TestCase $cache = new TestResultCache($cacheFile); $cache->setState('someTest', BaseTestRunner::STATUS_FAILURE); - $this->assertSame(BaseTestRunner::STATUS_UNKNOWN, $cache->getState('testFive')); + $this->assertSame(BaseTestRunner::STATUS_UNKNOWN, $cache->getState(\MultiDependencyTest::class . '::testFive')); $cache->load(); - $this->assertSame(BaseTestRunner::STATUS_UNKNOWN, $cache->getState('someTest')); - $this->assertSame(BaseTestRunner::STATUS_SKIPPED, $cache->getState('testFive')); + $this->assertSame(BaseTestRunner::STATUS_UNKNOWN, $cache->getState(\MultiDependencyTest::class . '::someTest')); + $this->assertSame(BaseTestRunner::STATUS_SKIPPED, $cache->getState(\MultiDependencyTest::class . '::testFive')); } public function testShouldNotSerializePassedTestsAsDefectButTimeIsStored(): void diff --git a/vendor/phpunit/phpunit/tests/unit/Util/XmlTest.php b/vendor/phpunit/phpunit/tests/unit/Util/XmlTest.php index 33e7cc9e5..216348355 100644 --- a/vendor/phpunit/phpunit/tests/unit/Util/XmlTest.php +++ b/vendor/phpunit/phpunit/tests/unit/Util/XmlTest.php @@ -95,7 +95,7 @@ class XmlTest extends TestCase public function testXmlToVariableCanHandleMultipleOfTheSameArgumentType(): void { $xml = 'abc'; - $dom = new \DOMDocument(); + $dom = new \DOMDocument; $dom->loadXML($xml); $expected = ['a' => 'a', 'b' => 'b', 'c' => 'c']; @@ -108,7 +108,7 @@ class XmlTest extends TestCase public function testXmlToVariableCanConstructObjectsWithConstructorArgumentsRecursively(): void { $xml = 'one0two'; - $dom = new \DOMDocument(); + $dom = new \DOMDocument; $dom->loadXML($xml); $actual = Xml::xmlToVariable($dom->documentElement); diff --git a/vendor/psr/log/Psr/Log/Test/LoggerInterfaceTest.php b/vendor/psr/log/Psr/Log/Test/LoggerInterfaceTest.php index a0391a52b..4b861c3ef 100644 --- a/vendor/psr/log/Psr/Log/Test/LoggerInterfaceTest.php +++ b/vendor/psr/log/Psr/Log/Test/LoggerInterfaceTest.php @@ -101,6 +101,9 @@ abstract class LoggerInterfaceTest extends \PHPUnit_Framework_TestCase public function testContextCanContainAnything() { + $closed = fopen('php://memory', 'r'); + fclose($closed); + $context = array( 'bool' => true, 'null' => null, @@ -110,6 +113,7 @@ abstract class LoggerInterfaceTest extends \PHPUnit_Framework_TestCase 'nested' => array('with object' => new DummyTest), 'object' => new \DateTime, 'resource' => fopen('php://memory', 'r'), + 'closed' => $closed, ); $this->getLogger()->warning('Crazy context data', $context); diff --git a/vendor/psr/log/Psr/Log/Test/TestLogger.php b/vendor/psr/log/Psr/Log/Test/TestLogger.php new file mode 100644 index 000000000..0cdffe4f9 --- /dev/null +++ b/vendor/psr/log/Psr/Log/Test/TestLogger.php @@ -0,0 +1,146 @@ + $level, + 'message' => $message, + 'context' => $context, + ]; + + $this->recordsByLevel[$record['level']][] = $record; + $this->records[] = $record; + } + + public function hasRecords($level) + { + return isset($this->recordsByLevel[$level]); + } + + public function hasRecord($record, $level) + { + if (is_string($record)) { + $record = ['message' => $record]; + } + return $this->hasRecordThatPasses(function ($rec) use ($record) { + if ($rec['message'] !== $record['message']) { + return false; + } + if (isset($record['context']) && $rec['context'] !== $record['context']) { + return false; + } + return true; + }, $level); + } + + public function hasRecordThatContains($message, $level) + { + return $this->hasRecordThatPasses(function ($rec) use ($message) { + return strpos($rec['message'], $message) !== false; + }, $level); + } + + public function hasRecordThatMatches($regex, $level) + { + return $this->hasRecordThatPasses(function ($rec) use ($regex) { + return preg_match($regex, $rec['message']) > 0; + }, $level); + } + + public function hasRecordThatPasses(callable $predicate, $level) + { + if (!isset($this->recordsByLevel[$level])) { + return false; + } + foreach ($this->recordsByLevel[$level] as $i => $rec) { + if (call_user_func($predicate, $rec, $i)) { + return true; + } + } + return false; + } + + public function __call($method, $args) + { + if (preg_match('/(.*)(Debug|Info|Notice|Warning|Error|Critical|Alert|Emergency)(.*)/', $method, $matches) > 0) { + $genericMethod = $matches[1] . ('Records' !== $matches[3] ? 'Record' : '') . $matches[3]; + $level = strtolower($matches[2]); + if (method_exists($this, $genericMethod)) { + $args[] = $level; + return call_user_func_array([$this, $genericMethod], $args); + } + } + throw new \BadMethodCallException('Call to undefined method ' . get_class($this) . '::' . $method . '()'); + } + + public function reset() + { + $this->records = []; + } +} diff --git a/vendor/psr/log/README.md b/vendor/psr/log/README.md index 574bc1cb2..5571a25e8 100644 --- a/vendor/psr/log/README.md +++ b/vendor/psr/log/README.md @@ -7,6 +7,13 @@ This repository holds all interfaces/classes/traits related to Note that this is not a logger of its own. It is merely an interface that describes a logger. See the specification for more details. +Installation +------------ + +```bash +composer require psr/log +``` + Usage ----- diff --git a/vendor/psy/psysh/box.json.dist b/vendor/psy/psysh/box.json.dist index 32305a525..e302f265e 100644 --- a/vendor/psy/psysh/box.json.dist +++ b/vendor/psy/psysh/box.json.dist @@ -4,7 +4,6 @@ "compactors": [ "KevinGH\\Box\\Compactor\\Php" ], - "chmod": "0755", "blacklist": [ "grammar", "test_old", diff --git a/vendor/psy/psysh/composer.json b/vendor/psy/psysh/composer.json index 7df60cf48..4588ba60a 100644 --- a/vendor/psy/psysh/composer.json +++ b/vendor/psy/psysh/composer.json @@ -20,7 +20,7 @@ "symfony/var-dumper": "~2.7|~3.0|~4.0", "nikic/php-parser": "~1.3|~2.0|~3.0|~4.0", "dnoegel/php-xdg-base-dir": "0.1", - "jakub-onderka/php-console-highlighter": "0.3.*" + "jakub-onderka/php-console-highlighter": "0.3.*|0.4.*" }, "require-dev": { "phpunit/phpunit": "~4.8.35|~5.0|~6.0|~7.0", diff --git a/vendor/psy/psysh/src/CodeCleaner/ListPass.php b/vendor/psy/psysh/src/CodeCleaner/ListPass.php index aabf0c36b..b0d1d73e4 100644 --- a/vendor/psy/psysh/src/CodeCleaner/ListPass.php +++ b/vendor/psy/psysh/src/CodeCleaner/ListPass.php @@ -17,7 +17,9 @@ use PhpParser\Node\Expr\Array_; use PhpParser\Node\Expr\ArrayDimFetch; use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\Assign; +use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Expr\List_; +use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\PropertyFetch; use PhpParser\Node\Expr\Variable; use Psy\Exception\ParseErrorException; @@ -99,14 +101,12 @@ class ListPass extends CodeCleanerPass { $value = ($item instanceof ArrayItem) ? $item->value : $item; - if ($value instanceof Variable) { - return true; + while ($value instanceof ArrayDimFetch || $value instanceof PropertyFetch) { + $value = $value->var; } - if ($value instanceof ArrayDimFetch || $value instanceof PropertyFetch) { - return isset($value->var) && $value->var instanceof Variable; - } - - return false; + // We just kind of give up if it's a method call. We can't tell if it's + // valid via static analysis. + return $value instanceof Variable || $value instanceof MethodCall || $value instanceof FuncCall; } } diff --git a/vendor/psy/psysh/src/ExecutionLoopClosure.php b/vendor/psy/psysh/src/ExecutionLoopClosure.php index 94d3ce2e7..5b8238cf6 100644 --- a/vendor/psy/psysh/src/ExecutionLoopClosure.php +++ b/vendor/psy/psysh/src/ExecutionLoopClosure.php @@ -41,7 +41,9 @@ class ExecutionLoopClosure extends ExecutionClosure try { // Pull in any new execution scope variables - \extract($__psysh__->getScopeVariablesDiff(\get_defined_vars())); + if ($__psysh__->getLastExecSuccess()) { + \extract($__psysh__->getScopeVariablesDiff(\get_defined_vars())); + } // Buffer stdout; we'll need it later \ob_start([$__psysh__, 'writeStdout'], 1); diff --git a/vendor/psy/psysh/src/Readline/Transient.php b/vendor/psy/psysh/src/Readline/Transient.php index e238fdf49..6623bd981 100644 --- a/vendor/psy/psysh/src/Readline/Transient.php +++ b/vendor/psy/psysh/src/Readline/Transient.php @@ -106,7 +106,7 @@ class Transient implements Readline { echo $prompt; - return \rtrim(\fgets($this->getStdin(), 1024)); + return \rtrim(\fgets($this->getStdin()), "\n\r"); } /** diff --git a/vendor/psy/psysh/src/Shell.php b/vendor/psy/psysh/src/Shell.php index 5d3517f23..7a0fbac28 100644 --- a/vendor/psy/psysh/src/Shell.php +++ b/vendor/psy/psysh/src/Shell.php @@ -47,7 +47,7 @@ use Symfony\Component\Console\Output\OutputInterface; */ class Shell extends Application { - const VERSION = 'v0.9.8'; + const VERSION = 'v0.9.9'; const PROMPT = '>>> '; const BUFF_PROMPT = '... '; @@ -73,6 +73,7 @@ class Shell extends Application private $autoCompleter; private $matchers = []; private $commandsMatcher; + private $lastExecSuccess = true; /** * Create a new Psy Shell. @@ -963,6 +964,8 @@ class Shell extends Application */ public function writeReturnValue($ret) { + $this->lastExecSuccess = true; + if ($ret instanceof NoReturnValue) { return; } @@ -986,11 +989,24 @@ class Shell extends Application */ public function writeException(\Exception $e) { + $this->lastExecSuccess = false; $this->context->setLastException($e); $this->output->writeln($this->formatException($e)); $this->resetCodeBuffer(); } + /** + * Check whether the last exec was successful. + * + * Returns true if a return value was logged rather than an exception. + * + * @return bool + */ + public function getLastExecSuccess() + { + return $this->lastExecSuccess; + } + /** * Helper for formatting an exception for writeException(). * diff --git a/vendor/psy/psysh/test/CodeCleaner/ListPassTest.php b/vendor/psy/psysh/test/CodeCleaner/ListPassTest.php index 7481f7c39..b7a360d69 100644 --- a/vendor/psy/psysh/test/CodeCleaner/ListPassTest.php +++ b/vendor/psy/psysh/test/CodeCleaner/ListPassTest.php @@ -100,7 +100,13 @@ class ListPassTest extends CodeCleanerTestCase ['[$a,,$c] = [1,2,3]'], ['[$a,,,] = [1,2,3]'], ['[$a[0], $a[1]] = [1, 2]'], + ['[$a[0][0][0], $a[0][0][1]] = [1, 2]'], ['[$a->b, $a->c] = [1, 2]'], + ['[$a->b[0], $a->c[1]] = [1, 2]'], + ['[$a[0]->b[0], $a[0]->c[1]] = [1, 2]'], + ['[$a[$b->c + $b->d]] = [1]'], + ['[$a->c()->d, $a->c()->e] = [1, 2]'], + ['[x()->a, x()->b] = [1, 2]'], ]); } diff --git a/vendor/psy/psysh/vendor-bin/box/composer.json b/vendor/psy/psysh/vendor-bin/box/composer.json index a5ef20620..13b78794f 100644 --- a/vendor/psy/psysh/vendor-bin/box/composer.json +++ b/vendor/psy/psysh/vendor-bin/box/composer.json @@ -2,6 +2,6 @@ "minimum-stability": "dev", "prefer-stable": true, "require": { - "humbug/box": "^3.0@alpha" + "humbug/box": "^3.1" } } diff --git a/vendor/ralouphie/getallheaders/.gitignore b/vendor/ralouphie/getallheaders/.gitignore new file mode 100644 index 000000000..1324e7d3e --- /dev/null +++ b/vendor/ralouphie/getallheaders/.gitignore @@ -0,0 +1,5 @@ +.idea +.DS_store +/vendor/ +composer.phar +composer.lock diff --git a/vendor/ralouphie/getallheaders/.travis.yml b/vendor/ralouphie/getallheaders/.travis.yml new file mode 100644 index 000000000..f45b55fa0 --- /dev/null +++ b/vendor/ralouphie/getallheaders/.travis.yml @@ -0,0 +1,18 @@ +language: php + +php: + - 5.3 + - 5.4 + - 5.5 + - 5.6 + - 7.0 + +before_script: + - composer install + +script: + - mkdir -p build/logs + - php vendor/bin/phpunit -c phpunit.xml + +after_script: + - php vendor/bin/coveralls -v \ No newline at end of file diff --git a/vendor/ralouphie/getallheaders/LICENSE b/vendor/ralouphie/getallheaders/LICENSE new file mode 100644 index 000000000..be5540c2a --- /dev/null +++ b/vendor/ralouphie/getallheaders/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Ralph Khattar + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/ralouphie/getallheaders/README.md b/vendor/ralouphie/getallheaders/README.md new file mode 100644 index 000000000..f3329d663 --- /dev/null +++ b/vendor/ralouphie/getallheaders/README.md @@ -0,0 +1,19 @@ +getallheaders +============= + +PHP `getallheaders()` polyfill. Compatible with PHP >= 5.3. + +[![Build Status](https://travis-ci.org/ralouphie/getallheaders.svg?branch=master)](https://travis-ci.org/ralouphie/getallheaders) +[![Coverage Status](https://coveralls.io/repos/ralouphie/getallheaders/badge.png?branch=master)](https://coveralls.io/r/ralouphie/getallheaders?branch=master) +[![Latest Stable Version](https://poser.pugx.org/ralouphie/getallheaders/v/stable.png)](https://packagist.org/packages/ralouphie/getallheaders) +[![Latest Unstable Version](https://poser.pugx.org/ralouphie/getallheaders/v/unstable.png)](https://packagist.org/packages/ralouphie/getallheaders) +[![License](https://poser.pugx.org/ralouphie/getallheaders/license.png)](https://packagist.org/packages/ralouphie/getallheaders) + + +This is a simple polyfill for [`getallheaders()`](http://www.php.net/manual/en/function.getallheaders.php). + +## Install + +``` +composer require ralouphie/getallheaders +``` diff --git a/vendor/ralouphie/getallheaders/composer.json b/vendor/ralouphie/getallheaders/composer.json new file mode 100644 index 000000000..5a0d595c9 --- /dev/null +++ b/vendor/ralouphie/getallheaders/composer.json @@ -0,0 +1,21 @@ +{ + "name": "ralouphie/getallheaders", + "description": "A polyfill for getallheaders.", + "license": "MIT", + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "require": { + "php": ">=5.3" + }, + "require-dev": { + "phpunit/phpunit": "~3.7.0", + "satooshi/php-coveralls": ">=1.0" + }, + "autoload": { + "files": ["src/getallheaders.php"] + } +} \ No newline at end of file diff --git a/vendor/ralouphie/getallheaders/phpunit.xml b/vendor/ralouphie/getallheaders/phpunit.xml new file mode 100644 index 000000000..7255b23d9 --- /dev/null +++ b/vendor/ralouphie/getallheaders/phpunit.xml @@ -0,0 +1,22 @@ + + + + ./tests + + + + + src + + + + + + + + \ No newline at end of file diff --git a/vendor/ralouphie/getallheaders/src/getallheaders.php b/vendor/ralouphie/getallheaders/src/getallheaders.php new file mode 100644 index 000000000..c7285a5ba --- /dev/null +++ b/vendor/ralouphie/getallheaders/src/getallheaders.php @@ -0,0 +1,46 @@ + 'Content-Type', + 'CONTENT_LENGTH' => 'Content-Length', + 'CONTENT_MD5' => 'Content-Md5', + ); + + foreach ($_SERVER as $key => $value) { + if (substr($key, 0, 5) === 'HTTP_') { + $key = substr($key, 5); + if (!isset($copy_server[$key]) || !isset($_SERVER[$key])) { + $key = str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', $key)))); + $headers[$key] = $value; + } + } elseif (isset($copy_server[$key])) { + $headers[$copy_server[$key]] = $value; + } + } + + if (!isset($headers['Authorization'])) { + if (isset($_SERVER['REDIRECT_HTTP_AUTHORIZATION'])) { + $headers['Authorization'] = $_SERVER['REDIRECT_HTTP_AUTHORIZATION']; + } elseif (isset($_SERVER['PHP_AUTH_USER'])) { + $basic_pass = isset($_SERVER['PHP_AUTH_PW']) ? $_SERVER['PHP_AUTH_PW'] : ''; + $headers['Authorization'] = 'Basic ' . base64_encode($_SERVER['PHP_AUTH_USER'] . ':' . $basic_pass); + } elseif (isset($_SERVER['PHP_AUTH_DIGEST'])) { + $headers['Authorization'] = $_SERVER['PHP_AUTH_DIGEST']; + } + } + + return $headers; + } + +} diff --git a/vendor/ralouphie/getallheaders/tests/GetAllHeadersTest.php b/vendor/ralouphie/getallheaders/tests/GetAllHeadersTest.php new file mode 100644 index 000000000..8e3d1790a --- /dev/null +++ b/vendor/ralouphie/getallheaders/tests/GetAllHeadersTest.php @@ -0,0 +1,121 @@ + $val) { + $_SERVER[$key] = $val; + } + $result = getallheaders(); + $this->assertEquals($expected, $result, "Error testing $test_type works."); + } + + public function testWorksData() + { + return array( + array( + 'normal case', + array( + 'Key-One' => 'foo', + 'Key-Two' => 'bar', + 'Another-Key-For-Testing' => 'baz' + ), + array( + 'HTTP_KEY_ONE' => 'foo', + 'HTTP_KEY_TWO' => 'bar', + 'HTTP_ANOTHER_KEY_FOR_TESTING' => 'baz' + ) + ), + array( + 'Content-Type', + array( + 'Content-Type' => 'two' + ), + array( + 'HTTP_CONTENT_TYPE' => 'one', + 'CONTENT_TYPE' => 'two' + ) + ), + array( + 'Content-Length', + array( + 'Content-Length' => '222' + ), + array( + 'CONTENT_LENGTH' => '222', + 'HTTP_CONTENT_LENGTH' => '111' + ) + ), + array( + 'Content-Length (HTTP_CONTENT_LENGTH only)', + array( + 'Content-Length' => '111' + ), + array( + 'HTTP_CONTENT_LENGTH' => '111' + ) + ), + array( + 'Content-MD5', + array( + 'Content-Md5' => 'aef123' + ), + array( + 'CONTENT_MD5' => 'aef123', + 'HTTP_CONTENT_MD5' => 'fea321' + ) + ), + array( + 'Content-MD5 (HTTP_CONTENT_MD5 only)', + array( + 'Content-Md5' => 'f123' + ), + array( + 'HTTP_CONTENT_MD5' => 'f123' + ) + ), + array( + 'Authorization (normal)', + array( + 'Authorization' => 'testing' + ), + array( + 'HTTP_AUTHORIZATION' => 'testing', + ) + ), + array( + 'Authorization (redirect)', + array( + 'Authorization' => 'testing redirect' + ), + array( + 'REDIRECT_HTTP_AUTHORIZATION' => 'testing redirect', + ) + ), + array( + 'Authorization (PHP_AUTH_USER + PHP_AUTH_PW)', + array( + 'Authorization' => 'Basic ' . base64_encode('foo:bar') + ), + array( + 'PHP_AUTH_USER' => 'foo', + 'PHP_AUTH_PW' => 'bar' + ) + ), + array( + 'Authorization (PHP_AUTH_DIGEST)', + array( + 'Authorization' => 'example-digest' + ), + array( + 'PHP_AUTH_DIGEST' => 'example-digest' + ) + ) + ); + } +} diff --git a/vendor/sebastian/environment/.github/stale.yml b/vendor/sebastian/environment/.github/stale.yml new file mode 100644 index 000000000..4eadca327 --- /dev/null +++ b/vendor/sebastian/environment/.github/stale.yml @@ -0,0 +1,40 @@ +# Configuration for probot-stale - https://github.com/probot/stale + +# Number of days of inactivity before an Issue or Pull Request becomes stale +daysUntilStale: 60 + +# Number of days of inactivity before a stale Issue or Pull Request is closed. +# Set to false to disable. If disabled, issues still need to be closed manually, but will remain marked as stale. +daysUntilClose: 7 + +# Issues or Pull Requests with these labels will never be considered stale. Set to `[]` to disable +exemptLabels: + - enhancement + +# Set to true to ignore issues in a project (defaults to false) +exemptProjects: false + +# Set to true to ignore issues in a milestone (defaults to false) +exemptMilestones: false + +# Label to use when marking as stale +staleLabel: stale + +# Comment to post when marking as stale. Set to `false` to disable +markComment: > + This issue has been automatically marked as stale because it has not had activity within the last 60 days. It will be closed after 7 days if no further activity occurs. Thank you for your contributions. + +# Comment to post when removing the stale label. +# unmarkComment: > +# Your comment here. + +# Comment to post when closing a stale Issue or Pull Request. +closeComment: > + This issue has been automatically closed because it has not had activity since it was marked as stale. Thank you for your contributions. + +# Limit the number of actions per hour, from 1-30. Default is 30 +limitPerRun: 30 + +# Limit to only `issues` or `pulls` +only: issues + diff --git a/vendor/sebastian/environment/.php_cs b/vendor/sebastian/environment/.php_cs deleted file mode 100644 index 89b9ca3a0..000000000 --- a/vendor/sebastian/environment/.php_cs +++ /dev/null @@ -1,79 +0,0 @@ - - -For the full copyright and license information, please view the LICENSE -file that was distributed with this source code. -EOF; - -return PhpCsFixer\Config::create() - ->setRiskyAllowed(true) - ->setRules( - [ - 'array_syntax' => ['syntax' => 'short'], - 'binary_operator_spaces' => [ - 'align_double_arrow' => true, - 'align_equals' => true - ], - 'blank_line_after_namespace' => true, - 'blank_line_before_return' => true, - 'braces' => true, - 'cast_spaces' => true, - 'concat_space' => ['spacing' => 'one'], - 'elseif' => true, - 'encoding' => true, - 'full_opening_tag' => true, - 'function_declaration' => true, - #'header_comment' => ['header' => $header, 'separate' => 'none'], - 'indentation_type' => true, - 'line_ending' => true, - 'lowercase_constants' => true, - 'lowercase_keywords' => true, - 'method_argument_space' => true, - 'native_function_invocation' => true, - 'no_alias_functions' => true, - 'no_blank_lines_after_class_opening' => true, - 'no_blank_lines_after_phpdoc' => true, - 'no_closing_tag' => true, - 'no_empty_phpdoc' => true, - 'no_empty_statement' => true, - 'no_extra_consecutive_blank_lines' => true, - 'no_leading_namespace_whitespace' => true, - 'no_singleline_whitespace_before_semicolons' => true, - 'no_spaces_after_function_name' => true, - 'no_spaces_inside_parenthesis' => true, - 'no_trailing_comma_in_list_call' => true, - 'no_trailing_whitespace' => true, - 'no_unused_imports' => true, - 'no_whitespace_in_blank_line' => true, - 'phpdoc_align' => true, - 'phpdoc_indent' => true, - 'phpdoc_no_access' => true, - 'phpdoc_no_empty_return' => true, - 'phpdoc_no_package' => true, - 'phpdoc_scalar' => true, - 'phpdoc_separation' => true, - 'phpdoc_to_comment' => true, - 'phpdoc_trim' => true, - 'phpdoc_types' => true, - 'phpdoc_var_without_name' => true, - 'self_accessor' => true, - 'simplified_null_return' => true, - 'single_blank_line_at_eof' => true, - 'single_import_per_statement' => true, - 'single_line_after_imports' => true, - 'single_quote' => true, - 'ternary_operator_spaces' => true, - 'trim_array_spaces' => true, - 'visibility_required' => true, - ] - ) - ->setFinder( - PhpCsFixer\Finder::create() - ->files() - ->in(__DIR__ . '/src') - ->in(__DIR__ . '/tests') - ->name('*.php') - ); diff --git a/vendor/sebastian/environment/.php_cs.dist b/vendor/sebastian/environment/.php_cs.dist new file mode 100644 index 000000000..67dd70e05 --- /dev/null +++ b/vendor/sebastian/environment/.php_cs.dist @@ -0,0 +1,199 @@ + + +For the full copyright and license information, please view the LICENSE +file that was distributed with this source code. +EOF; + +return PhpCsFixer\Config::create() + ->setRiskyAllowed(true) + ->setRules( + [ + 'align_multiline_comment' => true, + 'array_indentation' => true, + 'array_syntax' => ['syntax' => 'short'], + 'binary_operator_spaces' => [ + 'operators' => [ + '=' => 'align', + '=>' => 'align', + ], + ], + 'blank_line_after_namespace' => true, + 'blank_line_before_statement' => [ + 'statements' => [ + 'break', + 'continue', + 'declare', + 'do', + 'for', + 'foreach', + 'if', + 'include', + 'include_once', + 'require', + 'require_once', + 'return', + 'switch', + 'throw', + 'try', + 'while', + 'yield', + ], + ], + 'braces' => true, + 'cast_spaces' => true, + 'class_attributes_separation' => ['elements' => ['const', 'method', 'property']], + 'combine_consecutive_issets' => true, + 'combine_consecutive_unsets' => true, + 'combine_nested_dirname' => true, + 'compact_nullable_typehint' => true, + 'concat_space' => ['spacing' => 'one'], + 'declare_equal_normalize' => ['space' => 'none'], + 'declare_strict_types' => true, + 'dir_constant' => true, + 'elseif' => true, + 'encoding' => true, + 'full_opening_tag' => true, + 'function_declaration' => true, + 'header_comment' => ['header' => $header, 'separate' => 'none'], + 'indentation_type' => true, + 'is_null' => true, + 'line_ending' => true, + 'list_syntax' => ['syntax' => 'short'], + 'logical_operators' => true, + 'lowercase_cast' => true, + 'lowercase_constants' => true, + 'lowercase_keywords' => true, + 'lowercase_static_reference' => true, + 'magic_constant_casing' => true, + 'method_argument_space' => ['ensure_fully_multiline' => true], + 'modernize_types_casting' => true, + 'multiline_comment_opening_closing' => true, + 'multiline_whitespace_before_semicolons' => true, + 'native_constant_invocation' => true, + 'native_function_casing' => true, + 'native_function_invocation' => true, + 'new_with_braces' => false, + 'no_alias_functions' => true, + 'no_alternative_syntax' => true, + 'no_blank_lines_after_class_opening' => true, + 'no_blank_lines_after_phpdoc' => true, + 'no_blank_lines_before_namespace' => true, + 'no_closing_tag' => true, + 'no_empty_comment' => true, + 'no_empty_phpdoc' => true, + 'no_empty_statement' => true, + 'no_extra_blank_lines' => true, + 'no_homoglyph_names' => true, + 'no_leading_import_slash' => true, + 'no_leading_namespace_whitespace' => true, + 'no_mixed_echo_print' => ['use' => 'print'], + 'no_multiline_whitespace_around_double_arrow' => true, + 'no_null_property_initialization' => true, + 'no_php4_constructor' => true, + 'no_short_bool_cast' => true, + 'no_short_echo_tag' => true, + 'no_singleline_whitespace_before_semicolons' => true, + 'no_spaces_after_function_name' => true, + 'no_spaces_inside_parenthesis' => true, + 'no_superfluous_elseif' => true, + 'no_superfluous_phpdoc_tags' => true, + 'no_trailing_comma_in_list_call' => true, + 'no_trailing_comma_in_singleline_array' => true, + 'no_trailing_whitespace' => true, + 'no_trailing_whitespace_in_comment' => true, + 'no_unneeded_control_parentheses' => true, + 'no_unneeded_curly_braces' => true, + 'no_unneeded_final_method' => true, + 'no_unreachable_default_argument_value' => true, + 'no_unset_on_property' => true, + 'no_unused_imports' => true, + 'no_useless_else' => true, + 'no_useless_return' => true, + 'no_whitespace_before_comma_in_array' => true, + 'no_whitespace_in_blank_line' => true, + 'non_printable_character' => true, + 'normalize_index_brace' => true, + 'object_operator_without_whitespace' => true, + 'ordered_class_elements' => [ + 'order' => [ + 'use_trait', + 'constant_public', + 'constant_protected', + 'constant_private', + 'property_public_static', + 'property_protected_static', + 'property_private_static', + 'property_public', + 'property_protected', + 'property_private', + 'method_public_static', + 'construct', + 'destruct', + 'magic', + 'phpunit', + 'method_public', + 'method_protected', + 'method_private', + 'method_protected_static', + 'method_private_static', + ], + ], + 'ordered_imports' => true, + 'phpdoc_add_missing_param_annotation' => true, + 'phpdoc_align' => true, + 'phpdoc_annotation_without_dot' => true, + 'phpdoc_indent' => true, + 'phpdoc_no_access' => true, + 'phpdoc_no_empty_return' => true, + 'phpdoc_no_package' => true, + 'phpdoc_order' => true, + 'phpdoc_return_self_reference' => true, + 'phpdoc_scalar' => true, + 'phpdoc_separation' => true, + 'phpdoc_single_line_var_spacing' => true, + 'phpdoc_to_comment' => true, + 'phpdoc_trim' => true, + 'phpdoc_trim_consecutive_blank_line_separation' => true, + 'phpdoc_types' => true, + 'phpdoc_types_order' => true, + 'phpdoc_var_without_name' => true, + 'pow_to_exponentiation' => true, + 'protected_to_private' => true, + 'random_api_migration' => true, + 'return_assignment' => true, + 'return_type_declaration' => ['space_before' => 'none'], + 'self_accessor' => true, + 'semicolon_after_instruction' => true, + 'set_type_to_cast' => true, + 'short_scalar_cast' => true, + 'simplified_null_return' => true, + 'single_blank_line_at_eof' => true, + 'single_import_per_statement' => true, + 'single_line_after_imports' => true, + 'single_quote' => true, + 'standardize_not_equals' => true, + 'ternary_to_null_coalescing' => true, + 'trailing_comma_in_multiline_array' => true, + 'trim_array_spaces' => true, + 'unary_operator_spaces' => true, + 'visibility_required' => [ + 'elements' => [ + 'const', + 'method', + 'property', + ], + ], + 'void_return' => true, + 'whitespace_after_comma_in_array' => true, + ] + ) + ->setFinder( + PhpCsFixer\Finder::create() + ->files() + ->in(__DIR__ . '/src') + ->in(__DIR__ . '/tests') + ); diff --git a/vendor/sebastian/environment/.travis.yml b/vendor/sebastian/environment/.travis.yml index 79208c350..69913aa03 100644 --- a/vendor/sebastian/environment/.travis.yml +++ b/vendor/sebastian/environment/.travis.yml @@ -1,18 +1,9 @@ language: php -sudo: false - -before_install: - - composer self-update - -install: - - travis_retry composer install --no-interaction --prefer-source - php: - - 7.0 - - 7.0snapshot - 7.1 - - 7.1snapshot + - 7.2 + - 7.3 - master sudo: false @@ -22,7 +13,7 @@ before_install: - composer clear-cache install: - - travis_retry composer update --no-interaction --no-ansi --no-progress --no-suggest --optimize-autoloader --prefer-stable + - travis_retry composer update --no-interaction --no-ansi --no-progress --no-suggest script: - ./vendor/bin/phpunit --coverage-clover=coverage.xml diff --git a/vendor/sebastian/environment/ChangeLog.md b/vendor/sebastian/environment/ChangeLog.md index 839d85c8a..d0fbc3d14 100644 --- a/vendor/sebastian/environment/ChangeLog.md +++ b/vendor/sebastian/environment/ChangeLog.md @@ -2,6 +2,22 @@ All notable changes in `sebastianbergmann/environment` are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. +## [4.0.1] - 2018-11-25 + +### Fixed + +* Fixed [#31](https://github.com/sebastianbergmann/environment/issues/31): Regressions in `Console` class + +## [4.0.0] - 2018-10-23 [YANKED] + +### Fixed + +* Fixed [#25](https://github.com/sebastianbergmann/environment/pull/25): `Console::hasColorSupport()` does not work on Windows + +### Removed + +* This component is no longer supported on PHP 7.0 + ## [3.1.0] - 2017-07-01 ### Added @@ -42,6 +58,8 @@ All notable changes in `sebastianbergmann/environment` are documented in this fi * This component is no longer supported on PHP 5.6 +[4.0.1]: https://github.com/sebastianbergmann/phpunit/compare/66691f8e2dc4641909166b275a9a4f45c0e89092...4.0.1 +[4.0.0]: https://github.com/sebastianbergmann/phpunit/compare/3.1.0...66691f8e2dc4641909166b275a9a4f45c0e89092 [3.1.0]: https://github.com/sebastianbergmann/phpunit/compare/3.0...3.1.0 [3.0.4]: https://github.com/sebastianbergmann/phpunit/compare/3.0.3...3.0.4 [3.0.3]: https://github.com/sebastianbergmann/phpunit/compare/3.0.2...3.0.3 diff --git a/vendor/sebastian/environment/LICENSE b/vendor/sebastian/environment/LICENSE index 168c4ee72..9f80e2282 100644 --- a/vendor/sebastian/environment/LICENSE +++ b/vendor/sebastian/environment/LICENSE @@ -1,6 +1,6 @@ sebastian/environment -Copyright (c) 2014-2017, Sebastian Bergmann . +Copyright (c) 2014-2018, Sebastian Bergmann . All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/vendor/sebastian/environment/README.md b/vendor/sebastian/environment/README.md index f0827ff8d..3e854af35 100644 --- a/vendor/sebastian/environment/README.md +++ b/vendor/sebastian/environment/README.md @@ -3,7 +3,7 @@ This component provides functionality that helps writing PHP code that has runtime-specific (PHP / HHVM) execution paths. [![Latest Stable Version](https://img.shields.io/packagist/v/sebastian/environment.svg?style=flat-square)](https://packagist.org/packages/sebastian/environment) -[![Minimum PHP Version](https://img.shields.io/badge/php-%3E%3D%207.0-8892BF.svg?style=flat-square)](https://php.net/) +[![Minimum PHP Version](https://img.shields.io/badge/php-%3E%3D%207.1-8892BF.svg?style=flat-square)](https://php.net/) [![Build Status](https://travis-ci.org/sebastianbergmann/environment.svg?branch=master)](https://travis-ci.org/sebastianbergmann/environment) ## Installation diff --git a/vendor/sebastian/environment/build.xml b/vendor/sebastian/environment/build.xml index ea8be0194..591a58bbf 100644 --- a/vendor/sebastian/environment/build.xml +++ b/vendor/sebastian/environment/build.xml @@ -1,21 +1,19 @@ - + - - - - + + + + - - - - - - - - - - - + + + + + + + + + diff --git a/vendor/sebastian/environment/composer.json b/vendor/sebastian/environment/composer.json index 3086774cd..8925c7ace 100644 --- a/vendor/sebastian/environment/composer.json +++ b/vendor/sebastian/environment/composer.json @@ -10,12 +10,16 @@ "email": "sebastian@phpunit.de" } ], + "config": { + "optimize-autoloader": true, + "sort-packages": true + }, "prefer-stable": true, "require": { - "php": "^7.0" + "php": "^7.1" }, "require-dev": { - "phpunit/phpunit": "^6.1" + "phpunit/phpunit": "^7.4" }, "autoload": { "classmap": [ @@ -24,7 +28,7 @@ }, "extra": { "branch-alias": { - "dev-master": "3.1.x-dev" + "dev-master": "4.0-dev" } } } diff --git a/vendor/sebastian/environment/phpunit.xml b/vendor/sebastian/environment/phpunit.xml index 6c5092485..c63fea235 100644 --- a/vendor/sebastian/environment/phpunit.xml +++ b/vendor/sebastian/environment/phpunit.xml @@ -1,14 +1,16 @@ - - tests - + + + tests + + diff --git a/vendor/sebastian/environment/src/Console.php b/vendor/sebastian/environment/src/Console.php index 1d8c2cc03..442d62d53 100644 --- a/vendor/sebastian/environment/src/Console.php +++ b/vendor/sebastian/environment/src/Console.php @@ -1,4 +1,4 @@ -isWindows()) { // @codeCoverageIgnoreStart - return false !== \getenv('ANSICON') || 'ON' === \getenv('ConEmuANSI') || 'xterm' === \getenv('TERM'); + return (\defined('STDOUT') && \function_exists('sapi_windows_vt100_support') && @sapi_windows_vt100_support(\STDOUT)) + || false !== \getenv('ANSICON') + || 'ON' === \getenv('ConEmuANSI') + || 'xterm' === \getenv('TERM'); // @codeCoverageIgnoreEnd } @@ -49,7 +53,13 @@ final class Console // @codeCoverageIgnoreEnd } - return $this->isInteractive(STDOUT); + if ($this->isInteractive(\STDOUT)) { + return true; + } + + $stat = @\fstat(\STDOUT); + // Check if formatted mode is S_IFCHR + return $stat ? 0020000 === ($stat['mode'] & 0170000) : false; } /** @@ -63,7 +73,7 @@ final class Console return $this->getNumberOfColumnsWindows(); } - if (!$this->isInteractive(self::STDIN)) { + if (!$this->isInteractive(\defined('STDIN') ? \STDIN : self::STDIN)) { return 80; } @@ -73,16 +83,20 @@ final class Console /** * Returns if the file descriptor is an interactive terminal or not. * + * Normally, we want to use a resource as a parameter, yet sadly it's not always awailable, + * eg when running code in interactive console (`php -a`), STDIN/STDOUT/STDERR constants are not defined. + * * @param int|resource $fileDescriptor */ public function isInteractive($fileDescriptor = self::STDOUT): bool { - return \function_exists('posix_isatty') && @\posix_isatty($fileDescriptor); + return (\is_resource($fileDescriptor) && \function_exists('stream_isatty') && @\stream_isatty($fileDescriptor)) // stream_isatty requires that descriptor is a real resource, not numeric ID of it + || (\function_exists('posix_isatty') && @\posix_isatty($fileDescriptor)); } private function isWindows(): bool { - return DIRECTORY_SEPARATOR === '\\'; + return \DIRECTORY_SEPARATOR === '\\'; } /** @@ -120,7 +134,7 @@ final class Console 'mode CON', [ 1 => ['pipe', 'w'], - 2 => ['pipe', 'w'] + 2 => ['pipe', 'w'], ], $pipes, null, diff --git a/vendor/sebastian/environment/src/OperatingSystem.php b/vendor/sebastian/environment/src/OperatingSystem.php index fa20e1e9c..67a35bc9a 100644 --- a/vendor/sebastian/environment/src/OperatingSystem.php +++ b/vendor/sebastian/environment/src/OperatingSystem.php @@ -1,4 +1,4 @@ -isHHVM()) { // @codeCoverageIgnoreStart if ((self::$binary = \getenv('PHP_BINARY')) === false) { - self::$binary = PHP_BINARY; + self::$binary = \PHP_BINARY; } self::$binary = \escapeshellarg(self::$binary) . ' --php' . @@ -67,21 +64,22 @@ final class Runtime // @codeCoverageIgnoreEnd } - if (self::$binary === null && PHP_BINARY !== '') { - self::$binary = \escapeshellarg(PHP_BINARY); + if (self::$binary === null && \PHP_BINARY !== '') { + self::$binary = \escapeshellarg(\PHP_BINARY); } if (self::$binary === null) { // @codeCoverageIgnoreStart $possibleBinaryLocations = [ - PHP_BINDIR . '/php', - PHP_BINDIR . '/php-cli.exe', - PHP_BINDIR . '/php.exe' + \PHP_BINDIR . '/php', + \PHP_BINDIR . '/php-cli.exe', + \PHP_BINDIR . '/php.exe', ]; foreach ($possibleBinaryLocations as $binary) { if (\is_readable($binary)) { self::$binary = \escapeshellarg($binary); + break; } } @@ -138,7 +136,7 @@ final class Runtime // @codeCoverageIgnoreEnd } - return PHP_VERSION; + return \PHP_VERSION; } /** @@ -170,7 +168,7 @@ final class Runtime */ public function isPHPDBG(): bool { - return PHP_SAPI === 'phpdbg' && !$this->isHHVM(); + return \PHP_SAPI === 'phpdbg' && !$this->isHHVM(); } /** diff --git a/vendor/sebastian/environment/tests/ConsoleTest.php b/vendor/sebastian/environment/tests/ConsoleTest.php index f8983cc1a..572e82ac7 100644 --- a/vendor/sebastian/environment/tests/ConsoleTest.php +++ b/vendor/sebastian/environment/tests/ConsoleTest.php @@ -1,4 +1,4 @@ -console = new Console; } @@ -33,7 +30,7 @@ final class ConsoleTest extends TestCase * @todo Now that this component is PHP 7-only and uses return type declarations * this test makes even less sense than before */ - public function testCanDetectIfStdoutIsInteractiveByDefault()/*: void*/ + public function testCanDetectIfStdoutIsInteractiveByDefault(): void { $this->assertInternalType('boolean', $this->console->isInteractive()); } @@ -42,16 +39,16 @@ final class ConsoleTest extends TestCase * @todo Now that this component is PHP 7-only and uses return type declarations * this test makes even less sense than before */ - public function testCanDetectIfFileDescriptorIsInteractive()/*: void*/ + public function testCanDetectIfFileDescriptorIsInteractive(): void { - $this->assertInternalType('boolean', $this->console->isInteractive(STDOUT)); + $this->assertInternalType('boolean', $this->console->isInteractive(\STDOUT)); } /** * @todo Now that this component is PHP 7-only and uses return type declarations * this test makes even less sense than before */ - public function testCanDetectColorSupport()/*: void*/ + public function testCanDetectColorSupport(): void { $this->assertInternalType('boolean', $this->console->hasColorSupport()); } @@ -60,7 +57,7 @@ final class ConsoleTest extends TestCase * @todo Now that this component is PHP 7-only and uses return type declarations * this test makes even less sense than before */ - public function testCanDetectNumberOfColumns()/*: void*/ + public function testCanDetectNumberOfColumns(): void { $this->assertInternalType('integer', $this->console->getNumberOfColumns()); } diff --git a/vendor/sebastian/environment/tests/OperatingSystemTest.php b/vendor/sebastian/environment/tests/OperatingSystemTest.php index 56008fba2..e311cb17f 100644 --- a/vendor/sebastian/environment/tests/OperatingSystemTest.php +++ b/vendor/sebastian/environment/tests/OperatingSystemTest.php @@ -1,4 +1,4 @@ -os = new OperatingSystem; } @@ -32,7 +29,7 @@ final class OperatingSystemTest extends TestCase /** * @requires OS Linux */ - public function testFamilyCanBeRetrieved()/*: void*/ + public function testFamilyCanBeRetrieved(): void { $this->assertEquals('Linux', $this->os->getFamily()); } diff --git a/vendor/sebastian/environment/tests/RuntimeTest.php b/vendor/sebastian/environment/tests/RuntimeTest.php index 2b40cb258..c10d94b8b 100644 --- a/vendor/sebastian/environment/tests/RuntimeTest.php +++ b/vendor/sebastian/environment/tests/RuntimeTest.php @@ -1,4 +1,4 @@ -env = new Runtime; } @@ -33,7 +30,7 @@ final class RuntimeTest extends TestCase * @todo Now that this component is PHP 7-only and uses return type declarations * this test makes even less sense than before */ - public function testAbilityToCollectCodeCoverageCanBeAssessed()/*: void*/ + public function testAbilityToCollectCodeCoverageCanBeAssessed(): void { $this->assertInternalType('boolean', $this->env->canCollectCodeCoverage()); } @@ -42,7 +39,7 @@ final class RuntimeTest extends TestCase * @todo Now that this component is PHP 7-only and uses return type declarations * this test makes even less sense than before */ - public function testBinaryCanBeRetrieved()/*: void*/ + public function testBinaryCanBeRetrieved(): void { $this->assertInternalType('string', $this->env->getBinary()); } @@ -51,7 +48,7 @@ final class RuntimeTest extends TestCase * @todo Now that this component is PHP 7-only and uses return type declarations * this test makes even less sense than before */ - public function testCanBeDetected()/*: void*/ + public function testCanBeDetected(): void { $this->assertInternalType('boolean', $this->env->isHHVM()); } @@ -60,7 +57,7 @@ final class RuntimeTest extends TestCase * @todo Now that this component is PHP 7-only and uses return type declarations * this test makes even less sense than before */ - public function testCanBeDetected2()/*: void*/ + public function testCanBeDetected2(): void { $this->assertInternalType('boolean', $this->env->isPHP()); } @@ -69,7 +66,7 @@ final class RuntimeTest extends TestCase * @todo Now that this component is PHP 7-only and uses return type declarations * this test makes even less sense than before */ - public function testXdebugCanBeDetected()/*: void*/ + public function testXdebugCanBeDetected(): void { $this->assertInternalType('boolean', $this->env->hasXdebug()); } @@ -78,7 +75,7 @@ final class RuntimeTest extends TestCase * @todo Now that this component is PHP 7-only and uses return type declarations * this test makes even less sense than before */ - public function testNameAndVersionCanBeRetrieved()/*: void*/ + public function testNameAndVersionCanBeRetrieved(): void { $this->assertInternalType('string', $this->env->getNameWithVersion()); } @@ -87,7 +84,7 @@ final class RuntimeTest extends TestCase * @todo Now that this component is PHP 7-only and uses return type declarations * this test makes even less sense than before */ - public function testNameCanBeRetrieved()/*: void*/ + public function testNameCanBeRetrieved(): void { $this->assertInternalType('string', $this->env->getName()); } @@ -96,7 +93,7 @@ final class RuntimeTest extends TestCase * @todo Now that this component is PHP 7-only and uses return type declarations * this test makes even less sense than before */ - public function testVersionCanBeRetrieved()/*: void*/ + public function testVersionCanBeRetrieved(): void { $this->assertInternalType('string', $this->env->getVersion()); } @@ -105,7 +102,7 @@ final class RuntimeTest extends TestCase * @todo Now that this component is PHP 7-only and uses return type declarations * this test makes even less sense than before */ - public function testVendorUrlCanBeRetrieved()/*: void*/ + public function testVendorUrlCanBeRetrieved(): void { $this->assertInternalType('string', $this->env->getVendorUrl()); } diff --git a/vendor/symfony/console/Application.php b/vendor/symfony/console/Application.php index 3ef76b3f3..9030da646 100644 --- a/vendor/symfony/console/Application.php +++ b/vendor/symfony/console/Application.php @@ -753,12 +753,20 @@ class Application do { $message = trim($e->getMessage()); if ('' === $message || OutputInterface::VERBOSITY_VERBOSE <= $output->getVerbosity()) { - $title = sprintf(' [%s%s] ', \get_class($e), 0 !== ($code = $e->getCode()) ? ' ('.$code.')' : ''); + $class = \get_class($e); + $class = 'c' === $class[0] && 0 === strpos($class, "class@anonymous\0") ? get_parent_class($class).'@anonymous' : $class; + $title = sprintf(' [%s%s] ', $class, 0 !== ($code = $e->getCode()) ? ' ('.$code.')' : ''); $len = Helper::strlen($title); } else { $len = 0; } + if (false !== strpos($message, "class@anonymous\0")) { + $message = preg_replace_callback('/class@anonymous\x00.*?\.php0x?[0-9a-fA-F]++/', function ($m) { + return \class_exists($m[0], false) ? get_parent_class($m[0]).'@anonymous' : $m[0]; + }, $message); + } + $width = $this->terminal->getWidth() ? $this->terminal->getWidth() - 1 : PHP_INT_MAX; $lines = array(); foreach ('' !== $message ? preg_split('/\r?\n/', $message) : array() as $line) { @@ -793,6 +801,13 @@ class Application // exception related properties $trace = $e->getTrace(); + array_unshift($trace, array( + 'function' => '', + 'file' => $e->getFile() ?: 'n/a', + 'line' => $e->getLine() ?: 'n/a', + 'args' => array(), + )); + for ($i = 0, $count = \count($trace); $i < $count; ++$i) { $class = isset($trace[$i]['class']) ? $trace[$i]['class'] : ''; $type = isset($trace[$i]['type']) ? $trace[$i]['type'] : ''; diff --git a/vendor/symfony/console/CHANGELOG.md b/vendor/symfony/console/CHANGELOG.md index 7682feb59..b9175109c 100644 --- a/vendor/symfony/console/CHANGELOG.md +++ b/vendor/symfony/console/CHANGELOG.md @@ -1,6 +1,17 @@ CHANGELOG ========= +4.2.0 +----- + + * allowed passing commands as `array($process, 'ENV_VAR' => 'value')` to + `ProcessHelper::run()` to pass environment variables + * deprecated passing a command as a string to `ProcessHelper::run()`, + pass it the command as an array of its arguments instead + * made the `ProcessHelper` class final + * added `WrappableOutputFormatterInterface::formatAndWrap()` (implemented in `OutputFormatter`) + * added `capture_stderr_separately` option to `CommandTester::execute()` + 4.1.0 ----- diff --git a/vendor/symfony/console/Command/Command.php b/vendor/symfony/console/Command/Command.php index 3bf2f3a53..0e2384737 100644 --- a/vendor/symfony/console/Command/Command.php +++ b/vendor/symfony/console/Command/Command.php @@ -301,14 +301,13 @@ class Command $this->definition->addOptions($this->application->getDefinition()->getOptions()); + $this->applicationDefinitionMerged = true; + if ($mergeArgs) { $currentArguments = $this->definition->getArguments(); $this->definition->setArguments($this->application->getDefinition()->getArguments()); $this->definition->addArguments($currentArguments); - } - $this->applicationDefinitionMerged = true; - if ($mergeArgs) { $this->applicationDefinitionMergedWithArgs = true; } } @@ -361,10 +360,12 @@ class Command /** * Adds an argument. * - * @param string $name The argument name - * @param int $mode The argument mode: InputArgument::REQUIRED or InputArgument::OPTIONAL - * @param string $description A description text - * @param mixed $default The default value (for InputArgument::OPTIONAL mode only) + * @param string $name The argument name + * @param int|null $mode The argument mode: self::REQUIRED or self::OPTIONAL + * @param string $description A description text + * @param string|string[]|null $default The default value (for self::OPTIONAL mode only) + * + * @throws InvalidArgumentException When argument mode is not valid * * @return $this */ @@ -378,11 +379,13 @@ class Command /** * Adds an option. * - * @param string $name The option name - * @param string $shortcut The shortcut (can be null) - * @param int $mode The option mode: One of the InputOption::VALUE_* constants - * @param string $description A description text - * @param mixed $default The default value (must be null for InputOption::VALUE_NONE) + * @param string $name The option name + * @param string|array $shortcut The shortcuts, can be null, a string of shortcuts delimited by | or an array of shortcuts + * @param int|null $mode The option mode: One of the VALUE_* constants + * @param string $description A description text + * @param string|string[]|int|bool|null $default The default value (must be null for self::VALUE_NONE) + * + * @throws InvalidArgumentException If option mode is invalid or incompatible * * @return $this */ diff --git a/vendor/symfony/console/Command/LockableTrait.php b/vendor/symfony/console/Command/LockableTrait.php index 6c634ce44..f4ebe45bf 100644 --- a/vendor/symfony/console/Command/LockableTrait.php +++ b/vendor/symfony/console/Command/LockableTrait.php @@ -12,7 +12,6 @@ namespace Symfony\Component\Console\Command; use Symfony\Component\Console\Exception\LogicException; -use Symfony\Component\Console\Exception\RuntimeException; use Symfony\Component\Lock\Factory; use Symfony\Component\Lock\Lock; use Symfony\Component\Lock\Store\FlockStore; @@ -36,7 +35,7 @@ trait LockableTrait private function lock($name = null, $blocking = false) { if (!class_exists(SemaphoreStore::class)) { - throw new RuntimeException('To enable the locking feature you must install the symfony/lock component.'); + throw new LogicException('To enable the locking feature you must install the symfony/lock component.'); } if (null !== $this->lock) { diff --git a/vendor/symfony/console/Exception/ExceptionInterface.php b/vendor/symfony/console/Exception/ExceptionInterface.php index 491cc4c64..1624e13d0 100644 --- a/vendor/symfony/console/Exception/ExceptionInterface.php +++ b/vendor/symfony/console/Exception/ExceptionInterface.php @@ -16,6 +16,6 @@ namespace Symfony\Component\Console\Exception; * * @author Jérôme Tamarelle */ -interface ExceptionInterface +interface ExceptionInterface extends \Throwable { } diff --git a/vendor/symfony/console/Formatter/OutputFormatter.php b/vendor/symfony/console/Formatter/OutputFormatter.php index eebac82e7..fd3bbd12d 100644 --- a/vendor/symfony/console/Formatter/OutputFormatter.php +++ b/vendor/symfony/console/Formatter/OutputFormatter.php @@ -17,8 +17,9 @@ use Symfony\Component\Console\Exception\InvalidArgumentException; * Formatter class for console output. * * @author Konstantin Kudryashov + * @author Roland Franssen */ -class OutputFormatter implements OutputFormatterInterface +class OutputFormatter implements WrappableOutputFormatterInterface { private $decorated; private $styles = array(); @@ -130,10 +131,18 @@ class OutputFormatter implements OutputFormatterInterface */ public function format($message) { - $message = (string) $message; + return $this->formatAndWrap((string) $message, 0); + } + + /** + * {@inheritdoc} + */ + public function formatAndWrap(string $message, int $width) + { $offset = 0; $output = ''; $tagRegex = '[a-z][a-z0-9,_=;-]*+'; + $currentLineLength = 0; preg_match_all("#<(($tagRegex) | /($tagRegex)?)>#ix", $message, $matches, PREG_OFFSET_CAPTURE); foreach ($matches[0] as $i => $match) { $pos = $match[1]; @@ -144,7 +153,7 @@ class OutputFormatter implements OutputFormatterInterface } // add the text up to the next tag - $output .= $this->applyCurrentStyle(substr($message, $offset, $pos - $offset)); + $output .= $this->applyCurrentStyle(substr($message, $offset, $pos - $offset), $output, $width, $currentLineLength); $offset = $pos + \strlen($text); // opening tag? @@ -158,7 +167,7 @@ class OutputFormatter implements OutputFormatterInterface // $this->styleStack->pop(); } elseif (false === $style = $this->createStyleFromString(strtolower($tag))) { - $output .= $this->applyCurrentStyle($text); + $output .= $this->applyCurrentStyle($text, $output, $width, $currentLineLength); } elseif ($open) { $this->styleStack->push($style); } else { @@ -166,7 +175,7 @@ class OutputFormatter implements OutputFormatterInterface } } - $output .= $this->applyCurrentStyle(substr($message, $offset)); + $output .= $this->applyCurrentStyle(substr($message, $offset), $output, $width, $currentLineLength); if (false !== strpos($output, "\0")) { return strtr($output, array("\0" => '\\', '\\<' => '<')); @@ -223,8 +232,46 @@ class OutputFormatter implements OutputFormatterInterface /** * Applies current style from stack to text, if must be applied. */ - private function applyCurrentStyle(string $text): string + private function applyCurrentStyle(string $text, string $current, int $width, int &$currentLineLength): string { - return $this->isDecorated() && \strlen($text) > 0 ? $this->styleStack->getCurrent()->apply($text) : $text; + if ('' === $text) { + return ''; + } + + if (!$width) { + return $this->isDecorated() ? $this->styleStack->getCurrent()->apply($text) : $text; + } + + if (!$currentLineLength && '' !== $current) { + $text = ltrim($text); + } + + if ($currentLineLength) { + $prefix = substr($text, 0, $i = $width - $currentLineLength)."\n"; + $text = substr($text, $i); + } else { + $prefix = ''; + } + + preg_match('~(\\n)$~', $text, $matches); + $text = $prefix.preg_replace('~([^\\n]{'.$width.'})\\ *~', "\$1\n", $text); + $text = rtrim($text, "\n").($matches[1] ?? ''); + + if (!$currentLineLength && '' !== $current && "\n" !== substr($current, -1)) { + $text = "\n".$text; + } + + $lines = explode("\n", $text); + if ($width === $currentLineLength = \strlen(end($lines))) { + $currentLineLength = 0; + } + + if ($this->isDecorated()) { + foreach ($lines as $i => $line) { + $lines[$i] = $this->styleStack->getCurrent()->apply($line); + } + } + + return implode("\n", $lines); } } diff --git a/vendor/symfony/console/Formatter/OutputFormatterStyleStack.php b/vendor/symfony/console/Formatter/OutputFormatterStyleStack.php index 9e7283c2f..7ca93035b 100644 --- a/vendor/symfony/console/Formatter/OutputFormatterStyleStack.php +++ b/vendor/symfony/console/Formatter/OutputFormatterStyleStack.php @@ -12,11 +12,12 @@ namespace Symfony\Component\Console\Formatter; use Symfony\Component\Console\Exception\InvalidArgumentException; +use Symfony\Contracts\Service\ResetInterface; /** * @author Jean-François Simon */ -class OutputFormatterStyleStack +class OutputFormatterStyleStack implements ResetInterface { /** * @var OutputFormatterStyleInterface[] diff --git a/vendor/symfony/console/Formatter/WrappableOutputFormatterInterface.php b/vendor/symfony/console/Formatter/WrappableOutputFormatterInterface.php new file mode 100644 index 000000000..6694053f0 --- /dev/null +++ b/vendor/symfony/console/Formatter/WrappableOutputFormatterInterface.php @@ -0,0 +1,25 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Formatter; + +/** + * Formatter interface for console output that supports word wrapping. + * + * @author Roland Franssen + */ +interface WrappableOutputFormatterInterface extends OutputFormatterInterface +{ + /** + * Formats a message according to the given styles, wrapping at `$width` (0 means no wrapping). + */ + public function formatAndWrap(string $message, int $width); +} diff --git a/vendor/symfony/console/Helper/ProcessHelper.php b/vendor/symfony/console/Helper/ProcessHelper.php index 666f114a2..e0720c134 100644 --- a/vendor/symfony/console/Helper/ProcessHelper.php +++ b/vendor/symfony/console/Helper/ProcessHelper.php @@ -20,18 +20,20 @@ use Symfony\Component\Process\Process; * The ProcessHelper class provides helpers to run external processes. * * @author Fabien Potencier + * + * @final since Symfony 4.2 */ class ProcessHelper extends Helper { /** * Runs an external process. * - * @param OutputInterface $output An OutputInterface instance - * @param string|array|Process $cmd An instance of Process or an array of arguments to escape and run or a command to run - * @param string|null $error An error message that must be displayed if something went wrong - * @param callable|null $callback A PHP callback to run whenever there is some - * output available on STDOUT or STDERR - * @param int $verbosity The threshold for verbosity + * @param OutputInterface $output An OutputInterface instance + * @param array|Process $cmd An instance of Process or an array of the command and arguments + * @param string|null $error An error message that must be displayed if something went wrong + * @param callable|null $callback A PHP callback to run whenever there is some + * output available on STDOUT or STDERR + * @param int $verbosity The threshold for verbosity * * @return Process The process that ran */ @@ -44,9 +46,22 @@ class ProcessHelper extends Helper $formatter = $this->getHelperSet()->get('debug_formatter'); if ($cmd instanceof Process) { - $process = $cmd; - } else { + $cmd = array($cmd); + } + + if (!\is_array($cmd)) { + @trigger_error(sprintf('Passing a command as a string to "%s()" is deprecated since Symfony 4.2, pass it the command as an array of arguments instead.', __METHOD__), E_USER_DEPRECATED); + $cmd = array(\method_exists(Process::class, 'fromShellCommandline') ? Process::fromShellCommandline($cmd) : new Process($cmd)); + } + + if (\is_string($cmd[0] ?? null)) { $process = new Process($cmd); + $cmd = array(); + } elseif (($cmd[0] ?? null) instanceof Process) { + $process = $cmd[0]; + unset($cmd[0]); + } else { + throw new \InvalidArgumentException(sprintf('Invalid command provided to "%s()": the command should an array whose first is element is either the path to the binary to run of a "Process" object.', __METHOD__)); } if ($verbosity <= $output->getVerbosity()) { @@ -57,7 +72,7 @@ class ProcessHelper extends Helper $callback = $this->wrapCallback($output, $process, $callback); } - $process->run($callback); + $process->run($callback, $cmd); if ($verbosity <= $output->getVerbosity()) { $message = $process->isSuccessful() ? 'Command ran successfully' : sprintf('%s Command did not run successfully', $process->getExitCode()); diff --git a/vendor/symfony/console/Helper/QuestionHelper.php b/vendor/symfony/console/Helper/QuestionHelper.php index 5e6ef03e9..53af6fe92 100644 --- a/vendor/symfony/console/Helper/QuestionHelper.php +++ b/vendor/symfony/console/Helper/QuestionHelper.php @@ -47,13 +47,23 @@ class QuestionHelper extends Helper } if (!$input->isInteractive()) { - if ($question instanceof ChoiceQuestion) { + $default = $question->getDefault(); + + if (null !== $default && $question instanceof ChoiceQuestion) { $choices = $question->getChoices(); - return $choices[$question->getDefault()]; + if (!$question->isMultiselect()) { + return isset($choices[$default]) ? $choices[$default] : $default; + } + + $default = explode(',', $default); + foreach ($default as $k => $v) { + $v = trim($v); + $default[$k] = isset($choices[$v]) ? $choices[$v] : $v; + } } - return $question->getDefault(); + return $default; } if ($input instanceof StreamableInputInterface && $stream = $input->getStream()) { diff --git a/vendor/symfony/console/Helper/Table.php b/vendor/symfony/console/Helper/Table.php index 957754848..14974529c 100644 --- a/vendor/symfony/console/Helper/Table.php +++ b/vendor/symfony/console/Helper/Table.php @@ -13,6 +13,7 @@ namespace Symfony\Component\Console\Helper; use Symfony\Component\Console\Exception\InvalidArgumentException; use Symfony\Component\Console\Exception\RuntimeException; +use Symfony\Component\Console\Formatter\WrappableOutputFormatterInterface; use Symfony\Component\Console\Output\ConsoleSectionOutput; use Symfony\Component\Console\Output\OutputInterface; @@ -34,6 +35,9 @@ class Table private const BORDER_OUTSIDE = 0; private const BORDER_INSIDE = 1; + private $headerTitle; + private $footerTitle; + /** * Table headers. */ @@ -77,6 +81,7 @@ class Table * @var array */ private $columnWidths = array(); + private $columnMaxWidths = array(); private static $styles; @@ -180,11 +185,7 @@ class Table */ public function getColumnStyle($columnIndex) { - if (isset($this->columnStyles[$columnIndex])) { - return $this->columnStyles[$columnIndex]; - } - - return $this->getStyle(); + return $this->columnStyles[$columnIndex] ?? $this->getStyle(); } /** @@ -219,6 +220,25 @@ class Table return $this; } + /** + * Sets the maximum width of a column. + * + * Any cell within this column which contents exceeds the specified width will be wrapped into multiple lines, while + * formatted strings are preserved. + * + * @return $this + */ + public function setColumnMaxWidth(int $columnIndex, int $width): self + { + if (!$this->output->getFormatter() instanceof WrappableOutputFormatterInterface) { + throw new \LogicException(sprintf('Setting a maximum column width is only supported when using a "%s" formatter, got "%s".', WrappableOutputFormatterInterface::class, \get_class($this->output->getFormatter()))); + } + + $this->columnMaxWidths[$columnIndex] = $width; + + return $this; + } + public function setHeaders(array $headers) { $headers = array_values($headers); @@ -290,6 +310,20 @@ class Table return $this; } + public function setHeaderTitle(?string $title): self + { + $this->headerTitle = $title; + + return $this; + } + + public function setFooterTitle(?string $title): self + { + $this->footerTitle = $title; + + return $this; + } + /** * Renders table to output. * @@ -330,15 +364,17 @@ class Table } if ($isHeader || $isFirstRow) { - $this->renderRowSeparator($isFirstRow ? self::SEPARATOR_TOP_BOTTOM : self::SEPARATOR_TOP); if ($isFirstRow) { + $this->renderRowSeparator(self::SEPARATOR_TOP_BOTTOM); $isFirstRow = false; + } else { + $this->renderRowSeparator(self::SEPARATOR_TOP, $this->headerTitle, $this->style->getHeaderTitleFormat()); } } $this->renderRow($row, $isHeader ? $this->style->getCellHeaderFormat() : $this->style->getCellRowFormat()); } - $this->renderRowSeparator(self::SEPARATOR_BOTTOM); + $this->renderRowSeparator(self::SEPARATOR_BOTTOM, $this->footerTitle, $this->style->getFooterTitleFormat()); $this->cleanup(); $this->rendered = true; @@ -351,7 +387,7 @@ class Table * * +-----+-----------+-------+ */ - private function renderRowSeparator(int $type = self::SEPARATOR_MID) + private function renderRowSeparator(int $type = self::SEPARATOR_MID, string $title = null, string $titleFormat = null) { if (0 === $count = $this->numberOfColumns) { return; @@ -379,6 +415,23 @@ class Table $markup .= $column === $count - 1 ? $rightChar : $midChar; } + if (null !== $title) { + $titleLength = Helper::strlenWithoutDecoration($formatter = $this->output->getFormatter(), $formattedTitle = sprintf($titleFormat, $title)); + $markupLength = Helper::strlen($markup); + if ($titleLength > $limit = $markupLength - 4) { + $titleLength = $limit; + $formatLength = Helper::strlenWithoutDecoration($formatter, sprintf($titleFormat, '')); + $formattedTitle = sprintf($titleFormat, Helper::substr($title, 0, $limit - $formatLength - 3).'...'); + } + + $titleStart = ($markupLength - $titleLength) / 2; + if (false === mb_detect_encoding($markup, null, true)) { + $markup = substr_replace($markup, $formattedTitle, $titleStart, $titleLength); + } else { + $markup = mb_substr($markup, 0, $titleStart).$formattedTitle.mb_substr($markup, $titleStart + $titleLength); + } + } + $this->output->writeln(sprintf($this->style->getBorderFormat(), $markup)); } @@ -461,12 +514,17 @@ class Table private function buildTableRows($rows) { + /** @var WrappableOutputFormatterInterface $formatter */ + $formatter = $this->output->getFormatter(); $unmergedRows = array(); for ($rowKey = 0; $rowKey < \count($rows); ++$rowKey) { $rows = $this->fillNextRows($rows, $rowKey); // Remove any new line breaks and replace it with a new line foreach ($rows[$rowKey] as $column => $cell) { + if (isset($this->columnMaxWidths[$column]) && Helper::strlenWithoutDecoration($formatter, $cell) > $this->columnMaxWidths[$column]) { + $cell = $formatter->formatAndWrap($cell, $this->columnMaxWidths[$column]); + } if (!strstr($cell, "\n")) { continue; } @@ -674,8 +732,9 @@ class Table } $columnWidth = isset($this->columnWidths[$column]) ? $this->columnWidths[$column] : 0; + $cellWidth = max($cellWidth, $columnWidth); - return max($cellWidth, $columnWidth); + return isset($this->columnMaxWidths[$column]) ? min($this->columnMaxWidths[$column], $cellWidth) : $cellWidth; } /** diff --git a/vendor/symfony/console/Helper/TableStyle.php b/vendor/symfony/console/Helper/TableStyle.php index 0536713a8..f8ecc2d98 100644 --- a/vendor/symfony/console/Helper/TableStyle.php +++ b/vendor/symfony/console/Helper/TableStyle.php @@ -40,6 +40,8 @@ class TableStyle private $crossingTopLeftBottomChar = '+'; private $crossingTopMidBottomChar = '+'; private $crossingTopRightBottomChar = '+'; + private $headerTitleFormat = ' %s '; + private $footerTitleFormat = ' %s '; private $cellHeaderFormat = '%s'; private $cellRowFormat = '%s'; private $cellRowContentFormat = ' %s '; @@ -276,7 +278,7 @@ class TableStyle /** * Gets crossing character. * - * @return string $crossingChar + * @return string */ public function getCrossingChar() { @@ -429,4 +431,28 @@ class TableStyle { return $this->padType; } + + public function getHeaderTitleFormat(): string + { + return $this->headerTitleFormat; + } + + public function setHeaderTitleFormat(string $format): self + { + $this->headerTitleFormat = $format; + + return $this; + } + + public function getFooterTitleFormat(): string + { + return $this->footerTitleFormat; + } + + public function setFooterTitleFormat(string $format): self + { + $this->footerTitleFormat = $format; + + return $this; + } } diff --git a/vendor/symfony/console/Input/InputAwareInterface.php b/vendor/symfony/console/Input/InputAwareInterface.php index d0f11e986..5a288de5d 100644 --- a/vendor/symfony/console/Input/InputAwareInterface.php +++ b/vendor/symfony/console/Input/InputAwareInterface.php @@ -21,8 +21,6 @@ interface InputAwareInterface { /** * Sets the Console Input. - * - * @param InputInterface */ public function setInput(InputInterface $input); } diff --git a/vendor/symfony/console/Input/InputOption.php b/vendor/symfony/console/Input/InputOption.php index 174e871ac..3ba84cd77 100644 --- a/vendor/symfony/console/Input/InputOption.php +++ b/vendor/symfony/console/Input/InputOption.php @@ -33,11 +33,11 @@ class InputOption private $description; /** - * @param string $name The option name - * @param string|array $shortcut The shortcuts, can be null, a string of shortcuts delimited by | or an array of shortcuts - * @param int|null $mode The option mode: One of the VALUE_* constants - * @param string $description A description text - * @param string|string[]|bool|null $default The default value (must be null for self::VALUE_NONE) + * @param string $name The option name + * @param string|array $shortcut The shortcuts, can be null, a string of shortcuts delimited by | or an array of shortcuts + * @param int|null $mode The option mode: One of the VALUE_* constants + * @param string $description A description text + * @param string|string[]|int|bool|null $default The default value (must be null for self::VALUE_NONE) * * @throws InvalidArgumentException If option mode is invalid or incompatible */ @@ -149,7 +149,7 @@ class InputOption /** * Sets the default value. * - * @param string|string[]|bool|null $default The default value + * @param string|string[]|int|bool|null $default The default value * * @throws LogicException When incorrect default value is given */ @@ -173,7 +173,7 @@ class InputOption /** * Returns the default value. * - * @return string|string[]|bool|null The default value + * @return string|string[]|int|bool|null The default value */ public function getDefault() { diff --git a/vendor/symfony/console/Output/StreamOutput.php b/vendor/symfony/console/Output/StreamOutput.php index fe8632b35..43f7a2f23 100644 --- a/vendor/symfony/console/Output/StreamOutput.php +++ b/vendor/symfony/console/Output/StreamOutput.php @@ -70,7 +70,11 @@ class StreamOutput extends Output */ protected function doWrite($message, $newline) { - if (false === @fwrite($this->stream, $message) || ($newline && (false === @fwrite($this->stream, PHP_EOL)))) { + if ($newline) { + $message .= PHP_EOL; + } + + if (false === @fwrite($this->stream, $message)) { // should never happen throw new RuntimeException('Unable to write output.'); } diff --git a/vendor/symfony/console/Question/Question.php b/vendor/symfony/console/Question/Question.php index 593e9f1e8..eac82cfad 100644 --- a/vendor/symfony/console/Question/Question.php +++ b/vendor/symfony/console/Question/Question.php @@ -141,7 +141,7 @@ class Question } if (null !== $values && !\is_array($values) && !$values instanceof \Traversable) { - throw new InvalidArgumentException('Autocompleter values can be either an array, `null` or a `Traversable` object.'); + throw new InvalidArgumentException('Autocompleter values can be either an array, "null" or a "Traversable" object.'); } if ($this->hidden) { diff --git a/vendor/symfony/console/Tester/ApplicationTester.php b/vendor/symfony/console/Tester/ApplicationTester.php index 3ae311525..24976f089 100644 --- a/vendor/symfony/console/Tester/ApplicationTester.php +++ b/vendor/symfony/console/Tester/ApplicationTester.php @@ -13,8 +13,6 @@ namespace Symfony\Component\Console\Tester; use Symfony\Component\Console\Application; use Symfony\Component\Console\Input\ArrayInput; -use Symfony\Component\Console\Output\ConsoleOutput; -use Symfony\Component\Console\Output\StreamOutput; /** * Eases the testing of console applications. @@ -33,7 +31,6 @@ class ApplicationTester private $application; private $input; private $statusCode; - private $captureStreamsIndependently = false; public function __construct(Application $application) { @@ -69,36 +66,7 @@ class ApplicationTester putenv('SHELL_INTERACTIVE=1'); } - $this->captureStreamsIndependently = array_key_exists('capture_stderr_separately', $options) && $options['capture_stderr_separately']; - if (!$this->captureStreamsIndependently) { - $this->output = new StreamOutput(fopen('php://memory', 'w', false)); - if (isset($options['decorated'])) { - $this->output->setDecorated($options['decorated']); - } - if (isset($options['verbosity'])) { - $this->output->setVerbosity($options['verbosity']); - } - } else { - $this->output = new ConsoleOutput( - isset($options['verbosity']) ? $options['verbosity'] : ConsoleOutput::VERBOSITY_NORMAL, - isset($options['decorated']) ? $options['decorated'] : null - ); - - $errorOutput = new StreamOutput(fopen('php://memory', 'w', false)); - $errorOutput->setFormatter($this->output->getFormatter()); - $errorOutput->setVerbosity($this->output->getVerbosity()); - $errorOutput->setDecorated($this->output->isDecorated()); - - $reflectedOutput = new \ReflectionObject($this->output); - $strErrProperty = $reflectedOutput->getProperty('stderr'); - $strErrProperty->setAccessible(true); - $strErrProperty->setValue($this->output, $errorOutput); - - $reflectedParent = $reflectedOutput->getParentClass(); - $streamProperty = $reflectedParent->getProperty('stream'); - $streamProperty->setAccessible(true); - $streamProperty->setValue($this->output, fopen('php://memory', 'w', false)); - } + $this->initOutput($options); $this->statusCode = $this->application->run($this->input, $this->output); @@ -106,28 +74,4 @@ class ApplicationTester return $this->statusCode; } - - /** - * Gets the output written to STDERR by the application. - * - * @param bool $normalize Whether to normalize end of lines to \n or not - * - * @return string - */ - public function getErrorOutput($normalize = false) - { - if (!$this->captureStreamsIndependently) { - throw new \LogicException('The error output is not available when the tester is run without "capture_stderr_separately" option set.'); - } - - rewind($this->output->getErrorOutput()->getStream()); - - $display = stream_get_contents($this->output->getErrorOutput()->getStream()); - - if ($normalize) { - $display = str_replace(PHP_EOL, "\n", $display); - } - - return $display; - } } diff --git a/vendor/symfony/console/Tester/CommandTester.php b/vendor/symfony/console/Tester/CommandTester.php index ecdc40c04..c5b178f2a 100644 --- a/vendor/symfony/console/Tester/CommandTester.php +++ b/vendor/symfony/console/Tester/CommandTester.php @@ -13,7 +13,6 @@ namespace Symfony\Component\Console\Tester; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\ArrayInput; -use Symfony\Component\Console\Output\StreamOutput; /** * Eases the testing of console commands. @@ -39,9 +38,10 @@ class CommandTester * * Available execution options: * - * * interactive: Sets the input interactive flag - * * decorated: Sets the output decorated flag - * * verbosity: Sets the output verbosity flag + * * interactive: Sets the input interactive flag + * * decorated: Sets the output decorated flag + * * verbosity: Sets the output verbosity flag + * * capture_stderr_separately: Make output of stdOut and stdErr separately available * * @param array $input An array of command arguments and options * @param array $options An array of execution options @@ -68,12 +68,12 @@ class CommandTester $this->input->setInteractive($options['interactive']); } - $this->output = new StreamOutput(fopen('php://memory', 'w', false)); - $this->output->setDecorated(isset($options['decorated']) ? $options['decorated'] : false); - if (isset($options['verbosity'])) { - $this->output->setVerbosity($options['verbosity']); + if (!isset($options['decorated'])) { + $options['decorated'] = false; } + $this->initOutput($options); + return $this->statusCode = $this->command->run($this->input, $this->output); } } diff --git a/vendor/symfony/console/Tester/TesterTrait.php b/vendor/symfony/console/Tester/TesterTrait.php index 4e1e0795c..508a61b62 100644 --- a/vendor/symfony/console/Tester/TesterTrait.php +++ b/vendor/symfony/console/Tester/TesterTrait.php @@ -12,19 +12,19 @@ namespace Symfony\Component\Console\Tester; use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Output\ConsoleOutput; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Output\StreamOutput; /** * @author Amrouche Hamza - * - * @internal */ trait TesterTrait { /** @var StreamOutput */ private $output; private $inputs = array(); + private $captureStreamsIndependently = false; /** * Gets the display returned by the last execution of the command or application. @@ -46,6 +46,30 @@ trait TesterTrait return $display; } + /** + * Gets the output written to STDERR by the application. + * + * @param bool $normalize Whether to normalize end of lines to \n or not + * + * @return string + */ + public function getErrorOutput($normalize = false) + { + if (!$this->captureStreamsIndependently) { + throw new \LogicException('The error output is not available when the tester is run without "capture_stderr_separately" option set.'); + } + + rewind($this->output->getErrorOutput()->getStream()); + + $display = stream_get_contents($this->output->getErrorOutput()->getStream()); + + if ($normalize) { + $display = str_replace(PHP_EOL, "\n", $display); + } + + return $display; + } + /** * Gets the input instance used by the last execution of the command or application. * @@ -79,8 +103,8 @@ trait TesterTrait /** * Sets the user inputs. * - * @param $inputs array An array of strings representing each input - * passed to the command input stream + * @param array $inputs An array of strings representing each input + * passed to the command input stream * * @return self */ @@ -91,6 +115,49 @@ trait TesterTrait return $this; } + /** + * Initializes the output property. + * + * Available options: + * + * * decorated: Sets the output decorated flag + * * verbosity: Sets the output verbosity flag + * * capture_stderr_separately: Make output of stdOut and stdErr separately available + */ + private function initOutput(array $options) + { + $this->captureStreamsIndependently = array_key_exists('capture_stderr_separately', $options) && $options['capture_stderr_separately']; + if (!$this->captureStreamsIndependently) { + $this->output = new StreamOutput(fopen('php://memory', 'w', false)); + if (isset($options['decorated'])) { + $this->output->setDecorated($options['decorated']); + } + if (isset($options['verbosity'])) { + $this->output->setVerbosity($options['verbosity']); + } + } else { + $this->output = new ConsoleOutput( + isset($options['verbosity']) ? $options['verbosity'] : ConsoleOutput::VERBOSITY_NORMAL, + isset($options['decorated']) ? $options['decorated'] : null + ); + + $errorOutput = new StreamOutput(fopen('php://memory', 'w', false)); + $errorOutput->setFormatter($this->output->getFormatter()); + $errorOutput->setVerbosity($this->output->getVerbosity()); + $errorOutput->setDecorated($this->output->isDecorated()); + + $reflectedOutput = new \ReflectionObject($this->output); + $strErrProperty = $reflectedOutput->getProperty('stderr'); + $strErrProperty->setAccessible(true); + $strErrProperty->setValue($this->output, $errorOutput); + + $reflectedParent = $reflectedOutput->getParentClass(); + $streamProperty = $reflectedParent->getProperty('stream'); + $streamProperty->setAccessible(true); + $streamProperty->setValue($this->output, fopen('php://memory', 'w', false)); + } + } + private static function createStream(array $inputs) { $stream = fopen('php://memory', 'r+', false); diff --git a/vendor/symfony/console/Tests/ApplicationTest.php b/vendor/symfony/console/Tests/ApplicationTest.php index f6494f45d..d7b0451ef 100644 --- a/vendor/symfony/console/Tests/ApplicationTest.php +++ b/vendor/symfony/console/Tests/ApplicationTest.php @@ -824,6 +824,56 @@ class ApplicationTest extends TestCase $this->assertStringMatchesFormatFile(self::$fixturesPath.'/application_renderexception_linebreaks.txt', $tester->getDisplay(true), '->renderException() keep multiple line breaks'); } + public function testRenderAnonymousException() + { + $application = new Application(); + $application->setAutoExit(false); + $application->register('foo')->setCode(function () { + throw new class('') extends \InvalidArgumentException { + }; + }); + $tester = new ApplicationTester($application); + + $tester->run(array('command' => 'foo'), array('decorated' => false)); + $this->assertContains('[InvalidArgumentException@anonymous]', $tester->getDisplay(true)); + + $application = new Application(); + $application->setAutoExit(false); + $application->register('foo')->setCode(function () { + throw new \InvalidArgumentException(sprintf('Dummy type "%s" is invalid.', \get_class(new class() { + }))); + }); + $tester = new ApplicationTester($application); + + $tester->run(array('command' => 'foo'), array('decorated' => false)); + $this->assertContains('Dummy type "@anonymous" is invalid.', $tester->getDisplay(true)); + } + + public function testRenderExceptionStackTraceContainsRootException() + { + $application = new Application(); + $application->setAutoExit(false); + $application->register('foo')->setCode(function () { + throw new class('') extends \InvalidArgumentException { + }; + }); + $tester = new ApplicationTester($application); + + $tester->run(array('command' => 'foo'), array('decorated' => false)); + $this->assertContains('[InvalidArgumentException@anonymous]', $tester->getDisplay(true)); + + $application = new Application(); + $application->setAutoExit(false); + $application->register('foo')->setCode(function () { + throw new \InvalidArgumentException(sprintf('Dummy type "%s" is invalid.', \get_class(new class() { + }))); + }); + $tester = new ApplicationTester($application); + + $tester->run(array('command' => 'foo'), array('decorated' => false)); + $this->assertContains('Dummy type "@anonymous" is invalid.', $tester->getDisplay(true)); + } + public function testRun() { $application = new Application(); diff --git a/vendor/symfony/console/Tests/Formatter/OutputFormatterTest.php b/vendor/symfony/console/Tests/Formatter/OutputFormatterTest.php index c1addbab9..b51668cfa 100644 --- a/vendor/symfony/console/Tests/Formatter/OutputFormatterTest.php +++ b/vendor/symfony/console/Tests/Formatter/OutputFormatterTest.php @@ -322,6 +322,25 @@ more text EOF )); } + + public function testFormatAndWrap() + { + $formatter = new OutputFormatter(true); + + $this->assertSame("fo\no\e[37;41mb\e[39;49m\n\e[37;41mar\e[39;49m\nba\nz", $formatter->formatAndWrap('foobar baz', 2)); + $this->assertSame("pr\ne \e[37;41m\e[39;49m\n\e[37;41mfo\e[39;49m\n\e[37;41mo \e[39;49m\n\e[37;41mba\e[39;49m\n\e[37;41mr \e[39;49m\n\e[37;41mba\e[39;49m\n\e[37;41mz\e[39;49m \npo\nst", $formatter->formatAndWrap('pre foo bar baz post', 2)); + $this->assertSame("pre\e[37;41m\e[39;49m\n\e[37;41mfoo\e[39;49m\n\e[37;41mbar\e[39;49m\n\e[37;41mbaz\e[39;49m\npos\nt", $formatter->formatAndWrap('pre foo bar baz post', 3)); + $this->assertSame("pre \e[37;41m\e[39;49m\n\e[37;41mfoo \e[39;49m\n\e[37;41mbar \e[39;49m\n\e[37;41mbaz\e[39;49m \npost", $formatter->formatAndWrap('pre foo bar baz post', 4)); + $this->assertSame("pre \e[37;41mf\e[39;49m\n\e[37;41moo ba\e[39;49m\n\e[37;41mr baz\e[39;49m\npost", $formatter->formatAndWrap('pre foo bar baz post', 5)); + + $formatter = new OutputFormatter(); + + $this->assertSame("fo\nob\nar\nba\nz", $formatter->formatAndWrap('foobar baz', 2)); + $this->assertSame("pr\ne \nfo\no \nba\nr \nba\nz \npo\nst", $formatter->formatAndWrap('pre foo bar baz post', 2)); + $this->assertSame("pre\nfoo\nbar\nbaz\npos\nt", $formatter->formatAndWrap('pre foo bar baz post', 3)); + $this->assertSame("pre \nfoo \nbar \nbaz \npost", $formatter->formatAndWrap('pre foo bar baz post', 4)); + $this->assertSame("pre f\noo ba\nr baz\npost", $formatter->formatAndWrap('pre foo bar baz post', 5)); + } } class TableCell diff --git a/vendor/symfony/console/Tests/Helper/ProcessHelperTest.php b/vendor/symfony/console/Tests/Helper/ProcessHelperTest.php index 382c9f4c1..829bc4330 100644 --- a/vendor/symfony/console/Tests/Helper/ProcessHelperTest.php +++ b/vendor/symfony/console/Tests/Helper/ProcessHelperTest.php @@ -25,6 +25,10 @@ class ProcessHelperTest extends TestCase */ public function testVariousProcessRuns($expected, $cmd, $verbosity, $error) { + if (\is_string($cmd)) { + $cmd = \method_exists(Process::class, 'fromShellCommandline') ? Process::fromShellCommandline($cmd) : new Process($cmd); + } + $helper = new ProcessHelper(); $helper->setHelperSet(new HelperSet(array(new DebugFormatterHelper()))); $output = $this->getOutputStream($verbosity); @@ -41,7 +45,7 @@ class ProcessHelperTest extends TestCase $executed = false; $callback = function () use (&$executed) { $executed = true; }; - $helper->run($output, 'php -r "echo 42;"', null, $callback); + $helper->run($output, array('php', '-r', 'echo 42;'), null, $callback); $this->assertTrue($executed); } @@ -81,12 +85,21 @@ EOT; OUT out message RES 252 Command did not run successfully +EOT; + + $PHP = '\\' === \DIRECTORY_SEPARATOR ? '"!PHP!"' : '"$PHP"'; + $successOutputPhp = <<getCommandLine(); $successOutputProcessDebug = str_replace("'php' '-r' 'echo 42;'", $args, $successOutputProcessDebug); + $fromShellCommandline = \method_exists(Process::class, 'fromShellCommandline') ? array(Process::class, 'fromShellCommandline') : function ($cmd) { return new Process($cmd); }; return array( array('', 'php -r "echo 42;"', StreamOutput::VERBOSITY_VERBOSE, null), @@ -100,7 +113,9 @@ EOT; array($syntaxErrorOutputVerbose.$errorMessage.PHP_EOL, 'php -r "fwrite(STDERR, \'error message\');usleep(50000);fwrite(STDOUT, \'out message\');exit(252);"', StreamOutput::VERBOSITY_VERY_VERBOSE, $errorMessage), array($syntaxErrorOutputDebug.$errorMessage.PHP_EOL, 'php -r "fwrite(STDERR, \'error message\');usleep(500000);fwrite(STDOUT, \'out message\');exit(252);"', StreamOutput::VERBOSITY_DEBUG, $errorMessage), array($successOutputProcessDebug, array('php', '-r', 'echo 42;'), StreamOutput::VERBOSITY_DEBUG, null), - array($successOutputDebug, new Process('php -r "echo 42;"'), StreamOutput::VERBOSITY_DEBUG, null), + array($successOutputDebug, $fromShellCommandline('php -r "echo 42;"'), StreamOutput::VERBOSITY_DEBUG, null), + array($successOutputProcessDebug, array(new Process(array('php', '-r', 'echo 42;'))), StreamOutput::VERBOSITY_DEBUG, null), + array($successOutputPhp, array($fromShellCommandline('php -r '.$PHP), 'PHP' => 'echo 42;'), StreamOutput::VERBOSITY_DEBUG, null), ); } diff --git a/vendor/symfony/console/Tests/Helper/QuestionHelperTest.php b/vendor/symfony/console/Tests/Helper/QuestionHelperTest.php index 67d6981c9..3cb9a0996 100644 --- a/vendor/symfony/console/Tests/Helper/QuestionHelperTest.php +++ b/vendor/symfony/console/Tests/Helper/QuestionHelperTest.php @@ -89,6 +89,63 @@ class QuestionHelperTest extends AbstractQuestionHelperTest $this->assertEquals('Superman', $questionHelper->ask($this->createStreamableInputInterfaceMock($inputStream, true), $this->createOutputInterface(), $question)); } + public function testAskChoiceNonInteractive() + { + $questionHelper = new QuestionHelper(); + + $helperSet = new HelperSet(array(new FormatterHelper())); + $questionHelper->setHelperSet($helperSet); + $inputStream = $this->getInputStream("\n1\n 1 \nFabien\n1\nFabien\n1\n0,2\n 0 , 2 \n\n\n"); + + $heroes = array('Superman', 'Batman', 'Spiderman'); + + $question = new ChoiceQuestion('What is your favorite superhero?', $heroes, '0'); + + $this->assertSame('Superman', $questionHelper->ask($this->createStreamableInputInterfaceMock($inputStream, false), $this->createOutputInterface(), $question)); + + $question = new ChoiceQuestion('What is your favorite superhero?', $heroes, 'Batman'); + $this->assertSame('Batman', $questionHelper->ask($this->createStreamableInputInterfaceMock($inputStream, false), $this->createOutputInterface(), $question)); + + $question = new ChoiceQuestion('What is your favorite superhero?', $heroes, null); + $this->assertNull($questionHelper->ask($this->createStreamableInputInterfaceMock($inputStream, false), $this->createOutputInterface(), $question)); + + $question = new ChoiceQuestion('What is your favorite superhero?', $heroes, '0'); + $question->setValidator(null); + $this->assertSame('Superman', $questionHelper->ask($this->createStreamableInputInterfaceMock($inputStream, false), $this->createOutputInterface(), $question)); + + try { + $question = new ChoiceQuestion('What is your favorite superhero?', $heroes, null); + $questionHelper->ask($this->createStreamableInputInterfaceMock($inputStream, false), $this->createOutputInterface(), $question); + } catch (\InvalidArgumentException $e) { + $this->assertSame('Value "" is invalid', $e->getMessage()); + } + + $question = new ChoiceQuestion('Who are your favorite superheros?', $heroes, '0, 1'); + $question->setMultiselect(true); + $this->assertSame(array('Superman', 'Batman'), $questionHelper->ask($this->createStreamableInputInterfaceMock($inputStream, false), $this->createOutputInterface(), $question)); + + $question = new ChoiceQuestion('Who are your favorite superheros?', $heroes, '0, 1'); + $question->setMultiselect(true); + $question->setValidator(null); + $this->assertSame(array('Superman', 'Batman'), $questionHelper->ask($this->createStreamableInputInterfaceMock($inputStream, false), $this->createOutputInterface(), $question)); + + $question = new ChoiceQuestion('Who are your favorite superheros?', $heroes, '0, Batman'); + $question->setMultiselect(true); + $this->assertSame(array('Superman', 'Batman'), $questionHelper->ask($this->createStreamableInputInterfaceMock($inputStream, false), $this->createOutputInterface(), $question)); + + $question = new ChoiceQuestion('Who are your favorite superheros?', $heroes, null); + $question->setMultiselect(true); + $this->assertNull($questionHelper->ask($this->createStreamableInputInterfaceMock($inputStream, false), $this->createOutputInterface(), $question)); + + try { + $question = new ChoiceQuestion('Who are your favorite superheros?', $heroes, ''); + $question->setMultiselect(true); + $questionHelper->ask($this->createStreamableInputInterfaceMock($inputStream, false), $this->createOutputInterface(), $question); + } catch (\InvalidArgumentException $e) { + $this->assertSame('Value "" is invalid', $e->getMessage()); + } + } + public function testAsk() { $dialog = new QuestionHelper(); diff --git a/vendor/symfony/console/Tests/Helper/TableTest.php b/vendor/symfony/console/Tests/Helper/TableTest.php index 7a9a688ad..eb67eedfc 100644 --- a/vendor/symfony/console/Tests/Helper/TableTest.php +++ b/vendor/symfony/console/Tests/Helper/TableTest.php @@ -974,6 +974,109 @@ TABLE; Table::getStyleDefinition('absent'); } + /** + * @dataProvider renderSetTitle + */ + public function testSetTitle($headerTitle, $footerTitle, $style, $expected) + { + (new Table($output = $this->getOutputStream())) + ->setHeaderTitle($headerTitle) + ->setFooterTitle($footerTitle) + ->setHeaders(array('ISBN', 'Title', 'Author')) + ->setRows(array( + array('99921-58-10-7', 'Divine Comedy', 'Dante Alighieri'), + array('9971-5-0210-0', 'A Tale of Two Cities', 'Charles Dickens'), + array('960-425-059-0', 'The Lord of the Rings', 'J. R. R. Tolkien'), + array('80-902734-1-6', 'And Then There Were None', 'Agatha Christie'), + )) + ->setStyle($style) + ->render() + ; + + $this->assertEquals($expected, $this->getOutputContent($output)); + } + + public function renderSetTitle() + { + return array( + array( + 'Books', + 'Page 1/2', + 'default', + <<<'TABLE' ++---------------+----------- Books --------+------------------+ +| ISBN | Title | Author | ++---------------+--------------------------+------------------+ +| 99921-58-10-7 | Divine Comedy | Dante Alighieri | +| 9971-5-0210-0 | A Tale of Two Cities | Charles Dickens | +| 960-425-059-0 | The Lord of the Rings | J. R. R. Tolkien | +| 80-902734-1-6 | And Then There Were None | Agatha Christie | ++---------------+--------- Page 1/2 -------+------------------+ + +TABLE + ), + array( + 'Books', + 'Page 1/2', + 'box', + <<<'TABLE' +┌───────────────┬─────────── Books ────────┬──────────────────┐ +│ ISBN │ Title │ Author │ +├───────────────┼──────────────────────────┼──────────────────┤ +│ 99921-58-10-7 │ Divine Comedy │ Dante Alighieri │ +│ 9971-5-0210-0 │ A Tale of Two Cities │ Charles Dickens │ +│ 960-425-059-0 │ The Lord of the Rings │ J. R. R. Tolkien │ +│ 80-902734-1-6 │ And Then There Were None │ Agatha Christie │ +└───────────────┴───────── Page 1/2 ───────┴──────────────────┘ + +TABLE + ), + array( + 'Boooooooooooooooooooooooooooooooooooooooooooooooooooooooks', + 'Page 1/999999999999999999999999999999999999999999999999999', + 'default', + <<<'TABLE' ++- Booooooooooooooooooooooooooooooooooooooooooooooooooooo... -+ +| ISBN | Title | Author | ++---------------+--------------------------+------------------+ +| 99921-58-10-7 | Divine Comedy | Dante Alighieri | +| 9971-5-0210-0 | A Tale of Two Cities | Charles Dickens | +| 960-425-059-0 | The Lord of the Rings | J. R. R. Tolkien | +| 80-902734-1-6 | And Then There Were None | Agatha Christie | ++- Page 1/99999999999999999999999999999999999999999999999... -+ + +TABLE + ), + ); + } + + public function testColumnMaxWidths() + { + $table = new Table($output = $this->getOutputStream()); + $table + ->setRows(array( + array('Divine Comedy', 'A Tale of Two Cities', 'The Lord of the Rings', 'And Then There Were None'), + )) + ->setColumnMaxWidth(1, 5) + ->setColumnMaxWidth(2, 10) + ->setColumnMaxWidth(3, 15); + + $table->render(); + + $expected = + <<
    <?php
    assertEquals($expected, $this->getOutputContent($output)); + } + public function testBoxedStyleWithColspan() { $boxed = new TableStyle(); diff --git a/vendor/symfony/console/Tests/Tester/ApplicationTesterTest.php b/vendor/symfony/console/Tests/Tester/ApplicationTesterTest.php index 71547e7b7..49ef8029f 100644 --- a/vendor/symfony/console/Tests/Tester/ApplicationTesterTest.php +++ b/vendor/symfony/console/Tests/Tester/ApplicationTesterTest.php @@ -90,4 +90,24 @@ class ApplicationTesterTest extends TestCase { $this->assertSame(0, $this->tester->getStatusCode(), '->getStatusCode() returns the status code'); } + + public function testErrorOutput() + { + $application = new Application(); + $application->setAutoExit(false); + $application->register('foo') + ->addArgument('foo') + ->setCode(function ($input, $output) { + $output->getErrorOutput()->write('foo'); + }) + ; + + $tester = new ApplicationTester($application); + $tester->run( + array('command' => 'foo', 'foo' => 'bar'), + array('capture_stderr_separately' => true) + ); + + $this->assertSame('foo', $tester->getErrorOutput()); + } } diff --git a/vendor/symfony/console/Tests/Tester/CommandTesterTest.php b/vendor/symfony/console/Tests/Tester/CommandTesterTest.php index 58eb8103f..afaa2fcf6 100644 --- a/vendor/symfony/console/Tests/Tester/CommandTesterTest.php +++ b/vendor/symfony/console/Tests/Tester/CommandTesterTest.php @@ -160,4 +160,23 @@ class CommandTesterTest extends TestCase $this->assertEquals(0, $tester->getStatusCode()); } + + public function testErrorOutput() + { + $command = new Command('foo'); + $command->addArgument('command'); + $command->addArgument('foo'); + $command->setCode(function ($input, $output) { + $output->getErrorOutput()->write('foo'); + } + ); + + $tester = new CommandTester($command); + $tester->execute( + array('foo' => 'bar'), + array('capture_stderr_separately' => true) + ); + + $this->assertSame('foo', $tester->getErrorOutput()); + } } diff --git a/vendor/symfony/console/composer.json b/vendor/symfony/console/composer.json index d3aadfbc1..ca1a9269f 100644 --- a/vendor/symfony/console/composer.json +++ b/vendor/symfony/console/composer.json @@ -17,6 +17,7 @@ ], "require": { "php": "^7.1.3", + "symfony/contracts": "^1.0", "symfony/polyfill-mbstring": "~1.0" }, "require-dev": { @@ -46,7 +47,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-master": "4.1-dev" + "dev-master": "4.2-dev" } } } diff --git a/vendor/symfony/console/phpunit.xml.dist b/vendor/symfony/console/phpunit.xml.dist index 32569d63c..15e7e52a9 100644 --- a/vendor/symfony/console/phpunit.xml.dist +++ b/vendor/symfony/console/phpunit.xml.dist @@ -1,7 +1,7 @@ + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Contracts\Cache; + +use Psr\Cache\CacheItemInterface; +use Psr\Cache\InvalidArgumentException; + +/** + * Covers most simple to advanced caching needs. + * + * @author Nicolas Grekas + */ +interface CacheInterface +{ + /** + * Fetches a value from the pool or computes it if not found. + * + * On cache misses, a callback is called that should return the missing value. + * This callback is given a PSR-6 CacheItemInterface instance corresponding to the + * requested key, that could be used e.g. for expiration control. It could also + * be an ItemInterface instance when its additional features are needed. + * + * @param string $key The key of the item to retrieve from the cache + * @param callable|CallbackInterface $callback Should return the computed value for the given key/item + * @param float|null $beta A float that, as it grows, controls the likeliness of triggering + * early expiration. 0 disables it, INF forces immediate expiration. + * The default (or providing null) is implementation dependent but should + * typically be 1.0, which should provide optimal stampede protection. + * See https://en.wikipedia.org/wiki/Cache_stampede#Probabilistic_early_expiration + * @param array &$metadata The metadata of the cached item {@see ItemInterface::getMetadata()} + * + * @return mixed The value corresponding to the provided key + * + * @throws InvalidArgumentException When $key is not valid or when $beta is negative + */ + public function get(string $key, callable $callback, float $beta = null, array &$metadata = null); + + /** + * Removes an item from the pool. + * + * @param string $key The key to delete + * + * @throws InvalidArgumentException When $key is not valid + * + * @return bool True if the item was successfully removed, false if there was any error + */ + public function delete(string $key): bool; +} diff --git a/vendor/symfony/contracts/Cache/CacheTrait.php b/vendor/symfony/contracts/Cache/CacheTrait.php new file mode 100644 index 000000000..d82d96530 --- /dev/null +++ b/vendor/symfony/contracts/Cache/CacheTrait.php @@ -0,0 +1,71 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Contracts\Cache; + +use Psr\Cache\CacheItemPoolInterface; +use Psr\Cache\InvalidArgumentException; + +/** + * An implementation of CacheInterface for PSR-6 CacheItemPoolInterface classes. + * + * @author Nicolas Grekas + */ +trait CacheTrait +{ + /** + * {@inheritdoc} + */ + public function get(string $key, callable $callback, float $beta = null, array &$metadata = null) + { + return $this->doGet($this, $key, $callback, $beta, $metadata); + } + + /** + * {@inheritdoc} + */ + public function delete(string $key): bool + { + return $this->deleteItem($key); + } + + private function doGet(CacheItemPoolInterface $pool, string $key, callable $callback, ?float $beta, array &$metadata = null) + { + if (0 > $beta = $beta ?? 1.0) { + throw new class(sprintf('Argument "$beta" provided to "%s::get()" must be a positive number, %f given.', \get_class($this), $beta)) extends \InvalidArgumentException implements InvalidArgumentException { + }; + } + + $item = $pool->getItem($key); + $recompute = !$item->isHit() || INF === $beta; + $metadata = $item instanceof ItemInterface ? $item->getMetadata() : array(); + + if (!$recompute && $metadata) { + $expiry = $metadata[ItemInterface::METADATA_EXPIRY] ?? false; + $ctime = $metadata[ItemInterface::METADATA_CTIME] ?? false; + + if ($recompute = $ctime && $expiry && $expiry <= microtime(true) - $ctime / 1000 * $beta * log(random_int(1, PHP_INT_MAX) / PHP_INT_MAX)) { + // force applying defaultLifetime to expiry + $item->expiresAt(null); + } + } + + if ($recompute) { + $save = true; + $item->set($callback($item, $save)); + if ($save) { + $pool->save($item); + } + } + + return $item->get(); + } +} diff --git a/vendor/symfony/contracts/Cache/CallbackInterface.php b/vendor/symfony/contracts/Cache/CallbackInterface.php new file mode 100644 index 000000000..7dae2aac3 --- /dev/null +++ b/vendor/symfony/contracts/Cache/CallbackInterface.php @@ -0,0 +1,30 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Contracts\Cache; + +use Psr\Cache\CacheItemInterface; + +/** + * Computes and returns the cached value of an item. + * + * @author Nicolas Grekas + */ +interface CallbackInterface +{ + /** + * @param CacheItemInterface|ItemInterface $item The item to compute the value for + * @param bool &$save Should be set to false when the value should not be saved in the pool + * + * @return mixed The computed value for the passed item + */ + public function __invoke(CacheItemInterface $item, bool &$save); +} diff --git a/vendor/symfony/contracts/Cache/ItemInterface.php b/vendor/symfony/contracts/Cache/ItemInterface.php new file mode 100644 index 000000000..4884a2fff --- /dev/null +++ b/vendor/symfony/contracts/Cache/ItemInterface.php @@ -0,0 +1,60 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Contracts\Cache; + +use Psr\Cache\CacheException; +use Psr\Cache\CacheItemInterface; +use Psr\Cache\InvalidArgumentException; + +/** + * Augments PSR-6's CacheItemInterface with support for tags and metadata. + * + * @author Nicolas Grekas + */ +interface ItemInterface extends CacheItemInterface +{ + /** + * References the Unix timestamp stating when the item will expire. + */ + const METADATA_EXPIRY = 'expiry'; + + /** + * References the time the item took to be created, in milliseconds. + */ + const METADATA_CTIME = 'ctime'; + + /** + * References the list of tags that were assigned to the item, as string[]. + */ + const METADATA_TAGS = 'tags'; + + /** + * Adds a tag to a cache item. + * + * Tags are strings that follow the same validation rules as keys. + * + * @param string|string[] $tags A tag or array of tags + * + * @return $this + * + * @throws InvalidArgumentException When $tag is not valid + * @throws CacheException When the item comes from a pool that is not tag-aware + */ + public function tag($tags): self; + + /** + * Returns a list of metadata info that were saved alongside with the cached value. + * + * See ItemInterface::METADATA_* consts for keys potentially found in the returned array. + */ + public function getMetadata(): array; +} diff --git a/vendor/symfony/contracts/Cache/TagAwareCacheInterface.php b/vendor/symfony/contracts/Cache/TagAwareCacheInterface.php new file mode 100644 index 000000000..7c4cf1111 --- /dev/null +++ b/vendor/symfony/contracts/Cache/TagAwareCacheInterface.php @@ -0,0 +1,38 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Contracts\Cache; + +use Psr\Cache\InvalidArgumentException; + +/** + * Allows invalidating cached items using tags. + * + * @author Nicolas Grekas + */ +interface TagAwareCacheInterface extends CacheInterface +{ + /** + * Invalidates cached items using tags. + * + * When implemented on a PSR-6 pool, invalidation should not apply + * to deferred items. Instead, they should be committed as usual. + * This allows replacing old tagged values by new ones without + * race conditions. + * + * @param string[] $tags An array of tags to invalidate + * + * @return bool True on success + * + * @throws InvalidArgumentException When $tags is not valid + */ + public function invalidateTags(array $tags); +} diff --git a/vendor/symfony/contracts/LICENSE b/vendor/symfony/contracts/LICENSE new file mode 100644 index 000000000..ad399a798 --- /dev/null +++ b/vendor/symfony/contracts/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2018 Fabien Potencier + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/symfony/contracts/README.md b/vendor/symfony/contracts/README.md new file mode 100644 index 000000000..9cb73af23 --- /dev/null +++ b/vendor/symfony/contracts/README.md @@ -0,0 +1,70 @@ +Symfony Contracts +================= + +A set of abstractions extracted out of the Symfony components. + +Can be used to build on semantics that the Symfony components proved useful - and +that already have battle tested implementations. + +Design Principles +----------------- + + * contracts are split by domain, each into their own sub-namespaces; + * contracts are small and consistent sets of PHP interfaces, traits, normative + docblocks and reference test suites when applicable, etc.; + * all contracts must have a proven implementation to enter this repository; + * they must be backward compatible with existing Symfony components. + +Packages that implement specific contracts should list them in the "provide" +section of their "composer.json" file, using the `symfony/*-contracts-implementation` +convention (e.g. `"provide": { "symfony/cache-contracts-implementation": "1.0" }`). + +FAQ +--- + +### How to use this package? + +The abstractions in this package are useful to achieve loose coupling and +interoperability. By using the provided interfaces as type hints, you are able +to reuse any implementations that match their contracts. It could be a Symfony +component, or another one provided by the PHP community at large. + +Depending on their semantics, some interfaces can be combined with autowiring to +seamlessly inject a service in your classes. + +Others might be useful as labeling interfaces, to hint about a specific behavior +that could be enabled when using autoconfiguration or manual service tagging (or +any other means provided by your framework.) + +### How is this different from PHP-FIG's PSRs? + +When applicable, the provided contracts are built on top of PHP-FIG's PSRs. But +the group has different goals and different processes. Here, we're focusing on +providing abstractions that are useful on their own while still compatible with +implementations provided by Symfony. Although not the main target, we hope that +the declared contracts will directly or indirectly contribute to the PHP-FIG. + +### Why isn't this package split into several packages? + +Putting all interfaces in one package eases discoverability and dependency +management. Instead of dealing with a myriad of small packages and the +corresponding matrix of versions, you just need to deal with one package and one +version. Also when using IDE autocompletion or just reading the source code, it +makes it easier to figure out which contracts are provided. + +There are two downsides to this approach: you may have unused files in your +`vendor/` directory, and in the future, it will be impossible to use two +different sub-namespaces in different major versions of the package. For the +"unused files" downside, it has no practical consequences: their file sizes are +very small, and there is no performance overhead at all since they are never +loaded. For major versions, this package follows the Symfony BC + deprecation +policies, with an additional restriction to never remove deprecated interfaces. + +Resources +--------- + + * [Documentation](https://symfony.com/doc/current/components/contracts.html) + * [Contributing](https://symfony.com/doc/current/contributing/index.html) + * [Report issues](https://github.com/symfony/symfony/issues) and + [send Pull Requests](https://github.com/symfony/symfony/pulls) + in the [main Symfony repository](https://github.com/symfony/symfony) diff --git a/vendor/symfony/contracts/Service/ResetInterface.php b/vendor/symfony/contracts/Service/ResetInterface.php new file mode 100644 index 000000000..1af1075ee --- /dev/null +++ b/vendor/symfony/contracts/Service/ResetInterface.php @@ -0,0 +1,30 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Contracts\Service; + +/** + * Provides a way to reset an object to its initial state. + * + * When calling the "reset()" method on an object, it should be put back to its + * initial state. This usually means clearing any internal buffers and forwarding + * the call to internal dependencies. All properties of the object should be put + * back to the same state it had when it was first ready to use. + * + * This method could be called, for example, to recycle objects that are used as + * services, so that they can be used to handle several requests in the same + * process loop (note that we advise making your services stateless instead of + * implementing this interface when possible.) + */ +interface ResetInterface +{ + public function reset(); +} diff --git a/vendor/symfony/contracts/Service/ServiceLocatorTrait.php b/vendor/symfony/contracts/Service/ServiceLocatorTrait.php new file mode 100644 index 000000000..8ffa2b4f1 --- /dev/null +++ b/vendor/symfony/contracts/Service/ServiceLocatorTrait.php @@ -0,0 +1,97 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Contracts\Service; + +use Psr\Container\ContainerExceptionInterface; +use Psr\Container\NotFoundExceptionInterface; + +/** + * A trait to help implement PSR-11 service locators. + * + * @author Robin Chalas + * @author Nicolas Grekas + */ +trait ServiceLocatorTrait +{ + private $factories; + private $loading = array(); + + /** + * @param callable[] $factories + */ + public function __construct(array $factories) + { + $this->factories = $factories; + } + + /** + * {@inheritdoc} + */ + public function has($id) + { + return isset($this->factories[$id]); + } + + /** + * {@inheritdoc} + */ + public function get($id) + { + if (!isset($this->factories[$id])) { + throw $this->createNotFoundException($id); + } + + if (isset($this->loading[$id])) { + $ids = array_values($this->loading); + $ids = \array_slice($this->loading, array_search($id, $ids)); + $ids[] = $id; + + throw $this->createCircularReferenceException($id, $ids); + } + + $this->loading[$id] = $id; + try { + return $this->factories[$id]($this); + } finally { + unset($this->loading[$id]); + } + } + + private function createNotFoundException(string $id): NotFoundExceptionInterface + { + if (!$alternatives = array_keys($this->factories)) { + $message = 'is empty...'; + } else { + $last = array_pop($alternatives); + if ($alternatives) { + $message = sprintf('only knows about the "%s" and "%s" services.', implode('", "', $alternatives), $last); + } else { + $message = sprintf('only knows about the "%s" service.', $last); + } + } + + if ($this->loading) { + $message = sprintf('The service "%s" has a dependency on a non-existent service "%s". This locator %s', end($this->loading), $id, $message); + } else { + $message = sprintf('Service "%s" not found: the current service locator %s', $id, $message); + } + + return new class($message) extends \InvalidArgumentException implements NotFoundExceptionInterface { + }; + } + + private function createCircularReferenceException(string $id, array $path): ContainerExceptionInterface + { + return new class(sprintf('Circular reference detected for service "%s", path: "%s".', $id, implode(' -> ', $path))) extends \RuntimeException implements ContainerExceptionInterface { + }; + } +} diff --git a/vendor/symfony/contracts/Service/ServiceSubscriberInterface.php b/vendor/symfony/contracts/Service/ServiceSubscriberInterface.php new file mode 100644 index 000000000..cffccadb5 --- /dev/null +++ b/vendor/symfony/contracts/Service/ServiceSubscriberInterface.php @@ -0,0 +1,53 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Contracts\Service; + +/** + * A ServiceSubscriber exposes its dependencies via the static {@link getSubscribedServices} method. + * + * The getSubscribedServices method returns an array of service types required by such instances, + * optionally keyed by the service names used internally. Service types that start with an interrogation + * mark "?" are optional, while the other ones are mandatory service dependencies. + * + * The injected service locators SHOULD NOT allow access to any other services not specified by the method. + * + * It is expected that ServiceSubscriber instances consume PSR-11-based service locators internally. + * This interface does not dictate any injection method for these service locators, although constructor + * injection is recommended. + * + * @author Nicolas Grekas + */ +interface ServiceSubscriberInterface +{ + /** + * Returns an array of service types required by such instances, optionally keyed by the service names used internally. + * + * For mandatory dependencies: + * + * * array('logger' => 'Psr\Log\LoggerInterface') means the objects use the "logger" name + * internally to fetch a service which must implement Psr\Log\LoggerInterface. + * * array('loggers' => 'Psr\Log\LoggerInterface[]') means the objects use the "loggers" name + * internally to fetch an iterable of Psr\Log\LoggerInterface instances. + * * array('Psr\Log\LoggerInterface') is a shortcut for + * * array('Psr\Log\LoggerInterface' => 'Psr\Log\LoggerInterface') + * + * otherwise: + * + * * array('logger' => '?Psr\Log\LoggerInterface') denotes an optional dependency + * * array('loggers' => '?Psr\Log\LoggerInterface[]') denotes an optional iterable dependency + * * array('?Psr\Log\LoggerInterface') is a shortcut for + * * array('Psr\Log\LoggerInterface' => '?Psr\Log\LoggerInterface') + * + * @return array The required service types, optionally keyed by service names + */ + public static function getSubscribedServices(); +} diff --git a/vendor/symfony/contracts/Service/ServiceSubscriberTrait.php b/vendor/symfony/contracts/Service/ServiceSubscriberTrait.php new file mode 100644 index 000000000..457ffb26b --- /dev/null +++ b/vendor/symfony/contracts/Service/ServiceSubscriberTrait.php @@ -0,0 +1,61 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Contracts\Service; + +use Psr\Container\ContainerInterface; + +/** + * Implementation of ServiceSubscriberInterface that determines subscribed services from + * private method return types. Service ids are available as "ClassName::methodName". + * + * @author Kevin Bond + */ +trait ServiceSubscriberTrait +{ + /** @var ContainerInterface */ + private $container; + + public static function getSubscribedServices(): array + { + static $services; + + if (null !== $services) { + return $services; + } + + $services = \is_callable(array('parent', __FUNCTION__)) ? parent::getSubscribedServices() : array(); + + foreach ((new \ReflectionClass(self::class))->getMethods() as $method) { + if ($method->isStatic() || $method->isAbstract() || $method->isGenerator() || $method->isInternal() || $method->getNumberOfRequiredParameters()) { + continue; + } + + if (self::class === $method->getDeclaringClass()->name && ($returnType = $method->getReturnType()) && !$returnType->isBuiltin()) { + $services[self::class.'::'.$method->name] = '?'.$returnType->getName(); + } + } + + return $services; + } + + /** + * @required + */ + public function setContainer(ContainerInterface $container) + { + $this->container = $container; + + if (\is_callable(array('parent', __FUNCTION__))) { + return parent::setContainer($container); + } + } +} diff --git a/vendor/symfony/contracts/Tests/Cache/CacheTraitTest.php b/vendor/symfony/contracts/Tests/Cache/CacheTraitTest.php new file mode 100644 index 000000000..5134a9339 --- /dev/null +++ b/vendor/symfony/contracts/Tests/Cache/CacheTraitTest.php @@ -0,0 +1,165 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Contracts\Tests\Cache; + +use PHPUnit\Framework\TestCase; +use Psr\Cache\CacheItemInterface; +use Psr\Cache\CacheItemPoolInterface; +use Symfony\Contracts\Cache\CacheTrait; + +/** + * @author Tobias Nyholm + */ +class CacheTraitTest extends TestCase +{ + public function testSave() + { + $item = $this->getMockBuilder(CacheItemInterface::class)->getMock(); + $item->method('set') + ->willReturn($item); + $item->method('isHit') + ->willReturn(false); + + $item->expects($this->once()) + ->method('set') + ->with('computed data'); + + $cache = $this->getMockBuilder(TestPool::class) + ->setMethods(array('getItem', 'save')) + ->getMock(); + $cache->expects($this->once()) + ->method('getItem') + ->with('key') + ->willReturn($item); + $cache->expects($this->once()) + ->method('save'); + + $callback = function (CacheItemInterface $item) { + return 'computed data'; + }; + + $cache->get('key', $callback); + } + + public function testNoCallbackCallOnHit() + { + $item = $this->getMockBuilder(CacheItemInterface::class)->getMock(); + $item->method('isHit') + ->willReturn(true); + + $item->expects($this->never()) + ->method('set'); + + $cache = $this->getMockBuilder(TestPool::class) + ->setMethods(array('getItem', 'save')) + ->getMock(); + + $cache->expects($this->once()) + ->method('getItem') + ->with('key') + ->willReturn($item); + $cache->expects($this->never()) + ->method('save'); + + $callback = function (CacheItemInterface $item) { + $this->assertTrue(false, 'This code should never be reached'); + }; + + $cache->get('key', $callback); + } + + public function testRecomputeOnBetaInf() + { + $item = $this->getMockBuilder(CacheItemInterface::class)->getMock(); + $item->method('set') + ->willReturn($item); + $item->method('isHit') + // We want to recompute even if it is a hit + ->willReturn(true); + + $item->expects($this->once()) + ->method('set') + ->with('computed data'); + + $cache = $this->getMockBuilder(TestPool::class) + ->setMethods(array('getItem', 'save')) + ->getMock(); + + $cache->expects($this->once()) + ->method('getItem') + ->with('key') + ->willReturn($item); + $cache->expects($this->once()) + ->method('save'); + + $callback = function (CacheItemInterface $item) { + return 'computed data'; + }; + + $cache->get('key', $callback, INF); + } + + public function testExceptionOnNegativeBeta() + { + $cache = $this->getMockBuilder(TestPool::class) + ->setMethods(array('getItem', 'save')) + ->getMock(); + + $callback = function (CacheItemInterface $item) { + return 'computed data'; + }; + + $this->expectException(\InvalidArgumentException::class); + $cache->get('key', $callback, -2); + } +} + +class TestPool implements CacheItemPoolInterface +{ + use CacheTrait; + + public function hasItem($key) + { + } + + public function deleteItem($key) + { + } + + public function deleteItems(array $keys = array()) + { + } + + public function getItem($key) + { + } + + public function getItems(array $key = array()) + { + } + + public function saveDeferred(CacheItemInterface $item) + { + } + + public function save(CacheItemInterface $item) + { + } + + public function commit() + { + } + + public function clear() + { + } +} diff --git a/vendor/symfony/contracts/Tests/Service/ServiceLocatorTest.php b/vendor/symfony/contracts/Tests/Service/ServiceLocatorTest.php new file mode 100644 index 000000000..265af909d --- /dev/null +++ b/vendor/symfony/contracts/Tests/Service/ServiceLocatorTest.php @@ -0,0 +1,94 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Contracts\Tests\Service; + +use PHPUnit\Framework\TestCase; +use Psr\Container\ContainerInterface; +use Symfony\Contracts\Service\ServiceLocatorTrait; + +class ServiceLocatorTest extends TestCase +{ + public function getServiceLocator(array $factories) + { + return new class($factories) implements ContainerInterface { + use ServiceLocatorTrait; + }; + } + + public function testHas() + { + $locator = $this->getServiceLocator(array( + 'foo' => function () { return 'bar'; }, + 'bar' => function () { return 'baz'; }, + function () { return 'dummy'; }, + )); + + $this->assertTrue($locator->has('foo')); + $this->assertTrue($locator->has('bar')); + $this->assertFalse($locator->has('dummy')); + } + + public function testGet() + { + $locator = $this->getServiceLocator(array( + 'foo' => function () { return 'bar'; }, + 'bar' => function () { return 'baz'; }, + )); + + $this->assertSame('bar', $locator->get('foo')); + $this->assertSame('baz', $locator->get('bar')); + } + + public function testGetDoesNotMemoize() + { + $i = 0; + $locator = $this->getServiceLocator(array( + 'foo' => function () use (&$i) { + ++$i; + + return 'bar'; + }, + )); + + $this->assertSame('bar', $locator->get('foo')); + $this->assertSame('bar', $locator->get('foo')); + $this->assertSame(2, $i); + } + + /** + * @expectedException \Psr\Container\NotFoundExceptionInterface + * @expectedExceptionMessage The service "foo" has a dependency on a non-existent service "bar". This locator only knows about the "foo" service. + */ + public function testThrowsOnUndefinedInternalService() + { + $locator = $this->getServiceLocator(array( + 'foo' => function () use (&$locator) { return $locator->get('bar'); }, + )); + + $locator->get('foo'); + } + + /** + * @expectedException \Psr\Container\ContainerExceptionInterface + * @expectedExceptionMessage Circular reference detected for service "bar", path: "bar -> baz -> bar". + */ + public function testThrowsOnCircularReference() + { + $locator = $this->getServiceLocator(array( + 'foo' => function () use (&$locator) { return $locator->get('bar'); }, + 'bar' => function () use (&$locator) { return $locator->get('baz'); }, + 'baz' => function () use (&$locator) { return $locator->get('bar'); }, + )); + + $locator->get('foo'); + } +} diff --git a/vendor/symfony/contracts/Tests/Service/ServiceSubscriberTraitTest.php b/vendor/symfony/contracts/Tests/Service/ServiceSubscriberTraitTest.php new file mode 100644 index 000000000..c7742c65d --- /dev/null +++ b/vendor/symfony/contracts/Tests/Service/ServiceSubscriberTraitTest.php @@ -0,0 +1,65 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Contracts\Tests\Service; + +use PHPUnit\Framework\TestCase; +use Psr\Container\ContainerInterface; +use Symfony\Contracts\Service\ServiceLocatorTrait; +use Symfony\Contracts\Service\ServiceSubscriberInterface; +use Symfony\Contracts\Service\ServiceSubscriberTrait; + +class ServiceSubscriberTraitTest extends TestCase +{ + public function testMethodsOnParentsAndChildrenAreIgnoredInGetSubscribedServices() + { + $expected = array(TestService::class.'::aService' => '?Symfony\Contracts\Tests\Service\Service2'); + + $this->assertEquals($expected, ChildTestService::getSubscribedServices()); + } + + public function testSetContainerIsCalledOnParent() + { + $container = new class(array()) implements ContainerInterface { + use ServiceLocatorTrait; + }; + + $this->assertSame($container, (new TestService())->setContainer($container)); + } +} + +class ParentTestService +{ + public function aParentService(): Service1 + { + } + + public function setContainer(ContainerInterface $container) + { + return $container; + } +} + +class TestService extends ParentTestService implements ServiceSubscriberInterface +{ + use ServiceSubscriberTrait; + + public function aService(): Service2 + { + } +} + +class ChildTestService extends TestService +{ + public function aChildService(): Service3 + { + } +} diff --git a/vendor/symfony/contracts/Tests/Translation/TranslatorTest.php b/vendor/symfony/contracts/Tests/Translation/TranslatorTest.php new file mode 100644 index 000000000..a3b67dfe5 --- /dev/null +++ b/vendor/symfony/contracts/Tests/Translation/TranslatorTest.php @@ -0,0 +1,353 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Contracts\Tests\Translation; + +use PHPUnit\Framework\TestCase; +use Symfony\Contracts\Translation\TranslatorInterface; +use Symfony\Contracts\Translation\TranslatorTrait; + +/** + * Test should cover all languages mentioned on http://translate.sourceforge.net/wiki/l10n/pluralforms + * and Plural forms mentioned on http://www.gnu.org/software/gettext/manual/gettext.html#Plural-forms. + * + * See also https://developer.mozilla.org/en/Localization_and_Plurals which mentions 15 rules having a maximum of 6 forms. + * The mozilla code is also interesting to check for. + * + * As mentioned by chx http://drupal.org/node/1273968 we can cover all by testing number from 0 to 199 + * + * The goal to cover all languages is to far fetched so this test case is smaller. + * + * @author Clemens Tolboom clemens@build2be.nl + */ +class TranslatorTest extends TestCase +{ + public function getTranslator() + { + return new class() implements TranslatorInterface { + use TranslatorTrait; + }; + } + + /** + * @dataProvider getTransTests + */ + public function testTrans($expected, $id, $parameters) + { + $translator = $this->getTranslator(); + + $this->assertEquals($expected, $translator->trans($id, $parameters)); + } + + /** + * @dataProvider getTransChoiceTests + */ + public function testTransChoiceWithExplicitLocale($expected, $id, $number) + { + $translator = $this->getTranslator(); + $translator->setLocale('en'); + + $this->assertEquals($expected, $translator->trans($id, array('%count%' => $number))); + } + + /** + * @dataProvider getTransChoiceTests + */ + public function testTransChoiceWithDefaultLocale($expected, $id, $number) + { + \Locale::setDefault('en'); + + $translator = $this->getTranslator(); + + $this->assertEquals($expected, $translator->trans($id, array('%count%' => $number))); + } + + public function testGetSetLocale() + { + $translator = $this->getTranslator(); + $translator->setLocale('en'); + + $this->assertEquals('en', $translator->getLocale()); + } + + /** + * @requires extension intl + */ + public function testGetLocaleReturnsDefaultLocaleIfNotSet() + { + $translator = $this->getTranslator(); + + \Locale::setDefault('pt_BR'); + $this->assertEquals('pt_BR', $translator->getLocale()); + + \Locale::setDefault('en'); + $this->assertEquals('en', $translator->getLocale()); + } + + public function getTransTests() + { + return array( + array('Symfony is great!', 'Symfony is great!', array()), + array('Symfony is awesome!', 'Symfony is %what%!', array('%what%' => 'awesome')), + ); + } + + public function getTransChoiceTests() + { + return array( + array('There are no apples', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 0), + array('There is one apple', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 1), + array('There are 10 apples', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 10), + array('There are 0 apples', 'There is 1 apple|There are %count% apples', 0), + array('There is 1 apple', 'There is 1 apple|There are %count% apples', 1), + array('There are 10 apples', 'There is 1 apple|There are %count% apples', 10), + // custom validation messages may be coded with a fixed value + array('There are 2 apples', 'There are 2 apples', 2), + ); + } + + /** + * @dataProvider getInternal + */ + public function testInterval($expected, $number, $interval) + { + $translator = $this->getTranslator(); + + $this->assertEquals($expected, $translator->trans($interval.' foo|[1,Inf[ bar', array('%count%' => $number))); + } + + public function getInternal() + { + return array( + array('foo', 3, '{1,2, 3 ,4}'), + array('bar', 10, '{1,2, 3 ,4}'), + array('bar', 3, '[1,2]'), + array('foo', 1, '[1,2]'), + array('foo', 2, '[1,2]'), + array('bar', 1, ']1,2['), + array('bar', 2, ']1,2['), + array('foo', log(0), '[-Inf,2['), + array('foo', -log(0), '[-2,+Inf]'), + ); + } + + /** + * @dataProvider getChooseTests + */ + public function testChoose($expected, $id, $number) + { + $translator = $this->getTranslator(); + + $this->assertEquals($expected, $translator->trans($id, array('%count%' => $number))); + } + + public function testReturnMessageIfExactlyOneStandardRuleIsGiven() + { + $translator = $this->getTranslator(); + + $this->assertEquals('There are two apples', $translator->trans('There are two apples', array('%count%' => 2))); + } + + /** + * @dataProvider getNonMatchingMessages + * @expectedException \InvalidArgumentException + */ + public function testThrowExceptionIfMatchingMessageCannotBeFound($id, $number) + { + $translator = $this->getTranslator(); + + $translator->trans($id, array('%count%' => $number)); + } + + public function getNonMatchingMessages() + { + return array( + array('{0} There are no apples|{1} There is one apple', 2), + array('{1} There is one apple|]1,Inf] There are %count% apples', 0), + array('{1} There is one apple|]2,Inf] There are %count% apples', 2), + array('{0} There are no apples|There is one apple', 2), + ); + } + + public function getChooseTests() + { + return array( + array('There are no apples', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 0), + array('There are no apples', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 0), + array('There are no apples', '{0}There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 0), + + array('There is one apple', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 1), + + array('There are 10 apples', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 10), + array('There are 10 apples', '{0} There are no apples|{1} There is one apple|]1,Inf]There are %count% apples', 10), + array('There are 10 apples', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 10), + + array('There are 0 apples', 'There is one apple|There are %count% apples', 0), + array('There is one apple', 'There is one apple|There are %count% apples', 1), + array('There are 10 apples', 'There is one apple|There are %count% apples', 10), + + array('There are 0 apples', 'one: There is one apple|more: There are %count% apples', 0), + array('There is one apple', 'one: There is one apple|more: There are %count% apples', 1), + array('There are 10 apples', 'one: There is one apple|more: There are %count% apples', 10), + + array('There are no apples', '{0} There are no apples|one: There is one apple|more: There are %count% apples', 0), + array('There is one apple', '{0} There are no apples|one: There is one apple|more: There are %count% apples', 1), + array('There are 10 apples', '{0} There are no apples|one: There is one apple|more: There are %count% apples', 10), + + array('', '{0}|{1} There is one apple|]1,Inf] There are %count% apples', 0), + array('', '{0} There are no apples|{1}|]1,Inf] There are %count% apples', 1), + + // Indexed only tests which are Gettext PoFile* compatible strings. + array('There are 0 apples', 'There is one apple|There are %count% apples', 0), + array('There is one apple', 'There is one apple|There are %count% apples', 1), + array('There are 2 apples', 'There is one apple|There are %count% apples', 2), + + // Tests for float numbers + array('There is almost one apple', '{0} There are no apples|]0,1[ There is almost one apple|{1} There is one apple|[1,Inf] There is more than one apple', 0.7), + array('There is one apple', '{0} There are no apples|]0,1[There are %count% apples|{1} There is one apple|[1,Inf] There is more than one apple', 1), + array('There is more than one apple', '{0} There are no apples|]0,1[There are %count% apples|{1} There is one apple|[1,Inf] There is more than one apple', 1.7), + array('There are no apples', '{0} There are no apples|]0,1[There are %count% apples|{1} There is one apple|[1,Inf] There is more than one apple', 0), + array('There are no apples', '{0} There are no apples|]0,1[There are %count% apples|{1} There is one apple|[1,Inf] There is more than one apple', 0.0), + array('There are no apples', '{0.0} There are no apples|]0,1[There are %count% apples|{1} There is one apple|[1,Inf] There is more than one apple', 0), + + // Test texts with new-lines + // with double-quotes and \n in id & double-quotes and actual newlines in text + array("This is a text with a\n new-line in it. Selector = 0.", '{0}This is a text with a + new-line in it. Selector = 0.|{1}This is a text with a + new-line in it. Selector = 1.|[1,Inf]This is a text with a + new-line in it. Selector > 1.', 0), + // with double-quotes and \n in id and single-quotes and actual newlines in text + array("This is a text with a\n new-line in it. Selector = 1.", '{0}This is a text with a + new-line in it. Selector = 0.|{1}This is a text with a + new-line in it. Selector = 1.|[1,Inf]This is a text with a + new-line in it. Selector > 1.', 1), + array("This is a text with a\n new-line in it. Selector > 1.", '{0}This is a text with a + new-line in it. Selector = 0.|{1}This is a text with a + new-line in it. Selector = 1.|[1,Inf]This is a text with a + new-line in it. Selector > 1.', 5), + // with double-quotes and id split accros lines + array('This is a text with a + new-line in it. Selector = 1.', '{0}This is a text with a + new-line in it. Selector = 0.|{1}This is a text with a + new-line in it. Selector = 1.|[1,Inf]This is a text with a + new-line in it. Selector > 1.', 1), + // with single-quotes and id split accros lines + array('This is a text with a + new-line in it. Selector > 1.', '{0}This is a text with a + new-line in it. Selector = 0.|{1}This is a text with a + new-line in it. Selector = 1.|[1,Inf]This is a text with a + new-line in it. Selector > 1.', 5), + // with single-quotes and \n in text + array('This is a text with a\nnew-line in it. Selector = 0.', '{0}This is a text with a\nnew-line in it. Selector = 0.|{1}This is a text with a\nnew-line in it. Selector = 1.|[1,Inf]This is a text with a\nnew-line in it. Selector > 1.', 0), + // with double-quotes and id split accros lines + array("This is a text with a\nnew-line in it. Selector = 1.", "{0}This is a text with a\nnew-line in it. Selector = 0.|{1}This is a text with a\nnew-line in it. Selector = 1.|[1,Inf]This is a text with a\nnew-line in it. Selector > 1.", 1), + // esacape pipe + array('This is a text with | in it. Selector = 0.', '{0}This is a text with || in it. Selector = 0.|{1}This is a text with || in it. Selector = 1.', 0), + // Empty plural set (2 plural forms) from a .PO file + array('', '|', 1), + // Empty plural set (3 plural forms) from a .PO file + array('', '||', 1), + ); + } + + /** + * @dataProvider failingLangcodes + */ + public function testFailedLangcodes($nplural, $langCodes) + { + $matrix = $this->generateTestData($langCodes); + $this->validateMatrix($nplural, $matrix, false); + } + + /** + * @dataProvider successLangcodes + */ + public function testLangcodes($nplural, $langCodes) + { + $matrix = $this->generateTestData($langCodes); + $this->validateMatrix($nplural, $matrix); + } + + /** + * This array should contain all currently known langcodes. + * + * As it is impossible to have this ever complete we should try as hard as possible to have it almost complete. + * + * @return array + */ + public function successLangcodes() + { + return array( + array('1', array('ay', 'bo', 'cgg', 'dz', 'id', 'ja', 'jbo', 'ka', 'kk', 'km', 'ko', 'ky')), + array('2', array('nl', 'fr', 'en', 'de', 'de_GE', 'hy', 'hy_AM')), + array('3', array('be', 'bs', 'cs', 'hr')), + array('4', array('cy', 'mt', 'sl')), + array('6', array('ar')), + ); + } + + /** + * This array should be at least empty within the near future. + * + * This both depends on a complete list trying to add above as understanding + * the plural rules of the current failing languages. + * + * @return array with nplural together with langcodes + */ + public function failingLangcodes() + { + return array( + array('1', array('fa')), + array('2', array('jbo')), + array('3', array('cbs')), + array('4', array('gd', 'kw')), + array('5', array('ga')), + ); + } + + /** + * We validate only on the plural coverage. Thus the real rules is not tested. + * + * @param string $nplural Plural expected + * @param array $matrix Containing langcodes and their plural index values + * @param bool $expectSuccess + */ + protected function validateMatrix($nplural, $matrix, $expectSuccess = true) + { + foreach ($matrix as $langCode => $data) { + $indexes = array_flip($data); + if ($expectSuccess) { + $this->assertEquals($nplural, \count($indexes), "Langcode '$langCode' has '$nplural' plural forms."); + } else { + $this->assertNotEquals((int) $nplural, \count($indexes), "Langcode '$langCode' has '$nplural' plural forms."); + } + } + } + + protected function generateTestData($langCodes) + { + $translator = new class() { + use TranslatorTrait { + getPluralizationRule as public; + } + }; + + $matrix = array(); + foreach ($langCodes as $langCode) { + for ($count = 0; $count < 200; ++$count) { + $plural = $translator->getPluralizationRule($count, $langCode); + $matrix[$langCode][$count] = $plural; + } + } + + return $matrix; + } +} diff --git a/vendor/symfony/contracts/Translation/LocaleAwareInterface.php b/vendor/symfony/contracts/Translation/LocaleAwareInterface.php new file mode 100644 index 000000000..dbd8894fe --- /dev/null +++ b/vendor/symfony/contracts/Translation/LocaleAwareInterface.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Contracts\Translation; + +interface LocaleAwareInterface +{ + /** + * Sets the current locale. + * + * @param string $locale The locale + * + * @throws \InvalidArgumentException If the locale contains invalid characters + */ + public function setLocale($locale); + + /** + * Returns the current locale. + * + * @return string The locale + */ + public function getLocale(); +} diff --git a/vendor/symfony/contracts/Translation/TranslatorInterface.php b/vendor/symfony/contracts/Translation/TranslatorInterface.php new file mode 100644 index 000000000..2bdc415cb --- /dev/null +++ b/vendor/symfony/contracts/Translation/TranslatorInterface.php @@ -0,0 +1,65 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Contracts\Translation; + +/** + * @author Fabien Potencier + */ +interface TranslatorInterface +{ + /** + * Translates the given message. + * + * When a number is provided as a parameter named "%count%", the message is parsed for plural + * forms and a translation is chosen according to this number using the following rules: + * + * Given a message with different plural translations separated by a + * pipe (|), this method returns the correct portion of the message based + * on the given number, locale and the pluralization rules in the message + * itself. + * + * The message supports two different types of pluralization rules: + * + * interval: {0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples + * indexed: There is one apple|There are %count% apples + * + * The indexed solution can also contain labels (e.g. one: There is one apple). + * This is purely for making the translations more clear - it does not + * affect the functionality. + * + * The two methods can also be mixed: + * {0} There are no apples|one: There is one apple|more: There are %count% apples + * + * An interval can represent a finite set of numbers: + * {1,2,3,4} + * + * An interval can represent numbers between two numbers: + * [1, +Inf] + * ]-1,2[ + * + * The left delimiter can be [ (inclusive) or ] (exclusive). + * The right delimiter can be [ (exclusive) or ] (inclusive). + * Beside numbers, you can use -Inf and +Inf for the infinite. + * + * @see https://en.wikipedia.org/wiki/ISO_31-11 + * + * @param string $id The message id (may also be an object that can be cast to string) + * @param array $parameters An array of parameters for the message + * @param string|null $domain The domain for the message or null to use the default + * @param string|null $locale The locale or null to use the default + * + * @return string The translated string + * + * @throws \InvalidArgumentException If the locale contains invalid characters + */ + public function trans($id, array $parameters = array(), $domain = null, $locale = null); +} diff --git a/vendor/symfony/contracts/Translation/TranslatorTrait.php b/vendor/symfony/contracts/Translation/TranslatorTrait.php new file mode 100644 index 000000000..4e53fbd42 --- /dev/null +++ b/vendor/symfony/contracts/Translation/TranslatorTrait.php @@ -0,0 +1,255 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Contracts\Translation; + +use Symfony\Component\Translation\Exception\InvalidArgumentException; + +/** + * A trait to help implement TranslatorInterface and LocaleAwareInterface. + * + * @author Fabien Potencier + */ +trait TranslatorTrait +{ + private $locale; + + /** + * {@inheritdoc} + */ + public function setLocale($locale) + { + $this->locale = (string) $locale; + } + + /** + * {@inheritdoc} + */ + public function getLocale() + { + return $this->locale ?: \Locale::getDefault(); + } + + /** + * {@inheritdoc} + */ + public function trans($id, array $parameters = array(), $domain = null, $locale = null) + { + $id = (string) $id; + + if (!isset($parameters['%count%']) || !is_numeric($parameters['%count%'])) { + return strtr($id, $parameters); + } + + $number = (float) $parameters['%count%']; + $locale = (string) $locale ?: $this->getLocale(); + + $parts = array(); + if (preg_match('/^\|++$/', $id)) { + $parts = explode('|', $id); + } elseif (preg_match_all('/(?:\|\||[^\|])++/', $id, $matches)) { + $parts = $matches[0]; + } + + $intervalRegexp = <<<'EOF' +/^(?P + ({\s* + (\-?\d+(\.\d+)?[\s*,\s*\-?\d+(\.\d+)?]*) + \s*}) + + | + + (?P[\[\]]) + \s* + (?P-Inf|\-?\d+(\.\d+)?) + \s*,\s* + (?P\+?Inf|\-?\d+(\.\d+)?) + \s* + (?P[\[\]]) +)\s*(?P.*?)$/xs +EOF; + + $standardRules = array(); + foreach ($parts as $part) { + $part = trim(str_replace('||', '|', $part)); + + // try to match an explicit rule, then fallback to the standard ones + if (preg_match($intervalRegexp, $part, $matches)) { + if ($matches[2]) { + foreach (explode(',', $matches[3]) as $n) { + if ($number == $n) { + return strtr($matches['message'], $parameters); + } + } + } else { + $leftNumber = '-Inf' === $matches['left'] ? -INF : (float) $matches['left']; + $rightNumber = \is_numeric($matches['right']) ? (float) $matches['right'] : INF; + + if (('[' === $matches['left_delimiter'] ? $number >= $leftNumber : $number > $leftNumber) + && (']' === $matches['right_delimiter'] ? $number <= $rightNumber : $number < $rightNumber) + ) { + return strtr($matches['message'], $parameters); + } + } + } elseif (preg_match('/^\w+\:\s*(.*?)$/', $part, $matches)) { + $standardRules[] = $matches[1]; + } else { + $standardRules[] = $part; + } + } + + $position = $this->getPluralizationRule($number, $locale); + + if (!isset($standardRules[$position])) { + // when there's exactly one rule given, and that rule is a standard + // rule, use this rule + if (1 === \count($parts) && isset($standardRules[0])) { + return strtr($standardRules[0], $parameters); + } + + $message = sprintf('Unable to choose a translation for "%s" with locale "%s" for value "%d". Double check that this translation has the correct plural options (e.g. "There is one apple|There are %%count%% apples").', $id, $locale, $number); + + if (\class_exists(InvalidArgumentException::class)) { + throw new InvalidArgumentException($message); + } + + throw new \InvalidArgumentException($message); + } + + return strtr($standardRules[$position], $parameters); + } + + /** + * Returns the plural position to use for the given locale and number. + * + * The plural rules are derived from code of the Zend Framework (2010-09-25), + * which is subject to the new BSD license (http://framework.zend.com/license/new-bsd). + * Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com) + */ + private function getPluralizationRule(int $number, string $locale): int + { + switch ('pt_BR' !== $locale && \strlen($locale) > 3 ? substr($locale, 0, strrpos($locale, '_')) : $locale) { + case 'af': + case 'bn': + case 'bg': + case 'ca': + case 'da': + case 'de': + case 'el': + case 'en': + case 'eo': + case 'es': + case 'et': + case 'eu': + case 'fa': + case 'fi': + case 'fo': + case 'fur': + case 'fy': + case 'gl': + case 'gu': + case 'ha': + case 'he': + case 'hu': + case 'is': + case 'it': + case 'ku': + case 'lb': + case 'ml': + case 'mn': + case 'mr': + case 'nah': + case 'nb': + case 'ne': + case 'nl': + case 'nn': + case 'no': + case 'oc': + case 'om': + case 'or': + case 'pa': + case 'pap': + case 'ps': + case 'pt': + case 'so': + case 'sq': + case 'sv': + case 'sw': + case 'ta': + case 'te': + case 'tk': + case 'ur': + case 'zu': + return (1 == $number) ? 0 : 1; + + case 'am': + case 'bh': + case 'fil': + case 'fr': + case 'gun': + case 'hi': + case 'hy': + case 'ln': + case 'mg': + case 'nso': + case 'pt_BR': + case 'ti': + case 'wa': + return ((0 == $number) || (1 == $number)) ? 0 : 1; + + case 'be': + case 'bs': + case 'hr': + case 'ru': + case 'sh': + case 'sr': + case 'uk': + return ((1 == $number % 10) && (11 != $number % 100)) ? 0 : ((($number % 10 >= 2) && ($number % 10 <= 4) && (($number % 100 < 10) || ($number % 100 >= 20))) ? 1 : 2); + + case 'cs': + case 'sk': + return (1 == $number) ? 0 : ((($number >= 2) && ($number <= 4)) ? 1 : 2); + + case 'ga': + return (1 == $number) ? 0 : ((2 == $number) ? 1 : 2); + + case 'lt': + return ((1 == $number % 10) && (11 != $number % 100)) ? 0 : ((($number % 10 >= 2) && (($number % 100 < 10) || ($number % 100 >= 20))) ? 1 : 2); + + case 'sl': + return (1 == $number % 100) ? 0 : ((2 == $number % 100) ? 1 : (((3 == $number % 100) || (4 == $number % 100)) ? 2 : 3)); + + case 'mk': + return (1 == $number % 10) ? 0 : 1; + + case 'mt': + return (1 == $number) ? 0 : (((0 == $number) || (($number % 100 > 1) && ($number % 100 < 11))) ? 1 : ((($number % 100 > 10) && ($number % 100 < 20)) ? 2 : 3)); + + case 'lv': + return (0 == $number) ? 0 : (((1 == $number % 10) && (11 != $number % 100)) ? 1 : 2); + + case 'pl': + return (1 == $number) ? 0 : ((($number % 10 >= 2) && ($number % 10 <= 4) && (($number % 100 < 12) || ($number % 100 > 14))) ? 1 : 2); + + case 'cy': + return (1 == $number) ? 0 : ((2 == $number) ? 1 : (((8 == $number) || (11 == $number)) ? 2 : 3)); + + case 'ro': + return (1 == $number) ? 0 : (((0 == $number) || (($number % 100 > 0) && ($number % 100 < 20))) ? 1 : 2); + + case 'ar': + return (0 == $number) ? 0 : ((1 == $number) ? 1 : ((2 == $number) ? 2 : ((($number % 100 >= 3) && ($number % 100 <= 10)) ? 3 : ((($number % 100 >= 11) && ($number % 100 <= 99)) ? 4 : 5)))); + + default: + return 0; + } + } +} diff --git a/vendor/symfony/contracts/composer.json b/vendor/symfony/contracts/composer.json new file mode 100644 index 000000000..2f198a0c3 --- /dev/null +++ b/vendor/symfony/contracts/composer.json @@ -0,0 +1,44 @@ +{ + "name": "symfony/contracts", + "type": "library", + "description": "A set of abstractions extracted out of the Symfony components", + "keywords": ["abstractions", "contracts", "decoupling", "interfaces", "interoperability", "standards"], + "homepage": "https://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "require": { + "php": "^7.1.3" + }, + "require-dev": { + "psr/cache": "^1.0", + "psr/container": "^1.0" + }, + "suggest": { + "psr/cache": "When using the Cache contracts", + "psr/container": "When using the Service contracts", + "symfony/cache-contracts-implementation": "", + "symfony/service-contracts-implementation": "", + "symfony/translation-contracts-implementation": "" + }, + "autoload": { + "psr-4": { "Symfony\\Contracts\\": "" }, + "exclude-from-classmap": [ + "**/Tests/" + ] + }, + "minimum-stability": "dev", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + } +} diff --git a/vendor/symfony/contracts/phpunit.xml.dist b/vendor/symfony/contracts/phpunit.xml.dist new file mode 100644 index 000000000..e222d9f5a --- /dev/null +++ b/vendor/symfony/contracts/phpunit.xml.dist @@ -0,0 +1,31 @@ + + + + + + + + + + ./Tests/ + + + + + + ./ + + ./Tests + ./vendor + + + + + diff --git a/vendor/symfony/css-selector/Exception/ExceptionInterface.php b/vendor/symfony/css-selector/Exception/ExceptionInterface.php index e4c5ae1b6..9e259006b 100644 --- a/vendor/symfony/css-selector/Exception/ExceptionInterface.php +++ b/vendor/symfony/css-selector/Exception/ExceptionInterface.php @@ -19,6 +19,6 @@ namespace Symfony\Component\CssSelector\Exception; * * @author Jean-François Simon */ -interface ExceptionInterface +interface ExceptionInterface extends \Throwable { } diff --git a/vendor/symfony/css-selector/composer.json b/vendor/symfony/css-selector/composer.json index e2ed078e3..ebe7d0d5c 100644 --- a/vendor/symfony/css-selector/composer.json +++ b/vendor/symfony/css-selector/composer.json @@ -31,7 +31,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-master": "4.1-dev" + "dev-master": "4.2-dev" } } } diff --git a/vendor/symfony/css-selector/phpunit.xml.dist b/vendor/symfony/css-selector/phpunit.xml.dist index 65ff1827a..a8e537ef7 100644 --- a/vendor/symfony/css-selector/phpunit.xml.dist +++ b/vendor/symfony/css-selector/phpunit.xml.dist @@ -1,7 +1,7 @@ * @author Christophe Coevoet * @author Nicolas Grekas + * @author Guilhem Niot */ class DebugClassLoader { @@ -34,6 +37,7 @@ class DebugClassLoader private static $deprecated = array(); private static $internal = array(); private static $internalMethods = array(); + private static $annotatedParameters = array(); private static $darwinCache = array('/' => array('/', array())); public function __construct(callable $classLoader) @@ -137,14 +141,14 @@ class DebugClassLoader try { if ($this->isFinder && !isset($this->loaded[$class])) { $this->loaded[$class] = true; - if ($file = $this->classLoader[0]->findFile($class) ?: false) { - $wasCached = \function_exists('opcache_is_script_cached') && @opcache_is_script_cached($file); - + if (!$file = $this->classLoader[0]->findFile($class) ?: false) { + // no-op + } elseif (\function_exists('opcache_is_script_cached') && @opcache_is_script_cached($file)) { require $file; - if ($wasCached) { - return; - } + return; + } else { + require $file; } } else { \call_user_func($this->classLoader, $class); @@ -260,11 +264,12 @@ class DebugClassLoader return $deprecations; } - // Inherit @final and @internal annotations for methods + // Inherit @final, @internal and @param annotations for methods self::$finalMethods[$class] = array(); self::$internalMethods[$class] = array(); + self::$annotatedParameters[$class] = array(); foreach ($parentAndOwnInterfaces as $use) { - foreach (array('finalMethods', 'internalMethods') as $property) { + foreach (array('finalMethods', 'internalMethods', 'annotatedParameters') as $property) { if (isset(self::${$property}[$use])) { self::${$property}[$class] = self::${$property}[$class] ? self::${$property}[$use] + self::${$property}[$class] : self::${$property}[$use]; } @@ -288,15 +293,52 @@ class DebugClassLoader } } - // Detect method annotations - if (false === $doc = $method->getDocComment()) { + // To read method annotations + $doc = $method->getDocComment(); + + if (isset(self::$annotatedParameters[$class][$method->name])) { + $definedParameters = array(); + foreach ($method->getParameters() as $parameter) { + $definedParameters[$parameter->name] = true; + } + + foreach (self::$annotatedParameters[$class][$method->name] as $parameterName => $deprecation) { + if (!isset($definedParameters[$parameterName]) && !($doc && preg_match("/\\n\\s+\\* @param (.*?)(?<= )\\\${$parameterName}\\b/", $doc))) { + $deprecations[] = sprintf($deprecation, $class); + } + } + } + + if (!$doc) { continue; } + $finalOrInternal = false; + foreach (array('final', 'internal') as $annotation) { if (false !== \strpos($doc, $annotation) && preg_match('#\n\s+\* @'.$annotation.'(?:( .+?)\.?)?\r?\n\s+\*(?: @|/$)#s', $doc, $notice)) { $message = isset($notice[1]) ? preg_replace('#\s*\r?\n \* +#', ' ', $notice[1]) : ''; self::${$annotation.'Methods'}[$class][$method->name] = array($class, $message); + $finalOrInternal = true; + } + } + + if ($finalOrInternal || $method->isConstructor() || false === \strpos($doc, '@param') || StatelessInvocation::class === $class) { + continue; + } + if (!preg_match_all('#\n\s+\* @param (.*?)(?<= )\$([a-zA-Z0-9_\x7f-\xff]++)#', $doc, $matches, PREG_SET_ORDER)) { + continue; + } + if (!isset(self::$annotatedParameters[$class][$method->name])) { + $definedParameters = array(); + foreach ($method->getParameters() as $parameter) { + $definedParameters[$parameter->name] = true; + } + } + foreach ($matches as list(, $parameterType, $parameterName)) { + if (!isset($definedParameters[$parameterName])) { + $parameterType = trim($parameterType); + self::$annotatedParameters[$class][$method->name][$parameterName] = sprintf('The "%%s::%s()" method will require a new "%s$%s" argument in the next major version of its parent class "%s", not defining it is deprecated.', $method->name, $parameterType ? $parameterType.' ' : '', $parameterName, $method->class); } } } diff --git a/vendor/symfony/debug/ErrorHandler.php b/vendor/symfony/debug/ErrorHandler.php index caffd5416..ecae93dbc 100644 --- a/vendor/symfony/debug/ErrorHandler.php +++ b/vendor/symfony/debug/ErrorHandler.php @@ -15,6 +15,7 @@ use Psr\Log\LoggerInterface; use Psr\Log\LogLevel; use Symfony\Component\Debug\Exception\FatalErrorException; use Symfony\Component\Debug\Exception\FatalThrowableError; +use Symfony\Component\Debug\Exception\FlattenException; use Symfony\Component\Debug\Exception\OutOfMemoryException; use Symfony\Component\Debug\Exception\SilencedErrorContext; use Symfony\Component\Debug\FatalErrorHandler\ClassNotFoundFatalErrorHandler; @@ -405,15 +406,19 @@ class ErrorHandler $context = $e; } - $logMessage = $this->levels[$type].': '.$message; + if (false !== strpos($message, "class@anonymous\0")) { + $logMessage = $this->levels[$type].': '.(new FlattenException())->setMessage($message)->getMessage(); + } else { + $logMessage = $this->levels[$type].': '.$message; + } if (null !== self::$toStringException) { $errorAsException = self::$toStringException; self::$toStringException = null; } elseif (!$throw && !($type & $level)) { if (!isset(self::$silencedErrorCache[$id = $file.':'.$line])) { - $lightTrace = $this->tracedErrors & $type ? $this->cleanTrace(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 3), $type, $file, $line, false) : array(); - $errorAsException = new SilencedErrorContext($type, $file, $line, $lightTrace); + $lightTrace = $this->tracedErrors & $type ? $this->cleanTrace(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 5), $type, $file, $line, false) : array(); + $errorAsException = new SilencedErrorContext($type, $file, $line, isset($lightTrace[1]) ? array($lightTrace[0]) : $lightTrace); } elseif (isset(self::$silencedErrorCache[$id][$message])) { $lightTrace = null; $errorAsException = self::$silencedErrorCache[$id][$message]; @@ -436,7 +441,6 @@ class ErrorHandler } else { $errorAsException = new \ErrorException($logMessage, 0, $type, $file, $line); - // Clean the trace by removing function arguments and the first frames added by the error handler itself. if ($throw || $this->tracedErrors & $type) { $backtrace = $errorAsException->getTrace(); $lightTrace = $this->cleanTrace($backtrace, $type, $file, $line, $throw); @@ -518,21 +522,24 @@ class ErrorHandler $handlerException = null; if (($this->loggedErrors & $type) || $exception instanceof FatalThrowableError) { + if (false !== strpos($message = $exception->getMessage(), "class@anonymous\0")) { + $message = (new FlattenException())->setMessage($message)->getMessage(); + } if ($exception instanceof FatalErrorException) { if ($exception instanceof FatalThrowableError) { $error = array( 'type' => $type, - 'message' => $message = $exception->getMessage(), + 'message' => $message, 'file' => $exception->getFile(), 'line' => $exception->getLine(), ); } else { - $message = 'Fatal '.$exception->getMessage(); + $message = 'Fatal '.$message; } } elseif ($exception instanceof \ErrorException) { - $message = 'Uncaught '.$exception->getMessage(); + $message = 'Uncaught '.$message; } else { - $message = 'Uncaught Exception: '.$exception->getMessage(); + $message = 'Uncaught Exception: '.$message; } } if ($this->loggedErrors & $type) { @@ -661,6 +668,9 @@ class ErrorHandler ); } + /** + * Cleans the trace by removing function arguments and the frames added by the error handler and DebugClassLoader. + */ private function cleanTrace($backtrace, $type, $file, $line, $throw) { $lightTrace = $backtrace; @@ -671,6 +681,13 @@ class ErrorHandler break; } } + if (class_exists(DebugClassLoader::class, false)) { + for ($i = \count($lightTrace) - 2; 0 < $i; --$i) { + if (DebugClassLoader::class === ($lightTrace[$i]['class'] ?? null)) { + array_splice($lightTrace, --$i, 2); + } + } + } if (!($throw || $this->scopedErrors & $type)) { for ($i = 0; isset($lightTrace[$i]); ++$i) { unset($lightTrace[$i]['args'], $lightTrace[$i]['object']); diff --git a/vendor/symfony/debug/Exception/FlattenException.php b/vendor/symfony/debug/Exception/FlattenException.php index b091b55bd..f85522ce6 100644 --- a/vendor/symfony/debug/Exception/FlattenException.php +++ b/vendor/symfony/debug/Exception/FlattenException.php @@ -90,9 +90,14 @@ class FlattenException return $this->statusCode; } + /** + * @return $this + */ public function setStatusCode($code) { $this->statusCode = $code; + + return $this; } public function getHeaders() @@ -100,9 +105,14 @@ class FlattenException return $this->headers; } + /** + * @return $this + */ public function setHeaders(array $headers) { $this->headers = $headers; + + return $this; } public function getClass() @@ -110,9 +120,14 @@ class FlattenException return $this->class; } + /** + * @return $this + */ public function setClass($class) { - $this->class = $class; + $this->class = 'c' === $class[0] && 0 === strpos($class, "class@anonymous\0") ? get_parent_class($class).'@anonymous' : $class; + + return $this; } public function getFile() @@ -120,9 +135,14 @@ class FlattenException return $this->file; } + /** + * @return $this + */ public function setFile($file) { $this->file = $file; + + return $this; } public function getLine() @@ -130,9 +150,14 @@ class FlattenException return $this->line; } + /** + * @return $this + */ public function setLine($line) { $this->line = $line; + + return $this; } public function getMessage() @@ -140,9 +165,20 @@ class FlattenException return $this->message; } + /** + * @return $this + */ public function setMessage($message) { + if (false !== strpos($message, "class@anonymous\0")) { + $message = preg_replace_callback('/class@anonymous\x00.*?\.php0x?[0-9a-fA-F]++/', function ($m) { + return \class_exists($m[0], false) ? get_parent_class($m[0]).'@anonymous' : $m[0]; + }, $message); + } + $this->message = $message; + + return $this; } public function getCode() @@ -150,9 +186,14 @@ class FlattenException return $this->code; } + /** + * @return $this + */ public function setCode($code) { $this->code = $code; + + return $this; } public function getPrevious() @@ -160,9 +201,14 @@ class FlattenException return $this->previous; } + /** + * @return $this + */ public function setPrevious(self $previous) { $this->previous = $previous; + + return $this; } public function getAllPrevious() @@ -191,11 +237,14 @@ class FlattenException $this->setTraceFromThrowable($exception); } - public function setTraceFromThrowable(\Throwable $throwable): void + public function setTraceFromThrowable(\Throwable $throwable) { - $this->setTrace($throwable->getTrace(), $throwable->getFile(), $throwable->getLine()); + return $this->setTrace($throwable->getTrace(), $throwable->getFile(), $throwable->getLine()); } + /** + * @return $this + */ public function setTrace($trace, $file, $line) { $this->trace = array(); @@ -229,6 +278,8 @@ class FlattenException 'args' => isset($entry['args']) ? $this->flattenArgs($entry['args']) : array(), ); } + + return $this; } private function flattenArgs($args, $level = 0, &$count = 0) diff --git a/vendor/symfony/debug/ExceptionHandler.php b/vendor/symfony/debug/ExceptionHandler.php index 1845bc88c..ea666b1ac 100644 --- a/vendor/symfony/debug/ExceptionHandler.php +++ b/vendor/symfony/debug/ExceptionHandler.php @@ -253,7 +253,8 @@ EOF } catch (\Exception $e) { // something nasty happened and we cannot throw an exception anymore if ($this->debug) { - $title = sprintf('Exception thrown when handling an exception (%s: %s)', \get_class($e), $this->escapeHtml($e->getMessage())); + $e = FlattenException::create($e); + $title = sprintf('Exception thrown when handling an exception (%s: %s)', $e->getClass(), $this->escapeHtml($e->getMessage())); } else { $title = 'Whoops, looks like something went wrong.'; } diff --git a/vendor/symfony/debug/Tests/DebugClassLoaderTest.php b/vendor/symfony/debug/Tests/DebugClassLoaderTest.php index 4a2375549..c7e03fbef 100644 --- a/vendor/symfony/debug/Tests/DebugClassLoaderTest.php +++ b/vendor/symfony/debug/Tests/DebugClassLoaderTest.php @@ -273,6 +273,24 @@ class DebugClassLoaderTest extends TestCase )); } + public function testExtendedMethodDefinesNewParameters() + { + $deprecations = array(); + set_error_handler(function ($type, $msg) use (&$deprecations) { $deprecations[] = $msg; }); + $e = error_reporting(E_USER_DEPRECATED); + + class_exists(__NAMESPACE__.'\\Fixtures\SubClassWithAnnotatedParameters', true); + + error_reporting($e); + restore_error_handler(); + + $this->assertSame(array( + 'The "Symfony\Component\Debug\Tests\Fixtures\SubClassWithAnnotatedParameters::quzMethod()" method will require a new "Quz $quz" argument in the next major version of its parent class "Symfony\Component\Debug\Tests\Fixtures\ClassWithAnnotatedParameters", not defining it is deprecated.', + 'The "Symfony\Component\Debug\Tests\Fixtures\SubClassWithAnnotatedParameters::whereAmI()" method will require a new "bool $matrix" argument in the next major version of its parent class "Symfony\Component\Debug\Tests\Fixtures\InterfaceWithAnnotatedParameters", not defining it is deprecated.', + 'The "Symfony\Component\Debug\Tests\Fixtures\SubClassWithAnnotatedParameters::isSymfony()" method will require a new "true $yes" argument in the next major version of its parent class "Symfony\Component\Debug\Tests\Fixtures\ClassWithAnnotatedParameters", not defining it is deprecated.', + ), $deprecations); + } + public function testUseTraitWithInternalMethod() { $deprecations = array(); diff --git a/vendor/symfony/debug/Tests/Exception/FlattenExceptionTest.php b/vendor/symfony/debug/Tests/Exception/FlattenExceptionTest.php index 4bac16093..5b77b999a 100644 --- a/vendor/symfony/debug/Tests/Exception/FlattenExceptionTest.php +++ b/vendor/symfony/debug/Tests/Exception/FlattenExceptionTest.php @@ -333,6 +333,19 @@ class FlattenExceptionTest extends TestCase $this->assertNotContains('*value1*', $serializeTrace); } + public function testAnonymousClass() + { + $flattened = FlattenException::create(new class() extends \RuntimeException { + }); + + $this->assertSame('RuntimeException@anonymous', $flattened->getClass()); + + $flattened = FlattenException::create(new \Exception(sprintf('Class "%s" blah.', \get_class(new class() extends \RuntimeException { + })))); + + $this->assertSame('Class "RuntimeException@anonymous" blah.', $flattened->getMessage()); + } + private function createException($foo) { return new \Exception(); diff --git a/vendor/symfony/debug/Tests/Fixtures/ClassWithAnnotatedParameters.php b/vendor/symfony/debug/Tests/Fixtures/ClassWithAnnotatedParameters.php new file mode 100644 index 000000000..d6eec9aa6 --- /dev/null +++ b/vendor/symfony/debug/Tests/Fixtures/ClassWithAnnotatedParameters.php @@ -0,0 +1,34 @@ + preProcess($eventName); - $this->preDispatch($eventName, $event); - - $e = $this->stopwatch->start($eventName, 'section'); - - $this->dispatcher->dispatch($eventName, $event); - - if ($e->isStarted()) { - $e->stop(); + try { + $this->preDispatch($eventName, $event); + try { + $e = $this->stopwatch->start($eventName, 'section'); + try { + $this->dispatcher->dispatch($eventName, $event); + } finally { + if ($e->isStarted()) { + $e->stop(); + } + } + } finally { + $this->postDispatch($eventName, $event); + } + } finally { + $this->postProcess($eventName); } - $this->postDispatch($eventName, $event); - $this->postProcess($eventName); - return $event; } @@ -230,7 +235,7 @@ class TraceableEventDispatcher implements TraceableEventDispatcherInterface */ public function __call($method, $arguments) { - return \call_user_func_array(array($this->dispatcher, $method), $arguments); + return $this->dispatcher->{$method}(...$arguments); } /** @@ -263,7 +268,7 @@ class TraceableEventDispatcher implements TraceableEventDispatcherInterface foreach ($this->dispatcher->getListeners($eventName) as $listener) { $priority = $this->getListenerPriority($eventName, $listener); - $wrappedListener = new WrappedListener($listener, null, $this->stopwatch, $this); + $wrappedListener = new WrappedListener($listener instanceof WrappedListener ? $listener->getWrappedListener() : $listener, null, $this->stopwatch, $this); $this->wrappedListeners[$eventName][] = $wrappedListener; $this->dispatcher->removeListener($eventName, $listener); $this->dispatcher->addListener($eventName, $wrappedListener, $priority); diff --git a/vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcherInterface.php b/vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcherInterface.php index d716f1914..cd4d7470a 100644 --- a/vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcherInterface.php +++ b/vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcherInterface.php @@ -12,13 +12,14 @@ namespace Symfony\Component\EventDispatcher\Debug; use Symfony\Component\EventDispatcher\EventDispatcherInterface; +use Symfony\Contracts\Service\ResetInterface; /** * @deprecated since Symfony 4.1 * * @author Fabien Potencier */ -interface TraceableEventDispatcherInterface extends EventDispatcherInterface +interface TraceableEventDispatcherInterface extends EventDispatcherInterface, ResetInterface { /** * Gets the called listeners. @@ -33,9 +34,4 @@ interface TraceableEventDispatcherInterface extends EventDispatcherInterface * @return array An array of not called listeners */ public function getNotCalledListeners(); - - /** - * Resets the trace. - */ - public function reset(); } diff --git a/vendor/symfony/event-dispatcher/Debug/WrappedListener.php b/vendor/symfony/event-dispatcher/Debug/WrappedListener.php index 2d8126a65..d49f69de7 100644 --- a/vendor/symfony/event-dispatcher/Debug/WrappedListener.php +++ b/vendor/symfony/event-dispatcher/Debug/WrappedListener.php @@ -34,7 +34,6 @@ class WrappedListener public function __construct($listener, $name, Stopwatch $stopwatch, EventDispatcherInterface $dispatcher = null) { $this->listener = $listener; - $this->name = $name; $this->stopwatch = $stopwatch; $this->dispatcher = $dispatcher; $this->called = false; @@ -44,7 +43,15 @@ class WrappedListener $this->name = \is_object($listener[0]) ? \get_class($listener[0]) : $listener[0]; $this->pretty = $this->name.'::'.$listener[1]; } elseif ($listener instanceof \Closure) { - $this->pretty = $this->name = 'closure'; + $r = new \ReflectionFunction($listener); + if (false !== strpos($r->name, '{closure}')) { + $this->pretty = $this->name = 'closure'; + } elseif ($class = $r->getClosureScopeClass()) { + $this->name = $class->name; + $this->pretty = $this->name.'::'.$r->name; + } else { + $this->pretty = $this->name = $r->name; + } } elseif (\is_string($listener)) { $this->pretty = $this->name = $listener; } else { diff --git a/vendor/symfony/event-dispatcher/GenericEvent.php b/vendor/symfony/event-dispatcher/GenericEvent.php index 95c99408d..f0be7e18f 100644 --- a/vendor/symfony/event-dispatcher/GenericEvent.php +++ b/vendor/symfony/event-dispatcher/GenericEvent.php @@ -38,7 +38,7 @@ class GenericEvent extends Event implements \ArrayAccess, \IteratorAggregate /** * Getter for subject property. * - * @return mixed $subject The observer subject + * @return mixed The observer subject */ public function getSubject() { diff --git a/vendor/symfony/event-dispatcher/Tests/AbstractEventDispatcherTest.php b/vendor/symfony/event-dispatcher/Tests/AbstractEventDispatcherTest.php index 9997a7b0e..6d377d11f 100644 --- a/vendor/symfony/event-dispatcher/Tests/AbstractEventDispatcherTest.php +++ b/vendor/symfony/event-dispatcher/Tests/AbstractEventDispatcherTest.php @@ -426,7 +426,7 @@ class TestEventSubscriberWithPriorities implements EventSubscriberInterface return array( 'pre.foo' => array('preFoo', 10), 'post.foo' => array('postFoo'), - ); + ); } } diff --git a/vendor/symfony/event-dispatcher/Tests/Debug/WrappedListenerTest.php b/vendor/symfony/event-dispatcher/Tests/Debug/WrappedListenerTest.php new file mode 100644 index 000000000..f743f148d --- /dev/null +++ b/vendor/symfony/event-dispatcher/Tests/Debug/WrappedListenerTest.php @@ -0,0 +1,64 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\EventDispatcher\Tests\Debug; + +use PHPUnit\Framework\TestCase; +use Symfony\Component\EventDispatcher\Debug\WrappedListener; +use Symfony\Component\EventDispatcher\EventDispatcherInterface; +use Symfony\Component\Stopwatch\Stopwatch; + +class WrappedListenerTest extends TestCase +{ + /** + * @dataProvider provideListenersToDescribe + */ + public function testListenerDescription(callable $listener, $expected) + { + $wrappedListener = new WrappedListener($listener, null, $this->getMockBuilder(Stopwatch::class)->getMock(), $this->getMockBuilder(EventDispatcherInterface::class)->getMock()); + + $this->assertStringMatchesFormat($expected, $wrappedListener->getPretty()); + } + + public function provideListenersToDescribe() + { + $listeners = array( + array(new FooListener(), 'Symfony\Component\EventDispatcher\Tests\Debug\FooListener::__invoke'), + array(array(new FooListener(), 'listen'), 'Symfony\Component\EventDispatcher\Tests\Debug\FooListener::listen'), + array(array('Symfony\Component\EventDispatcher\Tests\Debug\FooListener', 'listenStatic'), 'Symfony\Component\EventDispatcher\Tests\Debug\FooListener::listenStatic'), + array('var_dump', 'var_dump'), + array(function () {}, 'closure'), + ); + + if (\PHP_VERSION_ID >= 70100) { + $listeners[] = array(\Closure::fromCallable(array(new FooListener(), 'listen')), 'Symfony\Component\EventDispatcher\Tests\Debug\FooListener::listen'); + $listeners[] = array(\Closure::fromCallable(array('Symfony\Component\EventDispatcher\Tests\Debug\FooListener', 'listenStatic')), 'Symfony\Component\EventDispatcher\Tests\Debug\FooListener::listenStatic'); + $listeners[] = array(\Closure::fromCallable(function () {}), 'closure'); + } + + return $listeners; + } +} + +class FooListener +{ + public function listen() + { + } + + public function __invoke() + { + } + + public static function listenStatic() + { + } +} diff --git a/vendor/symfony/event-dispatcher/Tests/GenericEventTest.php b/vendor/symfony/event-dispatcher/Tests/GenericEventTest.php index 9cf68c987..b63f69df1 100644 --- a/vendor/symfony/event-dispatcher/Tests/GenericEventTest.php +++ b/vendor/symfony/event-dispatcher/Tests/GenericEventTest.php @@ -31,8 +31,6 @@ class GenericEventTest extends TestCase */ protected function setUp() { - parent::setUp(); - $this->subject = new \stdClass(); $this->event = new GenericEvent($this->subject, array('name' => 'Event')); } @@ -44,8 +42,6 @@ class GenericEventTest extends TestCase { $this->subject = null; $this->event = null; - - parent::tearDown(); } public function testConstruct() diff --git a/vendor/symfony/event-dispatcher/composer.json b/vendor/symfony/event-dispatcher/composer.json index 12ee53270..6c75dfbb0 100644 --- a/vendor/symfony/event-dispatcher/composer.json +++ b/vendor/symfony/event-dispatcher/composer.json @@ -16,7 +16,8 @@ } ], "require": { - "php": "^7.1.3" + "php": "^7.1.3", + "symfony/contracts": "^1.0" }, "require-dev": { "symfony/dependency-injection": "~3.4|~4.0", @@ -41,7 +42,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-master": "4.1-dev" + "dev-master": "4.2-dev" } } } diff --git a/vendor/symfony/event-dispatcher/phpunit.xml.dist b/vendor/symfony/event-dispatcher/phpunit.xml.dist index b3ad1bdf5..f2eb1692c 100644 --- a/vendor/symfony/event-dispatcher/phpunit.xml.dist +++ b/vendor/symfony/event-dispatcher/phpunit.xml.dist @@ -1,7 +1,7 @@ depth('> 1') // the Finder will start matching at level 1. * $finder->depth('< 3') // the Finder will descend at most 3 levels of directories below the starting point. + * $finder->depth(['>= 1', '< 3']) * - * @param string|int $level The depth level expression + * @param string|int|string[]|int[] $levels The depth level expression or an array of depth levels * * @return $this * * @see DepthRangeFilterIterator * @see NumberComparator */ - public function depth($level) + public function depth($levels) { - $this->depths[] = new Comparator\NumberComparator($level); + foreach ((array) $levels as $level) { + $this->depths[] = new Comparator\NumberComparator($level); + } return $this; } @@ -131,8 +135,9 @@ class Finder implements \IteratorAggregate, \Countable * $finder->date('until 2 days ago'); * $finder->date('> now - 2 hours'); * $finder->date('>= 2005-10-15'); + * $finder->date(['>= 2005-10-15', '<= 2006-05-27']); * - * @param string $date A date range string + * @param string|string[] $dates A date range string or an array of date ranges * * @return $this * @@ -140,9 +145,11 @@ class Finder implements \IteratorAggregate, \Countable * @see DateRangeFilterIterator * @see DateComparator */ - public function date($date) + public function date($dates) { - $this->dates[] = new Comparator\DateComparator($date); + foreach ((array) $dates as $date) { + $this->dates[] = new Comparator\DateComparator($date); + } return $this; } @@ -155,16 +162,17 @@ class Finder implements \IteratorAggregate, \Countable * $finder->name('*.php') * $finder->name('/\.php$/') // same as above * $finder->name('test.php') + * $finder->name(['test.py', 'test.php']) * - * @param string $pattern A pattern (a regexp, a glob, or a string) + * @param string|string[] $patterns A pattern (a regexp, a glob, or a string) or an array of patterns * * @return $this * * @see FilenameFilterIterator */ - public function name($pattern) + public function name($patterns) { - $this->names[] = $pattern; + $this->names = \array_merge($this->names, (array) $patterns); return $this; } @@ -172,15 +180,15 @@ class Finder implements \IteratorAggregate, \Countable /** * Adds rules that files must not match. * - * @param string $pattern A pattern (a regexp, a glob, or a string) + * @param string|string[] $patterns A pattern (a regexp, a glob, or a string) or an array of patterns * * @return $this * * @see FilenameFilterIterator */ - public function notName($pattern) + public function notName($patterns) { - $this->notNames[] = $pattern; + $this->notNames = \array_merge($this->notNames, (array) $patterns); return $this; } @@ -192,16 +200,17 @@ class Finder implements \IteratorAggregate, \Countable * * $finder->contains('Lorem ipsum') * $finder->contains('/Lorem ipsum/i') + * $finder->contains(['dolor', '/ipsum/i']) * - * @param string $pattern A pattern (string or regexp) + * @param string|string[] $patterns A pattern (string or regexp) or an array of patterns * * @return $this * * @see FilecontentFilterIterator */ - public function contains($pattern) + public function contains($patterns) { - $this->contains[] = $pattern; + $this->contains = \array_merge($this->contains, (array) $patterns); return $this; } @@ -213,16 +222,17 @@ class Finder implements \IteratorAggregate, \Countable * * $finder->notContains('Lorem ipsum') * $finder->notContains('/Lorem ipsum/i') + * $finder->notContains(['lorem', '/dolor/i']) * - * @param string $pattern A pattern (string or regexp) + * @param string|string[] $patterns A pattern (string or regexp) or an array of patterns * * @return $this * * @see FilecontentFilterIterator */ - public function notContains($pattern) + public function notContains($patterns) { - $this->notContains[] = $pattern; + $this->notContains = \array_merge($this->notContains, (array) $patterns); return $this; } @@ -234,18 +244,19 @@ class Finder implements \IteratorAggregate, \Countable * * $finder->path('some/special/dir') * $finder->path('/some\/special\/dir/') // same as above + * $finder->path(['some dir', 'another/dir']) * * Use only / as dirname separator. * - * @param string $pattern A pattern (a regexp or a string) + * @param string|string[] $patterns A pattern (a regexp or a string) or an array of patterns * * @return $this * * @see FilenameFilterIterator */ - public function path($pattern) + public function path($patterns) { - $this->paths[] = $pattern; + $this->paths = \array_merge($this->paths, (array) $patterns); return $this; } @@ -257,18 +268,19 @@ class Finder implements \IteratorAggregate, \Countable * * $finder->notPath('some/special/dir') * $finder->notPath('/some\/special\/dir/') // same as above + * $finder->notPath(['some/file.txt', 'another/file.log']) * * Use only / as dirname separator. * - * @param string $pattern A pattern (a regexp or a string) + * @param string|string[] $patterns A pattern (a regexp or a string) or an array of patterns * * @return $this * * @see FilenameFilterIterator */ - public function notPath($pattern) + public function notPath($patterns) { - $this->notPaths[] = $pattern; + $this->notPaths = \array_merge($this->notPaths, (array) $patterns); return $this; } @@ -279,17 +291,20 @@ class Finder implements \IteratorAggregate, \Countable * $finder->size('> 10K'); * $finder->size('<= 1Ki'); * $finder->size(4); + * $finder->size(['> 10K', '< 20K']) * - * @param string|int $size A size range string or an integer + * @param string|int|string[]|int[] $sizes A size range string or an integer or an array of size ranges * * @return $this * * @see SizeRangeFilterIterator * @see NumberComparator */ - public function size($size) + public function size($sizes) { - $this->sizes[] = new Comparator\NumberComparator($size); + foreach ((array) $sizes as $size) { + $this->sizes[] = new Comparator\NumberComparator($size); + } return $this; } @@ -397,13 +412,20 @@ class Finder implements \IteratorAggregate, \Countable * * This can be slow as all the matching files and directories must be retrieved for comparison. * + * @param bool $useNaturalSort Whether to use natural sort or not, disabled by default + * * @return $this * * @see SortableIterator */ - public function sortByName() + public function sortByName(/* bool $useNaturalSort = false */) { - $this->sort = Iterator\SortableIterator::SORT_BY_NAME; + if (\func_num_args() < 1 && __CLASS__ !== \get_class($this) && __CLASS__ !== (new \ReflectionMethod($this, __FUNCTION__))->getDeclaringClass()->getName() && !$this instanceof \PHPUnit\Framework\MockObject\MockObject && !$this instanceof \Prophecy\Prophecy\ProphecySubjectInterface) { + @trigger_error(sprintf('The "%s()" method will have a new "bool $useNaturalSort = false" argument in version 5.0, not defining it is deprecated since Symfony 4.2.', __METHOD__), E_USER_DEPRECATED); + } + $useNaturalSort = 0 < \func_num_args() && func_get_arg(0); + + $this->sort = $useNaturalSort ? Iterator\SortableIterator::SORT_BY_NAME_NATURAL : Iterator\SortableIterator::SORT_BY_NAME; return $this; } @@ -442,6 +464,18 @@ class Finder implements \IteratorAggregate, \Countable return $this; } + /** + * Reverses the sorting. + * + * @return $this + */ + public function reverseSorting() + { + $this->reverseSorting = true; + + return $this; + } + /** * Sorts files and directories by the last inode changed time. * @@ -716,8 +750,8 @@ class Finder implements \IteratorAggregate, \Countable $iterator = new Iterator\PathFilterIterator($iterator, $this->paths, $this->notPaths); } - if ($this->sort) { - $iteratorAggregate = new Iterator\SortableIterator($iterator, $this->sort); + if ($this->sort || $this->reverseSorting) { + $iteratorAggregate = new Iterator\SortableIterator($iterator, $this->sort, $this->reverseSorting); $iterator = $iteratorAggregate->getIterator(); } diff --git a/vendor/symfony/finder/Iterator/SortableIterator.php b/vendor/symfony/finder/Iterator/SortableIterator.php index 53f8e31c6..41a8bd153 100644 --- a/vendor/symfony/finder/Iterator/SortableIterator.php +++ b/vendor/symfony/finder/Iterator/SortableIterator.php @@ -18,11 +18,13 @@ namespace Symfony\Component\Finder\Iterator; */ class SortableIterator implements \IteratorAggregate { + const SORT_BY_NONE = 0; const SORT_BY_NAME = 1; const SORT_BY_TYPE = 2; const SORT_BY_ACCESSED_TIME = 3; const SORT_BY_CHANGED_TIME = 4; const SORT_BY_MODIFIED_TIME = 5; + const SORT_BY_NAME_NATURAL = 6; private $iterator; private $sort; @@ -33,38 +35,45 @@ class SortableIterator implements \IteratorAggregate * * @throws \InvalidArgumentException */ - public function __construct(\Traversable $iterator, $sort) + public function __construct(\Traversable $iterator, $sort, bool $reverseOrder = false) { $this->iterator = $iterator; + $order = $reverseOrder ? -1 : 1; if (self::SORT_BY_NAME === $sort) { - $this->sort = function ($a, $b) { - return strcmp($a->getRealpath() ?: $a->getPathname(), $b->getRealpath() ?: $b->getPathname()); + $this->sort = function ($a, $b) use ($order) { + return $order * strcmp($a->getRealpath() ?: $a->getPathname(), $b->getRealpath() ?: $b->getPathname()); + }; + } elseif (self::SORT_BY_NAME_NATURAL === $sort) { + $this->sort = function ($a, $b) use ($order) { + return $order * strnatcmp($a->getRealPath() ?: $a->getPathname(), $b->getRealPath() ?: $b->getPathname()); }; } elseif (self::SORT_BY_TYPE === $sort) { - $this->sort = function ($a, $b) { + $this->sort = function ($a, $b) use ($order) { if ($a->isDir() && $b->isFile()) { - return -1; + return -$order; } elseif ($a->isFile() && $b->isDir()) { - return 1; + return $order; } - return strcmp($a->getRealpath() ?: $a->getPathname(), $b->getRealpath() ?: $b->getPathname()); + return $order * strcmp($a->getRealpath() ?: $a->getPathname(), $b->getRealpath() ?: $b->getPathname()); }; } elseif (self::SORT_BY_ACCESSED_TIME === $sort) { - $this->sort = function ($a, $b) { - return $a->getATime() - $b->getATime(); + $this->sort = function ($a, $b) use ($order) { + return $order * ($a->getATime() - $b->getATime()); }; } elseif (self::SORT_BY_CHANGED_TIME === $sort) { - $this->sort = function ($a, $b) { - return $a->getCTime() - $b->getCTime(); + $this->sort = function ($a, $b) use ($order) { + return $order * ($a->getCTime() - $b->getCTime()); }; } elseif (self::SORT_BY_MODIFIED_TIME === $sort) { - $this->sort = function ($a, $b) { - return $a->getMTime() - $b->getMTime(); + $this->sort = function ($a, $b) use ($order) { + return $order * ($a->getMTime() - $b->getMTime()); }; + } elseif (self::SORT_BY_NONE === $sort) { + $this->sort = $order; } elseif (\is_callable($sort)) { - $this->sort = $sort; + $this->sort = $reverseOrder ? function ($a, $b) use ($sort) { return -\call_user_func($sort, $a, $b); } : $sort; } else { throw new \InvalidArgumentException('The SortableIterator takes a PHP callable or a valid built-in sort algorithm as an argument.'); } @@ -72,8 +81,17 @@ class SortableIterator implements \IteratorAggregate public function getIterator() { + if (1 === $this->sort) { + return $this->iterator; + } + $array = iterator_to_array($this->iterator, true); - uasort($array, $this->sort); + + if (-1 === $this->sort) { + $array = array_reverse($array); + } else { + uasort($array, $this->sort); + } return new \ArrayIterator($array); } diff --git a/vendor/symfony/finder/Tests/FinderTest.php b/vendor/symfony/finder/Tests/FinderTest.php index fbdcc36e6..74c11cea1 100644 --- a/vendor/symfony/finder/Tests/FinderTest.php +++ b/vendor/symfony/finder/Tests/FinderTest.php @@ -24,33 +24,70 @@ class FinderTest extends Iterator\RealIteratorTestCase { $finder = $this->buildFinder(); $this->assertSame($finder, $finder->directories()); - $this->assertIterator($this->toAbsolute(array('foo', 'toto')), $finder->in(self::$tmpDir)->getIterator()); + $this->assertIterator($this->toAbsolute(array('foo', 'qux', 'toto')), $finder->in(self::$tmpDir)->getIterator()); $finder = $this->buildFinder(); $finder->directories(); $finder->files(); $finder->directories(); - $this->assertIterator($this->toAbsolute(array('foo', 'toto')), $finder->in(self::$tmpDir)->getIterator()); + $this->assertIterator($this->toAbsolute(array('foo', 'qux', 'toto')), $finder->in(self::$tmpDir)->getIterator()); } public function testFiles() { $finder = $this->buildFinder(); $this->assertSame($finder, $finder->files()); - $this->assertIterator($this->toAbsolute(array('foo/bar.tmp', 'test.php', 'test.py', 'foo bar')), $finder->in(self::$tmpDir)->getIterator()); + $this->assertIterator($this->toAbsolute(array('foo/bar.tmp', + 'test.php', + 'test.py', + 'foo bar', + 'qux/baz_100_1.py', + 'qux/baz_1_2.py', + 'qux_0_1.php', + 'qux_1000_1.php', + 'qux_1002_0.php', + 'qux_10_2.php', + 'qux_12_0.php', + 'qux_2_0.php', + )), $finder->in(self::$tmpDir)->getIterator()); $finder = $this->buildFinder(); $finder->files(); $finder->directories(); $finder->files(); - $this->assertIterator($this->toAbsolute(array('foo/bar.tmp', 'test.php', 'test.py', 'foo bar')), $finder->in(self::$tmpDir)->getIterator()); + $this->assertIterator($this->toAbsolute(array('foo/bar.tmp', + 'test.php', + 'test.py', + 'foo bar', + 'qux/baz_100_1.py', + 'qux/baz_1_2.py', + 'qux_0_1.php', + 'qux_1000_1.php', + 'qux_1002_0.php', + 'qux_10_2.php', + 'qux_12_0.php', + 'qux_2_0.php', + )), $finder->in(self::$tmpDir)->getIterator()); } public function testRemoveTrailingSlash() { $finder = $this->buildFinder(); - $expected = $this->toAbsolute(array('foo/bar.tmp', 'test.php', 'test.py', 'foo bar')); + $expected = $this->toAbsolute(array( + 'foo/bar.tmp', + 'test.php', + 'test.py', + 'foo bar', + 'qux/baz_100_1.py', + 'qux/baz_1_2.py', + 'qux_0_1.php', + 'qux_1000_1.php', + 'qux_1002_0.php', + 'qux_10_2.php', + 'qux_12_0.php', + 'qux_2_0.php', + )); $in = self::$tmpDir.'//'; $this->assertIterator($expected, $finder->in($in)->files()->getIterator()); @@ -89,26 +126,73 @@ class FinderTest extends Iterator\RealIteratorTestCase { $finder = $this->buildFinder(); $this->assertSame($finder, $finder->depth('< 1')); - $this->assertIterator($this->toAbsolute(array('foo', 'test.php', 'test.py', 'toto', 'foo bar')), $finder->in(self::$tmpDir)->getIterator()); + $this->assertIterator($this->toAbsolute(array('foo', + 'test.php', + 'test.py', + 'toto', + 'foo bar', + 'qux', + 'qux_0_1.php', + 'qux_1000_1.php', + 'qux_1002_0.php', + 'qux_10_2.php', + 'qux_12_0.php', + 'qux_2_0.php', + )), $finder->in(self::$tmpDir)->getIterator()); $finder = $this->buildFinder(); $this->assertSame($finder, $finder->depth('<= 0')); - $this->assertIterator($this->toAbsolute(array('foo', 'test.php', 'test.py', 'toto', 'foo bar')), $finder->in(self::$tmpDir)->getIterator()); + $this->assertIterator($this->toAbsolute(array('foo', + 'test.php', + 'test.py', + 'toto', + 'foo bar', + 'qux', + 'qux_0_1.php', + 'qux_1000_1.php', + 'qux_1002_0.php', + 'qux_10_2.php', + 'qux_12_0.php', + 'qux_2_0.php', + )), $finder->in(self::$tmpDir)->getIterator()); $finder = $this->buildFinder(); $this->assertSame($finder, $finder->depth('>= 1')); - $this->assertIterator($this->toAbsolute(array('foo/bar.tmp')), $finder->in(self::$tmpDir)->getIterator()); + $this->assertIterator($this->toAbsolute(array( + 'foo/bar.tmp', + 'qux/baz_100_1.py', + 'qux/baz_1_2.py', + )), $finder->in(self::$tmpDir)->getIterator()); $finder = $this->buildFinder(); $finder->depth('< 1')->depth('>= 1'); $this->assertIterator(array(), $finder->in(self::$tmpDir)->getIterator()); } + public function testDepthWithArrayParam() + { + $finder = $this->buildFinder(); + $finder->depth(array('>= 1', '< 2')); + $this->assertIterator($this->toAbsolute(array( + 'foo/bar.tmp', + 'qux/baz_100_1.py', + 'qux/baz_1_2.py', + )), $finder->in(self::$tmpDir)->getIterator()); + } + public function testName() { $finder = $this->buildFinder(); $this->assertSame($finder, $finder->name('*.php')); - $this->assertIterator($this->toAbsolute(array('test.php')), $finder->in(self::$tmpDir)->getIterator()); + $this->assertIterator($this->toAbsolute(array( + 'test.php', + 'qux_0_1.php', + 'qux_1000_1.php', + 'qux_1002_0.php', + 'qux_10_2.php', + 'qux_12_0.php', + 'qux_2_0.php', + )), $finder->in(self::$tmpDir)->getIterator()); $finder = $this->buildFinder(); $finder->name('test.ph*'); @@ -121,23 +205,53 @@ class FinderTest extends Iterator\RealIteratorTestCase $finder = $this->buildFinder(); $finder->name('~\\.php$~i'); - $this->assertIterator($this->toAbsolute(array('test.php')), $finder->in(self::$tmpDir)->getIterator()); + $this->assertIterator($this->toAbsolute(array( + 'test.php', + 'qux_0_1.php', + 'qux_1000_1.php', + 'qux_1002_0.php', + 'qux_10_2.php', + 'qux_12_0.php', + 'qux_2_0.php', + )), $finder->in(self::$tmpDir)->getIterator()); $finder = $this->buildFinder(); $finder->name('test.p{hp,y}'); $this->assertIterator($this->toAbsolute(array('test.php', 'test.py')), $finder->in(self::$tmpDir)->getIterator()); } + public function testNameWithArrayParam() + { + $finder = $this->buildFinder(); + $finder->name(array('test.php', 'test.py')); + $this->assertIterator($this->toAbsolute(array('test.php', 'test.py')), $finder->in(self::$tmpDir)->getIterator()); + } + public function testNotName() { $finder = $this->buildFinder(); $this->assertSame($finder, $finder->notName('*.php')); - $this->assertIterator($this->toAbsolute(array('foo', 'foo/bar.tmp', 'test.py', 'toto', 'foo bar')), $finder->in(self::$tmpDir)->getIterator()); + $this->assertIterator($this->toAbsolute(array( + 'foo', + 'foo/bar.tmp', + 'test.py', + 'toto', + 'foo bar', + 'qux', + 'qux/baz_100_1.py', + 'qux/baz_1_2.py', + )), $finder->in(self::$tmpDir)->getIterator()); $finder = $this->buildFinder(); $finder->notName('*.php'); $finder->notName('*.py'); - $this->assertIterator($this->toAbsolute(array('foo', 'foo/bar.tmp', 'toto', 'foo bar')), $finder->in(self::$tmpDir)->getIterator()); + $this->assertIterator($this->toAbsolute(array( + 'foo', + 'foo/bar.tmp', + 'toto', + 'foo bar', + 'qux', + )), $finder->in(self::$tmpDir)->getIterator()); $finder = $this->buildFinder(); $finder->name('test.ph*'); @@ -153,6 +267,19 @@ class FinderTest extends Iterator\RealIteratorTestCase $this->assertIterator(array(), $finder->in(self::$tmpDir)->getIterator()); } + public function testNotNameWithArrayParam() + { + $finder = $this->buildFinder(); + $finder->notName(array('*.php', '*.py')); + $this->assertIterator($this->toAbsolute(array( + 'foo', + 'foo/bar.tmp', + 'toto', + 'foo bar', + 'qux', + )), $finder->in(self::$tmpDir)->getIterator()); + } + /** * @dataProvider getRegexNameTestData */ @@ -160,7 +287,10 @@ class FinderTest extends Iterator\RealIteratorTestCase { $finder = $this->buildFinder(); $finder->name($regex); - $this->assertIterator($this->toAbsolute(array('test.py', 'test.php')), $finder->in(self::$tmpDir)->getIterator()); + $this->assertIterator($this->toAbsolute(array( + 'test.py', + 'test.php', + )), $finder->in(self::$tmpDir)->getIterator()); } public function testSize() @@ -170,6 +300,13 @@ class FinderTest extends Iterator\RealIteratorTestCase $this->assertIterator($this->toAbsolute(array('test.php')), $finder->in(self::$tmpDir)->getIterator()); } + public function testSizeWithArrayParam() + { + $finder = $this->buildFinder(); + $this->assertSame($finder, $finder->files()->size(array('< 1K', '> 500'))); + $this->assertIterator($this->toAbsolute(array('test.php')), $finder->in(self::$tmpDir)->getIterator()); + } + public function testDate() { $finder = $this->buildFinder(); @@ -177,83 +314,391 @@ class FinderTest extends Iterator\RealIteratorTestCase $this->assertIterator($this->toAbsolute(array('foo/bar.tmp', 'test.php')), $finder->in(self::$tmpDir)->getIterator()); } + public function testDateWithArrayParam() + { + $finder = $this->buildFinder(); + $this->assertSame($finder, $finder->files()->date(array('>= 2005-10-15', 'until last month'))); + $this->assertIterator($this->toAbsolute(array('foo/bar.tmp', 'test.php')), $finder->in(self::$tmpDir)->getIterator()); + } + public function testExclude() { $finder = $this->buildFinder(); $this->assertSame($finder, $finder->exclude('foo')); - $this->assertIterator($this->toAbsolute(array('test.php', 'test.py', 'toto', 'foo bar')), $finder->in(self::$tmpDir)->getIterator()); + $this->assertIterator($this->toAbsolute(array( + 'test.php', + 'test.py', + 'toto', + 'foo bar', + 'qux', + 'qux/baz_100_1.py', + 'qux/baz_1_2.py', + 'qux_0_1.php', + 'qux_1000_1.php', + 'qux_1002_0.php', + 'qux_10_2.php', + 'qux_12_0.php', + 'qux_2_0.php', + )), $finder->in(self::$tmpDir)->getIterator()); } public function testIgnoreVCS() { $finder = $this->buildFinder(); $this->assertSame($finder, $finder->ignoreVCS(false)->ignoreDotFiles(false)); - $this->assertIterator($this->toAbsolute(array('.git', 'foo', 'foo/bar.tmp', 'test.php', 'test.py', 'toto', 'toto/.git', '.bar', '.foo', '.foo/.bar', '.foo/bar', 'foo bar')), $finder->in(self::$tmpDir)->getIterator()); + $this->assertIterator($this->toAbsolute(array( + '.git', + 'foo', + 'foo/bar.tmp', + 'test.php', + 'test.py', + 'toto', + 'toto/.git', + '.bar', + '.foo', + '.foo/.bar', + '.foo/bar', + 'foo bar', + 'qux', + 'qux/baz_100_1.py', + 'qux/baz_1_2.py', + 'qux_0_1.php', + 'qux_1000_1.php', + 'qux_1002_0.php', + 'qux_10_2.php', + 'qux_12_0.php', + 'qux_2_0.php', + )), $finder->in(self::$tmpDir)->getIterator()); $finder = $this->buildFinder(); $finder->ignoreVCS(false)->ignoreVCS(false)->ignoreDotFiles(false); - $this->assertIterator($this->toAbsolute(array('.git', 'foo', 'foo/bar.tmp', 'test.php', 'test.py', 'toto', 'toto/.git', '.bar', '.foo', '.foo/.bar', '.foo/bar', 'foo bar')), $finder->in(self::$tmpDir)->getIterator()); + $this->assertIterator($this->toAbsolute(array( + '.git', + 'foo', + 'foo/bar.tmp', + 'test.php', + 'test.py', + 'toto', + 'toto/.git', + '.bar', + '.foo', + '.foo/.bar', + '.foo/bar', + 'foo bar', + 'qux', + 'qux/baz_100_1.py', + 'qux/baz_1_2.py', + 'qux_0_1.php', + 'qux_1000_1.php', + 'qux_1002_0.php', + 'qux_10_2.php', + 'qux_12_0.php', + 'qux_2_0.php', + )), $finder->in(self::$tmpDir)->getIterator()); $finder = $this->buildFinder(); $this->assertSame($finder, $finder->ignoreVCS(true)->ignoreDotFiles(false)); - $this->assertIterator($this->toAbsolute(array('foo', 'foo/bar.tmp', 'test.php', 'test.py', 'toto', '.bar', '.foo', '.foo/.bar', '.foo/bar', 'foo bar')), $finder->in(self::$tmpDir)->getIterator()); + $this->assertIterator($this->toAbsolute(array( + 'foo', + 'foo/bar.tmp', + 'test.php', + 'test.py', + 'toto', + '.bar', + '.foo', + '.foo/.bar', + '.foo/bar', + 'foo bar', + 'qux', + 'qux/baz_100_1.py', + 'qux/baz_1_2.py', + 'qux_0_1.php', + 'qux_1000_1.php', + 'qux_1002_0.php', + 'qux_10_2.php', + 'qux_12_0.php', + 'qux_2_0.php', + )), $finder->in(self::$tmpDir)->getIterator()); } public function testIgnoreDotFiles() { $finder = $this->buildFinder(); $this->assertSame($finder, $finder->ignoreDotFiles(false)->ignoreVCS(false)); - $this->assertIterator($this->toAbsolute(array('.git', '.bar', '.foo', '.foo/.bar', '.foo/bar', 'foo', 'foo/bar.tmp', 'test.php', 'test.py', 'toto', 'toto/.git', 'foo bar')), $finder->in(self::$tmpDir)->getIterator()); + $this->assertIterator($this->toAbsolute(array( + '.git', + '.bar', + '.foo', + '.foo/.bar', + '.foo/bar', + 'foo', + 'foo/bar.tmp', + 'test.php', + 'test.py', + 'toto', + 'toto/.git', + 'foo bar', + 'qux', + 'qux/baz_100_1.py', + 'qux/baz_1_2.py', + 'qux_0_1.php', + 'qux_1000_1.php', + 'qux_1002_0.php', + 'qux_10_2.php', + 'qux_12_0.php', + 'qux_2_0.php', + )), $finder->in(self::$tmpDir)->getIterator()); $finder = $this->buildFinder(); $finder->ignoreDotFiles(false)->ignoreDotFiles(false)->ignoreVCS(false); - $this->assertIterator($this->toAbsolute(array('.git', '.bar', '.foo', '.foo/.bar', '.foo/bar', 'foo', 'foo/bar.tmp', 'test.php', 'test.py', 'toto', 'toto/.git', 'foo bar')), $finder->in(self::$tmpDir)->getIterator()); + $this->assertIterator($this->toAbsolute(array( + '.git', + '.bar', + '.foo', + '.foo/.bar', + '.foo/bar', + 'foo', + 'foo/bar.tmp', + 'test.php', + 'test.py', + 'toto', + 'toto/.git', + 'foo bar', + 'qux', + 'qux/baz_100_1.py', + 'qux/baz_1_2.py', + 'qux_0_1.php', + 'qux_1000_1.php', + 'qux_1002_0.php', + 'qux_10_2.php', + 'qux_12_0.php', + 'qux_2_0.php', + )), $finder->in(self::$tmpDir)->getIterator()); $finder = $this->buildFinder(); $this->assertSame($finder, $finder->ignoreDotFiles(true)->ignoreVCS(false)); - $this->assertIterator($this->toAbsolute(array('foo', 'foo/bar.tmp', 'test.php', 'test.py', 'toto', 'foo bar')), $finder->in(self::$tmpDir)->getIterator()); + $this->assertIterator($this->toAbsolute(array( + 'foo', + 'foo/bar.tmp', + 'test.php', + 'test.py', + 'toto', + 'foo bar', + 'qux', + 'qux/baz_100_1.py', + 'qux/baz_1_2.py', + 'qux_0_1.php', + 'qux_1000_1.php', + 'qux_1002_0.php', + 'qux_10_2.php', + 'qux_12_0.php', + 'qux_2_0.php', + )), $finder->in(self::$tmpDir)->getIterator()); } public function testSortByName() { $finder = $this->buildFinder(); $this->assertSame($finder, $finder->sortByName()); - $this->assertIterator($this->toAbsolute(array('foo', 'foo bar', 'foo/bar.tmp', 'test.php', 'test.py', 'toto')), $finder->in(self::$tmpDir)->getIterator()); + $this->assertIterator($this->toAbsolute(array( + 'foo', + 'foo bar', + 'foo/bar.tmp', + 'qux', + 'qux/baz_100_1.py', + 'qux/baz_1_2.py', + 'qux_0_1.php', + 'qux_1000_1.php', + 'qux_1002_0.php', + 'qux_10_2.php', + 'qux_12_0.php', + 'qux_2_0.php', + 'test.php', + 'test.py', + 'toto', + )), $finder->in(self::$tmpDir)->getIterator()); } public function testSortByType() { $finder = $this->buildFinder(); $this->assertSame($finder, $finder->sortByType()); - $this->assertIterator($this->toAbsolute(array('foo', 'foo bar', 'toto', 'foo/bar.tmp', 'test.php', 'test.py')), $finder->in(self::$tmpDir)->getIterator()); + $this->assertIterator($this->toAbsolute(array( + 'foo', + 'foo bar', + 'toto', + 'foo/bar.tmp', + 'test.php', + 'test.py', + 'qux', + 'qux/baz_100_1.py', + 'qux/baz_1_2.py', + 'qux_0_1.php', + 'qux_1000_1.php', + 'qux_1002_0.php', + 'qux_10_2.php', + 'qux_12_0.php', + 'qux_2_0.php', + )), $finder->in(self::$tmpDir)->getIterator()); } public function testSortByAccessedTime() { $finder = $this->buildFinder(); $this->assertSame($finder, $finder->sortByAccessedTime()); - $this->assertIterator($this->toAbsolute(array('foo/bar.tmp', 'test.php', 'toto', 'test.py', 'foo', 'foo bar')), $finder->in(self::$tmpDir)->getIterator()); + $this->assertIterator($this->toAbsolute(array( + 'foo/bar.tmp', + 'test.php', + 'toto', + 'test.py', + 'foo', + 'foo bar', + 'qux', + 'qux/baz_100_1.py', + 'qux/baz_1_2.py', + 'qux_0_1.php', + 'qux_1000_1.php', + 'qux_1002_0.php', + 'qux_10_2.php', + 'qux_12_0.php', + 'qux_2_0.php', + )), $finder->in(self::$tmpDir)->getIterator()); } public function testSortByChangedTime() { $finder = $this->buildFinder(); $this->assertSame($finder, $finder->sortByChangedTime()); - $this->assertIterator($this->toAbsolute(array('toto', 'test.py', 'test.php', 'foo/bar.tmp', 'foo', 'foo bar')), $finder->in(self::$tmpDir)->getIterator()); + $this->assertIterator($this->toAbsolute(array( + 'toto', + 'test.py', + 'test.php', + 'foo/bar.tmp', + 'foo', + 'foo bar', + 'qux', + 'qux/baz_100_1.py', + 'qux/baz_1_2.py', + 'qux_0_1.php', + 'qux_1000_1.php', + 'qux_1002_0.php', + 'qux_10_2.php', + 'qux_12_0.php', + 'qux_2_0.php', + )), $finder->in(self::$tmpDir)->getIterator()); } public function testSortByModifiedTime() { $finder = $this->buildFinder(); $this->assertSame($finder, $finder->sortByModifiedTime()); - $this->assertIterator($this->toAbsolute(array('foo/bar.tmp', 'test.php', 'toto', 'test.py', 'foo', 'foo bar')), $finder->in(self::$tmpDir)->getIterator()); + $this->assertIterator($this->toAbsolute(array( + 'foo/bar.tmp', + 'test.php', + 'toto', + 'test.py', + 'foo', + 'foo bar', + 'qux', + 'qux/baz_100_1.py', + 'qux/baz_1_2.py', + 'qux_0_1.php', + 'qux_1000_1.php', + 'qux_1002_0.php', + 'qux_10_2.php', + 'qux_12_0.php', + 'qux_2_0.php', + )), $finder->in(self::$tmpDir)->getIterator()); + } + + public function testReverseSorting() + { + $finder = $this->buildFinder(); + $this->assertSame($finder, $finder->sortByName()); + $this->assertSame($finder, $finder->reverseSorting()); + $this->assertOrderedIteratorInForeach($this->toAbsolute(array( + 'toto', + 'test.py', + 'test.php', + 'qux_2_0.php', + 'qux_12_0.php', + 'qux_10_2.php', + 'qux_1002_0.php', + 'qux_1000_1.php', + 'qux_0_1.php', + 'qux/baz_1_2.py', + 'qux/baz_100_1.py', + 'qux', + 'foo/bar.tmp', + 'foo bar', + 'foo', + )), $finder->in(self::$tmpDir)->getIterator()); + } + + public function testSortByNameNatural() + { + $finder = $this->buildFinder(); + $this->assertSame($finder, $finder->sortByName(true)); + $this->assertIterator($this->toAbsolute(array( + 'foo', + 'foo bar', + 'foo/bar.tmp', + 'qux', + 'qux/baz_100_1.py', + 'qux/baz_1_2.py', + 'qux_0_1.php', + 'qux_1000_1.php', + 'qux_1002_0.php', + 'qux_10_2.php', + 'qux_12_0.php', + 'qux_2_0.php', + 'test.php', + 'test.py', + 'toto', + )), $finder->in(self::$tmpDir)->getIterator()); + + $finder = $this->buildFinder(); + $this->assertSame($finder, $finder->sortByName(false)); + $this->assertIterator($this->toAbsolute(array( + 'foo', + 'foo bar', + 'foo/bar.tmp', + 'qux', + 'qux/baz_100_1.py', + 'qux/baz_1_2.py', + 'qux_0_1.php', + 'qux_1000_1.php', + 'qux_1002_0.php', + 'qux_10_2.php', + 'qux_12_0.php', + 'qux_2_0.php', + 'test.php', + 'test.py', + 'toto', + )), $finder->in(self::$tmpDir)->getIterator()); } public function testSort() { $finder = $this->buildFinder(); $this->assertSame($finder, $finder->sort(function (\SplFileInfo $a, \SplFileInfo $b) { return strcmp($a->getRealPath(), $b->getRealPath()); })); - $this->assertIterator($this->toAbsolute(array('foo', 'foo bar', 'foo/bar.tmp', 'test.php', 'test.py', 'toto')), $finder->in(self::$tmpDir)->getIterator()); + $this->assertIterator($this->toAbsolute(array( + 'foo', + 'foo bar', + 'foo/bar.tmp', + 'test.php', + 'test.py', + 'toto', + 'qux', + 'qux/baz_100_1.py', + 'qux/baz_1_2.py', + 'qux_0_1.php', + 'qux_1000_1.php', + 'qux_1002_0.php', + 'qux_10_2.php', + 'qux_12_0.php', + 'qux_2_0.php', + )), $finder->in(self::$tmpDir)->getIterator()); } public function testFilter() @@ -271,7 +716,23 @@ class FinderTest extends Iterator\RealIteratorTestCase $finder = $this->buildFinder(); $this->assertSame($finder, $finder->followLinks()); - $this->assertIterator($this->toAbsolute(array('foo', 'foo/bar.tmp', 'test.php', 'test.py', 'toto', 'foo bar')), $finder->in(self::$tmpDir)->getIterator()); + $this->assertIterator($this->toAbsolute(array( + 'foo', + 'foo/bar.tmp', + 'test.php', + 'test.py', + 'toto', + 'foo bar', + 'qux', + 'qux/baz_100_1.py', + 'qux/baz_1_2.py', + 'qux_0_1.php', + 'qux_1000_1.php', + 'qux_1002_0.php', + 'qux_10_2.php', + 'qux_12_0.php', + 'qux_2_0.php', + )), $finder->in(self::$tmpDir)->getIterator()); } public function testIn() @@ -283,6 +744,12 @@ class FinderTest extends Iterator\RealIteratorTestCase self::$tmpDir.\DIRECTORY_SEPARATOR.'test.php', __DIR__.\DIRECTORY_SEPARATOR.'FinderTest.php', __DIR__.\DIRECTORY_SEPARATOR.'GlobTest.php', + self::$tmpDir.\DIRECTORY_SEPARATOR.'qux_0_1.php', + self::$tmpDir.\DIRECTORY_SEPARATOR.'qux_1000_1.php', + self::$tmpDir.\DIRECTORY_SEPARATOR.'qux_1002_0.php', + self::$tmpDir.\DIRECTORY_SEPARATOR.'qux_10_2.php', + self::$tmpDir.\DIRECTORY_SEPARATOR.'qux_12_0.php', + self::$tmpDir.\DIRECTORY_SEPARATOR.'qux_2_0.php', ); $this->assertIterator($expected, $iterator); @@ -339,7 +806,7 @@ class FinderTest extends Iterator\RealIteratorTestCase $dirs[] = (string) $dir; } - $expected = $this->toAbsolute(array('foo', 'toto')); + $expected = $this->toAbsolute(array('foo', 'qux', 'toto')); sort($dirs); sort($expected); @@ -347,7 +814,7 @@ class FinderTest extends Iterator\RealIteratorTestCase $this->assertEquals($expected, $dirs, 'implements the \IteratorAggregate interface'); $finder = $this->buildFinder(); - $this->assertEquals(2, iterator_count($finder->directories()->in(self::$tmpDir)), 'implements the \IteratorAggregate interface'); + $this->assertEquals(3, iterator_count($finder->directories()->in(self::$tmpDir)), 'implements the \IteratorAggregate interface'); $finder = $this->buildFinder(); $a = iterator_to_array($finder->directories()->in(self::$tmpDir)); @@ -366,7 +833,7 @@ class FinderTest extends Iterator\RealIteratorTestCase $paths[] = $file->getRelativePath(); } - $ref = array('', '', '', '', 'foo', ''); + $ref = array('', '', '', '', '', '', '', '', '', '', '', 'foo', 'qux', 'qux', ''); sort($ref); sort($paths); @@ -384,7 +851,23 @@ class FinderTest extends Iterator\RealIteratorTestCase $paths[] = $file->getRelativePathname(); } - $ref = array('test.php', 'toto', 'test.py', 'foo', 'foo'.\DIRECTORY_SEPARATOR.'bar.tmp', 'foo bar'); + $ref = array( + 'test.php', + 'toto', + 'test.py', + 'foo', + 'foo'.\DIRECTORY_SEPARATOR.'bar.tmp', + 'foo bar', + 'qux', + 'qux'.\DIRECTORY_SEPARATOR.'baz_100_1.py', + 'qux'.\DIRECTORY_SEPARATOR.'baz_1_2.py', + 'qux_0_1.php', + 'qux_1000_1.php', + 'qux_1002_0.php', + 'qux_10_2.php', + 'qux_12_0.php', + 'qux_2_0.php', + ); sort($paths); sort($ref); @@ -402,7 +885,7 @@ class FinderTest extends Iterator\RealIteratorTestCase $finder = $finder->append($finder1); - $this->assertIterator($this->toAbsolute(array('foo', 'foo/bar.tmp', 'toto')), $finder->getIterator()); + $this->assertIterator($this->toAbsolute(array('foo', 'foo/bar.tmp', 'qux', 'toto')), $finder->getIterator()); } public function testAppendWithAnArray() @@ -595,13 +1078,15 @@ class FinderTest extends Iterator\RealIteratorTestCase array('lorem', 'foobar', array('lorem.txt')), array('', 'lorem', array('dolor.txt', 'ipsum.txt')), array('ipsum dolor sit amet', '/^IPSUM/m', array('lorem.txt')), + array(array('lorem', 'dolor'), array(), array('lorem.txt', 'ipsum.txt', 'dolor.txt')), + array('', array('lorem', 'ipsum'), array('dolor.txt')), ); } public function getRegexNameTestData() { return array( - array('~.+\\.p.+~i'), + array('~.*t\\.p.+~i'), array('~t.*s~i'), ); } @@ -661,6 +1146,33 @@ class FinderTest extends Iterator\RealIteratorTestCase 'with space'.\DIRECTORY_SEPARATOR.'foo.txt', ), ), + array( + '/^A/', + array('a.dat', 'abc.dat'), + array( + 'A', + 'A'.\DIRECTORY_SEPARATOR.'B', + 'A'.\DIRECTORY_SEPARATOR.'B'.\DIRECTORY_SEPARATOR.'C', + 'A'.\DIRECTORY_SEPARATOR.'B'.\DIRECTORY_SEPARATOR.'ab.dat', + ), + ), + array( + array('/^A/', 'one'), + 'foobar', + array( + 'A', + 'A'.\DIRECTORY_SEPARATOR.'B', + 'A'.\DIRECTORY_SEPARATOR.'B'.\DIRECTORY_SEPARATOR.'C', + 'A'.\DIRECTORY_SEPARATOR.'a.dat', + 'A'.\DIRECTORY_SEPARATOR.'B'.\DIRECTORY_SEPARATOR.'ab.dat', + 'A'.\DIRECTORY_SEPARATOR.'B'.\DIRECTORY_SEPARATOR.'C'.\DIRECTORY_SEPARATOR.'abc.dat', + 'one', + 'one'.\DIRECTORY_SEPARATOR.'a', + 'one'.\DIRECTORY_SEPARATOR.'b', + 'one'.\DIRECTORY_SEPARATOR.'b'.\DIRECTORY_SEPARATOR.'c.neon', + 'one'.\DIRECTORY_SEPARATOR.'b'.\DIRECTORY_SEPARATOR.'d.neon', + ), + ), ); } @@ -718,7 +1230,20 @@ class FinderTest extends Iterator\RealIteratorTestCase chmod($testDir, 0333); if (false === ($couldRead = is_readable($testDir))) { - $this->assertIterator($this->toAbsolute(array('foo bar', 'test.php', 'test.py')), $finder->getIterator()); + $this->assertIterator($this->toAbsolute(array( + 'foo bar', + 'test.php', + 'test.py', + 'qux/baz_100_1.py', + 'qux/baz_1_2.py', + 'qux_0_1.php', + 'qux_1000_1.php', + 'qux_1002_0.php', + 'qux_10_2.php', + 'qux_12_0.php', + 'qux_2_0.php', + ) + ), $finder->getIterator()); } // restore original permissions @@ -730,8 +1255,26 @@ class FinderTest extends Iterator\RealIteratorTestCase } } + /** + * @group legacy + * @expectedDeprecation The "Symfony\Component\Finder\Finder::sortByName()" method will have a new "bool $useNaturalSort = false" argument in version 5.0, not defining it is deprecated since Symfony 4.2. + */ + public function testInheritedClassCallSortByNameWithNoArguments() + { + $finderChild = new ClassThatInheritFinder(); + $finderChild->sortByName(); + } + protected function buildFinder() { return Finder::create(); } } + +class ClassThatInheritFinder extends Finder +{ + public function sortByName() + { + parent::sortByName(); + } +} diff --git a/vendor/symfony/finder/Tests/Iterator/DateRangeFilterIteratorTest.php b/vendor/symfony/finder/Tests/Iterator/DateRangeFilterIteratorTest.php index 3226f706c..ade1a41a0 100644 --- a/vendor/symfony/finder/Tests/Iterator/DateRangeFilterIteratorTest.php +++ b/vendor/symfony/finder/Tests/Iterator/DateRangeFilterIteratorTest.php @@ -45,6 +45,15 @@ class DateRangeFilterIteratorTest extends RealIteratorTestCase '.foo/.bar', 'foo bar', '.foo/bar', + 'qux', + 'qux/baz_100_1.py', + 'qux/baz_1_2.py', + 'qux_0_1.php', + 'qux_1000_1.php', + 'qux_1002_0.php', + 'qux_10_2.php', + 'qux_12_0.php', + 'qux_2_0.php', ); $since2MonthsAgo = array( @@ -58,6 +67,15 @@ class DateRangeFilterIteratorTest extends RealIteratorTestCase '.foo/.bar', 'foo bar', '.foo/bar', + 'qux', + 'qux/baz_100_1.py', + 'qux/baz_1_2.py', + 'qux_0_1.php', + 'qux_1000_1.php', + 'qux_1002_0.php', + 'qux_10_2.php', + 'qux_12_0.php', + 'qux_2_0.php', ); $untilLastMonth = array( diff --git a/vendor/symfony/finder/Tests/Iterator/DepthRangeFilterIteratorTest.php b/vendor/symfony/finder/Tests/Iterator/DepthRangeFilterIteratorTest.php index 2e9014053..3a403cb95 100644 --- a/vendor/symfony/finder/Tests/Iterator/DepthRangeFilterIteratorTest.php +++ b/vendor/symfony/finder/Tests/Iterator/DepthRangeFilterIteratorTest.php @@ -41,6 +41,13 @@ class DepthRangeFilterIteratorTest extends RealIteratorTestCase '.foo', '.bar', 'foo bar', + 'qux', + 'qux_0_1.php', + 'qux_1000_1.php', + 'qux_1002_0.php', + 'qux_10_2.php', + 'qux_12_0.php', + 'qux_2_0.php', ); $lessThanOrEqualTo1 = array( @@ -56,6 +63,15 @@ class DepthRangeFilterIteratorTest extends RealIteratorTestCase '.bar', 'foo bar', '.foo/bar', + 'qux', + 'qux/baz_100_1.py', + 'qux/baz_1_2.py', + 'qux_0_1.php', + 'qux_1000_1.php', + 'qux_1002_0.php', + 'qux_10_2.php', + 'qux_12_0.php', + 'qux_2_0.php', ); $graterThanOrEqualTo1 = array( @@ -63,6 +79,8 @@ class DepthRangeFilterIteratorTest extends RealIteratorTestCase 'foo/bar.tmp', '.foo/.bar', '.foo/bar', + 'qux/baz_100_1.py', + 'qux/baz_1_2.py', ); $equalTo1 = array( @@ -70,6 +88,8 @@ class DepthRangeFilterIteratorTest extends RealIteratorTestCase 'foo/bar.tmp', '.foo/.bar', '.foo/bar', + 'qux/baz_100_1.py', + 'qux/baz_1_2.py', ); return array( diff --git a/vendor/symfony/finder/Tests/Iterator/ExcludeDirectoryFilterIteratorTest.php b/vendor/symfony/finder/Tests/Iterator/ExcludeDirectoryFilterIteratorTest.php index fa192c31f..c977b0cfd 100644 --- a/vendor/symfony/finder/Tests/Iterator/ExcludeDirectoryFilterIteratorTest.php +++ b/vendor/symfony/finder/Tests/Iterator/ExcludeDirectoryFilterIteratorTest.php @@ -41,6 +41,15 @@ class ExcludeDirectoryFilterIteratorTest extends RealIteratorTestCase 'toto', 'toto/.git', 'foo bar', + 'qux', + 'qux/baz_100_1.py', + 'qux/baz_1_2.py', + 'qux_0_1.php', + 'qux_1000_1.php', + 'qux_1002_0.php', + 'qux_10_2.php', + 'qux_12_0.php', + 'qux_2_0.php', ); $fo = array( @@ -56,6 +65,15 @@ class ExcludeDirectoryFilterIteratorTest extends RealIteratorTestCase 'toto', 'toto/.git', 'foo bar', + 'qux', + 'qux/baz_100_1.py', + 'qux/baz_1_2.py', + 'qux_0_1.php', + 'qux_1000_1.php', + 'qux_1002_0.php', + 'qux_10_2.php', + 'qux_12_0.php', + 'qux_2_0.php', ); $toto = array( @@ -69,6 +87,15 @@ class ExcludeDirectoryFilterIteratorTest extends RealIteratorTestCase 'foo/bar.tmp', 'test.php', 'foo bar', + 'qux', + 'qux/baz_100_1.py', + 'qux/baz_1_2.py', + 'qux_0_1.php', + 'qux_1000_1.php', + 'qux_1002_0.php', + 'qux_10_2.php', + 'qux_12_0.php', + 'qux_2_0.php', ); return array( diff --git a/vendor/symfony/finder/Tests/Iterator/FileTypeFilterIteratorTest.php b/vendor/symfony/finder/Tests/Iterator/FileTypeFilterIteratorTest.php index 4350b00ca..0ecd8dfe7 100644 --- a/vendor/symfony/finder/Tests/Iterator/FileTypeFilterIteratorTest.php +++ b/vendor/symfony/finder/Tests/Iterator/FileTypeFilterIteratorTest.php @@ -37,11 +37,20 @@ class FileTypeFilterIteratorTest extends RealIteratorTestCase '.foo/.bar', '.foo/bar', 'foo bar', + 'qux/baz_100_1.py', + 'qux/baz_1_2.py', + 'qux_0_1.php', + 'qux_1000_1.php', + 'qux_1002_0.php', + 'qux_10_2.php', + 'qux_12_0.php', + 'qux_2_0.php', ); $onlyDirectories = array( '.git', 'foo', + 'qux', 'toto', 'toto/.git', '.foo', diff --git a/vendor/symfony/finder/Tests/Iterator/RealIteratorTestCase.php b/vendor/symfony/finder/Tests/Iterator/RealIteratorTestCase.php index b0223b782..9aa68ea20 100644 --- a/vendor/symfony/finder/Tests/Iterator/RealIteratorTestCase.php +++ b/vendor/symfony/finder/Tests/Iterator/RealIteratorTestCase.php @@ -33,6 +33,15 @@ abstract class RealIteratorTestCase extends IteratorTestCase 'toto/', 'toto/.git/', 'foo bar', + 'qux_0_1.php', + 'qux_2_0.php', + 'qux_10_2.php', + 'qux_12_0.php', + 'qux_1000_1.php', + 'qux_1002_0.php', + 'qux/', + 'qux/baz_1_2.py', + 'qux/baz_100_1.py', ); self::$files = self::toAbsolute(self::$files); diff --git a/vendor/symfony/finder/Tests/Iterator/SizeRangeFilterIteratorTest.php b/vendor/symfony/finder/Tests/Iterator/SizeRangeFilterIteratorTest.php index 068fc7b0b..0ee463c6f 100644 --- a/vendor/symfony/finder/Tests/Iterator/SizeRangeFilterIteratorTest.php +++ b/vendor/symfony/finder/Tests/Iterator/SizeRangeFilterIteratorTest.php @@ -34,6 +34,7 @@ class SizeRangeFilterIteratorTest extends RealIteratorTestCase '.foo', '.git', 'foo', + 'qux', 'test.php', 'toto', 'toto/.git', diff --git a/vendor/symfony/finder/Tests/Iterator/SortableIteratorTest.php b/vendor/symfony/finder/Tests/Iterator/SortableIteratorTest.php index a35a12b5b..33687c521 100644 --- a/vendor/symfony/finder/Tests/Iterator/SortableIteratorTest.php +++ b/vendor/symfony/finder/Tests/Iterator/SortableIteratorTest.php @@ -82,6 +82,15 @@ class SortableIteratorTest extends RealIteratorTestCase 'foo', 'foo bar', 'foo/bar.tmp', + 'qux', + 'qux/baz_100_1.py', + 'qux/baz_1_2.py', + 'qux_0_1.php', + 'qux_1000_1.php', + 'qux_1002_0.php', + 'qux_10_2.php', + 'qux_12_0.php', + 'qux_2_0.php', 'test.php', 'test.py', 'toto', @@ -92,6 +101,7 @@ class SortableIteratorTest extends RealIteratorTestCase '.foo', '.git', 'foo', + 'qux', 'toto', 'toto/.git', '.bar', @@ -99,25 +109,18 @@ class SortableIteratorTest extends RealIteratorTestCase '.foo/bar', 'foo bar', 'foo/bar.tmp', + 'qux/baz_100_1.py', + 'qux/baz_1_2.py', + 'qux_0_1.php', + 'qux_1000_1.php', + 'qux_1002_0.php', + 'qux_10_2.php', + 'qux_12_0.php', + 'qux_2_0.php', 'test.php', 'test.py', ); - $customComparison = array( - '.bar', - '.foo', - '.foo/.bar', - '.foo/bar', - '.git', - 'foo', - 'foo bar', - 'foo/bar.tmp', - 'test.php', - 'test.py', - 'toto', - 'toto/.git', - ); - $sortByAccessedTime = array( // For these two files the access time was set to 2005-10-15 array('foo/bar.tmp', 'test.php'), @@ -132,6 +135,15 @@ class SortableIteratorTest extends RealIteratorTestCase 'toto', 'toto/.git', 'foo bar', + 'qux', + 'qux/baz_100_1.py', + 'qux/baz_1_2.py', + 'qux_0_1.php', + 'qux_1000_1.php', + 'qux_1002_0.php', + 'qux_10_2.php', + 'qux_12_0.php', + 'qux_2_0.php', ), // This file was accessed after sleeping for 1 sec array('.bar'), @@ -149,6 +161,15 @@ class SortableIteratorTest extends RealIteratorTestCase 'toto', 'toto/.git', 'foo bar', + 'qux', + 'qux/baz_100_1.py', + 'qux/baz_1_2.py', + 'qux_0_1.php', + 'qux_1000_1.php', + 'qux_1002_0.php', + 'qux_10_2.php', + 'qux_12_0.php', + 'qux_2_0.php', ), array('test.php'), array('test.py'), @@ -166,17 +187,75 @@ class SortableIteratorTest extends RealIteratorTestCase 'toto', 'toto/.git', 'foo bar', + 'qux', + 'qux/baz_100_1.py', + 'qux/baz_1_2.py', + 'qux_0_1.php', + 'qux_1000_1.php', + 'qux_1002_0.php', + 'qux_10_2.php', + 'qux_12_0.php', + 'qux_2_0.php', ), array('test.php'), array('test.py'), ); + $sortByNameNatural = array( + '.bar', + '.foo', + '.foo/.bar', + '.foo/bar', + '.git', + 'foo', + 'foo/bar.tmp', + 'foo bar', + 'qux', + 'qux/baz_1_2.py', + 'qux/baz_100_1.py', + 'qux_0_1.php', + 'qux_2_0.php', + 'qux_10_2.php', + 'qux_12_0.php', + 'qux_1000_1.php', + 'qux_1002_0.php', + 'test.php', + 'test.py', + 'toto', + 'toto/.git', + ); + + $customComparison = array( + '.bar', + '.foo', + '.foo/.bar', + '.foo/bar', + '.git', + 'foo', + 'foo bar', + 'foo/bar.tmp', + 'qux', + 'qux/baz_100_1.py', + 'qux/baz_1_2.py', + 'qux_0_1.php', + 'qux_1000_1.php', + 'qux_1002_0.php', + 'qux_10_2.php', + 'qux_12_0.php', + 'qux_2_0.php', + 'test.php', + 'test.py', + 'toto', + 'toto/.git', + ); + return array( array(SortableIterator::SORT_BY_NAME, $this->toAbsolute($sortByName)), array(SortableIterator::SORT_BY_TYPE, $this->toAbsolute($sortByType)), array(SortableIterator::SORT_BY_ACCESSED_TIME, $this->toAbsolute($sortByAccessedTime)), array(SortableIterator::SORT_BY_CHANGED_TIME, $this->toAbsolute($sortByChangedTime)), array(SortableIterator::SORT_BY_MODIFIED_TIME, $this->toAbsolute($sortByModifiedTime)), + array(SortableIterator::SORT_BY_NAME_NATURAL, $this->toAbsolute($sortByNameNatural)), array(function (\SplFileInfo $a, \SplFileInfo $b) { return strcmp($a->getRealPath(), $b->getRealPath()); }, $this->toAbsolute($customComparison)), ); } diff --git a/vendor/symfony/finder/composer.json b/vendor/symfony/finder/composer.json index dd37f2e0e..37d34a5e5 100644 --- a/vendor/symfony/finder/composer.json +++ b/vendor/symfony/finder/composer.json @@ -27,7 +27,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-master": "4.1-dev" + "dev-master": "4.2-dev" } } } diff --git a/vendor/symfony/finder/phpunit.xml.dist b/vendor/symfony/finder/phpunit.xml.dist index 0e1a8669b..078847af9 100644 --- a/vendor/symfony/finder/phpunit.xml.dist +++ b/vendor/symfony/finder/phpunit.xml.dist @@ -1,7 +1,7 @@ \func_num_args()) { + @trigger_error(sprintf('The default value of the "$secure" and "$samesite" arguments of "%s"\'s constructor will respectively change from "false" to "null" and from "null" to "lax" in Symfony 5.0, you should define their values explicitly or use "Cookie::create()" instead.', __METHOD__), E_USER_DEPRECATED); + } + // from PHP source code if (preg_match("/[=,; \t\r\n\013\014]/", $name)) { throw new \InvalidArgumentException(sprintf('The cookie name "%s" contains invalid characters.', $name)); @@ -110,7 +120,9 @@ class Cookie $this->httpOnly = $httpOnly; $this->raw = $raw; - if (null !== $sameSite) { + if ('' === $sameSite) { + $sameSite = null; + } elseif (null !== $sameSite) { $sameSite = strtolower($sameSite); } @@ -232,7 +244,7 @@ class Cookie */ public function isSecure() { - return $this->secure; + return $this->secure ?? $this->secureDefault; } /** @@ -274,4 +286,12 @@ class Cookie { return $this->sameSite; } + + /** + * @param bool $default The default value of the "secure" flag when it is set to null + */ + public function setSecureDefault(bool $default): void + { + $this->secureDefault = $default; + } } diff --git a/vendor/symfony/http-foundation/HeaderUtils.php b/vendor/symfony/http-foundation/HeaderUtils.php index 3ee50b873..637bc5be4 100644 --- a/vendor/symfony/http-foundation/HeaderUtils.php +++ b/vendor/symfony/http-foundation/HeaderUtils.php @@ -18,6 +18,9 @@ namespace Symfony\Component\HttpFoundation; */ class HeaderUtils { + public const DISPOSITION_ATTACHMENT = 'attachment'; + public const DISPOSITION_INLINE = 'inline'; + /** * This class should not be instantiated. */ @@ -143,6 +146,54 @@ class HeaderUtils return preg_replace('/\\\\(.)|"/', '$1', $s); } + /** + * Generates a HTTP Content-Disposition field-value. + * + * @param string $disposition One of "inline" or "attachment" + * @param string $filename A unicode string + * @param string $filenameFallback A string containing only ASCII characters that + * is semantically equivalent to $filename. If the filename is already ASCII, + * it can be omitted, or just copied from $filename + * + * @return string A string suitable for use as a Content-Disposition field-value + * + * @throws \InvalidArgumentException + * + * @see RFC 6266 + */ + public static function makeDisposition(string $disposition, string $filename, string $filenameFallback = ''): string + { + if (!\in_array($disposition, array(self::DISPOSITION_ATTACHMENT, self::DISPOSITION_INLINE))) { + throw new \InvalidArgumentException(sprintf('The disposition must be either "%s" or "%s".', self::DISPOSITION_ATTACHMENT, self::DISPOSITION_INLINE)); + } + + if ('' === $filenameFallback) { + $filenameFallback = $filename; + } + + // filenameFallback is not ASCII. + if (!preg_match('/^[\x20-\x7e]*$/', $filenameFallback)) { + throw new \InvalidArgumentException('The filename fallback must only contain ASCII characters.'); + } + + // percent characters aren't safe in fallback. + if (false !== strpos($filenameFallback, '%')) { + throw new \InvalidArgumentException('The filename fallback cannot contain the "%" character.'); + } + + // path separators aren't allowed in either. + if (false !== strpos($filename, '/') || false !== strpos($filename, '\\') || false !== strpos($filenameFallback, '/') || false !== strpos($filenameFallback, '\\')) { + throw new \InvalidArgumentException('The filename and the fallback cannot contain the "/" and "\\" characters.'); + } + + $params = array('filename' => $filenameFallback); + if ($filename !== $filenameFallback) { + $params['filename*'] = "utf-8''".rawurlencode($filename); + } + + return $disposition.'; '.self::toString($params, ';'); + } + private static function groupParts(array $matches, string $separators): array { $separator = $separators[0]; diff --git a/vendor/symfony/http-foundation/ParameterBag.php b/vendor/symfony/http-foundation/ParameterBag.php index e3be0a9b8..19d7ee913 100644 --- a/vendor/symfony/http-foundation/ParameterBag.php +++ b/vendor/symfony/http-foundation/ParameterBag.php @@ -174,7 +174,7 @@ class ParameterBag implements \IteratorAggregate, \Countable * Returns the parameter value converted to boolean. * * @param string $key The parameter key - * @param mixed $default The default value if the parameter key does not exist + * @param bool $default The default value if the parameter key does not exist * * @return bool The filtered value */ diff --git a/vendor/symfony/http-foundation/Request.php b/vendor/symfony/http-foundation/Request.php index f09573288..51940b8de 100644 --- a/vendor/symfony/http-foundation/Request.php +++ b/vendor/symfony/http-foundation/Request.php @@ -545,10 +545,13 @@ class Request $requestOrder = ini_get('request_order') ?: ini_get('variables_order'); $requestOrder = preg_replace('#[^cgp]#', '', strtolower($requestOrder)) ?: 'gp'; - $_REQUEST = array(); + $_REQUEST = array(array()); + foreach (str_split($requestOrder) as $order) { - $_REQUEST = array_merge($_REQUEST, $request[$order]); + $_REQUEST[] = $request[$order]; } + + $_REQUEST = array_merge(...$_REQUEST); } /** @@ -1284,7 +1287,7 @@ class Request { $canonicalMimeType = null; if (false !== $pos = strpos($mimeType, ';')) { - $canonicalMimeType = substr($mimeType, 0, $pos); + $canonicalMimeType = trim(substr($mimeType, 0, $pos)); } if (null === static::$formats) { @@ -1448,7 +1451,7 @@ class Request * * @see https://tools.ietf.org/html/rfc7231#section-4.2.3 * - * @return bool + * @return bool True for GET and HEAD, false otherwise */ public function isMethodCacheable() { @@ -1695,10 +1698,16 @@ class Request $this->server->remove('IIS_WasUrlRewritten'); } elseif ($this->server->has('REQUEST_URI')) { $requestUri = $this->server->get('REQUEST_URI'); + // HTTP proxy reqs setup request URI with scheme and host [and port] + the URL path, only use URL path - $schemeAndHttpHost = $this->getSchemeAndHttpHost(); - if (0 === strpos($requestUri, $schemeAndHttpHost)) { - $requestUri = substr($requestUri, \strlen($schemeAndHttpHost)); + $uriComponents = parse_url($requestUri); + + if (isset($uriComponents['path'])) { + $requestUri = $uriComponents['path']; + } + + if (isset($uriComponents['query'])) { + $requestUri .= '?'.$uriComponents['query']; } } elseif ($this->server->has('ORIG_PATH_INFO')) { // IIS 5.0, PHP as CGI diff --git a/vendor/symfony/http-foundation/RequestMatcher.php b/vendor/symfony/http-foundation/RequestMatcher.php index 57fa48e40..ab9434f43 100644 --- a/vendor/symfony/http-foundation/RequestMatcher.php +++ b/vendor/symfony/http-foundation/RequestMatcher.php @@ -28,6 +28,11 @@ class RequestMatcher implements RequestMatcherInterface */ private $host; + /** + * @var int|null + */ + private $port; + /** * @var string[] */ @@ -56,13 +61,14 @@ class RequestMatcher implements RequestMatcherInterface * @param array $attributes * @param string|string[]|null $schemes */ - public function __construct(string $path = null, string $host = null, $methods = null, $ips = null, array $attributes = array(), $schemes = null) + public function __construct(string $path = null, string $host = null, $methods = null, $ips = null, array $attributes = array(), $schemes = null, int $port = null) { $this->matchPath($path); $this->matchHost($host); $this->matchMethod($methods); $this->matchIps($ips); $this->matchScheme($schemes); + $this->matchPort($port); foreach ($attributes as $k => $v) { $this->matchAttribute($k, $v); @@ -89,6 +95,16 @@ class RequestMatcher implements RequestMatcherInterface $this->host = $regexp; } + /** + * Adds a check for the the URL port. + * + * @param int|null $port The port number to connect to + */ + public function matchPort(int $port = null) + { + $this->port = $port; + } + /** * Adds a check for the URL path info. * @@ -167,6 +183,10 @@ class RequestMatcher implements RequestMatcherInterface return false; } + if (null !== $this->port && 0 < $this->port && $request->getPort() !== $this->port) { + return false; + } + if (IpUtils::checkIp($request->getClientIp(), $this->ips)) { return true; } diff --git a/vendor/symfony/http-foundation/Response.php b/vendor/symfony/http-foundation/Response.php index 7f6ae7cd7..7c9621260 100644 --- a/vendor/symfony/http-foundation/Response.php +++ b/vendor/symfony/http-foundation/Response.php @@ -313,6 +313,12 @@ class Response $this->ensureIEOverSSLCompatibility($request); + if ($request->isSecure()) { + foreach ($headers->getCookies() as $cookie) { + $cookie->setSecureDefault(true); + } + } + return $this; } @@ -330,8 +336,9 @@ class Response // headers foreach ($this->headers->allPreserveCaseWithoutCookies() as $name => $values) { + $replace = 0 === strcasecmp($name, 'Content-Type'); foreach ($values as $value) { - header($name.': '.$value, false, $this->statusCode); + header($name.': '.$value, $replace, $this->statusCode); } } @@ -933,7 +940,7 @@ class Response public function setCache(array $options) { if ($diff = array_diff(array_keys($options), array('etag', 'last_modified', 'max_age', 's_maxage', 'private', 'public', 'immutable'))) { - throw new \InvalidArgumentException(sprintf('Response does not support the following options: "%s".', implode('", "', array_values($diff)))); + throw new \InvalidArgumentException(sprintf('Response does not support the following options: "%s".', implode('", "', $diff))); } if (isset($options['etag'])) { diff --git a/vendor/symfony/http-foundation/ResponseHeaderBag.php b/vendor/symfony/http-foundation/ResponseHeaderBag.php index ed2e0cfb5..1141e8d98 100644 --- a/vendor/symfony/http-foundation/ResponseHeaderBag.php +++ b/vendor/symfony/http-foundation/ResponseHeaderBag.php @@ -247,55 +247,15 @@ class ResponseHeaderBag extends HeaderBag */ public function clearCookie($name, $path = '/', $domain = null, $secure = false, $httpOnly = true) { - $this->setCookie(new Cookie($name, null, 1, $path, $domain, $secure, $httpOnly)); + $this->setCookie(new Cookie($name, null, 1, $path, $domain, $secure, $httpOnly, false, null)); } /** - * Generates a HTTP Content-Disposition field-value. - * - * @param string $disposition One of "inline" or "attachment" - * @param string $filename A unicode string - * @param string $filenameFallback A string containing only ASCII characters that - * is semantically equivalent to $filename. If the filename is already ASCII, - * it can be omitted, or just copied from $filename - * - * @return string A string suitable for use as a Content-Disposition field-value - * - * @throws \InvalidArgumentException - * - * @see RFC 6266 + * @see HeaderUtils::makeDisposition() */ public function makeDisposition($disposition, $filename, $filenameFallback = '') { - if (!\in_array($disposition, array(self::DISPOSITION_ATTACHMENT, self::DISPOSITION_INLINE))) { - throw new \InvalidArgumentException(sprintf('The disposition must be either "%s" or "%s".', self::DISPOSITION_ATTACHMENT, self::DISPOSITION_INLINE)); - } - - if ('' == $filenameFallback) { - $filenameFallback = $filename; - } - - // filenameFallback is not ASCII. - if (!preg_match('/^[\x20-\x7e]*$/', $filenameFallback)) { - throw new \InvalidArgumentException('The filename fallback must only contain ASCII characters.'); - } - - // percent characters aren't safe in fallback. - if (false !== strpos($filenameFallback, '%')) { - throw new \InvalidArgumentException('The filename fallback cannot contain the "%" character.'); - } - - // path separators aren't allowed in either. - if (false !== strpos($filename, '/') || false !== strpos($filename, '\\') || false !== strpos($filenameFallback, '/') || false !== strpos($filenameFallback, '\\')) { - throw new \InvalidArgumentException('The filename and the fallback cannot contain the "/" and "\\" characters.'); - } - - $params = array('filename' => $filenameFallback); - if ($filename !== $filenameFallback) { - $params['filename*'] = "utf-8''".rawurlencode($filename); - } - - return $disposition.'; '.HeaderUtils::toString($params, ';'); + return HeaderUtils::makeDisposition((string) $disposition, (string) $filename, (string) $filenameFallback); } /** diff --git a/vendor/symfony/http-foundation/Session/SessionUtils.php b/vendor/symfony/http-foundation/Session/SessionUtils.php new file mode 100644 index 000000000..91737c39a --- /dev/null +++ b/vendor/symfony/http-foundation/Session/SessionUtils.php @@ -0,0 +1,59 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpFoundation\Session; + +/** + * Session utility functions. + * + * @author Nicolas Grekas + * @author Rémon van de Kamp + * + * @internal + */ +final class SessionUtils +{ + /** + * Finds the session header amongst the headers that are to be sent, removes it, and returns + * it so the caller can process it further. + */ + public static function popSessionCookie(string $sessionName, string $sessionId): ?string + { + $sessionCookie = null; + $sessionCookiePrefix = sprintf(' %s=', urlencode($sessionName)); + $sessionCookieWithId = sprintf('%s%s;', $sessionCookiePrefix, urlencode($sessionId)); + $otherCookies = array(); + foreach (headers_list() as $h) { + if (0 !== stripos($h, 'Set-Cookie:')) { + continue; + } + if (11 === strpos($h, $sessionCookiePrefix, 11)) { + $sessionCookie = $h; + + if (11 !== strpos($h, $sessionCookieWithId, 11)) { + $otherCookies[] = $h; + } + } else { + $otherCookies[] = $h; + } + } + if (null === $sessionCookie) { + return null; + } + + header_remove('Set-Cookie'); + foreach ($otherCookies as $h) { + header($h, false); + } + + return $sessionCookie; + } +} diff --git a/vendor/symfony/http-foundation/Session/Storage/Handler/AbstractSessionHandler.php b/vendor/symfony/http-foundation/Session/Storage/Handler/AbstractSessionHandler.php index b1465716c..95f110332 100644 --- a/vendor/symfony/http-foundation/Session/Storage/Handler/AbstractSessionHandler.php +++ b/vendor/symfony/http-foundation/Session/Storage/Handler/AbstractSessionHandler.php @@ -11,6 +11,8 @@ namespace Symfony\Component\HttpFoundation\Session\Storage\Handler; +use Symfony\Component\HttpFoundation\Session\SessionUtils; + /** * This abstract session handler provides a generic implementation * of the PHP 7.0 SessionUpdateTimestampHandlerInterface, @@ -117,36 +119,20 @@ abstract class AbstractSessionHandler implements \SessionHandlerInterface, \Sess */ public function destroy($sessionId) { - if (!headers_sent() && ini_get('session.use_cookies')) { + if (!headers_sent() && filter_var(ini_get('session.use_cookies'), FILTER_VALIDATE_BOOLEAN)) { if (!$this->sessionName) { throw new \LogicException(sprintf('Session name cannot be empty, did you forget to call "parent::open()" in "%s"?.', \get_class($this))); } - $sessionCookie = sprintf(' %s=', urlencode($this->sessionName)); - $sessionCookieWithId = sprintf('%s%s;', $sessionCookie, urlencode($sessionId)); - $sessionCookieFound = false; - $otherCookies = array(); - foreach (headers_list() as $h) { - if (0 !== stripos($h, 'Set-Cookie:')) { - continue; - } - if (11 === strpos($h, $sessionCookie, 11)) { - $sessionCookieFound = true; - - if (11 !== strpos($h, $sessionCookieWithId, 11)) { - $otherCookies[] = $h; - } + $cookie = SessionUtils::popSessionCookie($this->sessionName, $sessionId); + if (null === $cookie) { + if (\PHP_VERSION_ID < 70300) { + setcookie($this->sessionName, '', 0, ini_get('session.cookie_path'), ini_get('session.cookie_domain'), filter_var(ini_get('session.cookie_secure'), FILTER_VALIDATE_BOOLEAN), filter_var(ini_get('session.cookie_httponly'), FILTER_VALIDATE_BOOLEAN)); } else { - $otherCookies[] = $h; + $params = session_get_cookie_params(); + unset($params['lifetime']); + setcookie($this->sessionName, '', $params); } } - if ($sessionCookieFound) { - header_remove('Set-Cookie'); - foreach ($otherCookies as $h) { - header($h, false); - } - } else { - setcookie($this->sessionName, '', 0, ini_get('session.cookie_path'), ini_get('session.cookie_domain'), ini_get('session.cookie_secure'), ini_get('session.cookie_httponly')); - } } return $this->newSessionId === $sessionId || $this->doDestroy($sessionId); diff --git a/vendor/symfony/http-foundation/Session/Storage/Handler/PdoSessionHandler.php b/vendor/symfony/http-foundation/Session/Storage/Handler/PdoSessionHandler.php index dd1a263fb..1bb647ef4 100644 --- a/vendor/symfony/http-foundation/Session/Storage/Handler/PdoSessionHandler.php +++ b/vendor/symfony/http-foundation/Session/Storage/Handler/PdoSessionHandler.php @@ -637,7 +637,7 @@ class PdoSessionHandler extends AbstractSessionHandler throw new \RuntimeException('Failed to read session: INSERT reported a duplicate id but next SELECT did not return any data.'); } - if (!ini_get('session.use_strict_mode') && self::LOCK_TRANSACTIONAL === $this->lockMode && 'sqlite' !== $this->driver) { + if (!filter_var(ini_get('session.use_strict_mode'), FILTER_VALIDATE_BOOLEAN) && self::LOCK_TRANSACTIONAL === $this->lockMode && 'sqlite' !== $this->driver) { // In strict mode, session fixation is not possible: new sessions always start with a unique // random id, so that concurrency is not possible and this code path can be skipped. // Exclusive-reading of non-existent rows does not block, so we need to do an insert to block diff --git a/vendor/symfony/http-foundation/Session/Storage/Handler/RedisSessionHandler.php b/vendor/symfony/http-foundation/Session/Storage/Handler/RedisSessionHandler.php index 36adf2424..9c08ddcc0 100644 --- a/vendor/symfony/http-foundation/Session/Storage/Handler/RedisSessionHandler.php +++ b/vendor/symfony/http-foundation/Session/Storage/Handler/RedisSessionHandler.php @@ -12,6 +12,7 @@ namespace Symfony\Component\HttpFoundation\Session\Storage\Handler; use Predis\Response\ErrorInterface; +use Symfony\Component\Cache\Traits\RedisClusterProxy; use Symfony\Component\Cache\Traits\RedisProxy; /** @@ -45,7 +46,8 @@ class RedisSessionHandler extends AbstractSessionHandler !$redis instanceof \RedisArray && !$redis instanceof \RedisCluster && !$redis instanceof \Predis\Client && - !$redis instanceof RedisProxy + !$redis instanceof RedisProxy && + !$redis instanceof RedisClusterProxy ) { throw new \InvalidArgumentException(sprintf('%s() expects parameter 1 to be Redis, RedisArray, RedisCluster or Predis\Client, %s given', __METHOD__, \is_object($redis) ? \get_class($redis) : \gettype($redis))); } diff --git a/vendor/symfony/http-foundation/Session/Storage/NativeSessionStorage.php b/vendor/symfony/http-foundation/Session/Storage/NativeSessionStorage.php index dc4ce44b2..156a0d455 100644 --- a/vendor/symfony/http-foundation/Session/Storage/NativeSessionStorage.php +++ b/vendor/symfony/http-foundation/Session/Storage/NativeSessionStorage.php @@ -12,6 +12,7 @@ namespace Symfony\Component\HttpFoundation\Session\Storage; use Symfony\Component\HttpFoundation\Session\SessionBagInterface; +use Symfony\Component\HttpFoundation\Session\SessionUtils; use Symfony\Component\HttpFoundation\Session\Storage\Handler\StrictSessionHandler; use Symfony\Component\HttpFoundation\Session\Storage\Proxy\AbstractProxy; use Symfony\Component\HttpFoundation\Session\Storage\Proxy\SessionHandlerProxy; @@ -48,6 +49,11 @@ class NativeSessionStorage implements SessionStorageInterface */ protected $metadataBag; + /** + * @var string|null + */ + private $emulateSameSite; + /** * Depending on how you want the storage driver to behave you probably * want to override this constructor entirely. @@ -67,6 +73,7 @@ class NativeSessionStorage implements SessionStorageInterface * cookie_lifetime, "0" * cookie_path, "/" * cookie_secure, "" + * cookie_samesite, null * gc_divisor, "100" * gc_maxlifetime, "1440" * gc_probability, "1" @@ -134,7 +141,7 @@ class NativeSessionStorage implements SessionStorageInterface throw new \RuntimeException('Failed to start the session: already started by PHP.'); } - if (ini_get('session.use_cookies') && headers_sent($file, $line)) { + if (filter_var(ini_get('session.use_cookies'), FILTER_VALIDATE_BOOLEAN) && headers_sent($file, $line)) { throw new \RuntimeException(sprintf('Failed to start the session because headers have already been sent by "%s" at line %d.', $file, $line)); } @@ -143,6 +150,13 @@ class NativeSessionStorage implements SessionStorageInterface throw new \RuntimeException('Failed to start the session'); } + if (null !== $this->emulateSameSite) { + $originalCookie = SessionUtils::popSessionCookie(session_name(), session_id()); + if (null !== $originalCookie) { + header(sprintf('%s; SameSite=%s', $originalCookie, $this->emulateSameSite)); + } + } + $this->loadSession(); return true; @@ -208,6 +222,13 @@ class NativeSessionStorage implements SessionStorageInterface // @see https://bugs.php.net/bug.php?id=70013 $this->loadSession(); + if (null !== $this->emulateSameSite) { + $originalCookie = SessionUtils::popSessionCookie(session_name(), session_id()); + if (null !== $originalCookie) { + header(sprintf('%s; SameSite=%s', $originalCookie, $this->emulateSameSite)); + } + } + return $isRegenerated; } @@ -340,7 +361,7 @@ class NativeSessionStorage implements SessionStorageInterface $validOptions = array_flip(array( 'cache_expire', 'cache_limiter', 'cookie_domain', 'cookie_httponly', - 'cookie_lifetime', 'cookie_path', 'cookie_secure', + 'cookie_lifetime', 'cookie_path', 'cookie_secure', 'cookie_samesite', 'gc_divisor', 'gc_maxlifetime', 'gc_probability', 'lazy_write', 'name', 'referer_check', 'serialize_handler', 'use_strict_mode', 'use_cookies', @@ -352,6 +373,12 @@ class NativeSessionStorage implements SessionStorageInterface foreach ($options as $key => $value) { if (isset($validOptions[$key])) { + if ('cookie_samesite' === $key && \PHP_VERSION_ID < 70300) { + // PHP < 7.3 does not support same_site cookies. We will emulate it in + // the start() method instead. + $this->emulateSameSite = $value; + continue; + } ini_set('url_rewriter.tags' !== $key ? 'session.'.$key : $key, $value); } } diff --git a/vendor/symfony/http-foundation/StreamedResponse.php b/vendor/symfony/http-foundation/StreamedResponse.php index 40f785c86..06d053ead 100644 --- a/vendor/symfony/http-foundation/StreamedResponse.php +++ b/vendor/symfony/http-foundation/StreamedResponse.php @@ -17,7 +17,7 @@ namespace Symfony\Component\HttpFoundation; * A StreamedResponse uses a callback for its content. * * The callback should use the standard PHP functions like echo - * to stream the response back to the client. The flush() method + * to stream the response back to the client. The flush() function * can also be used if needed. * * @see flush() diff --git a/vendor/symfony/http-foundation/Tests/CookieTest.php b/vendor/symfony/http-foundation/Tests/CookieTest.php index 390d42a62..44981dff8 100644 --- a/vendor/symfony/http-foundation/Tests/CookieTest.php +++ b/vendor/symfony/http-foundation/Tests/CookieTest.php @@ -45,7 +45,7 @@ class CookieTest extends TestCase */ public function testInstantiationThrowsExceptionIfCookieNameContainsInvalidCharacters($name) { - new Cookie($name); + Cookie::create($name); } /** @@ -53,12 +53,12 @@ class CookieTest extends TestCase */ public function testInvalidExpiration() { - new Cookie('MyCookie', 'foo', 'bar'); + Cookie::create('MyCookie', 'foo', 'bar'); } public function testNegativeExpirationIsNotPossible() { - $cookie = new Cookie('foo', 'bar', -100); + $cookie = Cookie::create('foo', 'bar', -100); $this->assertSame(0, $cookie->getExpiresTime()); } @@ -66,32 +66,32 @@ class CookieTest extends TestCase public function testGetValue() { $value = 'MyValue'; - $cookie = new Cookie('MyCookie', $value); + $cookie = Cookie::create('MyCookie', $value); $this->assertSame($value, $cookie->getValue(), '->getValue() returns the proper value'); } public function testGetPath() { - $cookie = new Cookie('foo', 'bar'); + $cookie = Cookie::create('foo', 'bar'); $this->assertSame('/', $cookie->getPath(), '->getPath() returns / as the default path'); } public function testGetExpiresTime() { - $cookie = new Cookie('foo', 'bar'); + $cookie = Cookie::create('foo', 'bar'); $this->assertEquals(0, $cookie->getExpiresTime(), '->getExpiresTime() returns the default expire date'); - $cookie = new Cookie('foo', 'bar', $expire = time() + 3600); + $cookie = Cookie::create('foo', 'bar', $expire = time() + 3600); $this->assertEquals($expire, $cookie->getExpiresTime(), '->getExpiresTime() returns the expire date'); } public function testGetExpiresTimeIsCastToInt() { - $cookie = new Cookie('foo', 'bar', 3600.9); + $cookie = Cookie::create('foo', 'bar', 3600.9); $this->assertSame(3600, $cookie->getExpiresTime(), '->getExpiresTime() returns the expire date as an integer'); } @@ -99,7 +99,7 @@ class CookieTest extends TestCase public function testConstructorWithDateTime() { $expire = new \DateTime(); - $cookie = new Cookie('foo', 'bar', $expire); + $cookie = Cookie::create('foo', 'bar', $expire); $this->assertEquals($expire->format('U'), $cookie->getExpiresTime(), '->getExpiresTime() returns the expire date'); } @@ -107,7 +107,7 @@ class CookieTest extends TestCase public function testConstructorWithDateTimeImmutable() { $expire = new \DateTimeImmutable(); - $cookie = new Cookie('foo', 'bar', $expire); + $cookie = Cookie::create('foo', 'bar', $expire); $this->assertEquals($expire->format('U'), $cookie->getExpiresTime(), '->getExpiresTime() returns the expire date'); } @@ -115,7 +115,7 @@ class CookieTest extends TestCase public function testGetExpiresTimeWithStringValue() { $value = '+1 day'; - $cookie = new Cookie('foo', 'bar', $value); + $cookie = Cookie::create('foo', 'bar', $value); $expire = strtotime($value); $this->assertEquals($expire, $cookie->getExpiresTime(), '->getExpiresTime() returns the expire date', 1); @@ -123,99 +123,99 @@ class CookieTest extends TestCase public function testGetDomain() { - $cookie = new Cookie('foo', 'bar', 0, '/', '.myfoodomain.com'); + $cookie = Cookie::create('foo', 'bar', 0, '/', '.myfoodomain.com'); $this->assertEquals('.myfoodomain.com', $cookie->getDomain(), '->getDomain() returns the domain name on which the cookie is valid'); } public function testIsSecure() { - $cookie = new Cookie('foo', 'bar', 0, '/', '.myfoodomain.com', true); + $cookie = Cookie::create('foo', 'bar', 0, '/', '.myfoodomain.com', true); $this->assertTrue($cookie->isSecure(), '->isSecure() returns whether the cookie is transmitted over HTTPS'); } public function testIsHttpOnly() { - $cookie = new Cookie('foo', 'bar', 0, '/', '.myfoodomain.com', false, true); + $cookie = Cookie::create('foo', 'bar', 0, '/', '.myfoodomain.com', false, true); $this->assertTrue($cookie->isHttpOnly(), '->isHttpOnly() returns whether the cookie is only transmitted over HTTP'); } public function testCookieIsNotCleared() { - $cookie = new Cookie('foo', 'bar', time() + 3600 * 24); + $cookie = Cookie::create('foo', 'bar', time() + 3600 * 24); $this->assertFalse($cookie->isCleared(), '->isCleared() returns false if the cookie did not expire yet'); } public function testCookieIsCleared() { - $cookie = new Cookie('foo', 'bar', time() - 20); + $cookie = Cookie::create('foo', 'bar', time() - 20); $this->assertTrue($cookie->isCleared(), '->isCleared() returns true if the cookie has expired'); - $cookie = new Cookie('foo', 'bar'); + $cookie = Cookie::create('foo', 'bar'); $this->assertFalse($cookie->isCleared()); - $cookie = new Cookie('foo', 'bar', 0); + $cookie = Cookie::create('foo', 'bar'); $this->assertFalse($cookie->isCleared()); - $cookie = new Cookie('foo', 'bar', -1); + $cookie = Cookie::create('foo', 'bar', -1); $this->assertFalse($cookie->isCleared()); } public function testToString() { - $cookie = new Cookie('foo', 'bar', $expire = strtotime('Fri, 20-May-2011 15:25:52 GMT'), '/', '.myfoodomain.com', true); + $cookie = Cookie::create('foo', 'bar', $expire = strtotime('Fri, 20-May-2011 15:25:52 GMT'), '/', '.myfoodomain.com', true, true, false, null); $this->assertEquals('foo=bar; expires=Fri, 20-May-2011 15:25:52 GMT; Max-Age=0; path=/; domain=.myfoodomain.com; secure; httponly', (string) $cookie, '->__toString() returns string representation of the cookie'); - $cookie = new Cookie('foo', 'bar with white spaces', strtotime('Fri, 20-May-2011 15:25:52 GMT'), '/', '.myfoodomain.com', true); + $cookie = Cookie::create('foo', 'bar with white spaces', strtotime('Fri, 20-May-2011 15:25:52 GMT'), '/', '.myfoodomain.com', true, true, false, null); $this->assertEquals('foo=bar%20with%20white%20spaces; expires=Fri, 20-May-2011 15:25:52 GMT; Max-Age=0; path=/; domain=.myfoodomain.com; secure; httponly', (string) $cookie, '->__toString() encodes the value of the cookie according to RFC 3986 (white space = %20)'); - $cookie = new Cookie('foo', null, 1, '/admin/', '.myfoodomain.com'); + $cookie = Cookie::create('foo', null, 1, '/admin/', '.myfoodomain.com', false, true, false, null); $this->assertEquals('foo=deleted; expires='.gmdate('D, d-M-Y H:i:s T', $expire = time() - 31536001).'; Max-Age=0; path=/admin/; domain=.myfoodomain.com; httponly', (string) $cookie, '->__toString() returns string representation of a cleared cookie if value is NULL'); - $cookie = new Cookie('foo', 'bar', 0, '/', ''); - $this->assertEquals('foo=bar; path=/; httponly', (string) $cookie); + $cookie = Cookie::create('foo', 'bar'); + $this->assertEquals('foo=bar; path=/; httponly; samesite=lax', (string) $cookie); } public function testRawCookie() { - $cookie = new Cookie('foo', 'b a r', 0, '/', null, false, false); + $cookie = Cookie::create('foo', 'b a r', 0, '/', null, false, false, false, null); $this->assertFalse($cookie->isRaw()); $this->assertEquals('foo=b%20a%20r; path=/', (string) $cookie); - $cookie = new Cookie('foo', 'b+a+r', 0, '/', null, false, false, true); + $cookie = Cookie::create('foo', 'b+a+r', 0, '/', null, false, false, true, null); $this->assertTrue($cookie->isRaw()); $this->assertEquals('foo=b+a+r; path=/', (string) $cookie); } public function testGetMaxAge() { - $cookie = new Cookie('foo', 'bar'); + $cookie = Cookie::create('foo', 'bar'); $this->assertEquals(0, $cookie->getMaxAge()); - $cookie = new Cookie('foo', 'bar', $expire = time() + 100); + $cookie = Cookie::create('foo', 'bar', $expire = time() + 100); $this->assertEquals($expire - time(), $cookie->getMaxAge()); - $cookie = new Cookie('foo', 'bar', $expire = time() - 100); + $cookie = Cookie::create('foo', 'bar', $expire = time() - 100); $this->assertEquals(0, $cookie->getMaxAge()); } public function testFromString() { $cookie = Cookie::fromString('foo=bar; expires=Fri, 20-May-2011 15:25:52 GMT; path=/; domain=.myfoodomain.com; secure; httponly'); - $this->assertEquals(new Cookie('foo', 'bar', strtotime('Fri, 20-May-2011 15:25:52 GMT'), '/', '.myfoodomain.com', true, true, true), $cookie); + $this->assertEquals(Cookie::create('foo', 'bar', strtotime('Fri, 20-May-2011 15:25:52 GMT'), '/', '.myfoodomain.com', true, true, true, null), $cookie); $cookie = Cookie::fromString('foo=bar', true); - $this->assertEquals(new Cookie('foo', 'bar', 0, '/', null, false, false), $cookie); + $this->assertEquals(Cookie::create('foo', 'bar', 0, '/', null, false, false, false, null), $cookie); $cookie = Cookie::fromString('foo', true); - $this->assertEquals(new Cookie('foo', null, 0, '/', null, false, false), $cookie); + $this->assertEquals(Cookie::create('foo', null, 0, '/', null, false, false, false, null), $cookie); } public function testFromStringWithHttpOnly() @@ -227,9 +227,27 @@ class CookieTest extends TestCase $this->assertFalse($cookie->isHttpOnly()); } - public function testSameSiteAttributeIsCaseInsensitive() + public function testSameSiteAttribute() { $cookie = new Cookie('foo', 'bar', 0, '/', null, false, true, false, 'Lax'); $this->assertEquals('lax', $cookie->getSameSite()); + + $cookie = new Cookie('foo', 'bar', 0, '/', null, false, true, false, ''); + $this->assertNull($cookie->getSameSite()); + } + + public function testSetSecureDefault() + { + $cookie = Cookie::create('foo', 'bar'); + + $this->assertFalse($cookie->isSecure()); + + $cookie->setSecureDefault(true); + + $this->assertTrue($cookie->isSecure()); + + $cookie->setSecureDefault(false); + + $this->assertFalse($cookie->isSecure()); } } diff --git a/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/common.inc b/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/common.inc index f9c40a9a3..0bdf9e4b7 100644 --- a/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/common.inc +++ b/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/common.inc @@ -22,7 +22,7 @@ error_reporting(-1); ini_set('html_errors', 0); ini_set('display_errors', 1); -if (ini_get('xdebug.default_enable')) { +if (filter_var(ini_get('xdebug.default_enable'), FILTER_VALIDATE_BOOLEAN)) { xdebug_disable(); } diff --git a/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_max_age.php b/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_max_age.php index 8775a5cce..e18ce5252 100644 --- a/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_max_age.php +++ b/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_max_age.php @@ -4,7 +4,7 @@ use Symfony\Component\HttpFoundation\Cookie; $r = require __DIR__.'/common.inc'; -$r->headers->setCookie(new Cookie('foo', 'bar', 253402310800, '', null, false, false)); +$r->headers->setCookie(new Cookie('foo', 'bar', 253402310800, '', null, false, false, false, null)); $r->sendHeaders(); setcookie('foo2', 'bar', 253402310800, '/'); diff --git a/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_raw_urlencode.php b/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_raw_urlencode.php index 2ca5b59f1..00c022d95 100644 --- a/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_raw_urlencode.php +++ b/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_raw_urlencode.php @@ -6,7 +6,7 @@ $r = require __DIR__.'/common.inc'; $str = '?*():@&+$/%#[]'; -$r->headers->setCookie(new Cookie($str, $str, 0, '/', null, false, false, true)); +$r->headers->setCookie(new Cookie($str, $str, 0, '/', null, false, false, true, null)); $r->sendHeaders(); setrawcookie($str, $str, 0, '/', null, false, false); diff --git a/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_urlencode.php b/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_urlencode.php index 05b9af30d..c0363b829 100644 --- a/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_urlencode.php +++ b/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_urlencode.php @@ -6,7 +6,7 @@ $r = require __DIR__.'/common.inc'; $str = '?*():@&+$/%#[]'; -$r->headers->setCookie(new Cookie($str, $str, 0, '', null, false, false)); +$r->headers->setCookie(new Cookie($str, $str, 0, '', null, false, false, false, null)); $r->sendHeaders(); setcookie($str, $str, 0, '/'); diff --git a/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/invalid_cookie_name.php b/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/invalid_cookie_name.php index 3fe157184..0afaaa8a5 100644 --- a/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/invalid_cookie_name.php +++ b/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/invalid_cookie_name.php @@ -5,7 +5,7 @@ use Symfony\Component\HttpFoundation\Cookie; $r = require __DIR__.'/common.inc'; try { - $r->headers->setCookie(new Cookie('Hello + world', 'hodor')); + $r->headers->setCookie(Cookie::create('Hello + world', 'hodor')); } catch (\InvalidArgumentException $e) { echo $e->getMessage(); } diff --git a/vendor/symfony/http-foundation/Tests/HeaderUtilsTest.php b/vendor/symfony/http-foundation/Tests/HeaderUtilsTest.php index 2f5fdc21c..15efdf923 100644 --- a/vendor/symfony/http-foundation/Tests/HeaderUtilsTest.php +++ b/vendor/symfony/http-foundation/Tests/HeaderUtilsTest.php @@ -82,4 +82,53 @@ class HeaderUtilsTest extends TestCase $this->assertEquals('foo "bar"', HeaderUtils::unquote('"foo \"\b\a\r\""')); $this->assertEquals('foo \\ bar', HeaderUtils::unquote('"foo \\\\ bar"')); } + + /** + * @expectedException \InvalidArgumentException + */ + public function testMakeDispositionInvalidDisposition() + { + HeaderUtils::makeDisposition('invalid', 'foo.html'); + } + + /** + * @dataProvider provideMakeDisposition + */ + public function testMakeDisposition($disposition, $filename, $filenameFallback, $expected) + { + $this->assertEquals($expected, HeaderUtils::makeDisposition($disposition, $filename, $filenameFallback)); + } + + public function provideMakeDisposition() + { + return array( + array('attachment', 'foo.html', 'foo.html', 'attachment; filename=foo.html'), + array('attachment', 'foo.html', '', 'attachment; filename=foo.html'), + array('attachment', 'foo bar.html', '', 'attachment; filename="foo bar.html"'), + array('attachment', 'foo "bar".html', '', 'attachment; filename="foo \\"bar\\".html"'), + array('attachment', 'foo%20bar.html', 'foo bar.html', 'attachment; filename="foo bar.html"; filename*=utf-8\'\'foo%2520bar.html'), + array('attachment', 'föö.html', 'foo.html', 'attachment; filename=foo.html; filename*=utf-8\'\'f%C3%B6%C3%B6.html'), + ); + } + + /** + * @dataProvider provideMakeDispositionFail + * @expectedException \InvalidArgumentException + */ + public function testMakeDispositionFail($disposition, $filename) + { + HeaderUtils::makeDisposition($disposition, $filename); + } + + public function provideMakeDispositionFail() + { + return array( + array('attachment', 'foo%20bar.html'), + array('attachment', 'foo/bar.html'), + array('attachment', '/foo.html'), + array('attachment', 'foo\bar.html'), + array('attachment', '\foo.html'), + array('attachment', 'föö.html'), + ); + } } diff --git a/vendor/symfony/http-foundation/Tests/RequestMatcherTest.php b/vendor/symfony/http-foundation/Tests/RequestMatcherTest.php index 10d764a77..cc35ad637 100644 --- a/vendor/symfony/http-foundation/Tests/RequestMatcherTest.php +++ b/vendor/symfony/http-foundation/Tests/RequestMatcherTest.php @@ -78,6 +78,21 @@ class RequestMatcherTest extends TestCase $this->assertSame($isMatch, $matcher->matches($request)); } + public function testPort() + { + $matcher = new RequestMatcher(); + $request = Request::create('', 'get', array(), array(), array(), array('HTTP_HOST' => null, 'SERVER_PORT' => 8000)); + + $matcher->matchPort(8000); + $this->assertTrue($matcher->matches($request)); + + $matcher->matchPort(9000); + $this->assertFalse($matcher->matches($request)); + + $matcher = new RequestMatcher(null, null, null, null, array(), null, 8000); + $this->assertTrue($matcher->matches($request)); + } + public function getHostData() { return array( diff --git a/vendor/symfony/http-foundation/Tests/RequestTest.php b/vendor/symfony/http-foundation/Tests/RequestTest.php index 52392adde..0711c515f 100644 --- a/vendor/symfony/http-foundation/Tests/RequestTest.php +++ b/vendor/symfony/http-foundation/Tests/RequestTest.php @@ -232,6 +232,55 @@ class RequestTest extends TestCase $this->assertEquals(80, $request->getPort()); $this->assertEquals('test.com', $request->getHttpHost()); $this->assertFalse($request->isSecure()); + + // Fragment should not be included in the URI + $request = Request::create('http://test.com/foo#bar'); + $this->assertEquals('http://test.com/foo', $request->getUri()); + } + + public function testCreateWithRequestUri() + { + $request = Request::create('http://test.com:80/foo'); + $request->server->set('REQUEST_URI', 'http://test.com:80/foo'); + $this->assertEquals('http://test.com/foo', $request->getUri()); + $this->assertEquals('/foo', $request->getPathInfo()); + $this->assertEquals('test.com', $request->getHost()); + $this->assertEquals('test.com', $request->getHttpHost()); + $this->assertEquals(80, $request->getPort()); + $this->assertFalse($request->isSecure()); + + $request = Request::create('http://test.com:8080/foo'); + $request->server->set('REQUEST_URI', 'http://test.com:8080/foo'); + $this->assertEquals('http://test.com:8080/foo', $request->getUri()); + $this->assertEquals('/foo', $request->getPathInfo()); + $this->assertEquals('test.com', $request->getHost()); + $this->assertEquals('test.com:8080', $request->getHttpHost()); + $this->assertEquals(8080, $request->getPort()); + $this->assertFalse($request->isSecure()); + + $request = Request::create('http://test.com/foo?bar=foo', 'GET', array('bar' => 'baz')); + $request->server->set('REQUEST_URI', 'http://test.com/foo?bar=foo'); + $this->assertEquals('http://test.com/foo?bar=baz', $request->getUri()); + $this->assertEquals('/foo', $request->getPathInfo()); + $this->assertEquals('bar=baz', $request->getQueryString()); + $this->assertEquals('test.com', $request->getHost()); + $this->assertEquals('test.com', $request->getHttpHost()); + $this->assertEquals(80, $request->getPort()); + $this->assertFalse($request->isSecure()); + + $request = Request::create('https://test.com:443/foo'); + $request->server->set('REQUEST_URI', 'https://test.com:443/foo'); + $this->assertEquals('https://test.com/foo', $request->getUri()); + $this->assertEquals('/foo', $request->getPathInfo()); + $this->assertEquals('test.com', $request->getHost()); + $this->assertEquals('test.com', $request->getHttpHost()); + $this->assertEquals(443, $request->getPort()); + $this->assertTrue($request->isSecure()); + + // Fragment should not be included in the URI + $request = Request::create('http://test.com/foo#bar'); + $request->server->set('REQUEST_URI', 'http://test.com/foo#bar'); + $this->assertEquals('http://test.com/foo', $request->getUri()); } public function testCreateCheckPrecedence() @@ -332,6 +381,9 @@ class RequestTest extends TestCase { $request = new Request(); $this->assertEquals('json', $request->getFormat('application/json; charset=utf-8')); + $this->assertEquals('json', $request->getFormat('application/json;charset=utf-8')); + $this->assertEquals('json', $request->getFormat('application/json ; charset=utf-8')); + $this->assertEquals('json', $request->getFormat('application/json ;charset=utf-8')); } /** diff --git a/vendor/symfony/http-foundation/Tests/ResponseHeaderBagTest.php b/vendor/symfony/http-foundation/Tests/ResponseHeaderBagTest.php index e987677d4..f6ddb98ea 100644 --- a/vendor/symfony/http-foundation/Tests/ResponseHeaderBagTest.php +++ b/vendor/symfony/http-foundation/Tests/ResponseHeaderBagTest.php @@ -110,9 +110,9 @@ class ResponseHeaderBagTest extends TestCase public function testToStringIncludesCookieHeaders() { $bag = new ResponseHeaderBag(array()); - $bag->setCookie(new Cookie('foo', 'bar')); + $bag->setCookie(Cookie::create('foo', 'bar')); - $this->assertSetCookieHeader('foo=bar; path=/; httponly', $bag); + $this->assertSetCookieHeader('foo=bar; path=/; httponly; samesite=lax', $bag); $bag->clearCookie('foo'); @@ -154,24 +154,24 @@ class ResponseHeaderBagTest extends TestCase public function testCookiesWithSameNames() { $bag = new ResponseHeaderBag(); - $bag->setCookie(new Cookie('foo', 'bar', 0, '/path/foo', 'foo.bar')); - $bag->setCookie(new Cookie('foo', 'bar', 0, '/path/bar', 'foo.bar')); - $bag->setCookie(new Cookie('foo', 'bar', 0, '/path/bar', 'bar.foo')); - $bag->setCookie(new Cookie('foo', 'bar')); + $bag->setCookie(Cookie::create('foo', 'bar', 0, '/path/foo', 'foo.bar')); + $bag->setCookie(Cookie::create('foo', 'bar', 0, '/path/bar', 'foo.bar')); + $bag->setCookie(Cookie::create('foo', 'bar', 0, '/path/bar', 'bar.foo')); + $bag->setCookie(Cookie::create('foo', 'bar')); $this->assertCount(4, $bag->getCookies()); - $this->assertEquals('foo=bar; path=/path/foo; domain=foo.bar; httponly', $bag->get('set-cookie')); + $this->assertEquals('foo=bar; path=/path/foo; domain=foo.bar; httponly; samesite=lax', $bag->get('set-cookie')); $this->assertEquals(array( - 'foo=bar; path=/path/foo; domain=foo.bar; httponly', - 'foo=bar; path=/path/bar; domain=foo.bar; httponly', - 'foo=bar; path=/path/bar; domain=bar.foo; httponly', - 'foo=bar; path=/; httponly', + 'foo=bar; path=/path/foo; domain=foo.bar; httponly; samesite=lax', + 'foo=bar; path=/path/bar; domain=foo.bar; httponly; samesite=lax', + 'foo=bar; path=/path/bar; domain=bar.foo; httponly; samesite=lax', + 'foo=bar; path=/; httponly; samesite=lax', ), $bag->get('set-cookie', null, false)); - $this->assertSetCookieHeader('foo=bar; path=/path/foo; domain=foo.bar; httponly', $bag); - $this->assertSetCookieHeader('foo=bar; path=/path/bar; domain=foo.bar; httponly', $bag); - $this->assertSetCookieHeader('foo=bar; path=/path/bar; domain=bar.foo; httponly', $bag); - $this->assertSetCookieHeader('foo=bar; path=/; httponly', $bag); + $this->assertSetCookieHeader('foo=bar; path=/path/foo; domain=foo.bar; httponly; samesite=lax', $bag); + $this->assertSetCookieHeader('foo=bar; path=/path/bar; domain=foo.bar; httponly; samesite=lax', $bag); + $this->assertSetCookieHeader('foo=bar; path=/path/bar; domain=bar.foo; httponly; samesite=lax', $bag); + $this->assertSetCookieHeader('foo=bar; path=/; httponly; samesite=lax', $bag); $cookies = $bag->getCookies(ResponseHeaderBag::COOKIES_ARRAY); @@ -186,8 +186,8 @@ class ResponseHeaderBagTest extends TestCase $bag = new ResponseHeaderBag(); $this->assertFalse($bag->has('set-cookie')); - $bag->setCookie(new Cookie('foo', 'bar', 0, '/path/foo', 'foo.bar')); - $bag->setCookie(new Cookie('bar', 'foo', 0, '/path/bar', 'foo.bar')); + $bag->setCookie(Cookie::create('foo', 'bar', 0, '/path/foo', 'foo.bar')); + $bag->setCookie(Cookie::create('bar', 'foo', 0, '/path/bar', 'foo.bar')); $this->assertTrue($bag->has('set-cookie')); $cookies = $bag->getCookies(ResponseHeaderBag::COOKIES_ARRAY); @@ -209,8 +209,8 @@ class ResponseHeaderBagTest extends TestCase public function testRemoveCookieWithNullRemove() { $bag = new ResponseHeaderBag(); - $bag->setCookie(new Cookie('foo', 'bar', 0)); - $bag->setCookie(new Cookie('bar', 'foo', 0)); + $bag->setCookie(Cookie::create('foo', 'bar')); + $bag->setCookie(Cookie::create('bar', 'foo')); $cookies = $bag->getCookies(ResponseHeaderBag::COOKIES_ARRAY); $this->assertArrayHasKey('/', $cookies['']); @@ -228,12 +228,12 @@ class ResponseHeaderBagTest extends TestCase { $bag = new ResponseHeaderBag(); $bag->set('set-cookie', 'foo=bar'); - $this->assertEquals(array(new Cookie('foo', 'bar', 0, '/', null, false, false, true)), $bag->getCookies()); + $this->assertEquals(array(Cookie::create('foo', 'bar', 0, '/', null, false, false, true, null)), $bag->getCookies()); $bag->set('set-cookie', 'foo2=bar2', false); $this->assertEquals(array( - new Cookie('foo', 'bar', 0, '/', null, false, false, true), - new Cookie('foo2', 'bar2', 0, '/', null, false, false, true), + Cookie::create('foo', 'bar', 0, '/', null, false, false, true, null), + Cookie::create('foo2', 'bar2', 0, '/', null, false, false, true, null), ), $bag->getCookies()); $bag->remove('set-cookie'); @@ -250,26 +250,6 @@ class ResponseHeaderBagTest extends TestCase $bag->getCookies('invalid_argument'); } - /** - * @expectedException \InvalidArgumentException - */ - public function testMakeDispositionInvalidDisposition() - { - $headers = new ResponseHeaderBag(); - - $headers->makeDisposition('invalid', 'foo.html'); - } - - /** - * @dataProvider provideMakeDisposition - */ - public function testMakeDisposition($disposition, $filename, $filenameFallback, $expected) - { - $headers = new ResponseHeaderBag(); - - $this->assertEquals($expected, $headers->makeDisposition($disposition, $filename, $filenameFallback)); - } - public function testToStringDoesntMessUpHeaders() { $headers = new ResponseHeaderBag(); @@ -284,41 +264,6 @@ class ResponseHeaderBagTest extends TestCase $this->assertEquals(array('text/html'), $allHeaders['Content-type']); } - public function provideMakeDisposition() - { - return array( - array('attachment', 'foo.html', 'foo.html', 'attachment; filename=foo.html'), - array('attachment', 'foo.html', '', 'attachment; filename=foo.html'), - array('attachment', 'foo bar.html', '', 'attachment; filename="foo bar.html"'), - array('attachment', 'foo "bar".html', '', 'attachment; filename="foo \\"bar\\".html"'), - array('attachment', 'foo%20bar.html', 'foo bar.html', 'attachment; filename="foo bar.html"; filename*=utf-8\'\'foo%2520bar.html'), - array('attachment', 'föö.html', 'foo.html', 'attachment; filename=foo.html; filename*=utf-8\'\'f%C3%B6%C3%B6.html'), - ); - } - - /** - * @dataProvider provideMakeDispositionFail - * @expectedException \InvalidArgumentException - */ - public function testMakeDispositionFail($disposition, $filename) - { - $headers = new ResponseHeaderBag(); - - $headers->makeDisposition($disposition, $filename); - } - - public function provideMakeDispositionFail() - { - return array( - array('attachment', 'foo%20bar.html'), - array('attachment', 'foo/bar.html'), - array('attachment', '/foo.html'), - array('attachment', 'foo\bar.html'), - array('attachment', '\foo.html'), - array('attachment', 'föö.html'), - ); - } - public function testDateHeaderAddedOnCreation() { $now = time(); diff --git a/vendor/symfony/http-foundation/Tests/ResponseTest.php b/vendor/symfony/http-foundation/Tests/ResponseTest.php index f9b5ef4f2..03dcc11ab 100644 --- a/vendor/symfony/http-foundation/Tests/ResponseTest.php +++ b/vendor/symfony/http-foundation/Tests/ResponseTest.php @@ -11,6 +11,7 @@ namespace Symfony\Component\HttpFoundation\Tests; +use Symfony\Component\HttpFoundation\Cookie; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; @@ -573,6 +574,24 @@ class ResponseTest extends ResponseTestCase $this->assertFalse($response->headers->has('expires')); } + public function testPrepareSetsCookiesSecure() + { + $cookie = Cookie::create('foo', 'bar'); + + $response = new Response('foo'); + $response->headers->setCookie($cookie); + + $request = Request::create('/', 'GET'); + $response->prepare($request); + + $this->assertFalse($cookie->isSecure()); + + $request = Request::create('https://localhost/', 'GET'); + $response->prepare($request); + + $this->assertTrue($cookie->isSecure()); + } + public function testSetCache() { $response = new Response(); diff --git a/vendor/symfony/http-foundation/Tests/Session/Attribute/AttributeBagTest.php b/vendor/symfony/http-foundation/Tests/Session/Attribute/AttributeBagTest.php index 43644e23e..8c41e4751 100644 --- a/vendor/symfony/http-foundation/Tests/Session/Attribute/AttributeBagTest.php +++ b/vendor/symfony/http-foundation/Tests/Session/Attribute/AttributeBagTest.php @@ -45,7 +45,7 @@ class AttributeBagTest extends TestCase ), ), ); - $this->bag = new AttributeBag('_sf2'); + $this->bag = new AttributeBag('_sf'); $this->bag->initialize($this->array); } @@ -67,7 +67,7 @@ class AttributeBagTest extends TestCase public function testGetStorageKey() { - $this->assertEquals('_sf2', $this->bag->getStorageKey()); + $this->assertEquals('_sf', $this->bag->getStorageKey()); $attributeBag = new AttributeBag('test'); $this->assertEquals('test', $attributeBag->getStorageKey()); } diff --git a/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/with_samesite.expected b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/with_samesite.expected new file mode 100644 index 000000000..d20fb88ec --- /dev/null +++ b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/with_samesite.expected @@ -0,0 +1,16 @@ +open +validateId +read +doRead: +read + +write +doWrite: foo|s:3:"bar"; +close +Array +( + [0] => Content-Type: text/plain; charset=utf-8 + [1] => Cache-Control: max-age=0, private, must-revalidate + [2] => Set-Cookie: sid=random_session_id; path=/; secure; HttpOnly; SameSite=lax +) +shutdown diff --git a/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/with_samesite.php b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/with_samesite.php new file mode 100644 index 000000000..2d32792a8 --- /dev/null +++ b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/with_samesite.php @@ -0,0 +1,13 @@ + 'lax')); +$storage->setSaveHandler(new TestSessionHandler()); +$storage->start(); + +$_SESSION = array('foo' => 'bar'); + +ob_start(function ($buffer) { return str_replace(session_id(), 'random_session_id', $buffer); }); diff --git a/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/with_samesite_and_migration.expected b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/with_samesite_and_migration.expected new file mode 100644 index 000000000..8b5fc08bd --- /dev/null +++ b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/with_samesite_and_migration.expected @@ -0,0 +1,23 @@ +open +validateId +read +doRead: +read +destroy +close +open +validateId +read +doRead: +read + +write +doWrite: foo|s:3:"bar"; +close +Array +( + [0] => Content-Type: text/plain; charset=utf-8 + [1] => Cache-Control: max-age=0, private, must-revalidate + [2] => Set-Cookie: sid=random_session_id; path=/; secure; HttpOnly; SameSite=lax +) +shutdown diff --git a/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/with_samesite_and_migration.php b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/with_samesite_and_migration.php new file mode 100644 index 000000000..e0ff64b95 --- /dev/null +++ b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/with_samesite_and_migration.php @@ -0,0 +1,15 @@ + 'lax')); +$storage->setSaveHandler(new TestSessionHandler()); +$storage->start(); + +$_SESSION = array('foo' => 'bar'); + +$storage->regenerate(true); + +ob_start(function ($buffer) { return preg_replace('~_sf2_meta.*$~m', '', str_replace(session_id(), 'random_session_id', $buffer)); }); diff --git a/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/MongoDbSessionHandlerTest.php b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/MongoDbSessionHandlerTest.php index 55a3864a9..c585fd4f1 100644 --- a/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/MongoDbSessionHandlerTest.php +++ b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/MongoDbSessionHandlerTest.php @@ -45,7 +45,7 @@ class MongoDbSessionHandlerTest extends TestCase 'data_field' => 'data', 'time_field' => 'time', 'expiry_field' => 'expires_at', - 'database' => 'sf2-test', + 'database' => 'sf-test', 'collection' => 'session-test', ); diff --git a/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/PdoSessionHandlerTest.php b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/PdoSessionHandlerTest.php index e84781898..0a65eaa8e 100644 --- a/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/PdoSessionHandlerTest.php +++ b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/PdoSessionHandlerTest.php @@ -33,7 +33,7 @@ class PdoSessionHandlerTest extends TestCase protected function getPersistentSqliteDsn() { - $this->dbFile = tempnam(sys_get_temp_dir(), 'sf2_sqlite_sessions'); + $this->dbFile = tempnam(sys_get_temp_dir(), 'sf_sqlite_sessions'); return 'sqlite:'.$this->dbFile; } @@ -153,7 +153,7 @@ class PdoSessionHandlerTest extends TestCase public function testReadLockedConvertsStreamToString() { - if (ini_get('session.use_strict_mode')) { + if (filter_var(ini_get('session.use_strict_mode'), FILTER_VALIDATE_BOOLEAN)) { $this->markTestSkipped('Strict mode needs no locking for new sessions.'); } diff --git a/vendor/symfony/http-foundation/Tests/Session/Storage/MockFileSessionStorageTest.php b/vendor/symfony/http-foundation/Tests/Session/Storage/MockFileSessionStorageTest.php index 169579817..f8394d8ca 100644 --- a/vendor/symfony/http-foundation/Tests/Session/Storage/MockFileSessionStorageTest.php +++ b/vendor/symfony/http-foundation/Tests/Session/Storage/MockFileSessionStorageTest.php @@ -35,7 +35,7 @@ class MockFileSessionStorageTest extends TestCase protected function setUp() { - $this->sessionDir = sys_get_temp_dir().'/sf2test'; + $this->sessionDir = sys_get_temp_dir().'/sftest'; $this->storage = $this->getStorage(); } diff --git a/vendor/symfony/http-foundation/Tests/Session/Storage/NativeSessionStorageTest.php b/vendor/symfony/http-foundation/Tests/Session/Storage/NativeSessionStorageTest.php index 52da2947c..8ce703b34 100644 --- a/vendor/symfony/http-foundation/Tests/Session/Storage/NativeSessionStorageTest.php +++ b/vendor/symfony/http-foundation/Tests/Session/Storage/NativeSessionStorageTest.php @@ -36,7 +36,7 @@ class NativeSessionStorageTest extends TestCase protected function setUp() { $this->iniSet('session.save_handler', 'files'); - $this->iniSet('session.save_path', $this->savePath = sys_get_temp_dir().'/sf2test'); + $this->iniSet('session.save_path', $this->savePath = sys_get_temp_dir().'/sftest'); if (!is_dir($this->savePath)) { mkdir($this->savePath); } @@ -171,6 +171,10 @@ class NativeSessionStorageTest extends TestCase 'cookie_httponly' => false, ); + if (\PHP_VERSION_ID >= 70300) { + $options['cookie_samesite'] = 'lax'; + } + $this->getStorage($options); $temp = session_get_cookie_params(); $gco = array(); diff --git a/vendor/symfony/http-foundation/Tests/Session/Storage/PhpBridgeSessionStorageTest.php b/vendor/symfony/http-foundation/Tests/Session/Storage/PhpBridgeSessionStorageTest.php index 303f36d34..a5a856146 100644 --- a/vendor/symfony/http-foundation/Tests/Session/Storage/PhpBridgeSessionStorageTest.php +++ b/vendor/symfony/http-foundation/Tests/Session/Storage/PhpBridgeSessionStorageTest.php @@ -32,7 +32,7 @@ class PhpBridgeSessionStorageTest extends TestCase protected function setUp() { $this->iniSet('session.save_handler', 'files'); - $this->iniSet('session.save_path', $this->savePath = sys_get_temp_dir().'/sf2test'); + $this->iniSet('session.save_path', $this->savePath = sys_get_temp_dir().'/sftest'); if (!is_dir($this->savePath)) { mkdir($this->savePath); } diff --git a/vendor/symfony/http-foundation/composer.json b/vendor/symfony/http-foundation/composer.json index ef4bf826e..76381a7c4 100644 --- a/vendor/symfony/http-foundation/composer.json +++ b/vendor/symfony/http-foundation/composer.json @@ -32,7 +32,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-master": "4.1-dev" + "dev-master": "4.2-dev" } } } diff --git a/vendor/symfony/http-foundation/phpunit.xml.dist b/vendor/symfony/http-foundation/phpunit.xml.dist index c1d61f8bf..f57bc9e62 100644 --- a/vendor/symfony/http-foundation/phpunit.xml.dist +++ b/vendor/symfony/http-foundation/phpunit.xml.dist @@ -1,7 +1,7 @@ warmers = $warmers; + $this->debug = $debug; + $this->deprecationLogsFilepath = $deprecationLogsFilepath; } public function enableOptionalWarmers() @@ -46,15 +50,62 @@ class CacheWarmerAggregate implements CacheWarmerInterface */ public function warmUp($cacheDir) { - foreach ($this->warmers as $warmer) { - if (!$this->optionalsEnabled && $warmer->isOptional()) { - continue; - } - if ($this->onlyOptionalsEnabled && !$warmer->isOptional()) { - continue; - } + if ($this->debug) { + $collectedLogs = array(); + $previousHandler = \defined('PHPUNIT_COMPOSER_INSTALL'); + $previousHandler = $previousHandler ?: set_error_handler(function ($type, $message, $file, $line) use (&$collectedLogs, &$previousHandler) { + if (E_USER_DEPRECATED !== $type && E_DEPRECATED !== $type) { + return $previousHandler ? $previousHandler($type, $message, $file, $line) : false; + } - $warmer->warmUp($cacheDir); + if (isset($collectedLogs[$message])) { + ++$collectedLogs[$message]['count']; + + return; + } + + $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 3); + // Clean the trace by removing first frames added by the error handler itself. + for ($i = 0; isset($backtrace[$i]); ++$i) { + if (isset($backtrace[$i]['file'], $backtrace[$i]['line']) && $backtrace[$i]['line'] === $line && $backtrace[$i]['file'] === $file) { + $backtrace = \array_slice($backtrace, 1 + $i); + break; + } + } + + $collectedLogs[$message] = array( + 'type' => $type, + 'message' => $message, + 'file' => $file, + 'line' => $line, + 'trace' => $backtrace, + 'count' => 1, + ); + }); + } + + try { + foreach ($this->warmers as $warmer) { + if (!$this->optionalsEnabled && $warmer->isOptional()) { + continue; + } + if ($this->onlyOptionalsEnabled && !$warmer->isOptional()) { + continue; + } + + $warmer->warmUp($cacheDir); + } + } finally { + if ($this->debug && true !== $previousHandler) { + restore_error_handler(); + + if (file_exists($this->deprecationLogsFilepath)) { + $previousLogs = unserialize(file_get_contents($this->deprecationLogsFilepath)); + $collectedLogs = array_merge($previousLogs, $collectedLogs); + } + + file_put_contents($this->deprecationLogsFilepath, serialize(array_values($collectedLogs))); + } } } diff --git a/vendor/symfony/http-kernel/Controller/ArgumentResolver/TraceableValueResolver.php b/vendor/symfony/http-kernel/Controller/ArgumentResolver/TraceableValueResolver.php index 4d60aa15f..bde3c90c1 100644 --- a/vendor/symfony/http-kernel/Controller/ArgumentResolver/TraceableValueResolver.php +++ b/vendor/symfony/http-kernel/Controller/ArgumentResolver/TraceableValueResolver.php @@ -38,7 +38,7 @@ final class TraceableValueResolver implements ArgumentValueResolverInterface public function supports(Request $request, ArgumentMetadata $argument): bool { $method = \get_class($this->inner).'::'.__FUNCTION__; - $this->stopwatch->start($method); + $this->stopwatch->start($method, 'controller.argument_value_resolver'); $return = $this->inner->supports($request, $argument); @@ -53,7 +53,7 @@ final class TraceableValueResolver implements ArgumentValueResolverInterface public function resolve(Request $request, ArgumentMetadata $argument): iterable { $method = \get_class($this->inner).'::'.__FUNCTION__; - $this->stopwatch->start($method); + $this->stopwatch->start($method, 'controller.argument_value_resolver'); yield from $this->inner->resolve($request, $argument); diff --git a/vendor/symfony/http-kernel/Controller/ContainerControllerResolver.php b/vendor/symfony/http-kernel/Controller/ContainerControllerResolver.php index ed515d247..4f80921cf 100644 --- a/vendor/symfony/http-kernel/Controller/ContainerControllerResolver.php +++ b/vendor/symfony/http-kernel/Controller/ContainerControllerResolver.php @@ -36,7 +36,7 @@ class ContainerControllerResolver extends ControllerResolver { if (1 === substr_count($controller, ':')) { $controller = str_replace(':', '::', $controller); - @trigger_error(sprintf('Referencing controllers with a single colon is deprecated since Symfony 4.1. Use %s instead.', $controller), E_USER_DEPRECATED); + // TODO deprecate this in 5.1 } return parent::createController($controller); diff --git a/vendor/symfony/http-kernel/DataCollector/ConfigDataCollector.php b/vendor/symfony/http-kernel/DataCollector/ConfigDataCollector.php index 76ad4a8c8..f07ac89c0 100644 --- a/vendor/symfony/http-kernel/DataCollector/ConfigDataCollector.php +++ b/vendor/symfony/http-kernel/DataCollector/ConfigDataCollector.php @@ -30,12 +30,15 @@ class ConfigDataCollector extends DataCollector implements LateDataCollectorInte private $version; private $hasVarDumper; - /** - * @param string $name The name of the application using the web profiler - * @param string $version The version of the application using the web profiler - */ public function __construct(string $name = null, string $version = null) { + if (1 <= \func_num_args()) { + @trigger_error(sprintf('The "$name" argument in method "%s()" is deprecated since Symfony 4.2.', __METHOD__), E_USER_DEPRECATED); + } + if (2 <= \func_num_args()) { + @trigger_error(sprintf('The "$version" argument in method "%s()" is deprecated since Symfony 4.2.', __METHOD__), E_USER_DEPRECATED); + } + $this->name = $name; $this->version = $version; $this->hasVarDumper = class_exists(LinkStub::class); @@ -60,7 +63,6 @@ class ConfigDataCollector extends DataCollector implements LateDataCollectorInte 'token' => $response->headers->get('X-Debug-Token'), 'symfony_version' => Kernel::VERSION, 'symfony_state' => 'unknown', - 'name' => isset($this->kernel) ? $this->kernel->getName() : 'n/a', 'env' => isset($this->kernel) ? $this->kernel->getEnvironment() : 'n/a', 'debug' => isset($this->kernel) ? $this->kernel->isDebug() : 'n/a', 'php_version' => PHP_VERSION, @@ -68,8 +70,8 @@ class ConfigDataCollector extends DataCollector implements LateDataCollectorInte 'php_intl_locale' => class_exists('Locale', false) && \Locale::getDefault() ? \Locale::getDefault() : 'n/a', 'php_timezone' => date_default_timezone_get(), 'xdebug_enabled' => \extension_loaded('xdebug'), - 'apcu_enabled' => \extension_loaded('apcu') && ini_get('apc.enabled'), - 'zend_opcache_enabled' => \extension_loaded('Zend OPcache') && ini_get('opcache.enable'), + 'apcu_enabled' => \extension_loaded('apcu') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN), + 'zend_opcache_enabled' => \extension_loaded('Zend OPcache') && filter_var(ini_get('opcache.enable'), FILTER_VALIDATE_BOOLEAN), 'bundles' => array(), 'sapi_name' => \PHP_SAPI, ); @@ -106,13 +108,23 @@ class ConfigDataCollector extends DataCollector implements LateDataCollectorInte $this->data = $this->cloneVar($this->data); } + /** + * @deprecated since Symfony 4.2 + */ public function getApplicationName() { + @trigger_error(sprintf('The method "%s()" is deprecated since Symfony 4.2.', __METHOD__), E_USER_DEPRECATED); + return $this->data['app_name']; } + /** + * @deprecated since Symfony 4.2 + */ public function getApplicationVersion() { + @trigger_error(sprintf('The method "%s()" is deprecated since Symfony 4.2.', __METHOD__), E_USER_DEPRECATED); + return $this->data['app_version']; } @@ -227,10 +239,14 @@ class ConfigDataCollector extends DataCollector implements LateDataCollectorInte * Gets the application name. * * @return string The application name + * + * @deprecated since Symfony 4.2 */ public function getAppName() { - return $this->data['name']; + @trigger_error(sprintf('The "%s()" method is deprecated since Symfony 4.2.', __METHOD__), E_USER_DEPRECATED); + + return 'n/a'; } /** diff --git a/vendor/symfony/http-kernel/DataCollector/DataCollectorInterface.php b/vendor/symfony/http-kernel/DataCollector/DataCollectorInterface.php index 549fd5d3a..b9584110e 100644 --- a/vendor/symfony/http-kernel/DataCollector/DataCollectorInterface.php +++ b/vendor/symfony/http-kernel/DataCollector/DataCollectorInterface.php @@ -13,13 +13,14 @@ namespace Symfony\Component\HttpKernel\DataCollector; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; +use Symfony\Contracts\Service\ResetInterface; /** * DataCollectorInterface. * * @author Fabien Potencier */ -interface DataCollectorInterface +interface DataCollectorInterface extends ResetInterface { /** * Collects data for the given Request and Response. @@ -32,9 +33,4 @@ interface DataCollectorInterface * @return string The collector name */ public function getName(); - - /** - * Resets this data collector to its initial state. - */ - public function reset(); } diff --git a/vendor/symfony/http-kernel/DataCollector/DumpDataCollector.php b/vendor/symfony/http-kernel/DataCollector/DumpDataCollector.php index 1ca852553..13694f5a5 100644 --- a/vendor/symfony/http-kernel/DataCollector/DumpDataCollector.php +++ b/vendor/symfony/http-kernel/DataCollector/DumpDataCollector.php @@ -204,7 +204,13 @@ class DumpDataCollector extends DataCollector implements DataDumperInterface --$i; } - if (!\in_array(\PHP_SAPI, array('cli', 'phpdbg'), true) && stripos($h[$i], 'html')) { + if (isset($_SERVER['VAR_DUMPER_FORMAT'])) { + $html = 'html' === $_SERVER['VAR_DUMPER_FORMAT']; + } else { + $html = !\in_array(\PHP_SAPI, array('cli', 'phpdbg'), true) && stripos($h[$i], 'html'); + } + + if ($html) { $dumper = new HtmlDumper('php://output', $this->charset); $dumper->setDisplayOptions(array('fileLinkFormat' => $this->fileLinkFormat)); } else { diff --git a/vendor/symfony/http-kernel/DataCollector/EventDataCollector.php b/vendor/symfony/http-kernel/DataCollector/EventDataCollector.php index f9d5bed13..3a7e51bf8 100644 --- a/vendor/symfony/http-kernel/DataCollector/EventDataCollector.php +++ b/vendor/symfony/http-kernel/DataCollector/EventDataCollector.php @@ -16,6 +16,7 @@ use Symfony\Component\EventDispatcher\Debug\TraceableEventDispatcherInterface; use Symfony\Component\EventDispatcher\EventDispatcherInterface; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; +use Symfony\Contracts\Service\ResetInterface; /** * EventDataCollector. @@ -47,7 +48,7 @@ class EventDataCollector extends DataCollector implements LateDataCollectorInter { $this->data = array(); - if ($this->dispatcher instanceof TraceableEventDispatcherInterface) { + if ($this->dispatcher instanceof ResetInterface) { $this->dispatcher->reset(); } } diff --git a/vendor/symfony/http-kernel/DataCollector/LoggerDataCollector.php b/vendor/symfony/http-kernel/DataCollector/LoggerDataCollector.php index 533d3217b..3081ac7fb 100644 --- a/vendor/symfony/http-kernel/DataCollector/LoggerDataCollector.php +++ b/vendor/symfony/http-kernel/DataCollector/LoggerDataCollector.php @@ -134,7 +134,7 @@ class LoggerDataCollector extends DataCollector implements LateDataCollectorInte $log['timestamp'] = $bootTime; $log['priority'] = 100; $log['priorityName'] = 'DEBUG'; - $log['channel'] = '-'; + $log['channel'] = null; $log['scream'] = false; unset($log['type'], $log['file'], $log['line'], $log['trace'], $log['trace'], $log['count']); $logs[] = $log; diff --git a/vendor/symfony/http-kernel/DataCollector/RequestDataCollector.php b/vendor/symfony/http-kernel/DataCollector/RequestDataCollector.php index 4c34cf90d..ed7538261 100644 --- a/vendor/symfony/http-kernel/DataCollector/RequestDataCollector.php +++ b/vendor/symfony/http-kernel/DataCollector/RequestDataCollector.php @@ -95,6 +95,7 @@ class RequestDataCollector extends DataCollector implements EventSubscriberInter 'status_code' => $statusCode, 'request_query' => $request->query->all(), 'request_request' => $request->request->all(), + 'request_files' => $request->files->all(), 'request_headers' => $request->headers->all(), 'request_server' => $request->server->all(), 'request_cookies' => $request->cookies->all(), @@ -153,7 +154,8 @@ class RequestDataCollector extends DataCollector implements EventSubscriberInter 'controller' => $this->parseController($request->attributes->get('_controller')), 'status_code' => $statusCode, 'status_text' => Response::$statusTexts[(int) $statusCode], - )) + )), + 0, '/', null, $request->isSecure(), true, false, 'lax' )); } @@ -195,6 +197,11 @@ class RequestDataCollector extends DataCollector implements EventSubscriberInter return new ParameterBag($this->data['request_query']->getValue()); } + public function getRequestFiles() + { + return new ParameterBag($this->data['request_files']->getValue()); + } + public function getRequestHeaders() { return new ParameterBag($this->data['request_headers']->getValue()); @@ -402,12 +409,25 @@ class RequestDataCollector extends DataCollector implements EventSubscriberInter if ($controller instanceof \Closure) { $r = new \ReflectionFunction($controller); - return array( + $controller = array( 'class' => $r->getName(), 'method' => null, 'file' => $r->getFileName(), 'line' => $r->getStartLine(), ); + + if (false !== strpos($r->name, '{closure}')) { + return $controller; + } + $controller['method'] = $r->name; + + if ($class = $r->getClosureScopeClass()) { + $controller['class'] = $class->name; + } else { + return $r->name; + } + + return $controller; } if (\is_object($controller)) { diff --git a/vendor/symfony/http-kernel/DependencyInjection/RegisterControllerArgumentLocatorsPass.php b/vendor/symfony/http-kernel/DependencyInjection/RegisterControllerArgumentLocatorsPass.php index 06adfe4a2..125464b12 100644 --- a/vendor/symfony/http-kernel/DependencyInjection/RegisterControllerArgumentLocatorsPass.php +++ b/vendor/symfony/http-kernel/DependencyInjection/RegisterControllerArgumentLocatorsPass.php @@ -122,7 +122,7 @@ class RegisterControllerArgumentLocatorsPass implements CompilerPassInterface $args = array(); foreach ($parameters as $p) { /** @var \ReflectionParameter $p */ - $type = $target = ProxyHelper::getTypeHint($r, $p, true); + $type = ltrim($target = ProxyHelper::getTypeHint($r, $p), '\\'); $invalidBehavior = ContainerInterface::IGNORE_ON_INVALID_REFERENCE; if (isset($arguments[$r->name][$p->name])) { @@ -134,7 +134,7 @@ class RegisterControllerArgumentLocatorsPass implements CompilerPassInterface } elseif ($p->allowsNull() && !$p->isOptional()) { $invalidBehavior = ContainerInterface::NULL_ON_INVALID_REFERENCE; } - } elseif (isset($bindings[$bindingName = '$'.$p->name]) || isset($bindings[$bindingName = $type])) { + } elseif (isset($bindings[$bindingName = $type.' $'.$p->name]) || isset($bindings[$bindingName = '$'.$p->name]) || isset($bindings[$bindingName = $type])) { $binding = $bindings[$bindingName]; list($bindingValue, $bindingId) = $binding->getValues(); @@ -150,7 +150,7 @@ class RegisterControllerArgumentLocatorsPass implements CompilerPassInterface } continue; - } elseif (!$type || !$autowire) { + } elseif (!$type || !$autowire || '\\' !== $target[0]) { continue; } elseif (!$p->allowsNull()) { $invalidBehavior = ContainerInterface::RUNTIME_EXCEPTION_ON_INVALID_REFERENCE; @@ -171,7 +171,8 @@ class RegisterControllerArgumentLocatorsPass implements CompilerPassInterface throw new InvalidArgumentException($message); } - $args[$p->name] = $type ? new TypedReference($target, $type, $invalidBehavior) : new Reference($target, $invalidBehavior); + $target = ltrim($target, '\\'); + $args[$p->name] = $type ? new TypedReference($target, $type, $invalidBehavior, $p->name) : new Reference($target, $invalidBehavior); } // register the maps as a per-method service-locators if ($args) { diff --git a/vendor/symfony/http-kernel/DependencyInjection/ServicesResetter.php b/vendor/symfony/http-kernel/DependencyInjection/ServicesResetter.php index b82d2fef3..734fadbd7 100644 --- a/vendor/symfony/http-kernel/DependencyInjection/ServicesResetter.php +++ b/vendor/symfony/http-kernel/DependencyInjection/ServicesResetter.php @@ -11,6 +11,8 @@ namespace Symfony\Component\HttpKernel\DependencyInjection; +use Symfony\Contracts\Service\ResetInterface; + /** * Resets provided services. * @@ -19,7 +21,7 @@ namespace Symfony\Component\HttpKernel\DependencyInjection; * * @internal */ -class ServicesResetter +class ServicesResetter implements ResetInterface { private $resettableServices; private $resetMethods; diff --git a/vendor/symfony/http-kernel/EventListener/AbstractSessionListener.php b/vendor/symfony/http-kernel/EventListener/AbstractSessionListener.php index 08a6ac63e..c7c171706 100644 --- a/vendor/symfony/http-kernel/EventListener/AbstractSessionListener.php +++ b/vendor/symfony/http-kernel/EventListener/AbstractSessionListener.php @@ -71,14 +71,17 @@ abstract class AbstractSessionListener implements EventSubscriberInterface return; } + $response = $event->getResponse(); + $autoCacheControl = !$response->headers->has(self::NO_AUTO_CACHE_CONTROL_HEADER); + // Always remove the internal header if present + $response->headers->remove(self::NO_AUTO_CACHE_CONTROL_HEADER); + if (!$session = $this->container && $this->container->has('initialized_session') ? $this->container->get('initialized_session') : $event->getRequest()->getSession()) { return; } - $response = $event->getResponse(); - if ($session instanceof Session ? $session->getUsageIndex() !== end($this->sessionUsageStack) : $session->isStarted()) { - if (!$response->headers->has(self::NO_AUTO_CACHE_CONTROL_HEADER)) { + if ($autoCacheControl) { $response ->setPrivate() ->setMaxAge(0) @@ -86,9 +89,6 @@ abstract class AbstractSessionListener implements EventSubscriberInterface } } - // Always remove the internal header if present - $response->headers->remove(self::NO_AUTO_CACHE_CONTROL_HEADER); - if ($session->isStarted()) { /* * Saves the session, in case it is still open, before sending the response/headers. diff --git a/vendor/symfony/http-kernel/EventListener/AbstractTestSessionListener.php b/vendor/symfony/http-kernel/EventListener/AbstractTestSessionListener.php index 7f07e7f10..993c6ddf9 100644 --- a/vendor/symfony/http-kernel/EventListener/AbstractTestSessionListener.php +++ b/vendor/symfony/http-kernel/EventListener/AbstractTestSessionListener.php @@ -30,6 +30,12 @@ use Symfony\Component\HttpKernel\KernelEvents; abstract class AbstractTestSessionListener implements EventSubscriberInterface { private $sessionId; + private $sessionOptions; + + public function __construct(array $sessionOptions = array()) + { + $this->sessionOptions = $sessionOptions; + } public function onKernelRequest(GetResponseEvent $event) { @@ -72,7 +78,12 @@ abstract class AbstractTestSessionListener implements EventSubscriberInterface } if ($session instanceof Session ? !$session->isEmpty() || (null !== $this->sessionId && $session->getId() !== $this->sessionId) : $wasStarted) { - $params = session_get_cookie_params(); + $params = session_get_cookie_params() + array('samesite' => null); + foreach ($this->sessionOptions as $k => $v) { + if (0 === strpos($k, 'cookie_')) { + $params[substr($k, 7)] = $v; + } + } foreach ($event->getResponse()->headers->getCookies() as $cookie) { if ($session->getName() === $cookie->getName() && $params['path'] === $cookie->getPath() && $params['domain'] == $cookie->getDomain()) { @@ -80,7 +91,7 @@ abstract class AbstractTestSessionListener implements EventSubscriberInterface } } - $event->getResponse()->headers->setCookie(new Cookie($session->getName(), $session->getId(), 0 === $params['lifetime'] ? 0 : time() + $params['lifetime'], $params['path'], $params['domain'], $params['secure'], $params['httponly'])); + $event->getResponse()->headers->setCookie(new Cookie($session->getName(), $session->getId(), 0 === $params['lifetime'] ? 0 : time() + $params['lifetime'], $params['path'], $params['domain'], $params['secure'], $params['httponly'], false, $params['samesite'] ?: null)); $this->sessionId = $session->getId(); } } diff --git a/vendor/symfony/http-kernel/EventListener/ExceptionListener.php b/vendor/symfony/http-kernel/EventListener/ExceptionListener.php index 559872a1e..02b1d4ddc 100644 --- a/vendor/symfony/http-kernel/EventListener/ExceptionListener.php +++ b/vendor/symfony/http-kernel/EventListener/ExceptionListener.php @@ -13,9 +13,11 @@ namespace Symfony\Component\HttpKernel\EventListener; use Psr\Log\LoggerInterface; use Symfony\Component\Debug\Exception\FlattenException; +use Symfony\Component\Debug\ExceptionHandler; use Symfony\Component\EventDispatcher\EventDispatcherInterface; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Event\FilterResponseEvent; use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent; use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface; @@ -33,23 +35,39 @@ class ExceptionListener implements EventSubscriberInterface protected $controller; protected $logger; protected $debug; + private $charset; + private $fileLinkFormat; + private $isTerminating = false; - public function __construct($controller, LoggerInterface $logger = null, $debug = false) + public function __construct($controller, LoggerInterface $logger = null, $debug = false, string $charset = null, $fileLinkFormat = null) { $this->controller = $controller; $this->logger = $logger; $this->debug = $debug; + $this->charset = $charset; + $this->fileLinkFormat = $fileLinkFormat; } public function logKernelException(GetResponseForExceptionEvent $event) { - $exception = $event->getException(); + $e = FlattenException::create($event->getException()); - $this->logException($exception, sprintf('Uncaught PHP Exception %s: "%s" at %s line %s', \get_class($exception), $exception->getMessage(), $exception->getFile(), $exception->getLine())); + $this->logException($event->getException(), sprintf('Uncaught PHP Exception %s: "%s" at %s line %s', $e->getClass(), $e->getMessage(), $e->getFile(), $e->getLine())); } public function onKernelException(GetResponseForExceptionEvent $event) { + if (null === $this->controller) { + if (!$event->isMasterRequest()) { + return; + } + if (!$this->isTerminating) { + $this->isTerminating = true; + + return; + } + $this->isTerminating = false; + } $exception = $event->getException(); $request = $this->duplicateRequest($exception, $event->getRequest()); $eventDispatcher = \func_num_args() > 2 ? func_get_arg(2) : null; @@ -57,7 +75,9 @@ class ExceptionListener implements EventSubscriberInterface try { $response = $event->getKernel()->handle($request, HttpKernelInterface::SUB_REQUEST, false); } catch (\Exception $e) { - $this->logException($e, sprintf('Exception thrown when handling an exception (%s: %s at %s line %s)', \get_class($e), $e->getMessage(), $e->getFile(), $e->getLine())); + $f = FlattenException::create($e); + + $this->logException($e, sprintf('Exception thrown when handling an exception (%s: %s at %s line %s)', $f->getClass(), $f->getMessage(), $e->getFile(), $e->getLine())); $wrapper = $e; @@ -85,6 +105,11 @@ class ExceptionListener implements EventSubscriberInterface } } + public function reset() + { + $this->isTerminating = false; + } + public static function getSubscribedEvents() { return array( @@ -118,13 +143,17 @@ class ExceptionListener implements EventSubscriberInterface * @param \Exception $exception The thrown exception * @param Request $request The original request * - * @return Request $request The cloned request + * @return Request The cloned request */ protected function duplicateRequest(\Exception $exception, Request $request) { $attributes = array( - '_controller' => $this->controller, - 'exception' => FlattenException::create($exception), + 'exception' => $exception = FlattenException::create($exception), + '_controller' => $this->controller ?: function () use ($exception) { + $handler = new ExceptionHandler($this->debug, $this->charset, $this->fileLinkFormat); + + return new Response($handler->getHtml($exception), $exception->getStatusCode(), $exception->getHeaders()); + }, 'logger' => $this->logger instanceof DebugLoggerInterface ? $this->logger : null, ); $request = $request->duplicate(null, null, $attributes); diff --git a/vendor/symfony/http-kernel/EventListener/SessionListener.php b/vendor/symfony/http-kernel/EventListener/SessionListener.php index 5ede7c3fa..75624b6c5 100644 --- a/vendor/symfony/http-kernel/EventListener/SessionListener.php +++ b/vendor/symfony/http-kernel/EventListener/SessionListener.php @@ -12,10 +12,15 @@ namespace Symfony\Component\HttpKernel\EventListener; use Psr\Container\ContainerInterface; +use Symfony\Component\HttpFoundation\Session\Storage\NativeSessionStorage; /** * Sets the session in the request. * + * When the passed container contains a "session_storage" entry which + * holds a NativeSessionStorage instance, the "cookie_secure" option + * will be set to true whenever the current master request is secure. + * * @author Fabien Potencier * * @final @@ -33,6 +38,13 @@ class SessionListener extends AbstractSessionListener return; } + if ($this->container->has('session_storage') + && ($storage = $this->container->get('session_storage')) instanceof NativeSessionStorage + && $this->container->get('request_stack')->getMasterRequest()->isSecure() + ) { + $storage->setOptions(array('cookie_secure' => true)); + } + return $this->container->get('session'); } } diff --git a/vendor/symfony/http-kernel/EventListener/TestSessionListener.php b/vendor/symfony/http-kernel/EventListener/TestSessionListener.php index f859d0976..23589a2bb 100644 --- a/vendor/symfony/http-kernel/EventListener/TestSessionListener.php +++ b/vendor/symfony/http-kernel/EventListener/TestSessionListener.php @@ -24,9 +24,10 @@ class TestSessionListener extends AbstractTestSessionListener { private $container; - public function __construct(ContainerInterface $container) + public function __construct(ContainerInterface $container, array $sessionOptions = array()) { $this->container = $container; + parent::__construct($sessionOptions); } protected function getSession() diff --git a/vendor/symfony/http-kernel/EventListener/TranslatorListener.php b/vendor/symfony/http-kernel/EventListener/TranslatorListener.php index 2a5fc7128..e0b344e4a 100644 --- a/vendor/symfony/http-kernel/EventListener/TranslatorListener.php +++ b/vendor/symfony/http-kernel/EventListener/TranslatorListener.php @@ -18,6 +18,7 @@ use Symfony\Component\HttpKernel\Event\FinishRequestEvent; use Symfony\Component\HttpKernel\Event\GetResponseEvent; use Symfony\Component\HttpKernel\KernelEvents; use Symfony\Component\Translation\TranslatorInterface; +use Symfony\Contracts\Translation\LocaleAwareInterface; /** * Synchronizes the locale between the request and the translator. @@ -29,8 +30,14 @@ class TranslatorListener implements EventSubscriberInterface private $translator; private $requestStack; - public function __construct(TranslatorInterface $translator, RequestStack $requestStack) + /** + * @param LocaleAwareInterface $translator + */ + public function __construct($translator, RequestStack $requestStack) { + if (!$translator instanceof TranslatorInterface && !$translator instanceof LocaleAwareInterface) { + throw new \TypeError(sprintf('Argument 1 passed to %s() must be an instance of %s, %s given.', __METHOD__, LocaleAwareInterface::class, \is_object($translator) ? \get_class($translator) : \gettype($translator))); + } $this->translator = $translator; $this->requestStack = $requestStack; } diff --git a/vendor/symfony/http-kernel/Exception/ControllerDoesNotReturnResponseException.php b/vendor/symfony/http-kernel/Exception/ControllerDoesNotReturnResponseException.php new file mode 100644 index 000000000..39149aa5b --- /dev/null +++ b/vendor/symfony/http-kernel/Exception/ControllerDoesNotReturnResponseException.php @@ -0,0 +1,78 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\HttpKernel\Exception; + +/** + * @author Grégoire Pineau + */ +class ControllerDoesNotReturnResponseException extends \LogicException +{ + public function __construct(string $message, callable $controller, string $file, int $line) + { + parent::__construct($message); + + if (!$controllerDefinition = $this->parseControllerDefinition($controller)) { + return; + } + + $this->file = $controllerDefinition['file']; + $this->line = $controllerDefinition['line']; + $r = new \ReflectionProperty(\Exception::class, 'trace'); + $r->setAccessible(true); + $r->setValue($this, array_merge(array( + array( + 'line' => $line, + 'file' => $file, + ), + ), $this->getTrace())); + } + + private function parseControllerDefinition(callable $controller): ?array + { + if (\is_string($controller) && false !== strpos($controller, '::')) { + $controller = explode('::', $controller); + } + + if (\is_array($controller)) { + try { + $r = new \ReflectionMethod($controller[0], $controller[1]); + + return array( + 'file' => $r->getFileName(), + 'line' => $r->getEndLine(), + ); + } catch (\ReflectionException $e) { + return null; + } + } + + if ($controller instanceof \Closure) { + $r = new \ReflectionFunction($controller); + + return array( + 'file' => $r->getFileName(), + 'line' => $r->getEndLine(), + ); + } + + if (\is_object($controller)) { + $r = new \ReflectionClass($controller); + + return array( + 'file' => $r->getFileName(), + 'line' => $r->getEndLine(), + ); + } + + return null; + } +} diff --git a/vendor/symfony/http-kernel/HttpCache/HttpCache.php b/vendor/symfony/http-kernel/HttpCache/HttpCache.php index fa3be46c8..6980745ad 100644 --- a/vendor/symfony/http-kernel/HttpCache/HttpCache.php +++ b/vendor/symfony/http-kernel/HttpCache/HttpCache.php @@ -93,7 +93,7 @@ class HttpCache implements HttpKernelInterface, TerminableInterface /** * Gets the current store. * - * @return StoreInterface $store A StoreInterface instance + * @return StoreInterface A StoreInterface instance */ public function getStore() { diff --git a/vendor/symfony/http-kernel/HttpKernel.php b/vendor/symfony/http-kernel/HttpKernel.php index 06d210056..7ed4118ea 100644 --- a/vendor/symfony/http-kernel/HttpKernel.php +++ b/vendor/symfony/http-kernel/HttpKernel.php @@ -28,6 +28,7 @@ use Symfony\Component\HttpKernel\Event\GetResponseForControllerResultEvent; use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent; use Symfony\Component\HttpKernel\Event\PostResponseEvent; use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; +use Symfony\Component\HttpKernel\Exception\ControllerDoesNotReturnResponseException; use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; @@ -146,7 +147,7 @@ class HttpKernel implements HttpKernelInterface, TerminableInterface $arguments = $event->getArguments(); // call controller - $response = \call_user_func_array($controller, $arguments); + $response = $controller(...$arguments); // view if (!$response instanceof Response) { @@ -156,13 +157,14 @@ class HttpKernel implements HttpKernelInterface, TerminableInterface if ($event->hasResponse()) { $response = $event->getResponse(); } else { - $msg = sprintf('The controller must return a response (%s given).', $this->varToString($response)); + $msg = sprintf('The controller must return a "Symfony\Component\HttpFoundation\Response" object but it returned %s.', $this->varToString($response)); // the user may have forgotten to return something if (null === $response) { $msg .= ' Did you forget to add a return statement somewhere in your controller?'; } - throw new \LogicException($msg); + + throw new ControllerDoesNotReturnResponseException($msg, $controller, __FILE__, __LINE__ - 17); } } @@ -248,23 +250,26 @@ class HttpKernel implements HttpKernelInterface, TerminableInterface } } + /** + * Returns a human-readable string for the specified variable. + */ private function varToString($var): string { if (\is_object($var)) { - return sprintf('Object(%s)', \get_class($var)); + return sprintf('an object of type %s', \get_class($var)); } if (\is_array($var)) { $a = array(); foreach ($var as $k => $v) { - $a[] = sprintf('%s => %s', $k, $this->varToString($v)); + $a[] = sprintf('%s => ...', $k); } - return sprintf('Array(%s)', implode(', ', $a)); + return sprintf('an array ([%s])', mb_substr(implode(', ', $a), 0, 255)); } if (\is_resource($var)) { - return sprintf('Resource(%s)', get_resource_type($var)); + return sprintf('a resource (%s)', get_resource_type($var)); } if (null === $var) { @@ -272,11 +277,19 @@ class HttpKernel implements HttpKernelInterface, TerminableInterface } if (false === $var) { - return 'false'; + return 'a boolean value (false)'; } if (true === $var) { - return 'true'; + return 'a boolean value (true)'; + } + + if (\is_string($var)) { + return sprintf('a string ("%s%s")', mb_substr($var, 0, 255), mb_strlen($var) > 255 ? '...' : ''); + } + + if (is_numeric($var)) { + return sprintf('a number (%s)', (string) $var); } return (string) $var; diff --git a/vendor/symfony/http-kernel/Kernel.php b/vendor/symfony/http-kernel/Kernel.php index 23e82059a..d34beba41 100644 --- a/vendor/symfony/http-kernel/Kernel.php +++ b/vendor/symfony/http-kernel/Kernel.php @@ -16,6 +16,7 @@ use Symfony\Bridge\ProxyManager\LazyProxy\PhpDumper\ProxyDumper; use Symfony\Component\Config\ConfigCache; use Symfony\Component\Config\Loader\DelegatingLoader; use Symfony\Component\Config\Loader\LoaderResolver; +use Symfony\Component\Debug\DebugClassLoader; use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; use Symfony\Component\DependencyInjection\Compiler\PassConfig; use Symfony\Component\DependencyInjection\ContainerBuilder; @@ -41,6 +42,9 @@ use Symfony\Component\HttpKernel\DependencyInjection\MergeExtensionConfiguration * * It manages an environment made of bundles. * + * Environment names must always start with a letter and + * they must only contain letters and numbers. + * * @author Fabien Potencier */ abstract class Kernel implements KernelInterface, RebootableInterface, TerminableInterface @@ -51,10 +55,16 @@ abstract class Kernel implements KernelInterface, RebootableInterface, Terminabl protected $bundles = array(); protected $container; + /** + * @deprecated since Symfony 4.2 + */ protected $rootDir; protected $environment; protected $debug; protected $booted = false; + /** + * @deprecated since Symfony 4.2 + */ protected $name; protected $startTime; @@ -63,22 +73,22 @@ abstract class Kernel implements KernelInterface, RebootableInterface, Terminabl private $requestStackSize = 0; private $resetServices = false; - const VERSION = '4.1.6'; - const VERSION_ID = 40106; + const VERSION = '4.2.1'; + const VERSION_ID = 40201; const MAJOR_VERSION = 4; - const MINOR_VERSION = 1; - const RELEASE_VERSION = 6; + const MINOR_VERSION = 2; + const RELEASE_VERSION = 1; const EXTRA_VERSION = ''; - const END_OF_MAINTENANCE = '01/2019'; - const END_OF_LIFE = '07/2019'; + const END_OF_MAINTENANCE = '07/2019'; + const END_OF_LIFE = '01/2020'; public function __construct(string $environment, bool $debug) { $this->environment = $environment; $this->debug = $debug; - $this->rootDir = $this->getRootDir(); - $this->name = $this->getName(); + $this->rootDir = $this->getRootDir(false); + $this->name = $this->getName(false); } public function __clone() @@ -215,7 +225,10 @@ abstract class Kernel implements KernelInterface, RebootableInterface, Terminabl public function getBundle($name) { if (!isset($this->bundles[$name])) { - throw new \InvalidArgumentException(sprintf('Bundle "%s" does not exist or it is not enabled. Maybe you forgot to add it in the registerBundles() method of your %s.php file?', $name, \get_class($this))); + $class = \get_class($this); + $class = 'c' === $class[0] && 0 === strpos($class, "class@anonymous\0") ? get_parent_class($class).'@anonymous' : $class; + + throw new \InvalidArgumentException(sprintf('Bundle "%s" does not exist or it is not enabled. Maybe you forgot to add it in the registerBundles() method of your %s.php file?', $name, $class)); } return $this->bundles[$name]; @@ -244,15 +257,10 @@ abstract class Kernel implements KernelInterface, RebootableInterface, Terminabl $isResource = 0 === strpos($path, 'Resources') && null !== $dir; $overridePath = substr($path, 9); - $resourceBundle = null; $bundle = $this->getBundle($bundleName); $files = array(); if ($isResource && file_exists($file = $dir.'/'.$bundle->getName().$overridePath)) { - if (null !== $resourceBundle) { - throw new \RuntimeException(sprintf('"%s" resource is hidden by a resource from the "%s" derived bundle. Create a "%s" file to override the bundle resource.', $file, $resourceBundle, $dir.'/'.$bundle->getName().$overridePath)); - } - $files[] = $file; } @@ -261,7 +269,6 @@ abstract class Kernel implements KernelInterface, RebootableInterface, Terminabl return $file; } $files[] = $file; - $resourceBundle = $bundle->getName(); } if (\count($files) > 0) { @@ -273,9 +280,15 @@ abstract class Kernel implements KernelInterface, RebootableInterface, Terminabl /** * {@inheritdoc} + * + * @deprecated since Symfony 4.2 */ - public function getName() + public function getName(/* $triggerDeprecation = true */) { + if (0 === \func_num_args() || func_get_arg(0)) { + @trigger_error(sprintf('The "%s()" method is deprecated since Symfony 4.2.', __METHOD__), E_USER_DEPRECATED); + } + if (null === $this->name) { $this->name = preg_replace('/[^a-zA-Z0-9_]+/', '', basename($this->rootDir)); if (ctype_digit($this->name[0])) { @@ -304,9 +317,15 @@ abstract class Kernel implements KernelInterface, RebootableInterface, Terminabl /** * {@inheritdoc} + * + * @deprecated since Symfony 4.2, use getProjectDir() instead */ - public function getRootDir() + public function getRootDir(/* $triggerDeprecation = true */) { + if (0 === \func_num_args() || func_get_arg(0)) { + @trigger_error(sprintf('The "%s()" method is deprecated since Symfony 4.2, use getProjectDir() instead.', __METHOD__), E_USER_DEPRECATED); + } + if (null === $this->rootDir) { $r = new \ReflectionObject($this); $this->rootDir = \dirname($r->getFileName()); @@ -366,7 +385,7 @@ abstract class Kernel implements KernelInterface, RebootableInterface, Terminabl */ public function getCacheDir() { - return $this->rootDir.'/cache/'.$this->environment; + return $this->getProjectDir().'/var/cache/'.$this->environment; } /** @@ -374,7 +393,7 @@ abstract class Kernel implements KernelInterface, RebootableInterface, Terminabl */ public function getLogDir() { - return $this->rootDir.'/logs'; + return $this->getProjectDir().'/var/log'; } /** @@ -427,7 +446,10 @@ abstract class Kernel implements KernelInterface, RebootableInterface, Terminabl */ protected function getContainerClass() { - return $this->name.ucfirst($this->environment).($this->debug ? 'Debug' : '').'ProjectContainer'; + $class = \get_class($this); + $class = 'c' === $class[0] && 0 === strpos($class, "class@anonymous\0") ? get_parent_class($class).ContainerBuilder::hash($class) : $class; + + return $this->name.str_replace('\\', '_', $class).ucfirst($this->environment).($this->debug ? 'Debug' : '').'Container'; } /** @@ -489,7 +511,7 @@ abstract class Kernel implements KernelInterface, RebootableInterface, Terminabl return; } - $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 3); + $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 5); // Clean the trace by removing first frames added by the error handler itself. for ($i = 0; isset($backtrace[$i]); ++$i) { if (isset($backtrace[$i]['file'], $backtrace[$i]['line']) && $backtrace[$i]['line'] === $line && $backtrace[$i]['file'] === $file) { @@ -497,13 +519,20 @@ abstract class Kernel implements KernelInterface, RebootableInterface, Terminabl break; } } + // Remove frames added by DebugClassLoader. + for ($i = \count($backtrace) - 2; 0 < $i; --$i) { + if (DebugClassLoader::class === ($backtrace[$i]['class'] ?? null)) { + $backtrace = array($backtrace[$i + 1]); + break; + } + } $collectedLogs[$message] = array( 'type' => $type, 'message' => $message, 'file' => $file, 'line' => $line, - 'trace' => $backtrace, + 'trace' => array($backtrace[0]), 'count' => 1, ); }); @@ -578,10 +607,16 @@ abstract class Kernel implements KernelInterface, RebootableInterface, Terminabl } return array( + /* + * @deprecated since Symfony 4.2, use kernel.project_dir instead + */ 'kernel.root_dir' => realpath($this->rootDir) ?: $this->rootDir, 'kernel.project_dir' => realpath($this->getProjectDir()) ?: $this->getProjectDir(), 'kernel.environment' => $this->environment, 'kernel.debug' => $this->debug, + /* + * @deprecated since Symfony 4.2 + */ 'kernel.name' => $this->name, 'kernel.cache_dir' => realpath($cacheDir = $this->warmupDir ?: $this->getCacheDir()) ?: $cacheDir, 'kernel.logs_dir' => realpath($this->getLogDir()) ?: $this->getLogDir(), diff --git a/vendor/symfony/http-kernel/KernelInterface.php b/vendor/symfony/http-kernel/KernelInterface.php index 485f3bf84..93c4190b9 100644 --- a/vendor/symfony/http-kernel/KernelInterface.php +++ b/vendor/symfony/http-kernel/KernelInterface.php @@ -21,6 +21,8 @@ use Symfony\Component\HttpKernel\Bundle\BundleInterface; * It manages an environment made of application kernel and bundles. * * @author Fabien Potencier + * + * @method string getProjectDir() Gets the project dir (path of the project's composer file) - not defining it is deprecated since Symfony 4.2 */ interface KernelInterface extends HttpKernelInterface, \Serializable { @@ -100,6 +102,8 @@ interface KernelInterface extends HttpKernelInterface, \Serializable * Gets the name of the kernel. * * @return string The kernel name + * + * @deprecated since Symfony 4.2 */ public function getName(); @@ -121,6 +125,8 @@ interface KernelInterface extends HttpKernelInterface, \Serializable * Gets the application root dir (path of the project's Kernel class). * * @return string The Kernel root dir + * + * @deprecated since Symfony 4.2 */ public function getRootDir(); diff --git a/vendor/symfony/http-kernel/Profiler/Profiler.php b/vendor/symfony/http-kernel/Profiler/Profiler.php index b4b0681b0..809a3396b 100644 --- a/vendor/symfony/http-kernel/Profiler/Profiler.php +++ b/vendor/symfony/http-kernel/Profiler/Profiler.php @@ -17,13 +17,14 @@ use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\DataCollector\DataCollectorInterface; use Symfony\Component\HttpKernel\DataCollector\LateDataCollectorInterface; +use Symfony\Contracts\Service\ResetInterface; /** * Profiler. * * @author Fabien Potencier */ -class Profiler +class Profiler implements ResetInterface { private $storage; diff --git a/vendor/symfony/http-kernel/Profiler/ProfilerStorageInterface.php b/vendor/symfony/http-kernel/Profiler/ProfilerStorageInterface.php index 544fb1fef..b78bae847 100644 --- a/vendor/symfony/http-kernel/Profiler/ProfilerStorageInterface.php +++ b/vendor/symfony/http-kernel/Profiler/ProfilerStorageInterface.php @@ -14,6 +14,14 @@ namespace Symfony\Component\HttpKernel\Profiler; /** * ProfilerStorageInterface. * + * This interface exists for historical reasons. The only supported + * implementation is FileProfilerStorage. + * + * As the profiler must only be used on non-production servers, the file storage + * is more than enough and no other implementations will ever be supported. + * + * @internal since 4.2 + * * @author Fabien Potencier */ interface ProfilerStorageInterface diff --git a/vendor/symfony/http-kernel/Tests/CacheClearer/ChainCacheClearerTest.php b/vendor/symfony/http-kernel/Tests/CacheClearer/ChainCacheClearerTest.php index 06400b444..5f09e4b22 100644 --- a/vendor/symfony/http-kernel/Tests/CacheClearer/ChainCacheClearerTest.php +++ b/vendor/symfony/http-kernel/Tests/CacheClearer/ChainCacheClearerTest.php @@ -20,7 +20,7 @@ class ChainCacheClearerTest extends TestCase public static function setUpBeforeClass() { - self::$cacheDir = tempnam(sys_get_temp_dir(), 'sf2_cache_clearer_dir'); + self::$cacheDir = tempnam(sys_get_temp_dir(), 'sf_cache_clearer_dir'); } public static function tearDownAfterClass() diff --git a/vendor/symfony/http-kernel/Tests/CacheWarmer/CacheWarmerAggregateTest.php b/vendor/symfony/http-kernel/Tests/CacheWarmer/CacheWarmerAggregateTest.php index cfa998c1d..09ba7020f 100644 --- a/vendor/symfony/http-kernel/Tests/CacheWarmer/CacheWarmerAggregateTest.php +++ b/vendor/symfony/http-kernel/Tests/CacheWarmer/CacheWarmerAggregateTest.php @@ -20,7 +20,7 @@ class CacheWarmerAggregateTest extends TestCase public static function setUpBeforeClass() { - self::$cacheDir = tempnam(sys_get_temp_dir(), 'sf2_cache_warmer_dir'); + self::$cacheDir = tempnam(sys_get_temp_dir(), 'sf_cache_warmer_dir'); } public static function tearDownAfterClass() diff --git a/vendor/symfony/http-kernel/Tests/CacheWarmer/CacheWarmerTest.php b/vendor/symfony/http-kernel/Tests/CacheWarmer/CacheWarmerTest.php index 4d34e7bfc..cee8b5503 100644 --- a/vendor/symfony/http-kernel/Tests/CacheWarmer/CacheWarmerTest.php +++ b/vendor/symfony/http-kernel/Tests/CacheWarmer/CacheWarmerTest.php @@ -20,7 +20,7 @@ class CacheWarmerTest extends TestCase public static function setUpBeforeClass() { - self::$cacheFile = tempnam(sys_get_temp_dir(), 'sf2_cache_warmer_dir'); + self::$cacheFile = tempnam(sys_get_temp_dir(), 'sf_cache_warmer_dir'); } public static function tearDownAfterClass() diff --git a/vendor/symfony/http-kernel/Tests/ClientTest.php b/vendor/symfony/http-kernel/Tests/ClientTest.php index 17cbe3687..4ce3670a3 100644 --- a/vendor/symfony/http-kernel/Tests/ClientTest.php +++ b/vendor/symfony/http-kernel/Tests/ClientTest.php @@ -61,13 +61,13 @@ class ClientTest extends TestCase $m->setAccessible(true); $response = new Response(); - $response->headers->setCookie($cookie1 = new Cookie('foo', 'bar', \DateTime::createFromFormat('j-M-Y H:i:s T', '15-Feb-2009 20:00:00 GMT')->format('U'), '/foo', 'http://example.com', true, true)); + $response->headers->setCookie($cookie1 = new Cookie('foo', 'bar', \DateTime::createFromFormat('j-M-Y H:i:s T', '15-Feb-2009 20:00:00 GMT')->format('U'), '/foo', 'http://example.com', true, true, false, null)); $domResponse = $m->invoke($client, $response); $this->assertSame((string) $cookie1, $domResponse->getHeader('Set-Cookie')); $response = new Response(); - $response->headers->setCookie($cookie1 = new Cookie('foo', 'bar', \DateTime::createFromFormat('j-M-Y H:i:s T', '15-Feb-2009 20:00:00 GMT')->format('U'), '/foo', 'http://example.com', true, true)); - $response->headers->setCookie($cookie2 = new Cookie('foo1', 'bar1', \DateTime::createFromFormat('j-M-Y H:i:s T', '15-Feb-2009 20:00:00 GMT')->format('U'), '/foo', 'http://example.com', true, true)); + $response->headers->setCookie($cookie1 = new Cookie('foo', 'bar', \DateTime::createFromFormat('j-M-Y H:i:s T', '15-Feb-2009 20:00:00 GMT')->format('U'), '/foo', 'http://example.com', true, true, false, null)); + $response->headers->setCookie($cookie2 = new Cookie('foo1', 'bar1', \DateTime::createFromFormat('j-M-Y H:i:s T', '15-Feb-2009 20:00:00 GMT')->format('U'), '/foo', 'http://example.com', true, true, false, null)); $domResponse = $m->invoke($client, $response); $this->assertSame((string) $cookie1, $domResponse->getHeader('Set-Cookie')); $this->assertSame(array((string) $cookie1, (string) $cookie2), $domResponse->getHeader('Set-Cookie', false)); diff --git a/vendor/symfony/http-kernel/Tests/Controller/ContainerControllerResolverTest.php b/vendor/symfony/http-kernel/Tests/Controller/ContainerControllerResolverTest.php index 57414d001..1a144eee4 100644 --- a/vendor/symfony/http-kernel/Tests/Controller/ContainerControllerResolverTest.php +++ b/vendor/symfony/http-kernel/Tests/Controller/ContainerControllerResolverTest.php @@ -19,10 +19,6 @@ use Symfony\Component\HttpKernel\Controller\ContainerControllerResolver; class ContainerControllerResolverTest extends ControllerResolverTest { - /** - * @group legacy - * @expectedDeprecation Referencing controllers with a single colon is deprecated since Symfony 4.1. Use foo::action instead. - */ public function testGetControllerServiceWithSingleColon() { $service = new ControllerTestService('foo'); diff --git a/vendor/symfony/http-kernel/Tests/DataCollector/ConfigDataCollectorTest.php b/vendor/symfony/http-kernel/Tests/DataCollector/ConfigDataCollectorTest.php index a99e34ad4..10b058584 100644 --- a/vendor/symfony/http-kernel/Tests/DataCollector/ConfigDataCollectorTest.php +++ b/vendor/symfony/http-kernel/Tests/DataCollector/ConfigDataCollectorTest.php @@ -30,7 +30,6 @@ class ConfigDataCollectorTest extends TestCase $this->assertSame('test', $c->getEnv()); $this->assertTrue($c->isDebug()); $this->assertSame('config', $c->getName()); - $this->assertSame('testkernel', $c->getAppName()); $this->assertRegExp('~^'.preg_quote($c->getPhpVersion(), '~').'~', PHP_VERSION); $this->assertRegExp('~'.preg_quote((string) $c->getPhpVersionExtra(), '~').'$~', PHP_VERSION); $this->assertSame(PHP_INT_SIZE * 8, $c->getPhpArchitecture()); @@ -39,18 +38,29 @@ class ConfigDataCollectorTest extends TestCase $this->assertSame(Kernel::VERSION, $c->getSymfonyVersion()); $this->assertNull($c->getToken()); $this->assertSame(\extension_loaded('xdebug'), $c->hasXDebug()); - $this->assertSame(\extension_loaded('Zend OPcache') && ini_get('opcache.enable'), $c->hasZendOpcache()); - $this->assertSame(\extension_loaded('apcu') && ini_get('apc.enabled'), $c->hasApcu()); + $this->assertSame(\extension_loaded('Zend OPcache') && filter_var(ini_get('opcache.enable'), FILTER_VALIDATE_BOOLEAN), $c->hasZendOpcache()); + $this->assertSame(\extension_loaded('apcu') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN), $c->hasApcu()); + } + + /** + * @group legacy + * @expectedDeprecation The "$name" argument in method "Symfony\Component\HttpKernel\DataCollector\ConfigDataCollector::__construct()" is deprecated since Symfony 4.2. + * @expectedDeprecation The "$version" argument in method "Symfony\Component\HttpKernel\DataCollector\ConfigDataCollector::__construct()" is deprecated since Symfony 4.2. + * @expectedDeprecation The method "Symfony\Component\HttpKernel\DataCollector\ConfigDataCollector::getApplicationName()" is deprecated since Symfony 4.2. + * @expectedDeprecation The method "Symfony\Component\HttpKernel\DataCollector\ConfigDataCollector::getApplicationVersion()" is deprecated since Symfony 4.2. + */ + public function testLegacy() + { + $c = new ConfigDataCollector('name', null); + $c->collect(new Request(), new Response()); + + $this->assertSame('name', $c->getApplicationName()); + $this->assertNull($c->getApplicationVersion()); } } class KernelForTest extends Kernel { - public function getName() - { - return 'testkernel'; - } - public function registerBundles() { } diff --git a/vendor/symfony/http-kernel/Tests/DataCollector/RequestDataCollectorTest.php b/vendor/symfony/http-kernel/Tests/DataCollector/RequestDataCollectorTest.php index cce08e27c..24904f7cc 100644 --- a/vendor/symfony/http-kernel/Tests/DataCollector/RequestDataCollectorTest.php +++ b/vendor/symfony/http-kernel/Tests/DataCollector/RequestDataCollectorTest.php @@ -225,6 +225,8 @@ class RequestDataCollectorTest extends TestCase $cookie = $this->getCookieByName($response, 'sf_redirect'); $this->assertNotEmpty($cookie->getValue()); + $this->assertSame('lax', $cookie->getSameSite()); + $this->assertFalse($cookie->isSecure()); } public function testItCollectsTheRedirectionAndClearTheCookie() @@ -274,9 +276,9 @@ class RequestDataCollectorTest extends TestCase $response->setStatusCode(200); $response->headers->set('Content-Type', 'application/json'); $response->headers->set('X-Foo-Bar', null); - $response->headers->setCookie(new Cookie('foo', 'bar', 1, '/foo', 'localhost', true, true)); - $response->headers->setCookie(new Cookie('bar', 'foo', new \DateTime('@946684800'))); - $response->headers->setCookie(new Cookie('bazz', 'foo', '2000-12-12')); + $response->headers->setCookie(new Cookie('foo', 'bar', 1, '/foo', 'localhost', true, true, false, null)); + $response->headers->setCookie(new Cookie('bar', 'foo', new \DateTime('@946684800'), '/', null, false, true, false, null)); + $response->headers->setCookie(new Cookie('bazz', 'foo', '2000-12-12', '/', null, false, true, false, null)); return $response; } diff --git a/vendor/symfony/http-kernel/Tests/DependencyInjection/RegisterControllerArgumentLocatorsPassTest.php b/vendor/symfony/http-kernel/Tests/DependencyInjection/RegisterControllerArgumentLocatorsPassTest.php index 6c036e88a..d03ea53a3 100644 --- a/vendor/symfony/http-kernel/Tests/DependencyInjection/RegisterControllerArgumentLocatorsPassTest.php +++ b/vendor/symfony/http-kernel/Tests/DependencyInjection/RegisterControllerArgumentLocatorsPassTest.php @@ -149,7 +149,7 @@ class RegisterControllerArgumentLocatorsPassTest extends TestCase $this->assertSame(ServiceLocator::class, $locator->getClass()); $this->assertFalse($locator->isPublic()); - $expected = array('bar' => new ServiceClosureArgument(new TypedReference(ControllerDummy::class, ControllerDummy::class, ContainerInterface::RUNTIME_EXCEPTION_ON_INVALID_REFERENCE))); + $expected = array('bar' => new ServiceClosureArgument(new TypedReference(ControllerDummy::class, ControllerDummy::class, ContainerInterface::RUNTIME_EXCEPTION_ON_INVALID_REFERENCE, 'bar'))); $this->assertEquals($expected, $locator->getArgument(0)); } @@ -309,16 +309,23 @@ class RegisterControllerArgumentLocatorsPassTest extends TestCase public function provideBindings() { - return array(array(ControllerDummy::class), array('$bar')); + return array( + array(ControllerDummy::class.'$bar'), + array(ControllerDummy::class), + array('$bar'), + ); } - public function testBindScalarValueToControllerArgument() + /** + * @dataProvider provideBindScalarValueToControllerArgument + */ + public function testBindScalarValueToControllerArgument($bindingKey) { $container = new ContainerBuilder(); $resolver = $container->register('argument_resolver.service')->addArgument(array()); $container->register('foo', ArgumentWithoutTypeController::class) - ->setBindings(array('$someArg' => '%foo%')) + ->setBindings(array($bindingKey => '%foo%')) ->addTag('controller.service_arguments'); $container->setParameter('foo', 'foo_val'); @@ -341,6 +348,12 @@ class RegisterControllerArgumentLocatorsPassTest extends TestCase $this->assertSame('foo_val', $container->get((string) $reference)); } + public function provideBindScalarValueToControllerArgument() + { + yield array('$someArg'); + yield array('string $someArg'); + } + public function testBindingsOnChildDefinitions() { $container = new ContainerBuilder(); @@ -420,7 +433,7 @@ class NonExistentClassOptionalController class ArgumentWithoutTypeController { - public function fooAction($someArg) + public function fooAction(string $someArg) { } } diff --git a/vendor/symfony/http-kernel/Tests/EventListener/ExceptionListenerTest.php b/vendor/symfony/http-kernel/Tests/EventListener/ExceptionListenerTest.php index 5743696c5..5251976e4 100644 --- a/vendor/symfony/http-kernel/Tests/EventListener/ExceptionListenerTest.php +++ b/vendor/symfony/http-kernel/Tests/EventListener/ExceptionListenerTest.php @@ -155,6 +155,25 @@ class ExceptionListenerTest extends TestCase $this->assertFalse($response->headers->has('content-security-policy'), 'CSP header has been removed'); $this->assertFalse($dispatcher->hasListeners(KernelEvents::RESPONSE), 'CSP removal listener has been removed'); } + + public function testNullController() + { + $listener = new ExceptionListener(null); + $kernel = $this->getMockBuilder(HttpKernelInterface::class)->getMock(); + $kernel->expects($this->once())->method('handle')->will($this->returnCallback(function (Request $request) { + $controller = $request->attributes->get('_controller'); + + return $controller(); + })); + $request = Request::create('/'); + $event = new GetResponseForExceptionEvent($kernel, $request, HttpKernelInterface::MASTER_REQUEST, new \Exception('foo')); + + $listener->onKernelException($event); + $this->assertNull($event->getResponse()); + + $listener->onKernelException($event); + $this->assertContains('Whoops, looks like something went wrong.', $event->getResponse()->getContent()); + } } class TestLogger extends Logger implements DebugLoggerInterface diff --git a/vendor/symfony/http-kernel/Tests/EventListener/SessionListenerTest.php b/vendor/symfony/http-kernel/Tests/EventListener/SessionListenerTest.php index 03fb3763f..e6255a56e 100644 --- a/vendor/symfony/http-kernel/Tests/EventListener/SessionListenerTest.php +++ b/vendor/symfony/http-kernel/Tests/EventListener/SessionListenerTest.php @@ -106,17 +106,24 @@ class SessionListenerTest extends TestCase $this->assertFalse($response->headers->has(AbstractSessionListener::NO_AUTO_CACHE_CONTROL_HEADER)); } - public function testUninitilizedSession() + public function testUninitializedSession() { - $event = $this->getMockBuilder(FilterResponseEvent::class)->disableOriginalConstructor()->getMock(); - $event->expects($this->once())->method('isMasterRequest')->willReturn(true); + $kernel = $this->getMockBuilder(HttpKernelInterface::class)->disableOriginalConstructor()->getMock(); + $response = new Response(); + $response->setSharedMaxAge(60); + $response->headers->set(AbstractSessionListener::NO_AUTO_CACHE_CONTROL_HEADER, 'true'); $container = new ServiceLocator(array( 'initialized_session' => function () {}, )); $listener = new SessionListener($container); - $listener->onKernelResponse($event); + $listener->onKernelResponse(new FilterResponseEvent($kernel, new Request(), HttpKernelInterface::MASTER_REQUEST, $response)); + $this->assertTrue($response->headers->hasCacheControlDirective('public')); + $this->assertFalse($response->headers->hasCacheControlDirective('private')); + $this->assertFalse($response->headers->hasCacheControlDirective('must-revalidate')); + $this->assertSame('60', $response->headers->getCacheControlDirective('s-maxage')); + $this->assertFalse($response->headers->has(AbstractSessionListener::NO_AUTO_CACHE_CONTROL_HEADER)); } public function testSurrogateMasterRequestIsPublic() diff --git a/vendor/symfony/http-kernel/Tests/EventListener/TestSessionListenerTest.php b/vendor/symfony/http-kernel/Tests/EventListener/TestSessionListenerTest.php index b06dca3c5..cd52bd56e 100644 --- a/vendor/symfony/http-kernel/Tests/EventListener/TestSessionListenerTest.php +++ b/vendor/symfony/http-kernel/Tests/EventListener/TestSessionListenerTest.php @@ -12,7 +12,6 @@ namespace Symfony\Component\HttpKernel\Tests\EventListener; use PHPUnit\Framework\TestCase; -use Symfony\Component\DependencyInjection\ServiceSubscriberInterface; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Session\SessionInterface; @@ -144,15 +143,6 @@ class TestSessionListenerTest extends TestCase $this->filterResponse(new Request()); } - public function testDoesNotImplementServiceSubscriberInterface() - { - $this->assertTrue(interface_exists(ServiceSubscriberInterface::class)); - $this->assertTrue(class_exists(SessionListener::class)); - $this->assertTrue(class_exists(TestSessionListener::class)); - $this->assertFalse(is_subclass_of(SessionListener::class, ServiceSubscriberInterface::class), 'Implementing ServiceSubscriberInterface would create a dep on the DI component, which eg Silex cannot afford'); - $this->assertFalse(is_subclass_of(TestSessionListener::class, ServiceSubscriberInterface::class, 'Implementing ServiceSubscriberInterface would create a dep on the DI component, which eg Silex cannot afford')); - } - public function testDoesNotThrowIfRequestDoesNotHaveASession() { $kernel = $this->getMockBuilder('Symfony\Component\HttpKernel\HttpKernelInterface')->getMock(); diff --git a/vendor/symfony/http-kernel/Tests/EventListener/TranslatorListenerTest.php b/vendor/symfony/http-kernel/Tests/EventListener/TranslatorListenerTest.php index 23b833177..b448f3bfd 100644 --- a/vendor/symfony/http-kernel/Tests/EventListener/TranslatorListenerTest.php +++ b/vendor/symfony/http-kernel/Tests/EventListener/TranslatorListenerTest.php @@ -17,6 +17,7 @@ use Symfony\Component\HttpKernel\Event\FinishRequestEvent; use Symfony\Component\HttpKernel\Event\GetResponseEvent; use Symfony\Component\HttpKernel\EventListener\TranslatorListener; use Symfony\Component\HttpKernel\HttpKernelInterface; +use Symfony\Contracts\Translation\LocaleAwareInterface; class TranslatorListenerTest extends TestCase { @@ -26,7 +27,7 @@ class TranslatorListenerTest extends TestCase protected function setUp() { - $this->translator = $this->getMockBuilder('Symfony\Component\Translation\TranslatorInterface')->getMock(); + $this->translator = $this->getMockBuilder(LocaleAwareInterface::class)->getMock(); $this->requestStack = $this->getMockBuilder('Symfony\Component\HttpFoundation\RequestStack')->getMock(); $this->listener = new TranslatorListener($this->translator, $this->requestStack); } diff --git a/vendor/symfony/http-kernel/Tests/Fixtures/123/Kernel123.php b/vendor/symfony/http-kernel/Tests/Fixtures/123/Kernel123.php deleted file mode 100644 index d3a76684d..000000000 --- a/vendor/symfony/http-kernel/Tests/Fixtures/123/Kernel123.php +++ /dev/null @@ -1,37 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpKernel\Tests\Fixtures\_123; - -use Symfony\Component\Config\Loader\LoaderInterface; -use Symfony\Component\HttpKernel\Kernel; - -class Kernel123 extends Kernel -{ - public function registerBundles() - { - return array(); - } - - public function registerContainerConfiguration(LoaderInterface $loader) - { - } - - public function getCacheDir() - { - return sys_get_temp_dir().'/'.Kernel::VERSION.'/kernel123/cache/'.$this->environment; - } - - public function getLogDir() - { - return sys_get_temp_dir().'/'.Kernel::VERSION.'/kernel123/logs'; - } -} diff --git a/vendor/symfony/http-kernel/Tests/Fixtures/KernelForTest.php b/vendor/symfony/http-kernel/Tests/Fixtures/KernelForTest.php index 9acee4cac..9734594b6 100644 --- a/vendor/symfony/http-kernel/Tests/Fixtures/KernelForTest.php +++ b/vendor/symfony/http-kernel/Tests/Fixtures/KernelForTest.php @@ -34,4 +34,14 @@ class KernelForTest extends Kernel { return $this->booted; } + + public function getCacheDir() + { + return $this->getProjectDir().'/Tests/Fixtures/cache.'.$this->environment; + } + + public function getLogDir() + { + return $this->getProjectDir().'/Tests/Fixtures/logs'; + } } diff --git a/vendor/symfony/http-kernel/Tests/Fixtures/KernelWithoutBundles.php b/vendor/symfony/http-kernel/Tests/Fixtures/KernelWithoutBundles.php index cee1b09fb..0d0881d62 100644 --- a/vendor/symfony/http-kernel/Tests/Fixtures/KernelWithoutBundles.php +++ b/vendor/symfony/http-kernel/Tests/Fixtures/KernelWithoutBundles.php @@ -26,6 +26,11 @@ class KernelWithoutBundles extends Kernel { } + public function getProjectDir() + { + return __DIR__; + } + protected function build(ContainerBuilder $container) { $container->setParameter('test_executed', true); diff --git a/vendor/symfony/http-kernel/Tests/Fragment/FragmentHandlerTest.php b/vendor/symfony/http-kernel/Tests/Fragment/FragmentHandlerTest.php index a296aa0e1..0dfaa7968 100644 --- a/vendor/symfony/http-kernel/Tests/Fragment/FragmentHandlerTest.php +++ b/vendor/symfony/http-kernel/Tests/Fragment/FragmentHandlerTest.php @@ -88,7 +88,7 @@ class FragmentHandlerTest extends TestCase ; if ($arguments) { - \call_user_func_array(array($e, 'with'), $arguments); + $e->with(...$arguments); } $handler = new FragmentHandler($this->requestStack); diff --git a/vendor/symfony/http-kernel/Tests/HttpCache/EsiTest.php b/vendor/symfony/http-kernel/Tests/HttpCache/EsiTest.php index 863ad7614..846caee4c 100644 --- a/vendor/symfony/http-kernel/Tests/HttpCache/EsiTest.php +++ b/vendor/symfony/http-kernel/Tests/HttpCache/EsiTest.php @@ -234,7 +234,7 @@ class EsiTest extends TestCase if (\is_array($response)) { $cache->expects($this->any()) ->method('handle') - ->will(\call_user_func_array(array($this, 'onConsecutiveCalls'), $response)) + ->will($this->onConsecutiveCalls(...$response)) ; } else { $cache->expects($this->any()) diff --git a/vendor/symfony/http-kernel/Tests/HttpCache/SsiTest.php b/vendor/symfony/http-kernel/Tests/HttpCache/SsiTest.php index 26ef6cb2b..1f1fbf849 100644 --- a/vendor/symfony/http-kernel/Tests/HttpCache/SsiTest.php +++ b/vendor/symfony/http-kernel/Tests/HttpCache/SsiTest.php @@ -201,7 +201,7 @@ class SsiTest extends TestCase if (\is_array($response)) { $cache->expects($this->any()) ->method('handle') - ->will(\call_user_func_array(array($this, 'onConsecutiveCalls'), $response)) + ->will($this->onConsecutiveCalls(...$response)) ; } else { $cache->expects($this->any()) diff --git a/vendor/symfony/http-kernel/Tests/HttpKernelTest.php b/vendor/symfony/http-kernel/Tests/HttpKernelTest.php index c5326a334..129fa704b 100644 --- a/vendor/symfony/http-kernel/Tests/HttpKernelTest.php +++ b/vendor/symfony/http-kernel/Tests/HttpKernelTest.php @@ -23,6 +23,7 @@ use Symfony\Component\HttpKernel\Controller\ControllerResolverInterface; use Symfony\Component\HttpKernel\Event\FilterControllerArgumentsEvent; use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent; use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException; +use Symfony\Component\HttpKernel\Exception\ControllerDoesNotReturnResponseException; use Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException; use Symfony\Component\HttpKernel\HttpKernel; use Symfony\Component\HttpKernel\HttpKernelInterface; @@ -211,15 +212,23 @@ class HttpKernelTest extends TestCase $this->assertResponseEquals(new Response('foo'), $kernel->handle(new Request())); } - /** - * @expectedException \LogicException - */ public function testHandleWhenTheControllerDoesNotReturnAResponse() { $dispatcher = new EventDispatcher(); $kernel = $this->getHttpKernel($dispatcher, function () { return 'foo'; }); - $kernel->handle(new Request()); + try { + $kernel->handle(new Request()); + + $this->fail('The kernel should throw an exception.'); + } catch (ControllerDoesNotReturnResponseException $e) { + } + + $first = $e->getTrace()[0]; + + // `file` index the array starting at 0, and __FILE__ starts at 1 + $line = file($first['file'])[$first['line'] - 2]; + $this->assertContains('// call controller', $line); } public function testHandleWhenTheControllerDoesNotReturnAResponseButAViewIsRegistered() @@ -265,7 +274,7 @@ class HttpKernelTest extends TestCase $oldArguments = $event->getArguments(); $newController = function ($id) use ($oldController, $oldArguments) { - $response = \call_user_func_array($oldController, $oldArguments); + $response = $oldController(...$oldArguments); $response->headers->set('X-Id', $id); diff --git a/vendor/symfony/http-kernel/Tests/KernelTest.php b/vendor/symfony/http-kernel/Tests/KernelTest.php index 8926f2087..2b581398c 100644 --- a/vendor/symfony/http-kernel/Tests/KernelTest.php +++ b/vendor/symfony/http-kernel/Tests/KernelTest.php @@ -33,7 +33,7 @@ class KernelTest extends TestCase public static function tearDownAfterClass() { $fs = new Filesystem(); - $fs->remove(__DIR__.'/Fixtures/cache'); + $fs->remove(__DIR__.'/Fixtures/var'); } public function testConstructor() @@ -67,15 +67,15 @@ class KernelTest extends TestCase public function testInitializeContainerClearsOldContainers() { $fs = new Filesystem(); - $legacyContainerDir = __DIR__.'/Fixtures/cache/custom/ContainerA123456'; + $legacyContainerDir = __DIR__.'/Fixtures/var/cache/custom/ContainerA123456'; $fs->mkdir($legacyContainerDir); touch($legacyContainerDir.'.legacy'); $kernel = new CustomProjectDirKernel(); $kernel->boot(); - $containerDir = __DIR__.'/Fixtures/cache/custom/'.substr(\get_class($kernel->getContainer()), 0, 16); - $this->assertTrue(unlink(__DIR__.'/Fixtures/cache/custom/FixturesCustomDebugProjectContainer.php.meta')); + $containerDir = __DIR__.'/Fixtures/var/cache/custom/'.substr(\get_class($kernel->getContainer()), 0, 16); + $this->assertTrue(unlink(__DIR__.'/Fixtures/var/cache/custom/TestsSymfony_Component_HttpKernel_Tests_CustomProjectDirKernelCustomDebugContainer.php.meta')); $this->assertFileExists($containerDir); $this->assertFileNotExists($containerDir.'.legacy'); @@ -295,6 +295,9 @@ EOF; $this->assertEquals($expected, $output); } + /** + * @group legacy + */ public function testGetRootDir() { $kernel = new KernelForTest('test', true); @@ -302,6 +305,9 @@ EOF; $this->assertEquals(__DIR__.\DIRECTORY_SEPARATOR.'Fixtures', realpath($kernel->getRootDir())); } + /** + * @group legacy + */ public function testGetName() { $kernel = new KernelForTest('test', true); @@ -309,6 +315,9 @@ EOF; $this->assertEquals('Fixtures', $kernel->getName()); } + /** + * @group legacy + */ public function testOverrideGetName() { $kernel = new KernelForOverrideName('test', true); @@ -506,40 +515,32 @@ EOF; $this->assertTrue($kernel->getContainer()->getParameter('test_executed')); } - public function testKernelRootDirNameStartingWithANumber() - { - $dir = __DIR__.'/Fixtures/123'; - require_once $dir.'/Kernel123.php'; - $kernel = new \Symfony\Component\HttpKernel\Tests\Fixtures\_123\Kernel123('dev', true); - $this->assertEquals('_123', $kernel->getName()); - } - public function testProjectDirExtension() { $kernel = new CustomProjectDirKernel(); $kernel->boot(); - $this->assertSame('foo', $kernel->getProjectDir()); - $this->assertSame('foo', $kernel->getContainer()->getParameter('kernel.project_dir')); + $this->assertSame(__DIR__.'/Fixtures', $kernel->getProjectDir()); + $this->assertSame(__DIR__.\DIRECTORY_SEPARATOR.'Fixtures', $kernel->getContainer()->getParameter('kernel.project_dir')); } public function testKernelReset() { - (new Filesystem())->remove(__DIR__.'/Fixtures/cache'); + (new Filesystem())->remove(__DIR__.'/Fixtures/var/cache'); $kernel = new CustomProjectDirKernel(); $kernel->boot(); $containerClass = \get_class($kernel->getContainer()); $containerFile = (new \ReflectionClass($kernel->getContainer()))->getFileName(); - unlink(__DIR__.'/Fixtures/cache/custom/FixturesCustomDebugProjectContainer.php.meta'); + unlink(__DIR__.'/Fixtures/var/cache/custom/TestsSymfony_Component_HttpKernel_Tests_CustomProjectDirKernelCustomDebugContainer.php.meta'); $kernel = new CustomProjectDirKernel(); $kernel->boot(); $this->assertInstanceOf($containerClass, $kernel->getContainer()); $this->assertFileExists($containerFile); - unlink(__DIR__.'/Fixtures/cache/custom/FixturesCustomDebugProjectContainer.php.meta'); + unlink(__DIR__.'/Fixtures/var/cache/custom/TestsSymfony_Component_HttpKernel_Tests_CustomProjectDirKernelCustomDebugContainer.php.meta'); $kernel = new CustomProjectDirKernel(function ($container) { $container->register('foo', 'stdClass')->setPublic(true); }); $kernel->boot(); @@ -707,11 +708,10 @@ class CustomProjectDirKernel extends Kernel private $buildContainer; private $httpKernel; - public function __construct(\Closure $buildContainer = null, HttpKernelInterface $httpKernel = null, $name = 'custom') + public function __construct(\Closure $buildContainer = null, HttpKernelInterface $httpKernel = null, $env = 'custom') { - parent::__construct($name, true); + parent::__construct($env, true); - $this->baseDir = 'foo'; $this->buildContainer = $buildContainer; $this->httpKernel = $httpKernel; } @@ -726,11 +726,6 @@ class CustomProjectDirKernel extends Kernel } public function getProjectDir() - { - return $this->baseDir; - } - - public function getRootDir() { return __DIR__.'/Fixtures'; } diff --git a/vendor/symfony/http-kernel/Tests/Profiler/FileProfilerStorageTest.php b/vendor/symfony/http-kernel/Tests/Profiler/FileProfilerStorageTest.php index a1db1d9c0..e64c622c3 100644 --- a/vendor/symfony/http-kernel/Tests/Profiler/FileProfilerStorageTest.php +++ b/vendor/symfony/http-kernel/Tests/Profiler/FileProfilerStorageTest.php @@ -22,7 +22,7 @@ class FileProfilerStorageTest extends TestCase protected function setUp() { - $this->tmpDir = sys_get_temp_dir().'/sf2_profiler_file_storage'; + $this->tmpDir = sys_get_temp_dir().'/sf_profiler_file_storage'; if (is_dir($this->tmpDir)) { self::cleanDir(); } diff --git a/vendor/symfony/http-kernel/Tests/Profiler/ProfilerTest.php b/vendor/symfony/http-kernel/Tests/Profiler/ProfilerTest.php index cff133c1a..2f7e8dd28 100644 --- a/vendor/symfony/http-kernel/Tests/Profiler/ProfilerTest.php +++ b/vendor/symfony/http-kernel/Tests/Profiler/ProfilerTest.php @@ -84,7 +84,7 @@ class ProfilerTest extends TestCase protected function setUp() { - $this->tmp = tempnam(sys_get_temp_dir(), 'sf2_profiler'); + $this->tmp = tempnam(sys_get_temp_dir(), 'sf_profiler'); if (file_exists($this->tmp)) { @unlink($this->tmp); } diff --git a/vendor/symfony/http-kernel/composer.json b/vendor/symfony/http-kernel/composer.json index 4d7ab116f..1e5684d57 100644 --- a/vendor/symfony/http-kernel/composer.json +++ b/vendor/symfony/http-kernel/composer.json @@ -17,6 +17,7 @@ ], "require": { "php": "^7.1.3", + "symfony/contracts": "^1.0.2", "symfony/event-dispatcher": "~4.1", "symfony/http-foundation": "^4.1.1", "symfony/debug": "~3.4|~4.0", @@ -28,7 +29,7 @@ "symfony/config": "~3.4|~4.0", "symfony/console": "~3.4|~4.0", "symfony/css-selector": "~3.4|~4.0", - "symfony/dependency-injection": "^4.1", + "symfony/dependency-injection": "^4.2", "symfony/dom-crawler": "~3.4|~4.0", "symfony/expression-language": "~3.4|~4.0", "symfony/finder": "~3.4|~4.0", @@ -36,7 +37,7 @@ "symfony/routing": "~3.4|~4.0", "symfony/stopwatch": "~3.4|~4.0", "symfony/templating": "~3.4|~4.0", - "symfony/translation": "~3.4|~4.0", + "symfony/translation": "~4.2", "symfony/var-dumper": "^4.1.1", "psr/cache": "~1.0" }, @@ -45,7 +46,8 @@ }, "conflict": { "symfony/config": "<3.4", - "symfony/dependency-injection": "<4.1", + "symfony/dependency-injection": "<4.2", + "symfony/translation": "<4.2", "symfony/var-dumper": "<4.1.1", "twig/twig": "<1.34|<2.4,>=2" }, @@ -65,7 +67,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-master": "4.1-dev" + "dev-master": "4.2-dev" } } } diff --git a/vendor/symfony/http-kernel/phpunit.xml.dist b/vendor/symfony/http-kernel/phpunit.xml.dist index e0de769dd..3fc07707f 100644 --- a/vendor/symfony/http-kernel/phpunit.xml.dist +++ b/vendor/symfony/http-kernel/phpunit.xml.dist @@ -1,7 +1,7 @@ 'a', 'B' => 'b', 'C' => 'c', @@ -1094,8 +1094,3 @@ static $data = array ( '𑢾' => '𑣞', '𑢿' => '𑣟', ); - -$result =& $data; -unset($data); - -return $result; diff --git a/vendor/symfony/polyfill-mbstring/Resources/unidata/upperCase.php b/vendor/symfony/polyfill-mbstring/Resources/unidata/upperCase.php index ec9422121..b8103b2e8 100644 --- a/vendor/symfony/polyfill-mbstring/Resources/unidata/upperCase.php +++ b/vendor/symfony/polyfill-mbstring/Resources/unidata/upperCase.php @@ -1,6 +1,6 @@ 'A', 'b' => 'B', 'c' => 'C', @@ -1102,8 +1102,3 @@ static $data = array ( '𑣞' => '𑢾', '𑣟' => '𑢿', ); - -$result =& $data; -unset($data); - -return $result; diff --git a/vendor/symfony/polyfill-php72/Php72.php b/vendor/symfony/polyfill-php72/Php72.php index 5f122a24c..d531e8441 100644 --- a/vendor/symfony/polyfill-php72/Php72.php +++ b/vendor/symfony/polyfill-php72/Php72.php @@ -50,7 +50,10 @@ final class Php72 $s[$j] = $c < 256 ? \chr($c) : '?'; break; - case "\xF0": ++$i; + case "\xF0": + ++$i; + // no break + case "\xE0": $s[$j] = '?'; $i += 2; @@ -66,7 +69,7 @@ final class Php72 public static function php_os_family() { - if ('\\' === DIRECTORY_SEPARATOR) { + if ('\\' === \DIRECTORY_SEPARATOR) { return 'Windows'; } @@ -98,7 +101,8 @@ final class Php72 public static function sapi_windows_vt100_support($stream, $enable = null) { if (!\is_resource($stream)) { - trigger_error('sapi_windows_vt100_support() expects parameter 1 to be resource, '.gettype($stream).' given', E_USER_WARNING); + trigger_error('sapi_windows_vt100_support() expects parameter 1 to be resource, '.\gettype($stream).' given', E_USER_WARNING); + return false; } @@ -106,6 +110,7 @@ final class Php72 if ('STDIO' !== $meta['stream_type']) { trigger_error('sapi_windows_vt100_support() was not able to analyze the specified stream', E_USER_WARNING); + return false; } @@ -128,17 +133,18 @@ final class Php72 public static function stream_isatty($stream) { if (!\is_resource($stream)) { - trigger_error('stream_isatty() expects parameter 1 to be resource, '.gettype($stream).' given', E_USER_WARNING); + trigger_error('stream_isatty() expects parameter 1 to be resource, '.\gettype($stream).' given', E_USER_WARNING); + return false; } - if ('\\' === DIRECTORY_SEPARATOR) { + if ('\\' === \DIRECTORY_SEPARATOR) { $stat = @fstat($stream); // Check if formatted mode is S_IFCHR return $stat ? 0020000 === ($stat['mode'] & 0170000) : false; } - return function_exists('posix_isatty') && @posix_isatty($stream); + return \function_exists('posix_isatty') && @posix_isatty($stream); } private static function initHashMask() @@ -162,4 +168,49 @@ final class Php72 self::$hashMask ^= hexdec(substr(spl_object_hash($obj), 16 - \PHP_INT_SIZE, \PHP_INT_SIZE)); } + + public static function mb_chr($code, $encoding = null) + { + if (0x80 > $code %= 0x200000) { + $s = \chr($code); + } elseif (0x800 > $code) { + $s = \chr(0xC0 | $code >> 6).\chr(0x80 | $code & 0x3F); + } elseif (0x10000 > $code) { + $s = \chr(0xE0 | $code >> 12).\chr(0x80 | $code >> 6 & 0x3F).\chr(0x80 | $code & 0x3F); + } else { + $s = \chr(0xF0 | $code >> 18).\chr(0x80 | $code >> 12 & 0x3F).\chr(0x80 | $code >> 6 & 0x3F).\chr(0x80 | $code & 0x3F); + } + + if ('UTF-8' !== $encoding) { + $s = mb_convert_encoding($s, $encoding, 'UTF-8'); + } + + return $s; + } + + public static function mb_ord($s, $encoding = null) + { + if (null == $encoding) { + $s = mb_convert_encoding($s, 'UTF-8'); + } elseif ('UTF-8' !== $encoding) { + $s = mb_convert_encoding($s, 'UTF-8', $encoding); + } + + if (1 === \strlen($s)) { + return \ord($s); + } + + $code = ($s = unpack('C*', substr($s, 0, 4))) ? $s[1] : 0; + if (0xF0 <= $code) { + return (($code - 0xF0) << 18) + (($s[2] - 0x80) << 12) + (($s[3] - 0x80) << 6) + $s[4] - 0x80; + } + if (0xE0 <= $code) { + return (($code - 0xE0) << 12) + (($s[2] - 0x80) << 6) + $s[3] - 0x80; + } + if (0xC0 <= $code) { + return (($code - 0xC0) << 6) + $s[2] - 0x80; + } + + return $code; + } } diff --git a/vendor/symfony/polyfill-php72/bootstrap.php b/vendor/symfony/polyfill-php72/bootstrap.php index 9ccea829d..519056de4 100644 --- a/vendor/symfony/polyfill-php72/bootstrap.php +++ b/vendor/symfony/polyfill-php72/bootstrap.php @@ -28,4 +28,9 @@ if (PHP_VERSION_ID < 70200) { if (!defined('PHP_OS_FAMILY')) { define('PHP_OS_FAMILY', p\Php72::php_os_family()); } + if (!function_exists('mb_chr')) { + function mb_ord($s, $enc = null) { return p\Php72::mb_ord($s, $enc); } + function mb_chr($code, $enc = null) { return p\Php72::mb_chr($code, $enc); } + function mb_scrub($s, $enc = null) { $enc = null === $enc ? mb_internal_encoding() : $enc; return mb_convert_encoding($s, $enc, $enc); } + } } diff --git a/vendor/symfony/process/CHANGELOG.md b/vendor/symfony/process/CHANGELOG.md index 354db592a..13fe89eaf 100644 --- a/vendor/symfony/process/CHANGELOG.md +++ b/vendor/symfony/process/CHANGELOG.md @@ -1,6 +1,15 @@ CHANGELOG ========= +4.2.0 +----- + + * added the `Process::fromShellCommandline()` to run commands in a shell wrapper + * deprecated passing a command as string when creating a `Process` instance + * deprecated the `Process::setCommandline()` and the `PhpProcess::setPhpBinary()` methods + * added the `Process::waitUntil()` method to wait for the process only for a + specific output, then continue the normal execution of your application + 4.1.0 ----- diff --git a/vendor/symfony/process/Exception/ExceptionInterface.php b/vendor/symfony/process/Exception/ExceptionInterface.php index 75c1c9e5d..bd4a60403 100644 --- a/vendor/symfony/process/Exception/ExceptionInterface.php +++ b/vendor/symfony/process/Exception/ExceptionInterface.php @@ -16,6 +16,6 @@ namespace Symfony\Component\Process\Exception; * * @author Johannes M. Schmitt */ -interface ExceptionInterface +interface ExceptionInterface extends \Throwable { } diff --git a/vendor/symfony/process/InputStream.php b/vendor/symfony/process/InputStream.php index 0b830c1a6..c8e4f00ef 100644 --- a/vendor/symfony/process/InputStream.php +++ b/vendor/symfony/process/InputStream.php @@ -36,8 +36,8 @@ class InputStream implements \IteratorAggregate /** * Appends an input to the write buffer. * - * @param resource|string|int|float|bool|\Traversable|null The input to append as scalar, - * stream resource or \Traversable + * @param resource|string|int|float|bool|\Traversable|null $input The input to append as scalar, + * stream resource or \Traversable */ public function write($input) { @@ -78,9 +78,7 @@ class InputStream implements \IteratorAggregate $current = array_shift($this->input); if ($current instanceof \Iterator) { - foreach ($current as $cur) { - yield $cur; - } + yield from $current; } else { yield $current; } diff --git a/vendor/symfony/process/PhpExecutableFinder.php b/vendor/symfony/process/PhpExecutableFinder.php index ee7203c9a..ae8b4da87 100644 --- a/vendor/symfony/process/PhpExecutableFinder.php +++ b/vendor/symfony/process/PhpExecutableFinder.php @@ -37,7 +37,14 @@ class PhpExecutableFinder { if ($php = getenv('PHP_BINARY')) { if (!is_executable($php)) { - return false; + $command = '\\' === \DIRECTORY_SEPARATOR ? 'where' : 'command -v'; + if ($php = strtok(exec($command.' '.escapeshellarg($php)), PHP_EOL)) { + if (!is_executable($php)) { + return false; + } + } else { + return false; + } } return $php; diff --git a/vendor/symfony/process/PhpProcess.php b/vendor/symfony/process/PhpProcess.php index 6cf02a2fc..efa25e2db 100644 --- a/vendor/symfony/process/PhpProcess.php +++ b/vendor/symfony/process/PhpProcess.php @@ -29,11 +29,12 @@ class PhpProcess extends Process * @param string|null $cwd The working directory or null to use the working dir of the current PHP process * @param array|null $env The environment variables or null to use the same environment as the current PHP process * @param int $timeout The timeout in seconds + * @param array|null $php Path to the PHP binary to use with any additional arguments */ - public function __construct(string $script, string $cwd = null, array $env = null, int $timeout = 60) + public function __construct(string $script, string $cwd = null, array $env = null, int $timeout = 60, array $php = null) { $executableFinder = new PhpExecutableFinder(); - if (false === $php = $executableFinder->find(false)) { + if (false === $php = $php ?? $executableFinder->find(false)) { $php = null; } else { $php = array_merge(array($php), $executableFinder->findArguments()); @@ -51,9 +52,13 @@ class PhpProcess extends Process /** * Sets the path to the PHP binary to use. + * + * @deprecated since Symfony 4.2, use the $php argument of the constructor instead. */ public function setPhpBinary($php) { + @trigger_error(sprintf('The "%s()" method is deprecated since Symfony 4.2, use the $php argument of the constructor instead.', __METHOD__), E_USER_DEPRECATED); + $this->setCommandLine($php); } diff --git a/vendor/symfony/process/Pipes/WindowsPipes.php b/vendor/symfony/process/Pipes/WindowsPipes.php index 9240102a3..7130589ce 100644 --- a/vendor/symfony/process/Pipes/WindowsPipes.php +++ b/vendor/symfony/process/Pipes/WindowsPipes.php @@ -28,6 +28,7 @@ class WindowsPipes extends AbstractPipes { private $files = array(); private $fileHandles = array(); + private $lockHandles = array(); private $readBytes = array( Process::STDOUT => 0, Process::STDERR => 0, @@ -47,31 +48,33 @@ class WindowsPipes extends AbstractPipes Process::STDOUT => Process::OUT, Process::STDERR => Process::ERR, ); - $tmpCheck = false; $tmpDir = sys_get_temp_dir(); $lastError = 'unknown reason'; set_error_handler(function ($type, $msg) use (&$lastError) { $lastError = $msg; }); for ($i = 0;; ++$i) { foreach ($pipes as $pipe => $name) { $file = sprintf('%s\\sf_proc_%02X.%s', $tmpDir, $i, $name); - if (file_exists($file) && !unlink($file)) { - continue 2; - } - $h = fopen($file, 'xb'); - if (!$h) { - $error = $lastError; - if ($tmpCheck || $tmpCheck = unlink(tempnam(false, 'sf_check_'))) { - continue; - } + + if (!$h = fopen($file.'.lock', 'w')) { restore_error_handler(); - throw new RuntimeException(sprintf('A temporary file could not be opened to write the process output: %s', $error)); + throw new RuntimeException(sprintf('A temporary file could not be opened to write the process output: %s', $lastError)); } - if (!$h || !$this->fileHandles[$pipe] = fopen($file, 'rb')) { + if (!flock($h, LOCK_EX | LOCK_NB)) { continue 2; } - if (isset($this->files[$pipe])) { - unlink($this->files[$pipe]); + if (isset($this->lockHandles[$pipe])) { + flock($this->lockHandles[$pipe], LOCK_UN); + fclose($this->lockHandles[$pipe]); } + $this->lockHandles[$pipe] = $h; + + if (!fclose(fopen($file, 'w')) || !$h = fopen($file, 'r')) { + flock($this->lockHandles[$pipe], LOCK_UN); + fclose($this->lockHandles[$pipe]); + unset($this->lockHandles[$pipe]); + continue 2; + } + $this->fileHandles[$pipe] = $h; $this->files[$pipe] = $file; } break; @@ -85,7 +88,6 @@ class WindowsPipes extends AbstractPipes public function __destruct() { $this->close(); - $this->removeFiles(); } /** @@ -145,8 +147,11 @@ class WindowsPipes extends AbstractPipes $read[$type] = $data; } if ($close) { + ftruncate($fileHandle, 0); fclose($fileHandle); - unset($this->fileHandles[$type]); + flock($this->lockHandles[$type], LOCK_UN); + fclose($this->lockHandles[$type]); + unset($this->fileHandles[$type], $this->lockHandles[$type]); } } @@ -175,22 +180,12 @@ class WindowsPipes extends AbstractPipes public function close() { parent::close(); - foreach ($this->fileHandles as $handle) { + foreach ($this->fileHandles as $type => $handle) { + ftruncate($handle, 0); fclose($handle); + flock($this->lockHandles[$type], LOCK_UN); + fclose($this->lockHandles[$type]); } - $this->fileHandles = array(); - } - - /** - * Removes temporary files. - */ - private function removeFiles() - { - foreach ($this->files as $filename) { - if (file_exists($filename)) { - @unlink($filename); - } - } - $this->files = array(); + $this->fileHandles = $this->lockHandles = array(); } } diff --git a/vendor/symfony/process/Process.php b/vendor/symfony/process/Process.php index cf551ef51..7ffbacb21 100644 --- a/vendor/symfony/process/Process.php +++ b/vendor/symfony/process/Process.php @@ -129,21 +129,25 @@ class Process implements \IteratorAggregate ); /** - * @param string|array $commandline The command line to run - * @param string|null $cwd The working directory or null to use the working dir of the current PHP process - * @param array|null $env The environment variables or null to use the same environment as the current PHP process - * @param mixed|null $input The input as stream resource, scalar or \Traversable, or null for no input - * @param int|float|null $timeout The timeout in seconds or null to disable + * @param array $command The command to run and its arguments listed as separate entries + * @param string|null $cwd The working directory or null to use the working dir of the current PHP process + * @param array|null $env The environment variables or null to use the same environment as the current PHP process + * @param mixed|null $input The input as stream resource, scalar or \Traversable, or null for no input + * @param int|float|null $timeout The timeout in seconds or null to disable * * @throws RuntimeException When proc_open is not installed */ - public function __construct($commandline, string $cwd = null, array $env = null, $input = null, ?float $timeout = 60) + public function __construct($command, string $cwd = null, array $env = null, $input = null, ?float $timeout = 60) { if (!\function_exists('proc_open')) { - throw new RuntimeException('The Process class relies on proc_open, which is not available on your PHP installation.'); + throw new LogicException('The Process class relies on proc_open, which is not available on your PHP installation.'); } - $this->commandline = $commandline; + if (!\is_array($command)) { + @trigger_error(sprintf('Passing a command as string when creating a "%s" instance is deprecated since Symfony 4.2, pass it as an array of its arguments instead, or use the "Process::fromShellCommandline()" constructor if you need features provided by the shell.', __CLASS__), E_USER_DEPRECATED); + } + + $this->commandline = $command; $this->cwd = $cwd; // on Windows, if the cwd changed via chdir(), proc_open defaults to the dir where PHP was started @@ -163,6 +167,35 @@ class Process implements \IteratorAggregate $this->pty = false; } + /** + * Creates a Process instance as a command-line to be run in a shell wrapper. + * + * Command-lines are parsed by the shell of your OS (/bin/sh on Unix-like, cmd.exe on Windows.) + * This allows using e.g. pipes or conditional execution. In this mode, signals are sent to the + * shell wrapper and not to your commands. + * + * In order to inject dynamic values into command-lines, we strongly recommend using placeholders. + * This will save escaping values, which is not portable nor secure anyway: + * + * $process = Process::fromShellCommandline('my_command "$MY_VAR"'); + * $process->run(null, ['MY_VAR' => $theValue]); + * + * @param string $command The command line to pass to the shell of the OS + * @param string|null $cwd The working directory or null to use the working dir of the current PHP process + * @param array|null $env The environment variables or null to use the same environment as the current PHP process + * @param mixed|null $input The input as stream resource, scalar or \Traversable, or null for no input + * @param int|float|null $timeout The timeout in seconds or null to disable + * + * @throws RuntimeException When proc_open is not installed + */ + public static function fromShellCommandline(string $command, string $cwd = null, array $env = null, $input = null, ?float $timeout = 60) + { + $process = new static(array(), $cwd, $env, $input, $timeout); + $process->commandline = $command; + + return $process; + } + public function __destruct() { $this->stop(0); @@ -374,7 +407,7 @@ class Process implements \IteratorAggregate if (null !== $callback) { if (!$this->processPipes->haveReadSupport()) { $this->stop(0); - throw new \LogicException('Pass the callback to the Process::start method or enableOutput to use a callback with Process::wait'); + throw new \LogicException('Pass the callback to the "Process::start" method or call enableOutput to use a callback with "Process::wait"'); } $this->callback = $this->buildCallback($callback); } @@ -396,6 +429,51 @@ class Process implements \IteratorAggregate return $this->exitcode; } + /** + * Waits until the callback returns true. + * + * The callback receives the type of output (out or err) and some bytes + * from the output in real-time while writing the standard input to the process. + * It allows to have feedback from the independent process during execution. + * + * @throws RuntimeException When process timed out + * @throws LogicException When process is not yet started + */ + public function waitUntil(callable $callback): bool + { + $this->requireProcessIsStarted(__FUNCTION__); + $this->updateStatus(false); + + if (!$this->processPipes->haveReadSupport()) { + $this->stop(0); + throw new \LogicException('Pass the callback to the "Process::start" method or call enableOutput to use a callback with "Process::waitUntil".'); + } + $callback = $this->buildCallback($callback); + + $ready = false; + while (true) { + $this->checkTimeout(); + $running = '\\' === \DIRECTORY_SEPARATOR ? $this->isRunning() : $this->processPipes->areOpen(); + $output = $this->processPipes->readAndWrite($running, '\\' !== \DIRECTORY_SEPARATOR || !$running); + + foreach ($output as $type => $data) { + if (3 !== $type) { + $ready = $callback(self::STDOUT === $type ? self::OUT : self::ERR, $data) || $ready; + } elseif (!isset($this->fallbackStatus['signaled'])) { + $this->fallbackStatus['exitcode'] = (int) $data; + } + } + if ($ready) { + return true; + } + if (!$running) { + return false; + } + + usleep(1000); + } + } + /** * Returns the Pid (process identifier), if applicable. * @@ -823,7 +901,7 @@ class Process implements \IteratorAggregate { $timeoutMicro = microtime(true) + $timeout; if ($this->isRunning()) { - // given `SIGTERM` may not be defined and that `proc_terminate` uses the constant value and not the constant itself, we use the same here + // given SIGTERM may not be defined and that "proc_terminate" uses the constant value and not the constant itself, we use the same here $this->doSignal(15, false); do { usleep(1000); @@ -892,9 +970,13 @@ class Process implements \IteratorAggregate * @param string|array $commandline The command to execute * * @return self The current Process instance + * + * @deprecated since Symfony 4.2. */ public function setCommandLine($commandline) { + @trigger_error(sprintf('The "%s()" method is deprecated since Symfony 4.2.', __METHOD__), E_USER_DEPRECATED); + $this->commandline = $commandline; return $this; @@ -1227,7 +1309,7 @@ class Process implements \IteratorAggregate if ($this->outputDisabled) { return function ($type, $data) use ($callback) { if (null !== $callback) { - \call_user_func($callback, $type, $data); + return \call_user_func($callback, $type, $data); } }; } @@ -1242,7 +1324,7 @@ class Process implements \IteratorAggregate } if (null !== $callback) { - \call_user_func($callback, $type, $data); + return \call_user_func($callback, $type, $data); } }; } @@ -1442,7 +1524,7 @@ class Process implements \IteratorAggregate } if (!$ok) { if ($throwException) { - throw new RuntimeException(sprintf('Error while sending signal `%s`.', $signal)); + throw new RuntimeException(sprintf('Error while sending signal "%s".', $signal)); } return false; @@ -1516,7 +1598,7 @@ class Process implements \IteratorAggregate } /** - * Ensures the process is terminated, throws a LogicException if the process has a status different than `terminated`. + * Ensures the process is terminated, throws a LogicException if the process has a status different than "terminated". * * @throws LogicException if the process is not yet terminated */ @@ -1530,14 +1612,14 @@ class Process implements \IteratorAggregate /** * Escapes a string to be used as a shell argument. */ - private function escapeArgument(string $argument): string + private function escapeArgument(?string $argument): string { + if ('' === $argument || null === $argument) { + return '""'; + } if ('\\' !== \DIRECTORY_SEPARATOR) { return "'".str_replace("'", "'\\''", $argument)."'"; } - if ('' === $argument = (string) $argument) { - return '""'; - } if (false !== strpos($argument, "\0")) { $argument = str_replace("\0", '?', $argument); } diff --git a/vendor/symfony/process/Tests/KillableProcessWithOutput.php b/vendor/symfony/process/Tests/KillableProcessWithOutput.php new file mode 100644 index 000000000..6c31ee305 --- /dev/null +++ b/vendor/symfony/process/Tests/KillableProcessWithOutput.php @@ -0,0 +1,26 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +$outputs = array( + 'First iteration output', + 'Second iteration output', + 'One more iteration output', + 'This took more time', + 'This one was sooooo slow', +); + +$iterationTime = 10000; + +foreach ($outputs as $output) { + usleep($iterationTime); + $iterationTime *= 10; + echo $output."\n"; +} diff --git a/vendor/symfony/process/Tests/ProcessFailedExceptionTest.php b/vendor/symfony/process/Tests/ProcessFailedExceptionTest.php index 25712af7d..d8fdb5c1f 100644 --- a/vendor/symfony/process/Tests/ProcessFailedExceptionTest.php +++ b/vendor/symfony/process/Tests/ProcessFailedExceptionTest.php @@ -24,7 +24,7 @@ class ProcessFailedExceptionTest extends TestCase */ public function testProcessFailedExceptionThrowsException() { - $process = $this->getMockBuilder('Symfony\Component\Process\Process')->setMethods(array('isSuccessful'))->setConstructorArgs(array('php'))->getMock(); + $process = $this->getMockBuilder('Symfony\Component\Process\Process')->setMethods(array('isSuccessful'))->setConstructorArgs(array(array('php')))->getMock(); $process->expects($this->once()) ->method('isSuccessful') ->will($this->returnValue(true)); @@ -52,7 +52,7 @@ class ProcessFailedExceptionTest extends TestCase $errorOutput = 'FATAL: Unexpected error'; $workingDirectory = getcwd(); - $process = $this->getMockBuilder('Symfony\Component\Process\Process')->setMethods(array('isSuccessful', 'getOutput', 'getErrorOutput', 'getExitCode', 'getExitCodeText', 'isOutputDisabled', 'getWorkingDirectory'))->setConstructorArgs(array($cmd))->getMock(); + $process = $this->getMockBuilder('Symfony\Component\Process\Process')->setMethods(array('isSuccessful', 'getOutput', 'getErrorOutput', 'getExitCode', 'getExitCodeText', 'isOutputDisabled', 'getWorkingDirectory'))->setConstructorArgs(array(array($cmd)))->getMock(); $process->expects($this->once()) ->method('isSuccessful') ->will($this->returnValue(false)); @@ -85,7 +85,7 @@ class ProcessFailedExceptionTest extends TestCase $this->assertEquals( "The command \"$cmd\" failed.\n\nExit Code: $exitCode($exitText)\n\nWorking directory: {$workingDirectory}\n\nOutput:\n================\n{$output}\n\nError Output:\n================\n{$errorOutput}", - $exception->getMessage() + str_replace("'php'", 'php', $exception->getMessage()) ); } @@ -100,7 +100,7 @@ class ProcessFailedExceptionTest extends TestCase $exitText = 'General error'; $workingDirectory = getcwd(); - $process = $this->getMockBuilder('Symfony\Component\Process\Process')->setMethods(array('isSuccessful', 'isOutputDisabled', 'getExitCode', 'getExitCodeText', 'getOutput', 'getErrorOutput', 'getWorkingDirectory'))->setConstructorArgs(array($cmd))->getMock(); + $process = $this->getMockBuilder('Symfony\Component\Process\Process')->setMethods(array('isSuccessful', 'isOutputDisabled', 'getExitCode', 'getExitCodeText', 'getOutput', 'getErrorOutput', 'getWorkingDirectory'))->setConstructorArgs(array(array($cmd)))->getMock(); $process->expects($this->once()) ->method('isSuccessful') ->will($this->returnValue(false)); @@ -131,7 +131,7 @@ class ProcessFailedExceptionTest extends TestCase $this->assertEquals( "The command \"$cmd\" failed.\n\nExit Code: $exitCode($exitText)\n\nWorking directory: {$workingDirectory}", - $exception->getMessage() + str_replace("'php'", 'php', $exception->getMessage()) ); } } diff --git a/vendor/symfony/process/Tests/ProcessTest.php b/vendor/symfony/process/Tests/ProcessTest.php index f7d4fc82e..60162975f 100644 --- a/vendor/symfony/process/Tests/ProcessTest.php +++ b/vendor/symfony/process/Tests/ProcessTest.php @@ -55,13 +55,13 @@ class ProcessTest extends TestCase { try { // Check that it works fine if the CWD exists - $cmd = new Process('echo test', __DIR__); + $cmd = new Process(array('echo', 'test'), __DIR__); $cmd->run(); } catch (\Exception $e) { $this->fail($e); } - $cmd = new Process('echo test', __DIR__.'/notfound/'); + $cmd = new Process(array('echo', 'test'), __DIR__.'/notfound/'); $cmd->run(); } @@ -133,6 +133,30 @@ class ProcessTest extends TestCase $this->assertLessThan(15, microtime(true) - $start); } + public function testWaitUntilSpecificOutput() + { + $p = $this->getProcess(array(self::$phpBin, __DIR__.'/KillableProcessWithOutput.php')); + $p->start(); + + $start = microtime(true); + + $completeOutput = ''; + $result = $p->waitUntil(function ($type, $output) use (&$completeOutput) { + return false !== strpos($completeOutput .= $output, 'One more'); + }); + $this->assertTrue($result); + $this->assertLessThan(20, microtime(true) - $start); + $this->assertStringStartsWith("First iteration output\nSecond iteration output\nOne more", $completeOutput); + $p->stop(); + } + + public function testWaitUntilCanReturnFalse() + { + $p = $this->getProcess('echo foo'); + $p->start(); + $this->assertFalse($p->waitUntil(function () { return false; })); + } + public function testAllOutputIsActuallyReadOnTermination() { // this code will result in a maximum of 2 reads of 8192 bytes by calling @@ -1436,12 +1460,12 @@ class ProcessTest extends TestCase $p = new Process(array(self::$phpBin, '-r', 'echo $argv[1];', $arg)); $p->run(); - $this->assertSame($arg, $p->getOutput()); + $this->assertSame((string) $arg, $p->getOutput()); } public function testRawCommandLine() { - $p = new Process(sprintf('"%s" -r %s "a" "" "b"', self::$phpBin, escapeshellarg('print_r($argv);'))); + $p = Process::fromShellCommandline(sprintf('"%s" -r %s "a" "" "b"', self::$phpBin, escapeshellarg('print_r($argv);'))); $p->run(); $expected = << 'Foo', 'BAR' => 'Bar'); $cmd = '\\' === \DIRECTORY_SEPARATOR ? 'echo !FOO! !BAR! !BAZ!' : 'echo $FOO $BAR $BAZ'; - $p = new Process($cmd, null, $env); + $p = Process::fromShellCommandline($cmd, null, $env); $p->run(null, array('BAR' => 'baR', 'BAZ' => 'baZ')); $this->assertSame('Foo baR baZ', rtrim($p->getOutput())); $this->assertSame($env, $p->getEnv()); } - /** - * @param string $commandline - * @param string|null $cwd - * @param array|null $env - * @param string|null $input - * @param int $timeout - * @param array $options - * - * @return Process - */ - private function getProcess($commandline, $cwd = null, array $env = null, $input = null, $timeout = 60) + private function getProcess($commandline, string $cwd = null, array $env = null, $input = null, ?int $timeout = 60): Process { - $process = new Process($commandline, $cwd, $env, $input, $timeout); + if (\is_string($commandline)) { + $process = Process::fromShellCommandline($commandline, $cwd, $env, $input, $timeout); + } else { + $process = new Process($commandline, $cwd, $env, $input, $timeout); + } $process->inheritEnvironmentVariables(); if (self::$process) { @@ -1501,10 +1522,7 @@ EOTXT; return self::$process = $process; } - /** - * @return Process - */ - private function getProcessForCode($code, $cwd = null, array $env = null, $input = null, $timeout = 60) + private function getProcessForCode(string $code, string $cwd = null, array $env = null, $input = null, ?int $timeout = 60): Process { return $this->getProcess(array(self::$phpBin, '-r', $code), $cwd, $env, $input, $timeout); } diff --git a/vendor/symfony/process/composer.json b/vendor/symfony/process/composer.json index 58f4005b5..44bad06b5 100644 --- a/vendor/symfony/process/composer.json +++ b/vendor/symfony/process/composer.json @@ -27,7 +27,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-master": "4.1-dev" + "dev-master": "4.2-dev" } } } diff --git a/vendor/symfony/process/phpunit.xml.dist b/vendor/symfony/process/phpunit.xml.dist index d38846730..c32f25101 100644 --- a/vendor/symfony/process/phpunit.xml.dist +++ b/vendor/symfony/process/phpunit.xml.dist @@ -1,7 +1,7 @@ */ -interface ExceptionInterface +interface ExceptionInterface extends \Throwable { } diff --git a/vendor/symfony/routing/Generator/Dumper/PhpGeneratorDumper.php b/vendor/symfony/routing/Generator/Dumper/PhpGeneratorDumper.php index 97e033501..6f08a0f39 100644 --- a/vendor/symfony/routing/Generator/Dumper/PhpGeneratorDumper.php +++ b/vendor/symfony/routing/Generator/Dumper/PhpGeneratorDumper.php @@ -113,10 +113,17 @@ EOF; ?? $this->context->getParameter('_locale') ?: $this->defaultLocale; - if (null !== $locale && (self::$declaredRoutes[$name.'.'.$locale][1]['_canonical_route'] ?? null) === $name) { - unset($parameters['_locale']); - $name .= '.'.$locale; - } elseif (!isset(self::$declaredRoutes[$name])) { + if (null !== $locale && null !== $name) { + do { + if ((self::$declaredRoutes[$name.'.'.$locale][1]['_canonical_route'] ?? null) === $name) { + unset($parameters['_locale']); + $name .= '.'.$locale; + break; + } + } while (false !== $locale = strstr($locale, '_', true)); + } + + if (!isset(self::$declaredRoutes[$name])) { throw new RouteNotFoundException(sprintf('Unable to generate a URL for the named route "%s" as such route does not exist.', $name)); } diff --git a/vendor/symfony/routing/Generator/UrlGenerator.php b/vendor/symfony/routing/Generator/UrlGenerator.php index 38dd13847..917944232 100644 --- a/vendor/symfony/routing/Generator/UrlGenerator.php +++ b/vendor/symfony/routing/Generator/UrlGenerator.php @@ -112,13 +112,21 @@ class UrlGenerator implements UrlGeneratorInterface, ConfigurableRequirementsInt */ public function generate($name, $parameters = array(), $referenceType = self::ABSOLUTE_PATH) { + $route = null; $locale = $parameters['_locale'] ?? $this->context->getParameter('_locale') ?: $this->defaultLocale; - if (null !== $locale && null !== ($route = $this->routes->get($name.'.'.$locale)) && $route->getDefault('_canonical_route') === $name) { - unset($parameters['_locale']); - } elseif (null === $route = $this->routes->get($name)) { + if (null !== $locale) { + do { + if (null !== ($route = $this->routes->get($name.'.'.$locale)) && $route->getDefault('_canonical_route') === $name) { + unset($parameters['_locale']); + break; + } + } while (false !== $locale = strstr($locale, '_', true)); + } + + if (null === $route = $route ?? $this->routes->get($name)) { throw new RouteNotFoundException(sprintf('Unable to generate a URL for the named route "%s" as such route does not exist.', $name)); } @@ -254,10 +262,7 @@ class UrlGenerator implements UrlGeneratorInterface, ConfigurableRequirementsInt }); // extract fragment - $fragment = ''; - if (isset($defaults['_fragment'])) { - $fragment = $defaults['_fragment']; - } + $fragment = $defaults['_fragment'] ?? ''; if (isset($extra['_fragment'])) { $fragment = $extra['_fragment']; diff --git a/vendor/symfony/routing/Loader/AnnotationClassLoader.php b/vendor/symfony/routing/Loader/AnnotationClassLoader.php index 958217fcb..1e5449ab2 100644 --- a/vendor/symfony/routing/Loader/AnnotationClassLoader.php +++ b/vendor/symfony/routing/Loader/AnnotationClassLoader.php @@ -120,12 +120,9 @@ abstract class AnnotationClassLoader implements LoaderInterface } if (0 === $collection->count() && $class->hasMethod('__invoke')) { + $globals = $this->resetGlobals(); foreach ($this->reader->getClassAnnotations($class) as $annot) { if ($annot instanceof $this->routeAnnotationClass) { - $globals['path'] = ''; - $globals['name'] = ''; - $globals['localized_paths'] = array(); - $this->addRoute($collection, $annot, $globals, $class, $class->getMethod('__invoke')); } } @@ -142,8 +139,16 @@ abstract class AnnotationClassLoader implements LoaderInterface } $name = $globals['name'].$name; + $requirements = $annot->getRequirements(); + + foreach ($requirements as $placeholder => $requirement) { + if (\is_int($placeholder)) { + @trigger_error(sprintf('A placeholder name must be a string (%d given). Did you forget to specify the placeholder key for the requirement "%s" of route "%s" in "%s::%s()"?', $placeholder, $requirement, $name, $class->getName(), $method->getName()), E_USER_DEPRECATED); + } + } + $defaults = array_replace($globals['defaults'], $annot->getDefaults()); - $requirements = array_replace($globals['requirements'], $annot->getRequirements()); + $requirements = array_replace($globals['requirements'], $requirements); $options = array_replace($globals['options'], $annot->getOptions()); $schemes = array_merge($globals['schemes'], $annot->getSchemes()); $methods = array_merge($globals['methods'], $annot->getMethods()); @@ -254,18 +259,7 @@ abstract class AnnotationClassLoader implements LoaderInterface protected function getGlobals(\ReflectionClass $class) { - $globals = array( - 'path' => null, - 'localized_paths' => array(), - 'requirements' => array(), - 'options' => array(), - 'defaults' => array(), - 'schemes' => array(), - 'methods' => array(), - 'host' => '', - 'condition' => '', - 'name' => '', - ); + $globals = $this->resetGlobals(); if ($annot = $this->reader->getClassAnnotation($class, $this->routeAnnotationClass)) { if (null !== $annot->getName()) { @@ -305,11 +299,33 @@ abstract class AnnotationClassLoader implements LoaderInterface if (null !== $annot->getCondition()) { $globals['condition'] = $annot->getCondition(); } + + foreach ($globals['requirements'] as $placeholder => $requirement) { + if (\is_int($placeholder)) { + @trigger_error(sprintf('A placeholder name must be a string (%d given). Did you forget to specify the placeholder key for the requirement "%s" in "%s"?', $placeholder, $requirement, $class->getName()), E_USER_DEPRECATED); + } + } } return $globals; } + private function resetGlobals() + { + return array( + 'path' => null, + 'localized_paths' => array(), + 'requirements' => array(), + 'options' => array(), + 'defaults' => array(), + 'schemes' => array(), + 'methods' => array(), + 'host' => '', + 'condition' => '', + 'name' => '', + ); + } + protected function createRoute($path, $defaults, $requirements, $options, $host, $schemes, $methods, $condition) { return new Route($path, $defaults, $requirements, $options, $host, $schemes, $methods, $condition); diff --git a/vendor/symfony/routing/Loader/AnnotationFileLoader.php b/vendor/symfony/routing/Loader/AnnotationFileLoader.php index ecd68e04f..b69fa99c4 100644 --- a/vendor/symfony/routing/Loader/AnnotationFileLoader.php +++ b/vendor/symfony/routing/Loader/AnnotationFileLoader.php @@ -32,7 +32,7 @@ class AnnotationFileLoader extends FileLoader public function __construct(FileLocatorInterface $locator, AnnotationClassLoader $loader) { if (!\function_exists('token_get_all')) { - throw new \RuntimeException('The Tokenizer extension is required for the routing annotation loaders.'); + throw new \LogicException('The Tokenizer extension is required for the routing annotation loaders.'); } parent::__construct($locator); diff --git a/vendor/symfony/routing/Loader/YamlFileLoader.php b/vendor/symfony/routing/Loader/YamlFileLoader.php index bd35c75a9..ca2e313aa 100644 --- a/vendor/symfony/routing/Loader/YamlFileLoader.php +++ b/vendor/symfony/routing/Loader/YamlFileLoader.php @@ -116,6 +116,12 @@ class YamlFileLoader extends FileLoader $methods = isset($config['methods']) ? $config['methods'] : array(); $condition = isset($config['condition']) ? $config['condition'] : null; + foreach ($requirements as $placeholder => $requirement) { + if (\is_int($placeholder)) { + @trigger_error(sprintf('A placeholder name must be a string (%d given). Did you forget to specify the placeholder key for the requirement "%s" of route "%s" in "%s"?', $placeholder, $requirement, $name, $path), E_USER_DEPRECATED); + } + } + if (isset($config['controller'])) { $defaults['_controller'] = $config['controller']; } diff --git a/vendor/symfony/routing/Matcher/Dumper/PhpMatcherDumper.php b/vendor/symfony/routing/Matcher/Dumper/PhpMatcherDumper.php index 14e5cc341..c11fc694b 100644 --- a/vendor/symfony/routing/Matcher/Dumper/PhpMatcherDumper.php +++ b/vendor/symfony/routing/Matcher/Dumper/PhpMatcherDumper.php @@ -13,7 +13,6 @@ namespace Symfony\Component\Routing\Matcher\Dumper; use Symfony\Component\ExpressionLanguage\ExpressionFunctionProviderInterface; use Symfony\Component\ExpressionLanguage\ExpressionLanguage; -use Symfony\Component\Routing\Matcher\RedirectableUrlMatcherInterface; use Symfony\Component\Routing\Route; use Symfony\Component\Routing\RouteCollection; @@ -56,13 +55,11 @@ class PhpMatcherDumper extends MatcherDumper // trailing slash support is only enabled if we know how to redirect the user $interfaces = class_implements($options['base_class']); - $supportsRedirections = isset($interfaces[RedirectableUrlMatcherInterface::class]); return <<context = \$context; - } - -{$this->generateMatchMethod($supportsRedirections)} +{$this->generateProperties()} } } EOF; @@ -90,7 +87,7 @@ EOF; /** * Generates the code for the match method implementing UrlMatcherInterface. */ - private function generateMatchMethod(bool $supportsRedirections): string + private function generateProperties(): string { // Group hosts by same-suffix, re-order when possible $matchHost = false; @@ -103,86 +100,25 @@ EOF; $routes->addRoute($host ?: '/(.*)', array($name, $route)); } - $routes = $matchHost ? $routes->populateCollection(new RouteCollection()) : $this->getRoutes(); - $code = rtrim($this->compileRoutes($routes, $matchHost), "\n"); - $fetchHost = $matchHost ? " \$host = strtolower(\$context->getHost());\n" : ''; - - $code = <<context; - \$requestMethod = \$canonicalMethod = \$context->getMethod(); -{$fetchHost} - if ('HEAD' === \$requestMethod) { - \$canonicalMethod = 'GET'; + if ($matchHost) { + $code = '$this->matchHost = true;'."\n"; + $routes = $routes->populateCollection(new RouteCollection()); + } else { + $code = ''; + $routes = $this->getRoutes(); } -$code - -EOF; - - if ($supportsRedirections) { - return <<<'EOF' - public function match($pathinfo) - { - $allow = $allowSchemes = array(); - if ($ret = $this->doMatch($pathinfo, $allow, $allowSchemes)) { - return $ret; - } - if ($allow) { - throw new MethodNotAllowedException(array_keys($allow)); - } - if (!in_array($this->context->getMethod(), array('HEAD', 'GET'), true)) { - // no-op - } elseif ($allowSchemes) { - redirect_scheme: - $scheme = $this->context->getScheme(); - $this->context->setScheme(key($allowSchemes)); - try { - if ($ret = $this->doMatch($pathinfo)) { - return $this->redirect($pathinfo, $ret['_route'], $this->context->getScheme()) + $ret; - } - } finally { - $this->context->setScheme($scheme); - } - } elseif ('/' !== $pathinfo) { - $pathinfo = '/' !== $pathinfo[-1] ? $pathinfo.'/' : substr($pathinfo, 0, -1); - if ($ret = $this->doMatch($pathinfo, $allow, $allowSchemes)) { - return $this->redirect($pathinfo, $ret['_route']) + $ret; - } - if ($allowSchemes) { - goto redirect_scheme; - } - } - - throw new ResourceNotFoundException(); - } - - private function doMatch(string $rawPathinfo, array &$allow = array(), array &$allowSchemes = array()): ?array - -EOF - .$code."\n return null;\n }"; - } - - return " public function match(\$rawPathinfo)\n".$code."\n throw \$allow ? new MethodNotAllowedException(array_keys(\$allow)) : new ResourceNotFoundException();\n }"; - } - - /** - * Generates PHP code to match a RouteCollection with all its routes. - */ - private function compileRoutes(RouteCollection $routes, bool $matchHost): string - { list($staticRoutes, $dynamicRoutes) = $this->groupStaticRoutes($routes); - $code = $this->compileStaticRoutes($staticRoutes, $matchHost); + $conditions = array(null); + $code .= $this->compileStaticRoutes($staticRoutes, $conditions); $chunkLimit = \count($dynamicRoutes); while (true) { try { $this->signalingException = new \RuntimeException('preg_match(): Compilation failed: regular expression is too large'); - $code .= $this->compileDynamicRoutes($dynamicRoutes, $matchHost, $chunkLimit); + $code .= $this->compileDynamicRoutes($dynamicRoutes, $matchHost, $chunkLimit, $conditions); break; } catch (\Exception $e) { if (1 < $chunkLimit && $this->signalingException === $e) { @@ -193,12 +129,24 @@ EOF } } - // used to display the Welcome Page in apps that don't define a homepage - $code .= " if ('/' === \$pathinfo && !\$allow && !\$allowSchemes) {\n"; - $code .= " throw new Symfony\Component\Routing\Exception\NoConfigurationException();\n"; - $code .= " }\n"; + unset($conditions[0]); - return $code; + if (!$conditions) { + return $this->indent($code, 2); + } + + foreach ($conditions as $expression => $condition) { + $conditions[$expression] = "case {$condition}: return {$expression};"; + } + + return $this->indent($code, 2).<<checkCondition = static function (\$condition, \$context, \$request) { + switch (\$condition) { +{$this->indent(implode("\n", $conditions), 4)} + } + }; + +EOF; } /** @@ -213,9 +161,18 @@ EOF $compiledRoute = $route->compile(); $hostRegex = $compiledRoute->getHostRegex(); $regex = $compiledRoute->getRegex(); + if ($hasTrailingSlash = '/' !== $route->getPath()) { + $pos = strrpos($regex, '$'); + $hasTrailingSlash = '/' === $regex[$pos - 1]; + $regex = substr_replace($regex, '/?$', $pos - $hasTrailingSlash, 1 + $hasTrailingSlash); + } + if (!$compiledRoute->getPathVariables()) { $host = !$compiledRoute->getHostVariables() ? $route->getHost() : ''; $url = $route->getPath(); + if ($hasTrailingSlash) { + $url = substr($url, 0, -1); + } foreach ($dynamicRegex as list($hostRx, $rx)) { if (preg_match($rx, $url) && (!$host || !$hostRx || preg_match($hostRx, $host))) { $dynamicRegex[] = array($hostRegex, $regex); @@ -224,7 +181,7 @@ EOF } } - $staticRoutes[$url][$name] = $route; + $staticRoutes[$url][$name] = array($route, $hasTrailingSlash); } else { $dynamicRegex[] = array($hostRegex, $regex); $dynamicRoutes->add($name, $route); @@ -242,58 +199,26 @@ EOF * * @throws \LogicException */ - private function compileStaticRoutes(array $staticRoutes, bool $matchHost): string + private function compileStaticRoutes(array $staticRoutes, array &$conditions): string { if (!$staticRoutes) { return ''; } - $code = $default = ''; + $code = ''; foreach ($staticRoutes as $url => $routes) { - if (1 === \count($routes)) { - foreach ($routes as $name => $route) { - } - - if (!$route->getCondition()) { - $defaults = $route->getDefaults(); - if (isset($defaults['_canonical_route'])) { - $name = $defaults['_canonical_route']; - unset($defaults['_canonical_route']); - } - $default .= sprintf( - "%s => array(%s, %s, %s, %s),\n", - self::export($url), - self::export(array('_route' => $name) + $defaults), - self::export(!$route->compile()->getHostVariables() ? $route->getHost() : $route->compile()->getHostRegex() ?: null), - self::export(array_flip($route->getMethods()) ?: null), - self::export(array_flip($route->getSchemes()) ?: null) - ); - continue; - } + $code .= self::export($url)." => array(\n"; + foreach ($routes as $name => list($route, $hasTrailingSlash)) { + $code .= $this->compileRoute($route, $name, !$route->compile()->getHostVariables() ? $route->getHost() : $route->compile()->getHostRegex() ?: null, $hasTrailingSlash, $conditions); } - - $code .= sprintf(" case %s:\n", self::export($url)); - foreach ($routes as $name => $route) { - $code .= $this->compileRoute($route, $name, true); - } - $code .= " break;\n"; + $code .= "),\n"; } - if ($default) { - $code .= <<indent($default, 4)} ); - - if (!isset(\$routes[\$pathinfo])) { - break; - } - list(\$ret, \$requiredHost, \$requiredMethods, \$requiredSchemes) = \$routes[\$pathinfo]; -{$this->compileSwitchDefault(false, $matchHost)} -EOF; + if ($code) { + return "\$this->staticRoutes = array(\n{$this->indent($code, 1)});\n"; } - return sprintf(" switch (\$pathinfo) {\n%s }\n\n", $this->indent($code)); + return $code; } /** @@ -314,7 +239,7 @@ EOF; * matching-but-failing subpattern is blacklisted by replacing its name by "(*F)", which forces a failure-to-match. * To ease this backlisting operation, the name of subpatterns is also the string offset where the replacement should occur. */ - private function compileDynamicRoutes(RouteCollection $collection, bool $matchHost, int $chunkLimit): string + private function compileDynamicRoutes(RouteCollection $collection, bool $matchHost, int $chunkLimit, array &$conditions): string { if (!$collection->all()) { return ''; @@ -322,8 +247,7 @@ EOF; $code = ''; $state = (object) array( 'regex' => '', - 'switch' => '', - 'default' => '', + 'routes' => '', 'mark' => 0, 'markTail' => 0, 'hostVars' => array(), @@ -367,7 +291,7 @@ EOF; } $prev = false; $rx = '{^(?'; - $code .= "\n {$state->mark} => ".self::export($rx); + $code .= "\n {$state->mark} => ".self::export($rx); $state->mark += \strlen($rx); $state->regex = $rx; @@ -383,7 +307,7 @@ EOF; $state->hostVars = array(); } $state->mark += \strlen($rx = ($prev ? ')' : '')."|{$hostRegex}(?"); - $code .= "\n .".self::export($rx); + $code .= "\n .".self::export($rx); $state->regex .= $rx; $prev = true; } @@ -394,17 +318,21 @@ EOF; $state->vars = array(); $regex = preg_replace_callback('#\?P<([^>]++)>#', $state->getVars, $rx[1]); - $tree->addRoute($regex, array($name, $regex, $state->vars, $route)); + if ($hasTrailingSlash = '/' !== $regex && '/' === $regex[-1]) { + $regex = substr($regex, 0, -1); + } + + $tree->addRoute($regex, array($name, $regex, $state->vars, $route, $hasTrailingSlash)); } - $code .= $this->compileStaticPrefixCollection($tree, $state); + $code .= $this->compileStaticPrefixCollection($tree, $state, 0, $conditions); } if ($matchHost) { - $code .= "\n .')'"; + $code .= "\n .')'"; $state->regex .= ')'; } - $rx = ")$}{$modifiers}"; - $code .= "\n .'{$rx}',"; + $rx = ")(?:/?)$}{$modifiers}"; + $code .= "\n .'{$rx}',"; $state->regex .= $rx; $state->markTail = 0; @@ -417,39 +345,10 @@ EOF; } } - if ($state->default) { - $state->switch .= <<indent($state->default, 4)} ); - - list(\$ret, \$vars, \$requiredMethods, \$requiredSchemes) = \$routes[\$m]; -{$this->compileSwitchDefault(true, $matchHost)} -EOF; - } - - $matchedPathinfo = $matchHost ? '$host.\'.\'.$pathinfo' : '$pathinfo'; unset($state->getVars); - return << \$regex) { - while (preg_match(\$regex, \$matchedPathinfo, \$matches)) { - switch (\$m = (int) \$matches['MARK']) { -{$this->indent($state->switch, 3)} } - - if ({$state->mark} === \$m) { - break; - } - \$regex = substr_replace(\$regex, 'F', \$m - \$offset, 1 + strlen(\$m)); - \$offset += strlen(\$m); - } - } - -EOF; + return "\$this->regexpList = array({$code}\n);\n" + ."\$this->dynamicRoutes = array(\n{$this->indent($state->routes, 1)});\n"; } /** @@ -458,7 +357,7 @@ EOF; * @param \stdClass $state A simple state object that keeps track of the progress of the compilation, * and gathers the generated switch's "case" and "default" statements */ - private function compileStaticPrefixCollection(StaticPrefixCollection $tree, \stdClass $state, int $prefixLen = 0): string + private function compileStaticPrefixCollection(StaticPrefixCollection $tree, \stdClass $state, int $prefixLen, array &$conditions): string { $code = ''; $prevRegex = null; @@ -469,262 +368,72 @@ EOF; $prevRegex = null; $prefix = substr($route->getPrefix(), $prefixLen); $state->mark += \strlen($rx = "|{$prefix}(?"); - $code .= "\n .".self::export($rx); + $code .= "\n .".self::export($rx); $state->regex .= $rx; - $code .= $this->indent($this->compileStaticPrefixCollection($route, $state, $prefixLen + \strlen($prefix))); - $code .= "\n .')'"; + $code .= $this->indent($this->compileStaticPrefixCollection($route, $state, $prefixLen + \strlen($prefix), $conditions)); + $code .= "\n .')'"; $state->regex .= ')'; ++$state->markTail; continue; } - list($name, $regex, $vars, $route) = $route; + list($name, $regex, $vars, $route, $hasTrailingSlash) = $route; $compiledRoute = $route->compile(); + $vars = array_merge($state->hostVars, $vars); if ($compiledRoute->getRegex() === $prevRegex) { - $state->switch = substr_replace($state->switch, $this->compileRoute($route, $name, false)."\n", -19, 0); + $state->routes = substr_replace($state->routes, $this->compileRoute($route, $name, $vars, $hasTrailingSlash, $conditions), -3, 0); continue; } $state->mark += 3 + $state->markTail + \strlen($regex) - $prefixLen; $state->markTail = 2 + \strlen($state->mark); $rx = sprintf('|%s(*:%s)', substr($regex, $prefixLen), $state->mark); - $code .= "\n .".self::export($rx); + $code .= "\n .".self::export($rx); $state->regex .= $rx; - $vars = array_merge($state->hostVars, $vars); - if (!$route->getCondition() && (!\is_array($next = $routes[1 + $i] ?? null) || $regex !== $next[1])) { - $prevRegex = null; - $defaults = $route->getDefaults(); - if (isset($defaults['_canonical_route'])) { - $name = $defaults['_canonical_route']; - unset($defaults['_canonical_route']); - } - $state->default .= sprintf( - "%s => array(%s, %s, %s, %s),\n", - $state->mark, - self::export(array('_route' => $name) + $defaults), - self::export($vars), - self::export(array_flip($route->getMethods()) ?: null), - self::export(array_flip($route->getSchemes()) ?: null) - ); - } else { - $prevRegex = $compiledRoute->getRegex(); - $combine = ' $matches = array('; - foreach ($vars as $j => $m) { - $combine .= sprintf('%s => $matches[%d] ?? null, ', self::export($m), 1 + $j); - } - $combine = $vars ? substr_replace($combine, ");\n\n", -2) : ''; - - $state->switch .= <<mark}: -{$combine}{$this->compileRoute($route, $name, false)} - break; - -EOF; - } + $prevRegex = $compiledRoute->getRegex(); + $state->routes .= sprintf("%s => array(\n%s),\n", $state->mark, $this->compileRoute($route, $name, $vars, $hasTrailingSlash, $conditions)); } return $code; } - /** - * A simple helper to compiles the switch's "default" for both static and dynamic routes. - */ - private function compileSwitchDefault(bool $hasVars, bool $matchHost): string - { - if ($hasVars) { - $code = << \$v) { - if (isset(\$matches[1 + \$i])) { - \$ret[\$v] = \$matches[1 + \$i]; - } - } - -EOF; - } elseif ($matchHost) { - $code = <<mergeDefaults(\$hostMatches, \$ret); - } - } - -EOF; - } else { - $code = ''; - } - - $code .= <<getScheme()]); - if (\$requiredMethods && !isset(\$requiredMethods[\$canonicalMethod]) && !isset(\$requiredMethods[\$requestMethod])) { - if (\$hasRequiredScheme) { - \$allow += \$requiredMethods; - } - break; - } - if (!\$hasRequiredScheme) { - \$allowSchemes += \$requiredSchemes; - break; - } - - return \$ret; - -EOF; - - return $code; - } - /** * Compiles a single Route to PHP code used to match it against the path info. - * - * @throws \LogicException */ - private function compileRoute(Route $route, string $name, bool $checkHost): string + private function compileRoute(Route $route, string $name, $vars, bool $hasTrailingSlash, array &$conditions): string { - $code = ''; - $compiledRoute = $route->compile(); - $conditions = array(); - $matches = (bool) $compiledRoute->getPathVariables(); - $hostMatches = (bool) $compiledRoute->getHostVariables(); - $methods = array_flip($route->getMethods()); - - if ($route->getCondition()) { - $expression = $this->getExpressionLanguage()->compile($route->getCondition(), array('context', 'request')); - - if (false !== strpos($expression, '$request')) { - $conditions[] = '($request = $request ?? $this->request ?: $this->createRequest($pathinfo))'; - } - $conditions[] = $expression; - } - - if (!$checkHost || !$compiledRoute->getHostRegex()) { - // no-op - } elseif ($hostMatches) { - $conditions[] = sprintf('preg_match(%s, $host, $hostMatches)', self::export($compiledRoute->getHostRegex())); - } else { - $conditions[] = sprintf('%s === $host', self::export($route->getHost())); - } - - $conditions = implode(' && ', $conditions); - - if ($conditions) { - $code .= <<getDefaults(); + if (isset($defaults['_canonical_route'])) { $name = $defaults['_canonical_route']; unset($defaults['_canonical_route']); } - // optimize parameters array - if ($matches || $hostMatches) { - $vars = array("array('_route' => '$name')"); - if ($matches || ($hostMatches && !$checkHost)) { - $vars[] = '$matches'; - } - if ($hostMatches && $checkHost) { - $vars[] = '$hostMatches'; - } - - $code .= sprintf( - " \$ret = \$this->mergeDefaults(%s, %s);\n", - implode(' + ', $vars), - self::export($defaults) - ); - } elseif ($defaults) { - $code .= sprintf(" \$ret = %s;\n", self::export(array('_route' => $name) + $defaults)); + if ($condition = $route->getCondition()) { + $condition = $this->getExpressionLanguage()->compile($condition, array('context', 'request')); + $condition = $conditions[$condition] ?? $conditions[$condition] = (false !== strpos($condition, '$request') ? 1 : -1) * \count($conditions); } else { - $code .= sprintf(" \$ret = array('_route' => '%s');\n", $name); + $condition = 'null'; } - if ($methods) { - $methodVariable = isset($methods['GET']) ? '$canonicalMethod' : '$requestMethod'; - $methods = self::export($methods); - } - - if ($schemes = $route->getSchemes()) { - $schemes = self::export(array_flip($schemes)); - if ($methods) { - $code .= <<getScheme()]); - if (!isset((\$a = {$methods})[{$methodVariable}])) { - if (\$hasRequiredScheme) { - \$allow += \$a; - } - goto $gotoname; - } - if (!\$hasRequiredScheme) { - \$allowSchemes += \$requiredSchemes; - goto $gotoname; - } - - -EOF; - } else { - $code .= <<getScheme()])) { - \$allowSchemes += \$requiredSchemes; - goto $gotoname; - } - - -EOF; - } - } elseif ($methods) { - $code .= <<indent($code) : $code; + return sprintf( + " array(%s, %s, %s, %s, %s, %s),\n", + self::export(array('_route' => $name) + $defaults), + self::export($vars), + self::export(array_flip($route->getMethods()) ?: null), + self::export(array_flip($route->getSchemes()) ?: null), + self::export($hasTrailingSlash), + $condition + ); } private function getExpressionLanguage() { if (null === $this->expressionLanguage) { if (!class_exists('Symfony\Component\ExpressionLanguage\ExpressionLanguage')) { - throw new \RuntimeException('Unable to use expressions as the Symfony ExpressionLanguage component is not installed.'); + throw new \LogicException('Unable to use expressions as the Symfony ExpressionLanguage component is not installed.'); } $this->expressionLanguage = new ExpressionLanguage(null, $this->expressionLanguageProviders); } @@ -734,6 +443,8 @@ EOF; private function indent($code, $level = 1) { + $code = preg_replace('/ => array\(\n (array\(.+),\n\),/', ' => array($1),', $code); + return preg_replace('/^./m', str_repeat(' ', $level).'$0', $code); } diff --git a/vendor/symfony/routing/Matcher/Dumper/PhpMatcherTrait.php b/vendor/symfony/routing/Matcher/Dumper/PhpMatcherTrait.php new file mode 100644 index 000000000..85c8cba8b --- /dev/null +++ b/vendor/symfony/routing/Matcher/Dumper/PhpMatcherTrait.php @@ -0,0 +1,181 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Matcher\Dumper; + +use Symfony\Component\Routing\Exception\MethodNotAllowedException; +use Symfony\Component\Routing\Exception\NoConfigurationException; +use Symfony\Component\Routing\Exception\ResourceNotFoundException; +use Symfony\Component\Routing\Matcher\RedirectableUrlMatcherInterface; + +/** + * @author Nicolas Grekas + * + * @internal + */ +trait PhpMatcherTrait +{ + private $matchHost = false; + private $staticRoutes = array(); + private $regexpList = array(); + private $dynamicRoutes = array(); + private $checkCondition; + + public function match($pathinfo) + { + $allow = $allowSchemes = array(); + if ($ret = $this->doMatch($pathinfo, $allow, $allowSchemes)) { + return $ret; + } + if ($allow) { + throw new MethodNotAllowedException(array_keys($allow)); + } + if (!$this instanceof RedirectableUrlMatcherInterface) { + throw new ResourceNotFoundException(); + } + if (!\in_array($this->context->getMethod(), array('HEAD', 'GET'), true)) { + // no-op + } elseif ($allowSchemes) { + redirect_scheme: + $scheme = $this->context->getScheme(); + $this->context->setScheme(key($allowSchemes)); + try { + if ($ret = $this->doMatch($pathinfo)) { + return $this->redirect($pathinfo, $ret['_route'], $this->context->getScheme()) + $ret; + } + } finally { + $this->context->setScheme($scheme); + } + } elseif ('/' !== $pathinfo) { + $pathinfo = '/' !== $pathinfo[-1] ? $pathinfo.'/' : substr($pathinfo, 0, -1); + if ($ret = $this->doMatch($pathinfo, $allow, $allowSchemes)) { + return $this->redirect($pathinfo, $ret['_route']) + $ret; + } + if ($allowSchemes) { + goto redirect_scheme; + } + } + + throw new ResourceNotFoundException(); + } + + private function doMatch(string $rawPathinfo, array &$allow = array(), array &$allowSchemes = array()): array + { + $allow = $allowSchemes = array(); + $pathinfo = rawurldecode($rawPathinfo) ?: '/'; + $context = $this->context; + $requestMethod = $canonicalMethod = $context->getMethod(); + $trimmedPathinfo = '/' !== $pathinfo && '/' === $pathinfo[-1] ? substr($pathinfo, 0, -1) : $pathinfo; + + if ($this->matchHost) { + $host = strtolower($context->getHost()); + } + + if ('HEAD' === $requestMethod) { + $canonicalMethod = 'GET'; + } + + foreach ($this->staticRoutes[$trimmedPathinfo] ?? array() as list($ret, $requiredHost, $requiredMethods, $requiredSchemes, $hasTrailingSlash, $condition)) { + if ($condition && !($this->checkCondition)($condition, $context, 0 < $condition ? $request ?? $request = $this->request ?: $this->createRequest($pathinfo) : null)) { + continue; + } + + if ('/' === $pathinfo || $hasTrailingSlash === ('/' === $pathinfo[-1])) { + // no-op + } elseif ($this instanceof RedirectableUrlMatcherInterface && (!$requiredMethods || isset($requiredMethods['GET'])) && 'GET' === $canonicalMethod) { + return $allow = $allowSchemes = array(); + } else { + continue; + } + + if ($requiredHost) { + if ('#' !== $requiredHost[0] ? $requiredHost !== $host : !preg_match($requiredHost, $host, $hostMatches)) { + continue; + } + if ('#' === $requiredHost[0] && $hostMatches) { + $hostMatches['_route'] = $ret['_route']; + $ret = $this->mergeDefaults($hostMatches, $ret); + } + } + + $hasRequiredScheme = !$requiredSchemes || isset($requiredSchemes[$context->getScheme()]); + if ($requiredMethods && !isset($requiredMethods[$canonicalMethod]) && !isset($requiredMethods[$requestMethod])) { + if ($hasRequiredScheme) { + $allow += $requiredMethods; + } + continue; + } + if (!$hasRequiredScheme) { + $allowSchemes += $requiredSchemes; + continue; + } + + return $ret; + } + + $matchedPathinfo = $this->matchHost ? $host.'.'.$pathinfo : $pathinfo; + + foreach ($this->regexpList as $offset => $regex) { + while (preg_match($regex, $matchedPathinfo, $matches)) { + foreach ($this->dynamicRoutes[$m = (int) $matches['MARK']] as list($ret, $vars, $requiredMethods, $requiredSchemes, $hasTrailingSlash, $condition)) { + if ($condition && !($this->checkCondition)($condition, $context, 0 < $condition ? $request ?? $request = $this->request ?: $this->createRequest($pathinfo) : null)) { + continue; + } + + if ('/' !== $pathinfo) { + if ('/' === $pathinfo[-1]) { + if (preg_match($regex, substr($pathinfo, 0, -1), $n) && $m === (int) $n['MARK']) { + $matches = $n; + } else { + $hasTrailingSlash = true; + } + } + if ($hasTrailingSlash !== ('/' === $pathinfo[-1])) { + if ($this instanceof RedirectableUrlMatcherInterface && (!$requiredMethods || isset($requiredMethods['GET'])) && 'GET' === $canonicalMethod) { + return $allow = $allowSchemes = array(); + } + continue; + } + } + + foreach ($vars as $i => $v) { + if (isset($matches[1 + $i])) { + $ret[$v] = $matches[1 + $i]; + } + } + + $hasRequiredScheme = !$requiredSchemes || isset($requiredSchemes[$context->getScheme()]); + if ($requiredMethods && !isset($requiredMethods[$canonicalMethod]) && !isset($requiredMethods[$requestMethod])) { + if ($hasRequiredScheme) { + $allow += $requiredMethods; + } + continue; + } + if (!$hasRequiredScheme) { + $allowSchemes += $requiredSchemes; + continue; + } + + return $ret; + } + + $regex = substr_replace($regex, 'F', $m - $offset, 1 + \strlen($m)); + $offset += \strlen($m); + } + } + + if ('/' === $pathinfo && !$allow && !$allowSchemes) { + throw new NoConfigurationException(); + } + + return array(); + } +} diff --git a/vendor/symfony/routing/Matcher/UrlMatcher.php b/vendor/symfony/routing/Matcher/UrlMatcher.php index 095e6dc2d..0d5d14da5 100644 --- a/vendor/symfony/routing/Matcher/UrlMatcher.php +++ b/vendor/symfony/routing/Matcher/UrlMatcher.php @@ -130,16 +130,55 @@ class UrlMatcher implements UrlMatcherInterface, RequestMatcherInterface */ protected function matchCollection($pathinfo, RouteCollection $routes) { + // HEAD and GET are equivalent as per RFC + if ('HEAD' === $method = $this->context->getMethod()) { + $method = 'GET'; + } + $supportsTrailingSlash = '/' !== $pathinfo && '' !== $pathinfo && $this instanceof RedirectableUrlMatcherInterface; + foreach ($routes as $name => $route) { $compiledRoute = $route->compile(); + $staticPrefix = $compiledRoute->getStaticPrefix(); + $requiredMethods = $route->getMethods(); // check the static prefix of the URL first. Only use the more expensive preg_match when it matches - if ('' !== $compiledRoute->getStaticPrefix() && 0 !== strpos($pathinfo, $compiledRoute->getStaticPrefix())) { + if ('' === $staticPrefix || 0 === strpos($pathinfo, $staticPrefix)) { + // no-op + } elseif (!$supportsTrailingSlash || ($requiredMethods && !\in_array('GET', $requiredMethods)) || 'GET' !== $method) { + continue; + } elseif ('/' === $staticPrefix[-1] && substr($staticPrefix, 0, -1) === $pathinfo) { + return $this->allow = $this->allowSchemes = array(); + } elseif ('/' === $pathinfo[-1] && substr($pathinfo, 0, -1) === $staticPrefix) { + return $this->allow = $this->allowSchemes = array(); + } else { + continue; + } + $regex = $compiledRoute->getRegex(); + + if ($supportsTrailingSlash) { + $pos = strrpos($regex, '$'); + $hasTrailingSlash = '/' === $regex[$pos - 1]; + $regex = substr_replace($regex, '/?$', $pos - $hasTrailingSlash, 1 + $hasTrailingSlash); + } + + if (!preg_match($regex, $pathinfo, $matches)) { continue; } - if (!preg_match($compiledRoute->getRegex(), $pathinfo, $matches)) { - continue; + if ($supportsTrailingSlash) { + if ('/' === $pathinfo[-1]) { + if (preg_match($regex, substr($pathinfo, 0, -1), $m)) { + $matches = $m; + } else { + $hasTrailingSlash = true; + } + } + if ($hasTrailingSlash !== ('/' === $pathinfo[-1])) { + if ((!$requiredMethods || \in_array('GET', $requiredMethods)) && 'GET' === $method) { + return $this->allow = $this->allowSchemes = array(); + } + continue; + } } $hostMatches = array(); @@ -154,12 +193,7 @@ class UrlMatcher implements UrlMatcherInterface, RequestMatcherInterface } $hasRequiredScheme = !$route->getSchemes() || $route->hasScheme($this->context->getScheme()); - if ($requiredMethods = $route->getMethods()) { - // HEAD and GET are equivalent as per RFC - if ('HEAD' === $method = $this->context->getMethod()) { - $method = 'GET'; - } - + if ($requiredMethods) { if (!\in_array($method, $requiredMethods)) { if ($hasRequiredScheme) { $this->allow = array_merge($this->allow, $requiredMethods); @@ -177,6 +211,8 @@ class UrlMatcher implements UrlMatcherInterface, RequestMatcherInterface return $this->getAttributes($route, $name, array_replace($matches, $hostMatches, isset($status[1]) ? $status[1] : array())); } + + return array(); } /** @@ -246,7 +282,7 @@ class UrlMatcher implements UrlMatcherInterface, RequestMatcherInterface { if (null === $this->expressionLanguage) { if (!class_exists('Symfony\Component\ExpressionLanguage\ExpressionLanguage')) { - throw new \RuntimeException('Unable to use expressions as the Symfony ExpressionLanguage component is not installed.'); + throw new \LogicException('Unable to use expressions as the Symfony ExpressionLanguage component is not installed.'); } $this->expressionLanguage = new ExpressionLanguage(null, $this->expressionLanguageProviders); } diff --git a/vendor/symfony/routing/RouteCollectionBuilder.php b/vendor/symfony/routing/RouteCollectionBuilder.php index eb42887fa..e0f307698 100644 --- a/vendor/symfony/routing/RouteCollectionBuilder.php +++ b/vendor/symfony/routing/RouteCollectionBuilder.php @@ -11,7 +11,7 @@ namespace Symfony\Component\Routing; -use Symfony\Component\Config\Exception\FileLoaderLoadException; +use Symfony\Component\Config\Exception\LoaderLoadException; use Symfony\Component\Config\Loader\LoaderInterface; use Symfony\Component\Config\Resource\ResourceInterface; @@ -54,7 +54,7 @@ class RouteCollectionBuilder * * @return self * - * @throws FileLoaderLoadException + * @throws LoaderLoadException */ public function import($resource, $prefix = '/', $type = null) { @@ -347,7 +347,7 @@ class RouteCollectionBuilder * * @return RouteCollection[] * - * @throws FileLoaderLoadException If no loader is found + * @throws LoaderLoadException If no loader is found */ private function load($resource, string $type = null): array { @@ -362,11 +362,11 @@ class RouteCollectionBuilder } if (null === $resolver = $this->loader->getResolver()) { - throw new FileLoaderLoadException($resource, null, null, null, $type); + throw new LoaderLoadException($resource, null, null, null, $type); } if (false === $loader = $resolver->resolve($resource, $type)) { - throw new FileLoaderLoadException($resource, null, null, null, $type); + throw new LoaderLoadException($resource, null, null, null, $type); } $collections = $loader->load($resource, $type); diff --git a/vendor/symfony/routing/Router.php b/vendor/symfony/routing/Router.php index 56842a4d3..3f4838ea0 100644 --- a/vendor/symfony/routing/Router.php +++ b/vendor/symfony/routing/Router.php @@ -375,7 +375,7 @@ class Router implements RouterInterface, RequestMatcherInterface * Provides the ConfigCache factory implementation, falling back to a * default implementation if necessary. * - * @return ConfigCacheFactoryInterface $configCacheFactory + * @return ConfigCacheFactoryInterface */ private function getConfigCacheFactory() { diff --git a/vendor/symfony/routing/Tests/Fixtures/AnnotationFixtures/InvokableController.php b/vendor/symfony/routing/Tests/Fixtures/AnnotationFixtures/InvokableController.php index b25a0ad92..c70793a81 100644 --- a/vendor/symfony/routing/Tests/Fixtures/AnnotationFixtures/InvokableController.php +++ b/vendor/symfony/routing/Tests/Fixtures/AnnotationFixtures/InvokableController.php @@ -5,7 +5,7 @@ namespace Symfony\Component\Routing\Tests\Fixtures\AnnotationFixtures; use Symfony\Component\Routing\Annotation\Route; /** - * @Route("/here", name="lol") + * @Route("/here", name="lol", methods={"GET", "POST"}, schemes={"https"}) */ class InvokableController { diff --git a/vendor/symfony/routing/Tests/Fixtures/AnnotationFixtures/RequirementsWithoutPlaceholderNameController.php b/vendor/symfony/routing/Tests/Fixtures/AnnotationFixtures/RequirementsWithoutPlaceholderNameController.php new file mode 100644 index 000000000..301f9691d --- /dev/null +++ b/vendor/symfony/routing/Tests/Fixtures/AnnotationFixtures/RequirementsWithoutPlaceholderNameController.php @@ -0,0 +1,27 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Routing\Tests\Fixtures\AnnotationFixtures; + +use Symfony\Component\Routing\Annotation\Route; + +/** + * @Route("/", requirements={"foo", "\d+"}) + */ +class RequirementsWithoutPlaceholderNameController +{ + /** + * @Route("/{foo}", name="foo", requirements={"foo", "\d+"}) + */ + public function foo() + { + } +} diff --git a/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher0.php b/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher0.php index e7c076500..e1466356f 100644 --- a/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher0.php +++ b/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher0.php @@ -1,7 +1,6 @@ context = $context; } - - public function match($rawPathinfo) - { - $allow = $allowSchemes = array(); - $pathinfo = rawurldecode($rawPathinfo); - $context = $this->context; - $requestMethod = $canonicalMethod = $context->getMethod(); - - if ('HEAD' === $requestMethod) { - $canonicalMethod = 'GET'; - } - - if ('/' === $pathinfo && !$allow && !$allowSchemes) { - throw new Symfony\Component\Routing\Exception\NoConfigurationException(); - } - - throw $allow ? new MethodNotAllowedException(array_keys($allow)) : new ResourceNotFoundException(); - } } diff --git a/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher1.php b/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher1.php index 68e7741b5..ce1201a59 100644 --- a/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher1.php +++ b/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher1.php @@ -1,7 +1,6 @@ context = $context; - } - - public function match($rawPathinfo) - { - $allow = $allowSchemes = array(); - $pathinfo = rawurldecode($rawPathinfo); - $context = $this->context; - $requestMethod = $canonicalMethod = $context->getMethod(); - $host = strtolower($context->getHost()); - - if ('HEAD' === $requestMethod) { - $canonicalMethod = 'GET'; - } - - switch ($pathinfo) { - default: - $routes = array( - '/test/baz' => array(array('_route' => 'baz'), null, null, null), - '/test/baz.html' => array(array('_route' => 'baz2'), null, null, null), - '/test/baz3/' => array(array('_route' => 'baz3'), null, null, null), - '/foofoo' => array(array('_route' => 'foofoo', 'def' => 'test'), null, null, null), - '/spa ce' => array(array('_route' => 'space'), null, null, null), - '/multi/new' => array(array('_route' => 'overridden2'), null, null, null), - '/multi/hey/' => array(array('_route' => 'hey'), null, null, null), - '/ababa' => array(array('_route' => 'ababa'), null, null, null), - '/route1' => array(array('_route' => 'route1'), 'a.example.com', null, null), - '/c2/route2' => array(array('_route' => 'route2'), 'a.example.com', null, null), - '/route4' => array(array('_route' => 'route4'), 'a.example.com', null, null), - '/c2/route3' => array(array('_route' => 'route3'), 'b.example.com', null, null), - '/route5' => array(array('_route' => 'route5'), 'c.example.com', null, null), - '/route6' => array(array('_route' => 'route6'), null, null, null), - '/route11' => array(array('_route' => 'route11'), '#^(?P[^\\.]++)\\.example\\.com$#sDi', null, null), - '/route12' => array(array('_route' => 'route12', 'var1' => 'val'), '#^(?P[^\\.]++)\\.example\\.com$#sDi', null, null), - '/route17' => array(array('_route' => 'route17'), null, null, null), - ); - - if (!isset($routes[$pathinfo])) { - break; - } - list($ret, $requiredHost, $requiredMethods, $requiredSchemes) = $routes[$pathinfo]; - - if ($requiredHost) { - if ('#' !== $requiredHost[0] ? $requiredHost !== $host : !preg_match($requiredHost, $host, $hostMatches)) { - break; - } - if ('#' === $requiredHost[0] && $hostMatches) { - $hostMatches['_route'] = $ret['_route']; - $ret = $this->mergeDefaults($hostMatches, $ret); - } - } - - $hasRequiredScheme = !$requiredSchemes || isset($requiredSchemes[$context->getScheme()]); - if ($requiredMethods && !isset($requiredMethods[$canonicalMethod]) && !isset($requiredMethods[$requestMethod])) { - if ($hasRequiredScheme) { - $allow += $requiredMethods; - } - break; - } - if (!$hasRequiredScheme) { - $allowSchemes += $requiredSchemes; - break; - } - - return $ret; - } - - $matchedPathinfo = $host.'.'.$pathinfo; - $regexList = array( + $this->matchHost = true; + $this->staticRoutes = array( + '/test/baz' => array(array(array('_route' => 'baz'), null, null, null, false, null)), + '/test/baz.html' => array(array(array('_route' => 'baz2'), null, null, null, false, null)), + '/test/baz3' => array(array(array('_route' => 'baz3'), null, null, null, true, null)), + '/foofoo' => array(array(array('_route' => 'foofoo', 'def' => 'test'), null, null, null, false, null)), + '/spa ce' => array(array(array('_route' => 'space'), null, null, null, false, null)), + '/multi/new' => array(array(array('_route' => 'overridden2'), null, null, null, false, null)), + '/multi/hey' => array(array(array('_route' => 'hey'), null, null, null, true, null)), + '/ababa' => array(array(array('_route' => 'ababa'), null, null, null, false, null)), + '/route1' => array(array(array('_route' => 'route1'), 'a.example.com', null, null, false, null)), + '/c2/route2' => array(array(array('_route' => 'route2'), 'a.example.com', null, null, false, null)), + '/route4' => array(array(array('_route' => 'route4'), 'a.example.com', null, null, false, null)), + '/c2/route3' => array(array(array('_route' => 'route3'), 'b.example.com', null, null, false, null)), + '/route5' => array(array(array('_route' => 'route5'), 'c.example.com', null, null, false, null)), + '/route6' => array(array(array('_route' => 'route6'), null, null, null, false, null)), + '/route11' => array(array(array('_route' => 'route11'), '#^(?P[^\\.]++)\\.example\\.com$#sDi', null, null, false, null)), + '/route12' => array(array(array('_route' => 'route12', 'var1' => 'val'), '#^(?P[^\\.]++)\\.example\\.com$#sDi', null, null, false, null)), + '/route17' => array(array(array('_route' => 'route17'), null, null, null, false, null)), + ); + $this->regexpList = array( 0 => '{^(?' .'|(?:(?:[^./]*+\\.)++)(?' .'|/foo/(baz|symfony)(*:47)' @@ -88,160 +42,72 @@ class ProjectUrlMatcher extends Symfony\Component\Routing\Matcher\UrlMatcher .'|/([^/]++)(*:70)' .'|head/([^/]++)(*:90)' .')' - .'|/test/([^/]++)/(?' - .'|(*:116)' + .'|/test/([^/]++)(?' + .'|(*:115)' .')' - .'|/([\']+)(*:132)' + .'|/([\']+)(*:131)' .'|/a/(?' .'|b\'b/([^/]++)(?' - .'|(*:161)' - .'|(*:169)' + .'|(*:160)' + .'|(*:168)' .')' - .'|(.*)(*:182)' + .'|(.*)(*:181)' .'|b\'b/([^/]++)(?' - .'|(*:205)' - .'|(*:213)' + .'|(*:204)' + .'|(*:212)' .')' .')' - .'|/multi/hello(?:/([^/]++))?(*:249)' + .'|/multi/hello(?:/([^/]++))?(*:248)' .'|/([^/]++)/b/([^/]++)(?' - .'|(*:280)' - .'|(*:288)' + .'|(*:279)' + .'|(*:287)' .')' - .'|/aba/([^/]++)(*:310)' + .'|/aba/([^/]++)(*:309)' .')|(?i:([^\\.]++)\\.example\\.com)\\.(?' .'|/route1(?' - .'|3/([^/]++)(*:372)' - .'|4/([^/]++)(*:390)' + .'|3/([^/]++)(*:371)' + .'|4/([^/]++)(*:389)' .')' .')|(?i:c\\.example\\.com)\\.(?' - .'|/route15/([^/]++)(*:442)' + .'|/route15/([^/]++)(*:441)' .')|(?:(?:[^./]*+\\.)++)(?' - .'|/route16/([^/]++)(*:490)' + .'|/route16/([^/]++)(*:489)' .'|/a/(?' - .'|a\\.\\.\\.(*:511)' + .'|a\\.\\.\\.(*:510)' .'|b/(?' - .'|([^/]++)(*:532)' - .'|c/([^/]++)(*:550)' + .'|([^/]++)(*:531)' + .'|c/([^/]++)(*:549)' .')' .')' .')' - .')$}sD', + .')(?:/?)$}sD', + ); + $this->dynamicRoutes = array( + 47 => array(array(array('_route' => 'foo', 'def' => 'test'), array('bar'), null, null, false, null)), + 70 => array(array(array('_route' => 'bar'), array('foo'), array('GET' => 0, 'HEAD' => 1), null, false, null)), + 90 => array(array(array('_route' => 'barhead'), array('foo'), array('GET' => 0), null, false, null)), + 115 => array( + array(array('_route' => 'baz4'), array('foo'), null, null, true, null), + array(array('_route' => 'baz5'), array('foo'), array('POST' => 0), null, true, null), + array(array('_route' => 'baz.baz6'), array('foo'), array('PUT' => 0), null, true, null), + ), + 131 => array(array(array('_route' => 'quoter'), array('quoter'), null, null, false, null)), + 160 => array(array(array('_route' => 'foo1'), array('foo'), array('PUT' => 0), null, false, null)), + 168 => array(array(array('_route' => 'bar1'), array('bar'), null, null, false, null)), + 181 => array(array(array('_route' => 'overridden'), array('var'), null, null, false, null)), + 204 => array(array(array('_route' => 'foo2'), array('foo1'), null, null, false, null)), + 212 => array(array(array('_route' => 'bar2'), array('bar1'), null, null, false, null)), + 248 => array(array(array('_route' => 'helloWorld', 'who' => 'World!'), array('who'), null, null, false, null)), + 279 => array(array(array('_route' => 'foo3'), array('_locale', 'foo'), null, null, false, null)), + 287 => array(array(array('_route' => 'bar3'), array('_locale', 'bar'), null, null, false, null)), + 309 => array(array(array('_route' => 'foo4'), array('foo'), null, null, false, null)), + 371 => array(array(array('_route' => 'route13'), array('var1', 'name'), null, null, false, null)), + 389 => array(array(array('_route' => 'route14', 'var1' => 'val'), array('var1', 'name'), null, null, false, null)), + 441 => array(array(array('_route' => 'route15'), array('name'), null, null, false, null)), + 489 => array(array(array('_route' => 'route16', 'var1' => 'val'), array('name'), null, null, false, null)), + 510 => array(array(array('_route' => 'a'), array(), null, null, false, null)), + 531 => array(array(array('_route' => 'b'), array('var'), null, null, false, null)), + 549 => array(array(array('_route' => 'c'), array('var'), null, null, false, null)), ); - - foreach ($regexList as $offset => $regex) { - while (preg_match($regex, $matchedPathinfo, $matches)) { - switch ($m = (int) $matches['MARK']) { - case 116: - $matches = array('foo' => $matches[1] ?? null); - - // baz4 - return $this->mergeDefaults(array('_route' => 'baz4') + $matches, array()); - - // baz5 - $ret = $this->mergeDefaults(array('_route' => 'baz5') + $matches, array()); - if (!isset(($a = array('POST' => 0))[$requestMethod])) { - $allow += $a; - goto not_baz5; - } - - return $ret; - not_baz5: - - // baz.baz6 - $ret = $this->mergeDefaults(array('_route' => 'baz.baz6') + $matches, array()); - if (!isset(($a = array('PUT' => 0))[$requestMethod])) { - $allow += $a; - goto not_bazbaz6; - } - - return $ret; - not_bazbaz6: - - break; - case 161: - $matches = array('foo' => $matches[1] ?? null); - - // foo1 - $ret = $this->mergeDefaults(array('_route' => 'foo1') + $matches, array()); - if (!isset(($a = array('PUT' => 0))[$requestMethod])) { - $allow += $a; - goto not_foo1; - } - - return $ret; - not_foo1: - - break; - case 205: - $matches = array('foo1' => $matches[1] ?? null); - - // foo2 - return $this->mergeDefaults(array('_route' => 'foo2') + $matches, array()); - - break; - case 280: - $matches = array('_locale' => $matches[1] ?? null, 'foo' => $matches[2] ?? null); - - // foo3 - return $this->mergeDefaults(array('_route' => 'foo3') + $matches, array()); - - break; - default: - $routes = array( - 47 => array(array('_route' => 'foo', 'def' => 'test'), array('bar'), null, null), - 70 => array(array('_route' => 'bar'), array('foo'), array('GET' => 0, 'HEAD' => 1), null), - 90 => array(array('_route' => 'barhead'), array('foo'), array('GET' => 0), null), - 132 => array(array('_route' => 'quoter'), array('quoter'), null, null), - 169 => array(array('_route' => 'bar1'), array('bar'), null, null), - 182 => array(array('_route' => 'overridden'), array('var'), null, null), - 213 => array(array('_route' => 'bar2'), array('bar1'), null, null), - 249 => array(array('_route' => 'helloWorld', 'who' => 'World!'), array('who'), null, null), - 288 => array(array('_route' => 'bar3'), array('_locale', 'bar'), null, null), - 310 => array(array('_route' => 'foo4'), array('foo'), null, null), - 372 => array(array('_route' => 'route13'), array('var1', 'name'), null, null), - 390 => array(array('_route' => 'route14', 'var1' => 'val'), array('var1', 'name'), null, null), - 442 => array(array('_route' => 'route15'), array('name'), null, null), - 490 => array(array('_route' => 'route16', 'var1' => 'val'), array('name'), null, null), - 511 => array(array('_route' => 'a'), array(), null, null), - 532 => array(array('_route' => 'b'), array('var'), null, null), - 550 => array(array('_route' => 'c'), array('var'), null, null), - ); - - list($ret, $vars, $requiredMethods, $requiredSchemes) = $routes[$m]; - - foreach ($vars as $i => $v) { - if (isset($matches[1 + $i])) { - $ret[$v] = $matches[1 + $i]; - } - } - - $hasRequiredScheme = !$requiredSchemes || isset($requiredSchemes[$context->getScheme()]); - if ($requiredMethods && !isset($requiredMethods[$canonicalMethod]) && !isset($requiredMethods[$requestMethod])) { - if ($hasRequiredScheme) { - $allow += $requiredMethods; - } - break; - } - if (!$hasRequiredScheme) { - $allowSchemes += $requiredSchemes; - break; - } - - return $ret; - } - - if (550 === $m) { - break; - } - $regex = substr_replace($regex, 'F', $m - $offset, 1 + strlen($m)); - $offset += strlen($m); - } - } - if ('/' === $pathinfo && !$allow && !$allowSchemes) { - throw new Symfony\Component\Routing\Exception\NoConfigurationException(); - } - - throw $allow ? new MethodNotAllowedException(array_keys($allow)) : new ResourceNotFoundException(); } } diff --git a/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher10.php b/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher10.php index 2f5cc3fc5..d1a6caed8 100644 --- a/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher10.php +++ b/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher10.php @@ -1,7 +1,6 @@ context = $context; - } - - public function match($rawPathinfo) - { - $allow = $allowSchemes = array(); - $pathinfo = rawurldecode($rawPathinfo); - $context = $this->context; - $requestMethod = $canonicalMethod = $context->getMethod(); - - if ('HEAD' === $requestMethod) { - $canonicalMethod = 'GET'; - } - - $matchedPathinfo = $pathinfo; - $regexList = array( + $this->regexpList = array( 0 => '{^(?' .'|/c(?' .'|f(?' @@ -906,7 +893,7 @@ class ProjectUrlMatcher extends Symfony\Component\Routing\Matcher\UrlMatcher .'|1d92b/([^/]++)/([^/]++)/([^/]++)/51d92b(*:24737)' .'|98b3e/([^/]++)/([^/]++)/([^/]++)/598b3e(*:24786)' .')' - .')$}sD', + .')(?:/?)$}sD', 24786 => '{^(?' .'|/5(?' .'|b69b9/([^/]++)/([^/]++)/([^/]++)/5b69b9(*:24837)' @@ -1781,1050 +1768,1009 @@ class ProjectUrlMatcher extends Symfony\Component\Routing\Matcher\UrlMatcher .')' .'|9c9ad/([^/]++)/([^/]++)/([^/]++)/49c9ad(*:49718)' .')' - .')$}sD', + .')(?:/?)$}sD', + ); + $this->dynamicRoutes = array( + 54 => array(array(array('_route' => '_0'), array('a', 'b', 'c'), null, null, false, null)), + 102 => array(array(array('_route' => '_190'), array('a', 'b', 'c'), null, null, false, null)), + 147 => array(array(array('_route' => '_478'), array('a', 'b', 'c'), null, null, false, null)), + 194 => array(array(array('_route' => '_259'), array('a', 'b', 'c'), null, null, false, null)), + 240 => array(array(array('_route' => '_368'), array('a', 'b', 'c'), null, null, false, null)), + 291 => array(array(array('_route' => '_1'), array('a', 'b', 'c'), null, null, false, null)), + 337 => array(array(array('_route' => '_116'), array('a', 'b', 'c'), null, null, false, null)), + 383 => array(array(array('_route' => '_490'), array('a', 'b', 'c'), null, null, false, null)), + 434 => array(array(array('_route' => '_2'), array('a', 'b', 'c'), null, null, false, null)), + 480 => array(array(array('_route' => '_124'), array('a', 'b', 'c'), null, null, false, null)), + 526 => array(array(array('_route' => '_389'), array('a', 'b', 'c'), null, null, false, null)), + 577 => array(array(array('_route' => '_8'), array('a', 'b', 'c'), null, null, false, null)), + 623 => array(array(array('_route' => '_104'), array('a', 'b', 'c'), null, null, false, null)), + 677 => array(array(array('_route' => '_12'), array('a', 'b', 'c'), null, null, false, null)), + 722 => array(array(array('_route' => '_442'), array('a', 'b', 'c'), null, null, false, null)), + 769 => array(array(array('_route' => '_253'), array('a', 'b', 'c'), null, null, false, null)), + 820 => array(array(array('_route' => '_13'), array('a', 'b', 'c'), null, null, false, null)), + 866 => array(array(array('_route' => '_254'), array('a', 'b', 'c'), null, null, false, null)), + 912 => array(array(array('_route' => '_347'), array('a', 'b', 'c'), null, null, false, null)), + 963 => array(array(array('_route' => '_16'), array('a', 'b', 'c'), null, null, false, null)), + 1009 => array(array(array('_route' => '_87'), array('a', 'b', 'c'), null, null, false, null)), + 1058 => array(array(array('_route' => '_31'), array('a', 'b', 'c'), null, null, false, null)), + 1109 => array(array(array('_route' => '_50'), array('a', 'b', 'c'), null, null, false, null)), + 1156 => array(array(array('_route' => '_219'), array('a', 'b', 'c'), null, null, false, null)), + 1203 => array(array(array('_route' => '_332'), array('a', 'b', 'c'), null, null, false, null)), + 1250 => array(array(array('_route' => '_359'), array('a', 'b', 'c'), null, null, false, null)), + 1302 => array(array(array('_route' => '_183'), array('a', 'b', 'c'), null, null, false, null)), + 1349 => array(array(array('_route' => '_500'), array('a', 'b', 'c'), null, null, false, null)), + 1401 => array(array(array('_route' => '_214'), array('a', 'b', 'c'), null, null, false, null)), + 1448 => array(array(array('_route' => '_321'), array('a', 'b', 'c'), null, null, false, null)), + 1497 => array(array(array('_route' => '_243'), array('a', 'b', 'c'), null, null, false, null)), + 1545 => array(array(array('_route' => '_328'), array('a', 'b', 'c'), null, null, false, null)), + 1596 => array(array(array('_route' => '_362'), array('a', 'b', 'c'), null, null, false, null)), + 1643 => array(array(array('_route' => '_488'), array('a', 'b', 'c'), null, null, false, null)), + 1701 => array(array(array('_route' => '_3'), array('a', 'b', 'c'), null, null, false, null)), + 1751 => array(array(array('_route' => '_102'), array('a', 'b', 'c'), null, null, false, null)), + 1797 => array(array(array('_route' => '_220'), array('a', 'b', 'c'), null, null, false, null)), + 1845 => array(array(array('_route' => '_127'), array('a', 'b', 'c'), null, null, false, null)), + 1897 => array(array(array('_route' => '_5'), array('a', 'b', 'c'), null, null, false, null)), + 1944 => array(array(array('_route' => '_242'), array('a', 'b', 'c'), null, null, false, null)), + 1991 => array(array(array('_route' => '_397'), array('a', 'b', 'c'), null, null, false, null)), + 2038 => array(array(array('_route' => '_454'), array('a', 'b', 'c'), null, null, false, null)), + 2090 => array(array(array('_route' => '_34'), array('a', 'b', 'c'), null, null, false, null)), + 2137 => array(array(array('_route' => '_281'), array('a', 'b', 'c'), null, null, false, null)), + 2189 => array(array(array('_route' => '_64'), array('a', 'b', 'c'), null, null, false, null)), + 2236 => array(array(array('_route' => '_205'), array('a', 'b', 'c'), null, null, false, null)), + 2291 => array(array(array('_route' => '_71'), array('a', 'b', 'c'), null, null, false, null)), + 2337 => array(array(array('_route' => '_203'), array('a', 'b', 'c'), null, null, false, null)), + 2385 => array(array(array('_route' => '_97'), array('a', 'b', 'c'), null, null, false, null)), + 2437 => array(array(array('_route' => '_98'), array('a', 'b', 'c'), null, null, false, null)), + 2484 => array(array(array('_route' => '_267'), array('a', 'b', 'c'), null, null, false, null)), + 2531 => array(array(array('_route' => '_309'), array('a', 'b', 'c'), null, null, false, null)), + 2586 => array(array(array('_route' => '_117'), array('a', 'b', 'c'), null, null, false, null)), + 2631 => array(array(array('_route' => '_211'), array('a', 'b', 'c'), null, null, false, null)), + 2679 => array(array(array('_route' => '_484'), array('a', 'b', 'c'), null, null, false, null)), + 2731 => array(array(array('_route' => '_139'), array('a', 'b', 'c'), null, null, false, null)), + 2778 => array(array(array('_route' => '_421'), array('a', 'b', 'c'), null, null, false, null)), + 2830 => array(array(array('_route' => '_185'), array('a', 'b', 'c'), null, null, false, null)), + 2877 => array(array(array('_route' => '_439'), array('a', 'b', 'c'), null, null, false, null)), + 2926 => array(array(array('_route' => '_218'), array('a', 'b', 'c'), null, null, false, null)), + 2977 => array(array(array('_route' => '_233'), array('a', 'b', 'c'), null, null, false, null)), + 3024 => array(array(array('_route' => '_483'), array('a', 'b', 'c'), null, null, false, null)), + 3073 => array(array(array('_route' => '_265'), array('a', 'b', 'c'), null, null, false, null)), + 3124 => array(array(array('_route' => '_299'), array('a', 'b', 'c'), null, null, false, null)), + 3171 => array(array(array('_route' => '_351'), array('a', 'b', 'c'), null, null, false, null)), + 3218 => array(array(array('_route' => '_472'), array('a', 'b', 'c'), null, null, false, null)), + 3267 => array(array(array('_route' => '_360'), array('a', 'b', 'c'), null, null, false, null)), + 3315 => array(array(array('_route' => '_466'), array('a', 'b', 'c'), null, null, false, null)), + 3372 => array(array(array('_route' => '_4'), array('a', 'b', 'c'), null, null, false, null)), + 3419 => array(array(array('_route' => '_142'), array('a', 'b', 'c'), null, null, false, null)), + 3466 => array(array(array('_route' => '_151'), array('a', 'b', 'c'), null, null, false, null)), + 3513 => array(array(array('_route' => '_308'), array('a', 'b', 'c'), null, null, false, null)), + 3560 => array(array(array('_route' => '_440'), array('a', 'b', 'c'), null, null, false, null)), + 3612 => array(array(array('_route' => '_14'), array('a', 'b', 'c'), null, null, false, null)), + 3659 => array(array(array('_route' => '_358'), array('a', 'b', 'c'), null, null, false, null)), + 3711 => array(array(array('_route' => '_37'), array('a', 'b', 'c'), null, null, false, null)), + 3758 => array(array(array('_route' => '_38'), array('a', 'b', 'c'), null, null, false, null)), + 3805 => array(array(array('_route' => '_146'), array('a', 'b', 'c'), null, null, false, null)), + 3852 => array(array(array('_route' => '_194'), array('a', 'b', 'c'), null, null, false, null)), + 3899 => array(array(array('_route' => '_487'), array('a', 'b', 'c'), null, null, false, null)), + 3948 => array(array(array('_route' => '_42'), array('a', 'b', 'c'), null, null, false, null)), + 3999 => array(array(array('_route' => '_54'), array('a', 'b', 'c'), null, null, false, null)), + 4046 => array(array(array('_route' => '_326'), array('a', 'b', 'c'), null, null, false, null)), + 4098 => array(array(array('_route' => '_68'), array('a', 'b', 'c'), null, null, false, null)), + 4145 => array(array(array('_route' => '_108'), array('a', 'b', 'c'), null, null, false, null)), + 4197 => array(array(array('_route' => '_74'), array('a', 'b', 'c'), null, null, false, null)), + 4244 => array(array(array('_route' => '_315'), array('a', 'b', 'c'), null, null, false, null)), + 4291 => array(array(array('_route' => '_374'), array('a', 'b', 'c'), null, null, false, null)), + 4343 => array(array(array('_route' => '_99'), array('a', 'b', 'c'), null, null, false, null)), + 4390 => array(array(array('_route' => '_238'), array('a', 'b', 'c'), null, null, false, null)), + 4442 => array(array(array('_route' => '_107'), array('a', 'b', 'c'), null, null, false, null)), + 4489 => array(array(array('_route' => '_409'), array('a', 'b', 'c'), null, null, false, null)), + 4541 => array(array(array('_route' => '_122'), array('a', 'b', 'c'), null, null, false, null)), + 4588 => array(array(array('_route' => '_379'), array('a', 'b', 'c'), null, null, false, null)), + 4635 => array(array(array('_route' => '_390'), array('a', 'b', 'c'), null, null, false, null)), + 4687 => array(array(array('_route' => '_171'), array('a', 'b', 'c'), null, null, false, null)), + 4734 => array(array(array('_route' => '_260'), array('a', 'b', 'c'), null, null, false, null)), + 4781 => array(array(array('_route' => '_434'), array('a', 'b', 'c'), null, null, false, null)), + 4830 => array(array(array('_route' => '_189'), array('a', 'b', 'c'), null, null, false, null)), + 4878 => array(array(array('_route' => '_467'), array('a', 'b', 'c'), null, null, false, null)), + 4935 => array(array(array('_route' => '_6'), array('a', 'b', 'c'), null, null, false, null)), + 4982 => array(array(array('_route' => '_286'), array('a', 'b', 'c'), null, null, false, null)), + 5029 => array(array(array('_route' => '_438'), array('a', 'b', 'c'), null, null, false, null)), + 5081 => array(array(array('_route' => '_19'), array('a', 'b', 'c'), null, null, false, null)), + 5131 => array(array(array('_route' => '_24'), array('a', 'b', 'c'), null, null, false, null)), + 5177 => array(array(array('_route' => '_172'), array('a', 'b', 'c'), null, null, false, null)), + 5230 => array(array(array('_route' => '_33'), array('a', 'b', 'c'), null, null, false, null)), + 5277 => array(array(array('_route' => '_400'), array('a', 'b', 'c'), null, null, false, null)), + 5324 => array(array(array('_route' => '_427'), array('a', 'b', 'c'), null, null, false, null)), + 5376 => array(array(array('_route' => '_35'), array('a', 'b', 'c'), null, null, false, null)), + 5423 => array(array(array('_route' => '_156'), array('a', 'b', 'c'), null, null, false, null)), + 5475 => array(array(array('_route' => '_36'), array('a', 'b', 'c'), null, null, false, null)), + 5522 => array(array(array('_route' => '_251'), array('a', 'b', 'c'), null, null, false, null)), + 5574 => array(array(array('_route' => '_43'), array('a', 'b', 'c'), null, null, false, null)), + 5621 => array(array(array('_route' => '_292'), array('a', 'b', 'c'), null, null, false, null)), + 5668 => array(array(array('_route' => '_411'), array('a', 'b', 'c'), null, null, false, null)), + 5720 => array(array(array('_route' => '_69'), array('a', 'b', 'c'), null, null, false, null)), + 5767 => array(array(array('_route' => '_159'), array('a', 'b', 'c'), null, null, false, null)), + 5814 => array(array(array('_route' => '_170'), array('a', 'b', 'c'), null, null, false, null)), + 5861 => array(array(array('_route' => '_376'), array('a', 'b', 'c'), null, null, false, null)), + 5913 => array(array(array('_route' => '_131'), array('a', 'b', 'c'), null, null, false, null)), + 5960 => array(array(array('_route' => '_446'), array('a', 'b', 'c'), null, null, false, null)), + 6015 => array(array(array('_route' => '_140'), array('a', 'b', 'c'), null, null, false, null)), + 6061 => array(array(array('_route' => '_353'), array('a', 'b', 'c'), null, null, false, null)), + 6112 => array(array(array('_route' => '_224'), array('a', 'b', 'c'), null, null, false, null)), + 6158 => array(array(array('_route' => '_346'), array('a', 'b', 'c'), null, null, false, null)), + 6204 => array(array(array('_route' => '_443'), array('a', 'b', 'c'), null, null, false, null)), + 6254 => array(array(array('_route' => '_154'), array('a', 'b', 'c'), null, null, false, null)), + 6305 => array(array(array('_route' => '_212'), array('a', 'b', 'c'), null, null, false, null)), + 6352 => array(array(array('_route' => '_313'), array('a', 'b', 'c'), null, null, false, null)), + 6399 => array(array(array('_route' => '_395'), array('a', 'b', 'c'), null, null, false, null)), + 6446 => array(array(array('_route' => '_441'), array('a', 'b', 'c'), null, null, false, null)), + 6498 => array(array(array('_route' => '_223'), array('a', 'b', 'c'), null, null, false, null)), + 6545 => array(array(array('_route' => '_303'), array('a', 'b', 'c'), null, null, false, null)), + 6594 => array(array(array('_route' => '_410'), array('a', 'b', 'c'), null, null, false, null)), + 6642 => array(array(array('_route' => '_494'), array('a', 'b', 'c'), null, null, false, null)), + 6702 => array(array(array('_route' => '_7'), array('a', 'b', 'c'), null, null, false, null)), + 6748 => array(array(array('_route' => '_268'), array('a', 'b', 'c'), null, null, false, null)), + 6796 => array(array(array('_route' => '_178'), array('a', 'b', 'c'), null, null, false, null)), + 6843 => array(array(array('_route' => '_179'), array('a', 'b', 'c'), null, null, false, null)), + 6890 => array(array(array('_route' => '_416'), array('a', 'b', 'c'), null, null, false, null)), + 6942 => array(array(array('_route' => '_25'), array('a', 'b', 'c'), null, null, false, null)), + 6989 => array(array(array('_route' => '_307'), array('a', 'b', 'c'), null, null, false, null)), + 7036 => array(array(array('_route' => '_387'), array('a', 'b', 'c'), null, null, false, null)), + 7083 => array(array(array('_route' => '_471'), array('a', 'b', 'c'), null, null, false, null)), + 7132 => array(array(array('_route' => '_90'), array('a', 'b', 'c'), null, null, false, null)), + 7183 => array(array(array('_route' => '_95'), array('a', 'b', 'c'), null, null, false, null)), + 7230 => array(array(array('_route' => '_338'), array('a', 'b', 'c'), null, null, false, null)), + 7277 => array(array(array('_route' => '_401'), array('a', 'b', 'c'), null, null, false, null)), + 7329 => array(array(array('_route' => '_147'), array('a', 'b', 'c'), null, null, false, null)), + 7376 => array(array(array('_route' => '_319'), array('a', 'b', 'c'), null, null, false, null)), + 7423 => array(array(array('_route' => '_354'), array('a', 'b', 'c'), null, null, false, null)), + 7470 => array(array(array('_route' => '_428'), array('a', 'b', 'c'), null, null, false, null)), + 7522 => array(array(array('_route' => '_162'), array('a', 'b', 'c'), null, null, false, null)), + 7572 => array(array(array('_route' => '_175'), array('a', 'b', 'c'), null, null, false, null)), + 7618 => array(array(array('_route' => '_455'), array('a', 'b', 'c'), null, null, false, null)), + 7666 => array(array(array('_route' => '_355'), array('a', 'b', 'c'), null, null, false, null)), + 7718 => array(array(array('_route' => '_197'), array('a', 'b', 'c'), null, null, false, null)), + 7768 => array(array(array('_route' => '_202'), array('a', 'b', 'c'), null, null, false, null)), + 7813 => array(array(array('_route' => '_489'), array('a', 'b', 'c'), null, null, false, null)), + 7863 => array(array(array('_route' => '_199'), array('a', 'b', 'c'), null, null, false, null)), + 7914 => array(array(array('_route' => '_263'), array('a', 'b', 'c'), null, null, false, null)), + 7961 => array(array(array('_route' => '_406'), array('a', 'b', 'c'), null, null, false, null)), + 8010 => array(array(array('_route' => '_289'), array('a', 'b', 'c'), null, null, false, null)), + 8058 => array(array(array('_route' => '_325'), array('a', 'b', 'c'), null, null, false, null)), + 8106 => array(array(array('_route' => '_378'), array('a', 'b', 'c'), null, null, false, null)), + 8154 => array(array(array('_route' => '_468'), array('a', 'b', 'c'), null, null, false, null)), + 8211 => array(array(array('_route' => '_9'), array('a', 'b', 'c'), null, null, false, null)), + 8258 => array(array(array('_route' => '_216'), array('a', 'b', 'c'), null, null, false, null)), + 8307 => array(array(array('_route' => '_26'), array('a', 'b', 'c'), null, null, false, null)), + 8355 => array(array(array('_route' => '_62'), array('a', 'b', 'c'), null, null, false, null)), + 8406 => array(array(array('_route' => '_81'), array('a', 'b', 'c'), null, null, false, null)), + 8453 => array(array(array('_route' => '_318'), array('a', 'b', 'c'), null, null, false, null)), + 8505 => array(array(array('_route' => '_121'), array('a', 'b', 'c'), null, null, false, null)), + 8551 => array(array(array('_route' => '_182'), array('a', 'b', 'c'), null, null, false, null)), + 8603 => array(array(array('_route' => '_136'), array('a', 'b', 'c'), null, null, false, null)), + 8650 => array(array(array('_route' => '_415'), array('a', 'b', 'c'), null, null, false, null)), + 8697 => array(array(array('_route' => '_457'), array('a', 'b', 'c'), null, null, false, null)), + 8744 => array(array(array('_route' => '_463'), array('a', 'b', 'c'), null, null, false, null)), + 8796 => array(array(array('_route' => '_148'), array('a', 'b', 'c'), null, null, false, null)), + 8843 => array(array(array('_route' => '_273'), array('a', 'b', 'c'), null, null, false, null)), + 8892 => array(array(array('_route' => '_284'), array('a', 'b', 'c'), null, null, false, null)), + 8940 => array(array(array('_route' => '_288'), array('a', 'b', 'c'), null, null, false, null)), + 8991 => array(array(array('_route' => '_295'), array('a', 'b', 'c'), null, null, false, null)), + 9038 => array(array(array('_route' => '_305'), array('a', 'b', 'c'), null, null, false, null)), + 9085 => array(array(array('_route' => '_453'), array('a', 'b', 'c'), null, null, false, null)), + 9134 => array(array(array('_route' => '_340'), array('a', 'b', 'c'), null, null, false, null)), + 9185 => array(array(array('_route' => '_371'), array('a', 'b', 'c'), null, null, false, null)), + 9232 => array(array(array('_route' => '_417'), array('a', 'b', 'c'), null, null, false, null)), + 9284 => array(array(array('_route' => '_382'), array('a', 'b', 'c'), null, null, false, null)), + 9331 => array(array(array('_route' => '_404'), array('a', 'b', 'c'), null, null, false, null)), + 9389 => array(array(array('_route' => '_10'), array('a', 'b', 'c'), null, null, false, null)), + 9436 => array(array(array('_route' => '_279'), array('a', 'b', 'c'), null, null, false, null)), + 9483 => array(array(array('_route' => '_377'), array('a', 'b', 'c'), null, null, false, null)), + 9535 => array(array(array('_route' => '_39'), array('a', 'b', 'c'), null, null, false, null)), + 9582 => array(array(array('_route' => '_40'), array('a', 'b', 'c'), null, null, false, null)), + 9629 => array(array(array('_route' => '_264'), array('a', 'b', 'c'), null, null, false, null)), + 9676 => array(array(array('_route' => '_449'), array('a', 'b', 'c'), null, null, false, null)), + 9728 => array(array(array('_route' => '_46'), array('a', 'b', 'c'), null, null, false, null)), + 9775 => array(array(array('_route' => '_257'), array('a', 'b', 'c'), null, null, false, null)), + 9822 => array(array(array('_route' => '_274'), array('a', 'b', 'c'), null, null, false, null)), + 9869 => array(array(array('_route' => '_388'), array('a', 'b', 'c'), null, null, false, null)), + 9921 => array(array(array('_route' => '_53'), array('a', 'b', 'c'), null, null, false, null)), + 9968 => array(array(array('_route' => '_345'), array('a', 'b', 'c'), null, null, false, null)), + 10020 => array(array(array('_route' => '_73'), array('a', 'b', 'c'), null, null, false, null)), + 10068 => array(array(array('_route' => '_296'), array('a', 'b', 'c'), null, null, false, null)), + 10121 => array(array(array('_route' => '_75'), array('a', 'b', 'c'), null, null, false, null)), + 10169 => array(array(array('_route' => '_458'), array('a', 'b', 'c'), null, null, false, null)), + 10225 => array(array(array('_route' => '_79'), array('a', 'b', 'c'), null, null, false, null)), + 10272 => array(array(array('_route' => '_129'), array('a', 'b', 'c'), null, null, false, null)), + 10319 => array(array(array('_route' => '_418'), array('a', 'b', 'c'), null, null, false, null)), + 10368 => array(array(array('_route' => '_225'), array('a', 'b', 'c'), null, null, false, null)), + 10416 => array(array(array('_route' => '_479'), array('a', 'b', 'c'), null, null, false, null)), + 10466 => array(array(array('_route' => '_120'), array('a', 'b', 'c'), null, null, false, null)), + 10515 => array(array(array('_route' => '_276'), array('a', 'b', 'c'), null, null, false, null)), + 10564 => array(array(array('_route' => '_370'), array('a', 'b', 'c'), null, null, false, null)), + 10616 => array(array(array('_route' => '_385'), array('a', 'b', 'c'), null, null, false, null)), + 10664 => array(array(array('_route' => '_469'), array('a', 'b', 'c'), null, null, false, null)), + 10714 => array(array(array('_route' => '_435'), array('a', 'b', 'c'), null, null, false, null)), + 10772 => array(array(array('_route' => '_11'), array('a', 'b', 'c'), null, null, false, null)), + 10820 => array(array(array('_route' => '_105'), array('a', 'b', 'c'), null, null, false, null)), + 10868 => array(array(array('_route' => '_132'), array('a', 'b', 'c'), null, null, false, null)), + 10921 => array(array(array('_route' => '_18'), array('a', 'b', 'c'), null, null, false, null)), + 10969 => array(array(array('_route' => '_210'), array('a', 'b', 'c'), null, null, false, null)), + 11017 => array(array(array('_route' => '_329'), array('a', 'b', 'c'), null, null, false, null)), + 11073 => array(array(array('_route' => '_29'), array('a', 'b', 'c'), null, null, false, null)), + 11120 => array(array(array('_route' => '_480'), array('a', 'b', 'c'), null, null, false, null)), + 11169 => array(array(array('_route' => '_426'), array('a', 'b', 'c'), null, null, false, null)), + 11222 => array(array(array('_route' => '_32'), array('a', 'b', 'c'), null, null, false, null)), + 11270 => array(array(array('_route' => '_217'), array('a', 'b', 'c'), null, null, false, null)), + 11318 => array(array(array('_route' => '_275'), array('a', 'b', 'c'), null, null, false, null)), + 11371 => array(array(array('_route' => '_45'), array('a', 'b', 'c'), null, null, false, null)), + 11419 => array(array(array('_route' => '_157'), array('a', 'b', 'c'), null, null, false, null)), + 11467 => array(array(array('_route' => '_184'), array('a', 'b', 'c'), null, null, false, null)), + 11515 => array(array(array('_route' => '_250'), array('a', 'b', 'c'), null, null, false, null)), + 11563 => array(array(array('_route' => '_356'), array('a', 'b', 'c'), null, null, false, null)), + 11616 => array(array(array('_route' => '_47'), array('a', 'b', 'c'), null, null, false, null)), + 11664 => array(array(array('_route' => '_445'), array('a', 'b', 'c'), null, null, false, null)), + 11714 => array(array(array('_route' => '_48'), array('a', 'b', 'c'), null, null, false, null)), + 11766 => array(array(array('_route' => '_58'), array('a', 'b', 'c'), null, null, false, null)), + 11814 => array(array(array('_route' => '_414'), array('a', 'b', 'c'), null, null, false, null)), + 11862 => array(array(array('_route' => '_431'), array('a', 'b', 'c'), null, null, false, null)), + 11915 => array(array(array('_route' => '_84'), array('a', 'b', 'c'), null, null, false, null)), + 11963 => array(array(array('_route' => '_294'), array('a', 'b', 'c'), null, null, false, null)), + 12011 => array(array(array('_route' => '_336'), array('a', 'b', 'c'), null, null, false, null)), + 12059 => array(array(array('_route' => '_465'), array('a', 'b', 'c'), null, null, false, null)), + 12112 => array(array(array('_route' => '_103'), array('a', 'b', 'c'), null, null, false, null)), + 12160 => array(array(array('_route' => '_111'), array('a', 'b', 'c'), null, null, false, null)), + 12208 => array(array(array('_route' => '_207'), array('a', 'b', 'c'), null, null, false, null)), + 12256 => array(array(array('_route' => '_402'), array('a', 'b', 'c'), null, null, false, null)), + 12309 => array(array(array('_route' => '_230'), array('a', 'b', 'c'), null, null, false, null)), + 12356 => array(array(array('_route' => '_331'), array('a', 'b', 'c'), null, null, false, null)), + 12406 => array(array(array('_route' => '_248'), array('a', 'b', 'c'), null, null, false, null)), + 12455 => array(array(array('_route' => '_282'), array('a', 'b', 'c'), null, null, false, null)), + 12513 => array(array(array('_route' => '_15'), array('a', 'b', 'c'), null, null, false, null)), + 12561 => array(array(array('_route' => '_130'), array('a', 'b', 'c'), null, null, false, null)), + 12609 => array(array(array('_route' => '_231'), array('a', 'b', 'c'), null, null, false, null)), + 12657 => array(array(array('_route' => '_365'), array('a', 'b', 'c'), null, null, false, null)), + 12705 => array(array(array('_route' => '_448'), array('a', 'b', 'c'), null, null, false, null)), + 12758 => array(array(array('_route' => '_20'), array('a', 'b', 'c'), null, null, false, null)), + 12806 => array(array(array('_route' => '_93'), array('a', 'b', 'c'), null, null, false, null)), + 12854 => array(array(array('_route' => '_186'), array('a', 'b', 'c'), null, null, false, null)), + 12902 => array(array(array('_route' => '_460'), array('a', 'b', 'c'), null, null, false, null)), + 12955 => array(array(array('_route' => '_52'), array('a', 'b', 'c'), null, null, false, null)), + 13003 => array(array(array('_route' => '_447'), array('a', 'b', 'c'), null, null, false, null)), + 13056 => array(array(array('_route' => '_56'), array('a', 'b', 'c'), null, null, false, null)), + 13104 => array(array(array('_route' => '_133'), array('a', 'b', 'c'), null, null, false, null)), + 13152 => array(array(array('_route' => '_297'), array('a', 'b', 'c'), null, null, false, null)), + 13205 => array(array(array('_route' => '_82'), array('a', 'b', 'c'), null, null, false, null)), + 13253 => array(array(array('_route' => '_165'), array('a', 'b', 'c'), null, null, false, null)), + 13301 => array(array(array('_route' => '_213'), array('a', 'b', 'c'), null, null, false, null)), + 13351 => array(array(array('_route' => '_86'), array('a', 'b', 'c'), null, null, false, null)), + 13403 => array(array(array('_route' => '_92'), array('a', 'b', 'c'), null, null, false, null)), + 13450 => array(array(array('_route' => '_280'), array('a', 'b', 'c'), null, null, false, null)), + 13500 => array(array(array('_route' => '_143'), array('a', 'b', 'c'), null, null, false, null)), + 13549 => array(array(array('_route' => '_177'), array('a', 'b', 'c'), null, null, false, null)), + 13601 => array(array(array('_route' => '_188'), array('a', 'b', 'c'), null, null, false, null)), + 13649 => array(array(array('_route' => '_311'), array('a', 'b', 'c'), null, null, false, null)), + 13697 => array(array(array('_route' => '_350'), array('a', 'b', 'c'), null, null, false, null)), + 13750 => array(array(array('_route' => '_226'), array('a', 'b', 'c'), null, null, false, null)), + 13798 => array(array(array('_route' => '_291'), array('a', 'b', 'c'), null, null, false, null)), + 13851 => array(array(array('_route' => '_244'), array('a', 'b', 'c'), null, null, false, null)), + 13898 => array(array(array('_route' => '_287'), array('a', 'b', 'c'), null, null, false, null)), + 13951 => array(array(array('_route' => '_300'), array('a', 'b', 'c'), null, null, false, null)), + 13999 => array(array(array('_route' => '_451'), array('a', 'b', 'c'), null, null, false, null)), + 14047 => array(array(array('_route' => '_452'), array('a', 'b', 'c'), null, null, false, null)), + 14095 => array(array(array('_route' => '_481'), array('a', 'b', 'c'), null, null, false, null)), + 14145 => array(array(array('_route' => '_312'), array('a', 'b', 'c'), null, null, false, null)), + 14203 => array(array(array('_route' => '_17'), array('a', 'b', 'c'), null, null, false, null)), + 14251 => array(array(array('_route' => '_227'), array('a', 'b', 'c'), null, null, false, null)), + 14299 => array(array(array('_route' => '_393'), array('a', 'b', 'c'), null, null, false, null)), + 14349 => array(array(array('_route' => '_57'), array('a', 'b', 'c'), null, null, false, null)), + 14401 => array(array(array('_route' => '_61'), array('a', 'b', 'c'), null, null, false, null)), + 14449 => array(array(array('_route' => '_112'), array('a', 'b', 'c'), null, null, false, null)), + 14500 => array(array(array('_route' => '_135'), array('a', 'b', 'c'), null, null, false, null)), + 14547 => array(array(array('_route' => '_271'), array('a', 'b', 'c'), null, null, false, null)), + 14596 => array(array(array('_route' => '_459'), array('a', 'b', 'c'), null, null, false, null)), + 14649 => array(array(array('_route' => '_67'), array('a', 'b', 'c'), null, null, false, null)), + 14697 => array(array(array('_route' => '_113'), array('a', 'b', 'c'), null, null, false, null)), + 14745 => array(array(array('_route' => '_497'), array('a', 'b', 'c'), null, null, false, null)), + 14795 => array(array(array('_route' => '_70'), array('a', 'b', 'c'), null, null, false, null)), + 14847 => array(array(array('_route' => '_89'), array('a', 'b', 'c'), null, null, false, null)), + 14895 => array(array(array('_route' => '_128'), array('a', 'b', 'c'), null, null, false, null)), + 14948 => array(array(array('_route' => '_150'), array('a', 'b', 'c'), null, null, false, null)), + 14996 => array(array(array('_route' => '_166'), array('a', 'b', 'c'), null, null, false, null)), + 15047 => array(array(array('_route' => '_206'), array('a', 'b', 'c'), null, null, false, null)), + 15094 => array(array(array('_route' => '_419'), array('a', 'b', 'c'), null, null, false, null)), + 15148 => array(array(array('_route' => '_201'), array('a', 'b', 'c'), null, null, false, null)), + 15196 => array(array(array('_route' => '_314'), array('a', 'b', 'c'), null, null, false, null)), + 15244 => array(array(array('_route' => '_429'), array('a', 'b', 'c'), null, null, false, null)), + 15297 => array(array(array('_route' => '_228'), array('a', 'b', 'c'), null, null, false, null)), + 15345 => array(array(array('_route' => '_477'), array('a', 'b', 'c'), null, null, false, null)), + 15395 => array(array(array('_route' => '_272'), array('a', 'b', 'c'), null, null, false, null)), + 15444 => array(array(array('_route' => '_486'), array('a', 'b', 'c'), null, null, false, null)), + 15502 => array(array(array('_route' => '_21'), array('a', 'b', 'c'), null, null, false, null)), + 15550 => array(array(array('_route' => '_247'), array('a', 'b', 'c'), null, null, false, null)), + 15598 => array(array(array('_route' => '_424'), array('a', 'b', 'c'), null, null, false, null)), + 15646 => array(array(array('_route' => '_499'), array('a', 'b', 'c'), null, null, false, null)), + 15699 => array(array(array('_route' => '_23'), array('a', 'b', 'c'), null, null, false, null)), + 15747 => array(array(array('_route' => '_152'), array('a', 'b', 'c'), null, null, false, null)), + 15795 => array(array(array('_route' => '_304'), array('a', 'b', 'c'), null, null, false, null)), + 15843 => array(array(array('_route' => '_352'), array('a', 'b', 'c'), null, null, false, null)), + 15896 => array(array(array('_route' => '_28'), array('a', 'b', 'c'), null, null, false, null)), + 15944 => array(array(array('_route' => '_240'), array('a', 'b', 'c'), null, null, false, null)), + 16000 => array(array(array('_route' => '_30'), array('a', 'b', 'c'), null, null, false, null)), + 16047 => array(array(array('_route' => '_41'), array('a', 'b', 'c'), null, null, false, null)), + 16096 => array(array(array('_route' => '_301'), array('a', 'b', 'c'), null, null, false, null)), + 16149 => array(array(array('_route' => '_66'), array('a', 'b', 'c'), null, null, false, null)), + 16197 => array(array(array('_route' => '_72'), array('a', 'b', 'c'), null, null, false, null)), + 16245 => array(array(array('_route' => '_320'), array('a', 'b', 'c'), null, null, false, null)), + 16298 => array(array(array('_route' => '_78'), array('a', 'b', 'c'), null, null, false, null)), + 16346 => array(array(array('_route' => '_337'), array('a', 'b', 'c'), null, null, false, null)), + 16394 => array(array(array('_route' => '_399'), array('a', 'b', 'c'), null, null, false, null)), + 16442 => array(array(array('_route' => '_495'), array('a', 'b', 'c'), null, null, false, null)), + 16492 => array(array(array('_route' => '_85'), array('a', 'b', 'c'), null, null, false, null)), + 16544 => array(array(array('_route' => '_101'), array('a', 'b', 'c'), null, null, false, null)), + 16592 => array(array(array('_route' => '_176'), array('a', 'b', 'c'), null, null, false, null)), + 16640 => array(array(array('_route' => '_246'), array('a', 'b', 'c'), null, null, false, null)), + 16693 => array(array(array('_route' => '_125'), array('a', 'b', 'c'), null, null, false, null)), + 16741 => array(array(array('_route' => '_341'), array('a', 'b', 'c'), null, null, false, null)), + 16794 => array(array(array('_route' => '_137'), array('a', 'b', 'c'), null, null, false, null)), + 16842 => array(array(array('_route' => '_270'), array('a', 'b', 'c'), null, null, false, null)), + 16890 => array(array(array('_route' => '_386'), array('a', 'b', 'c'), null, null, false, null)), + 16943 => array(array(array('_route' => '_169'), array('a', 'b', 'c'), null, null, false, null)), + 16991 => array(array(array('_route' => '_200'), array('a', 'b', 'c'), null, null, false, null)), + 17039 => array(array(array('_route' => '_262'), array('a', 'b', 'c'), null, null, false, null)), + 17092 => array(array(array('_route' => '_187'), array('a', 'b', 'c'), null, null, false, null)), + 17140 => array(array(array('_route' => '_333'), array('a', 'b', 'c'), null, null, false, null)), + 17190 => array(array(array('_route' => '_215'), array('a', 'b', 'c'), null, null, false, null)), + 17239 => array(array(array('_route' => '_316'), array('a', 'b', 'c'), null, null, false, null)), + 17288 => array(array(array('_route' => '_343'), array('a', 'b', 'c'), null, null, false, null)), + 17346 => array(array(array('_route' => '_22'), array('a', 'b', 'c'), null, null, false, null)), + 17394 => array(array(array('_route' => '_420'), array('a', 'b', 'c'), null, null, false, null)), + 17447 => array(array(array('_route' => '_55'), array('a', 'b', 'c'), null, null, false, null)), + 17494 => array(array(array('_route' => '_496'), array('a', 'b', 'c'), null, null, false, null)), + 17547 => array(array(array('_route' => '_153'), array('a', 'b', 'c'), null, null, false, null)), + 17595 => array(array(array('_route' => '_344'), array('a', 'b', 'c'), null, null, false, null)), + 17648 => array(array(array('_route' => '_160'), array('a', 'b', 'c'), null, null, false, null)), + 17696 => array(array(array('_route' => '_398'), array('a', 'b', 'c'), null, null, false, null)), + 17749 => array(array(array('_route' => '_161'), array('a', 'b', 'c'), null, null, false, null)), + 17797 => array(array(array('_route' => '_193'), array('a', 'b', 'c'), null, null, false, null)), + 17847 => array(array(array('_route' => '_174'), array('a', 'b', 'c'), null, null, false, null)), + 17899 => array(array(array('_route' => '_209'), array('a', 'b', 'c'), null, null, false, null)), + 17947 => array(array(array('_route' => '_261'), array('a', 'b', 'c'), null, null, false, null)), + 18000 => array(array(array('_route' => '_222'), array('a', 'b', 'c'), null, null, false, null)), + 18048 => array(array(array('_route' => '_323'), array('a', 'b', 'c'), null, null, false, null)), + 18096 => array(array(array('_route' => '_380'), array('a', 'b', 'c'), null, null, false, null)), + 18149 => array(array(array('_route' => '_232'), array('a', 'b', 'c'), null, null, false, null)), + 18197 => array(array(array('_route' => '_383'), array('a', 'b', 'c'), null, null, false, null)), + 18247 => array(array(array('_route' => '_306'), array('a', 'b', 'c'), null, null, false, null)), + 18296 => array(array(array('_route' => '_327'), array('a', 'b', 'c'), null, null, false, null)), + 18345 => array(array(array('_route' => '_364'), array('a', 'b', 'c'), null, null, false, null)), + 18397 => array(array(array('_route' => '_403'), array('a', 'b', 'c'), null, null, false, null)), + 18445 => array(array(array('_route' => '_405'), array('a', 'b', 'c'), null, null, false, null)), + 18495 => array(array(array('_route' => '_412'), array('a', 'b', 'c'), null, null, false, null)), + 18553 => array(array(array('_route' => '_27'), array('a', 'b', 'c'), null, null, false, null)), + 18601 => array(array(array('_route' => '_134'), array('a', 'b', 'c'), null, null, false, null)), + 18649 => array(array(array('_route' => '_245'), array('a', 'b', 'c'), null, null, false, null)), + 18702 => array(array(array('_route' => '_59'), array('a', 'b', 'c'), null, null, false, null)), + 18750 => array(array(array('_route' => '_208'), array('a', 'b', 'c'), null, null, false, null)), + 18803 => array(array(array('_route' => '_60'), array('a', 'b', 'c'), null, null, false, null)), + 18851 => array(array(array('_route' => '_119'), array('a', 'b', 'c'), null, null, false, null)), + 18902 => array(array(array('_route' => '_163'), array('a', 'b', 'c'), null, null, false, null)), + 18949 => array(array(array('_route' => '_249'), array('a', 'b', 'c'), null, null, false, null)), + 18998 => array(array(array('_route' => '_278'), array('a', 'b', 'c'), null, null, false, null)), + 19051 => array(array(array('_route' => '_63'), array('a', 'b', 'c'), null, null, false, null)), + 19099 => array(array(array('_route' => '_195'), array('a', 'b', 'c'), null, null, false, null)), + 19147 => array(array(array('_route' => '_252'), array('a', 'b', 'c'), null, null, false, null)), + 19195 => array(array(array('_route' => '_461'), array('a', 'b', 'c'), null, null, false, null)), + 19248 => array(array(array('_route' => '_126'), array('a', 'b', 'c'), null, null, false, null)), + 19296 => array(array(array('_route' => '_158'), array('a', 'b', 'c'), null, null, false, null)), + 19344 => array(array(array('_route' => '_221'), array('a', 'b', 'c'), null, null, false, null)), + 19392 => array(array(array('_route' => '_269'), array('a', 'b', 'c'), null, null, false, null)), + 19440 => array(array(array('_route' => '_310'), array('a', 'b', 'c'), null, null, false, null)), + 19496 => array(array(array('_route' => '_138'), array('a', 'b', 'c'), null, null, false, null)), + 19543 => array(array(array('_route' => '_348'), array('a', 'b', 'c'), null, null, false, null)), + 19592 => array(array(array('_route' => '_236'), array('a', 'b', 'c'), null, null, false, null)), + 19640 => array(array(array('_route' => '_433'), array('a', 'b', 'c'), null, null, false, null)), + 19693 => array(array(array('_route' => '_141'), array('a', 'b', 'c'), null, null, false, null)), + 19741 => array(array(array('_route' => '_283'), array('a', 'b', 'c'), null, null, false, null)), + 19794 => array(array(array('_route' => '_144'), array('a', 'b', 'c'), null, null, false, null)), + 19842 => array(array(array('_route' => '_191'), array('a', 'b', 'c'), null, null, false, null)), + 19895 => array(array(array('_route' => '_168'), array('a', 'b', 'c'), null, null, false, null)), + 19943 => array(array(array('_route' => '_363'), array('a', 'b', 'c'), null, null, false, null)), + 19991 => array(array(array('_route' => '_381'), array('a', 'b', 'c'), null, null, false, null)), + 20044 => array(array(array('_route' => '_180'), array('a', 'b', 'c'), null, null, false, null)), + 20092 => array(array(array('_route' => '_339'), array('a', 'b', 'c'), null, null, false, null)), + 20142 => array(array(array('_route' => '_196'), array('a', 'b', 'c'), null, null, false, null)), + 20194 => array(array(array('_route' => '_198'), array('a', 'b', 'c'), null, null, false, null)), + 20242 => array(array(array('_route' => '_285'), array('a', 'b', 'c'), null, null, false, null)), + 20292 => array(array(array('_route' => '_349'), array('a', 'b', 'c'), null, null, false, null)), + 20344 => array(array(array('_route' => '_367'), array('a', 'b', 'c'), null, null, false, null)), + 20392 => array(array(array('_route' => '_384'), array('a', 'b', 'c'), null, null, false, null)), + 20440 => array(array(array('_route' => '_498'), array('a', 'b', 'c'), null, null, false, null)), + 20490 => array(array(array('_route' => '_369'), array('a', 'b', 'c'), null, null, false, null)), + 20542 => array(array(array('_route' => '_408'), array('a', 'b', 'c'), null, null, false, null)), + 20590 => array(array(array('_route' => '_413'), array('a', 'b', 'c'), null, null, false, null)), + 20652 => array(array(array('_route' => '_44'), array('a', 'b', 'c'), null, null, false, null)), + 20699 => array(array(array('_route' => '_256'), array('a', 'b', 'c'), null, null, false, null)), + 20748 => array(array(array('_route' => '_173'), array('a', 'b', 'c'), null, null, false, null)), + 20796 => array(array(array('_route' => '_266'), array('a', 'b', 'c'), null, null, false, null)), + 20844 => array(array(array('_route' => '_392'), array('a', 'b', 'c'), null, null, false, null)), + 20892 => array(array(array('_route' => '_430'), array('a', 'b', 'c'), null, null, false, null)), + 20940 => array(array(array('_route' => '_482'), array('a', 'b', 'c'), null, null, false, null)), + 20993 => array(array(array('_route' => '_49'), array('a', 'b', 'c'), null, null, false, null)), + 21041 => array(array(array('_route' => '_94'), array('a', 'b', 'c'), null, null, false, null)), + 21089 => array(array(array('_route' => '_407'), array('a', 'b', 'c'), null, null, false, null)), + 21142 => array(array(array('_route' => '_65'), array('a', 'b', 'c'), null, null, false, null)), + 21190 => array(array(array('_route' => '_181'), array('a', 'b', 'c'), null, null, false, null)), + 21238 => array(array(array('_route' => '_437'), array('a', 'b', 'c'), null, null, false, null)), + 21291 => array(array(array('_route' => '_76'), array('a', 'b', 'c'), null, null, false, null)), + 21339 => array(array(array('_route' => '_357'), array('a', 'b', 'c'), null, null, false, null)), + 21392 => array(array(array('_route' => '_80'), array('a', 'b', 'c'), null, null, false, null)), + 21440 => array(array(array('_route' => '_106'), array('a', 'b', 'c'), null, null, false, null)), + 21493 => array(array(array('_route' => '_83'), array('a', 'b', 'c'), null, null, false, null)), + 21541 => array(array(array('_route' => '_255'), array('a', 'b', 'c'), null, null, false, null)), + 21589 => array(array(array('_route' => '_330'), array('a', 'b', 'c'), null, null, false, null)), + 21642 => array(array(array('_route' => '_100'), array('a', 'b', 'c'), null, null, false, null)), + 21690 => array(array(array('_route' => '_396'), array('a', 'b', 'c'), null, null, false, null)), + 21738 => array(array(array('_route' => '_422'), array('a', 'b', 'c'), null, null, false, null)), + 21791 => array(array(array('_route' => '_149'), array('a', 'b', 'c'), null, null, false, null)), + 21839 => array(array(array('_route' => '_324'), array('a', 'b', 'c'), null, null, false, null)), + 21892 => array(array(array('_route' => '_164'), array('a', 'b', 'c'), null, null, false, null)), + 21940 => array(array(array('_route' => '_423'), array('a', 'b', 'c'), null, null, false, null)), + 21990 => array(array(array('_route' => '_241'), array('a', 'b', 'c'), null, null, false, null)), + 22042 => array(array(array('_route' => '_290'), array('a', 'b', 'c'), null, null, false, null)), + 22090 => array(array(array('_route' => '_335'), array('a', 'b', 'c'), null, null, false, null)), + 22140 => array(array(array('_route' => '_373'), array('a', 'b', 'c'), null, null, false, null)), + 22189 => array(array(array('_route' => '_375'), array('a', 'b', 'c'), null, null, false, null)), + 22238 => array(array(array('_route' => '_450'), array('a', 'b', 'c'), null, null, false, null)), + 22287 => array(array(array('_route' => '_464'), array('a', 'b', 'c'), null, null, false, null)), + 22345 => array(array(array('_route' => '_51'), array('a', 'b', 'c'), null, null, false, null)), + 22393 => array(array(array('_route' => '_77'), array('a', 'b', 'c'), null, null, false, null)), + 22441 => array(array(array('_route' => '_234'), array('a', 'b', 'c'), null, null, false, null)), + 22489 => array(array(array('_route' => '_394'), array('a', 'b', 'c'), null, null, false, null)), + 22542 => array(array(array('_route' => '_88'), array('a', 'b', 'c'), null, null, false, null)), + 22590 => array(array(array('_route' => '_155'), array('a', 'b', 'c'), null, null, false, null)), + 22643 => array(array(array('_route' => '_96'), array('a', 'b', 'c'), null, null, false, null)), + 22691 => array(array(array('_route' => '_298'), array('a', 'b', 'c'), null, null, false, null)), + 22739 => array(array(array('_route' => '_470'), array('a', 'b', 'c'), null, null, false, null)), + 22792 => array(array(array('_route' => '_109'), array('a', 'b', 'c'), null, null, false, null)), + 22840 => array(array(array('_route' => '_204'), array('a', 'b', 'c'), null, null, false, null)), + 22893 => array(array(array('_route' => '_115'), array('a', 'b', 'c'), null, null, false, null)), + 22941 => array(array(array('_route' => '_145'), array('a', 'b', 'c'), null, null, false, null)), + 22994 => array(array(array('_route' => '_123'), array('a', 'b', 'c'), null, null, false, null)), + 23042 => array(array(array('_route' => '_277'), array('a', 'b', 'c'), null, null, false, null)), + 23090 => array(array(array('_route' => '_473'), array('a', 'b', 'c'), null, null, false, null)), + 23143 => array(array(array('_route' => '_334'), array('a', 'b', 'c'), null, null, false, null)), + 23191 => array(array(array('_route' => '_493'), array('a', 'b', 'c'), null, null, false, null)), + 23244 => array(array(array('_route' => '_372'), array('a', 'b', 'c'), null, null, false, null)), + 23292 => array(array(array('_route' => '_432'), array('a', 'b', 'c'), null, null, false, null)), + 23340 => array(array(array('_route' => '_436'), array('a', 'b', 'c'), null, null, false, null)), + 23393 => array(array(array('_route' => '_425'), array('a', 'b', 'c'), null, null, false, null)), + 23441 => array(array(array('_route' => '_456'), array('a', 'b', 'c'), null, null, false, null)), + 23489 => array(array(array('_route' => '_474'), array('a', 'b', 'c'), null, null, false, null)), + 23539 => array(array(array('_route' => '_485'), array('a', 'b', 'c'), null, null, false, null)), + 23594 => array(array(array('_route' => '_91'), array('a', 'b', 'c'), null, null, false, null)), + 23646 => array(array(array('_route' => '_110'), array('a', 'b', 'c'), null, null, false, null)), + 23694 => array(array(array('_route' => '_114'), array('a', 'b', 'c'), null, null, false, null)), + 23750 => array(array(array('_route' => '_118'), array('a', 'b', 'c'), null, null, false, null)), + 23796 => array(array(array('_route' => '_475'), array('a', 'b', 'c'), null, null, false, null)), + 23844 => array(array(array('_route' => '_366'), array('a', 'b', 'c'), null, null, false, null)), + 23897 => array(array(array('_route' => '_167'), array('a', 'b', 'c'), null, null, false, null)), + 23945 => array(array(array('_route' => '_192'), array('a', 'b', 'c'), null, null, false, null)), + 23993 => array(array(array('_route' => '_342'), array('a', 'b', 'c'), null, null, false, null)), + 24046 => array(array(array('_route' => '_229'), array('a', 'b', 'c'), null, null, false, null)), + 24097 => array(array(array('_route' => '_235'), array('a', 'b', 'c'), null, null, false, null)), + 24144 => array(array(array('_route' => '_302'), array('a', 'b', 'c'), null, null, false, null)), + 24193 => array(array(array('_route' => '_322'), array('a', 'b', 'c'), null, null, false, null)), + 24246 => array(array(array('_route' => '_237'), array('a', 'b', 'c'), null, null, false, null)), + 24294 => array(array(array('_route' => '_293'), array('a', 'b', 'c'), null, null, false, null)), + 24347 => array(array(array('_route' => '_239'), array('a', 'b', 'c'), null, null, false, null)), + 24395 => array(array(array('_route' => '_444'), array('a', 'b', 'c'), null, null, false, null)), + 24443 => array(array(array('_route' => '_491'), array('a', 'b', 'c'), null, null, false, null)), + 24491 => array(array(array('_route' => '_492'), array('a', 'b', 'c'), null, null, false, null)), + 24541 => array(array(array('_route' => '_258'), array('a', 'b', 'c'), null, null, false, null)), + 24590 => array(array(array('_route' => '_317'), array('a', 'b', 'c'), null, null, false, null)), + 24639 => array(array(array('_route' => '_361'), array('a', 'b', 'c'), null, null, false, null)), + 24688 => array(array(array('_route' => '_391'), array('a', 'b', 'c'), null, null, false, null)), + 24737 => array(array(array('_route' => '_462'), array('a', 'b', 'c'), null, null, false, null)), + 24786 => array(array(array('_route' => '_476'), array('a', 'b', 'c'), null, null, false, null)), + 24837 => array(array(array('_route' => '_501'), array('a', 'b', 'c'), null, null, false, null)), + 24889 => array(array(array('_route' => '_514'), array('a', 'b', 'c'), null, null, false, null)), + 24937 => array(array(array('_route' => '_731'), array('a', 'b', 'c'), null, null, false, null)), + 24990 => array(array(array('_route' => '_522'), array('a', 'b', 'c'), null, null, false, null)), + 25038 => array(array(array('_route' => '_693'), array('a', 'b', 'c'), null, null, false, null)), + 25091 => array(array(array('_route' => '_537'), array('a', 'b', 'c'), null, null, false, null)), + 25139 => array(array(array('_route' => '_554'), array('a', 'b', 'c'), null, null, false, null)), + 25187 => array(array(array('_route' => '_645'), array('a', 'b', 'c'), null, null, false, null)), + 25235 => array(array(array('_route' => '_862'), array('a', 'b', 'c'), null, null, false, null)), + 25288 => array(array(array('_route' => '_539'), array('a', 'b', 'c'), null, null, false, null)), + 25336 => array(array(array('_route' => '_729'), array('a', 'b', 'c'), null, null, false, null)), + 25384 => array(array(array('_route' => '_897'), array('a', 'b', 'c'), null, null, false, null)), + 25437 => array(array(array('_route' => '_561'), array('a', 'b', 'c'), null, null, false, null)), + 25485 => array(array(array('_route' => '_615'), array('a', 'b', 'c'), null, null, false, null)), + 25533 => array(array(array('_route' => '_764'), array('a', 'b', 'c'), null, null, false, null)), + 25581 => array(array(array('_route' => '_948'), array('a', 'b', 'c'), null, null, false, null)), + 25634 => array(array(array('_route' => '_617'), array('a', 'b', 'c'), null, null, false, null)), + 25682 => array(array(array('_route' => '_671'), array('a', 'b', 'c'), null, null, false, null)), + 25735 => array(array(array('_route' => '_649'), array('a', 'b', 'c'), null, null, false, null)), + 25783 => array(array(array('_route' => '_651'), array('a', 'b', 'c'), null, null, false, null)), + 25831 => array(array(array('_route' => '_684'), array('a', 'b', 'c'), null, null, false, null)), + 25884 => array(array(array('_route' => '_669'), array('a', 'b', 'c'), null, null, false, null)), + 25932 => array(array(array('_route' => '_743'), array('a', 'b', 'c'), null, null, false, null)), + 25980 => array(array(array('_route' => '_962'), array('a', 'b', 'c'), null, null, false, null)), + 26033 => array(array(array('_route' => '_694'), array('a', 'b', 'c'), null, null, false, null)), + 26081 => array(array(array('_route' => '_985'), array('a', 'b', 'c'), null, null, false, null)), + 26134 => array(array(array('_route' => '_707'), array('a', 'b', 'c'), null, null, false, null)), + 26182 => array(array(array('_route' => '_718'), array('a', 'b', 'c'), null, null, false, null)), + 26235 => array(array(array('_route' => '_720'), array('a', 'b', 'c'), null, null, false, null)), + 26283 => array(array(array('_route' => '_745'), array('a', 'b', 'c'), null, null, false, null)), + 26333 => array(array(array('_route' => '_874'), array('a', 'b', 'c'), null, null, false, null)), + 26391 => array(array(array('_route' => '_502'), array('a', 'b', 'c'), null, null, false, null)), + 26439 => array(array(array('_route' => '_667'), array('a', 'b', 'c'), null, null, false, null)), + 26487 => array(array(array('_route' => '_911'), array('a', 'b', 'c'), null, null, false, null)), + 26535 => array(array(array('_route' => '_942'), array('a', 'b', 'c'), null, null, false, null)), + 26585 => array(array(array('_route' => '_504'), array('a', 'b', 'c'), null, null, false, null)), + 26637 => array(array(array('_route' => '_524'), array('a', 'b', 'c'), null, null, false, null)), + 26685 => array(array(array('_route' => '_732'), array('a', 'b', 'c'), null, null, false, null)), + 26738 => array(array(array('_route' => '_596'), array('a', 'b', 'c'), null, null, false, null)), + 26786 => array(array(array('_route' => '_601'), array('a', 'b', 'c'), null, null, false, null)), + 26839 => array(array(array('_route' => '_620'), array('a', 'b', 'c'), null, null, false, null)), + 26887 => array(array(array('_route' => '_631'), array('a', 'b', 'c'), null, null, false, null)), + 26935 => array(array(array('_route' => '_771'), array('a', 'b', 'c'), null, null, false, null)), + 26983 => array(array(array('_route' => '_937'), array('a', 'b', 'c'), null, null, false, null)), + 27031 => array(array(array('_route' => '_999'), array('a', 'b', 'c'), null, null, false, null)), + 27084 => array(array(array('_route' => '_657'), array('a', 'b', 'c'), null, null, false, null)), + 27132 => array(array(array('_route' => '_701'), array('a', 'b', 'c'), null, null, false, null)), + 27185 => array(array(array('_route' => '_662'), array('a', 'b', 'c'), null, null, false, null)), + 27233 => array(array(array('_route' => '_797'), array('a', 'b', 'c'), null, null, false, null)), + 27281 => array(array(array('_route' => '_924'), array('a', 'b', 'c'), null, null, false, null)), + 27334 => array(array(array('_route' => '_702'), array('a', 'b', 'c'), null, null, false, null)), + 27382 => array(array(array('_route' => '_750'), array('a', 'b', 'c'), null, null, false, null)), + 27435 => array(array(array('_route' => '_749'), array('a', 'b', 'c'), null, null, false, null)), + 27483 => array(array(array('_route' => '_837'), array('a', 'b', 'c'), null, null, false, null)), + 27533 => array(array(array('_route' => '_758'), array('a', 'b', 'c'), null, null, false, null)), + 27585 => array(array(array('_route' => '_810'), array('a', 'b', 'c'), null, null, false, null)), + 27633 => array(array(array('_route' => '_902'), array('a', 'b', 'c'), null, null, false, null)), + 27683 => array(array(array('_route' => '_845'), array('a', 'b', 'c'), null, null, false, null)), + 27741 => array(array(array('_route' => '_503'), array('a', 'b', 'c'), null, null, false, null)), + 27792 => array(array(array('_route' => '_756'), array('a', 'b', 'c'), null, null, false, null)), + 27839 => array(array(array('_route' => '_799'), array('a', 'b', 'c'), null, null, false, null)), + 27888 => array(array(array('_route' => '_769'), array('a', 'b', 'c'), null, null, false, null)), + 27936 => array(array(array('_route' => '_981'), array('a', 'b', 'c'), null, null, false, null)), + 27989 => array(array(array('_route' => '_507'), array('a', 'b', 'c'), null, null, false, null)), + 28037 => array(array(array('_route' => '_672'), array('a', 'b', 'c'), null, null, false, null)), + 28085 => array(array(array('_route' => '_790'), array('a', 'b', 'c'), null, null, false, null)), + 28138 => array(array(array('_route' => '_515'), array('a', 'b', 'c'), null, null, false, null)), + 28186 => array(array(array('_route' => '_523'), array('a', 'b', 'c'), null, null, false, null)), + 28234 => array(array(array('_route' => '_957'), array('a', 'b', 'c'), null, null, false, null)), + 28282 => array(array(array('_route' => '_995'), array('a', 'b', 'c'), null, null, false, null)), + 28335 => array(array(array('_route' => '_532'), array('a', 'b', 'c'), null, null, false, null)), + 28383 => array(array(array('_route' => '_642'), array('a', 'b', 'c'), null, null, false, null)), + 28433 => array(array(array('_route' => '_579'), array('a', 'b', 'c'), null, null, false, null)), + 28485 => array(array(array('_route' => '_625'), array('a', 'b', 'c'), null, null, false, null)), + 28533 => array(array(array('_route' => '_916'), array('a', 'b', 'c'), null, null, false, null)), + 28586 => array(array(array('_route' => '_633'), array('a', 'b', 'c'), null, null, false, null)), + 28634 => array(array(array('_route' => '_656'), array('a', 'b', 'c'), null, null, false, null)), + 28687 => array(array(array('_route' => '_658'), array('a', 'b', 'c'), null, null, false, null)), + 28735 => array(array(array('_route' => '_943'), array('a', 'b', 'c'), null, null, false, null)), + 28788 => array(array(array('_route' => '_664'), array('a', 'b', 'c'), null, null, false, null)), + 28836 => array(array(array('_route' => '_852'), array('a', 'b', 'c'), null, null, false, null)), + 28884 => array(array(array('_route' => '_870'), array('a', 'b', 'c'), null, null, false, null)), + 28937 => array(array(array('_route' => '_683'), array('a', 'b', 'c'), null, null, false, null)), + 28985 => array(array(array('_route' => '_915'), array('a', 'b', 'c'), null, null, false, null)), + 29038 => array(array(array('_route' => '_719'), array('a', 'b', 'c'), null, null, false, null)), + 29086 => array(array(array('_route' => '_859'), array('a', 'b', 'c'), null, null, false, null)), + 29134 => array(array(array('_route' => '_912'), array('a', 'b', 'c'), null, null, false, null)), + 29182 => array(array(array('_route' => '_978'), array('a', 'b', 'c'), null, null, false, null)), + 29235 => array(array(array('_route' => '_738'), array('a', 'b', 'c'), null, null, false, null)), + 29283 => array(array(array('_route' => '_883'), array('a', 'b', 'c'), null, null, false, null)), + 29333 => array(array(array('_route' => '_741'), array('a', 'b', 'c'), null, null, false, null)), + 29382 => array(array(array('_route' => '_760'), array('a', 'b', 'c'), null, null, false, null)), + 29431 => array(array(array('_route' => '_895'), array('a', 'b', 'c'), null, null, false, null)), + 29489 => array(array(array('_route' => '_505'), array('a', 'b', 'c'), null, null, false, null)), + 29537 => array(array(array('_route' => '_935'), array('a', 'b', 'c'), null, null, false, null)), + 29590 => array(array(array('_route' => '_509'), array('a', 'b', 'c'), null, null, false, null)), + 29638 => array(array(array('_route' => '_820'), array('a', 'b', 'c'), null, null, false, null)), + 29686 => array(array(array('_route' => '_910'), array('a', 'b', 'c'), null, null, false, null)), + 29739 => array(array(array('_route' => '_518'), array('a', 'b', 'c'), null, null, false, null)), + 29787 => array(array(array('_route' => '_618'), array('a', 'b', 'c'), null, null, false, null)), + 29840 => array(array(array('_route' => '_546'), array('a', 'b', 'c'), null, null, false, null)), + 29888 => array(array(array('_route' => '_740'), array('a', 'b', 'c'), null, null, false, null)), + 29936 => array(array(array('_route' => '_867'), array('a', 'b', 'c'), null, null, false, null)), + 29989 => array(array(array('_route' => '_572'), array('a', 'b', 'c'), null, null, false, null)), + 30037 => array(array(array('_route' => '_952'), array('a', 'b', 'c'), null, null, false, null)), + 30090 => array(array(array('_route' => '_573'), array('a', 'b', 'c'), null, null, false, null)), + 30138 => array(array(array('_route' => '_692'), array('a', 'b', 'c'), null, null, false, null)), + 30186 => array(array(array('_route' => '_700'), array('a', 'b', 'c'), null, null, false, null)), + 30234 => array(array(array('_route' => '_772'), array('a', 'b', 'c'), null, null, false, null)), + 30284 => array(array(array('_route' => '_653'), array('a', 'b', 'c'), null, null, false, null)), + 30336 => array(array(array('_route' => '_695'), array('a', 'b', 'c'), null, null, false, null)), + 30384 => array(array(array('_route' => '_748'), array('a', 'b', 'c'), null, null, false, null)), + 30437 => array(array(array('_route' => '_710'), array('a', 'b', 'c'), null, null, false, null)), + 30485 => array(array(array('_route' => '_716'), array('a', 'b', 'c'), null, null, false, null)), + 30533 => array(array(array('_route' => '_969'), array('a', 'b', 'c'), null, null, false, null)), + 30586 => array(array(array('_route' => '_734'), array('a', 'b', 'c'), null, null, false, null)), + 30634 => array(array(array('_route' => '_742'), array('a', 'b', 'c'), null, null, false, null)), + 30682 => array(array(array('_route' => '_844'), array('a', 'b', 'c'), null, null, false, null)), + 30735 => array(array(array('_route' => '_763'), array('a', 'b', 'c'), null, null, false, null)), + 30783 => array(array(array('_route' => '_965'), array('a', 'b', 'c'), null, null, false, null)), + 30836 => array(array(array('_route' => '_778'), array('a', 'b', 'c'), null, null, false, null)), + 30884 => array(array(array('_route' => '_813'), array('a', 'b', 'c'), null, null, false, null)), + 30932 => array(array(array('_route' => '_831'), array('a', 'b', 'c'), null, null, false, null)), + 30982 => array(array(array('_route' => '_955'), array('a', 'b', 'c'), null, null, false, null)), + 31031 => array(array(array('_route' => '_997'), array('a', 'b', 'c'), null, null, false, null)), + 31089 => array(array(array('_route' => '_506'), array('a', 'b', 'c'), null, null, false, null)), + 31137 => array(array(array('_route' => '_575'), array('a', 'b', 'c'), null, null, false, null)), + 31190 => array(array(array('_route' => '_516'), array('a', 'b', 'c'), null, null, false, null)), + 31238 => array(array(array('_route' => '_553'), array('a', 'b', 'c'), null, null, false, null)), + 31291 => array(array(array('_route' => '_528'), array('a', 'b', 'c'), null, null, false, null)), + 31339 => array(array(array('_route' => '_847'), array('a', 'b', 'c'), null, null, false, null)), + 31387 => array(array(array('_route' => '_904'), array('a', 'b', 'c'), null, null, false, null)), + 31440 => array(array(array('_route' => '_574'), array('a', 'b', 'c'), null, null, false, null)), + 31488 => array(array(array('_route' => '_818'), array('a', 'b', 'c'), null, null, false, null)), + 31538 => array(array(array('_route' => '_577'), array('a', 'b', 'c'), null, null, false, null)), + 31590 => array(array(array('_route' => '_584'), array('a', 'b', 'c'), null, null, false, null)), + 31638 => array(array(array('_route' => '_905'), array('a', 'b', 'c'), null, null, false, null)), + 31691 => array(array(array('_route' => '_612'), array('a', 'b', 'c'), null, null, false, null)), + 31739 => array(array(array('_route' => '_688'), array('a', 'b', 'c'), null, null, false, null)), + 31787 => array(array(array('_route' => '_854'), array('a', 'b', 'c'), null, null, false, null)), + 31840 => array(array(array('_route' => '_613'), array('a', 'b', 'c'), null, null, false, null)), + 31888 => array(array(array('_route' => '_767'), array('a', 'b', 'c'), null, null, false, null)), + 31941 => array(array(array('_route' => '_666'), array('a', 'b', 'c'), null, null, false, null)), + 31989 => array(array(array('_route' => '_759'), array('a', 'b', 'c'), null, null, false, null)), + 32037 => array(array(array('_route' => '_827'), array('a', 'b', 'c'), null, null, false, null)), + 32085 => array(array(array('_route' => '_840'), array('a', 'b', 'c'), null, null, false, null)), + 32138 => array(array(array('_route' => '_680'), array('a', 'b', 'c'), null, null, false, null)), + 32186 => array(array(array('_route' => '_784'), array('a', 'b', 'c'), null, null, false, null)), + 32234 => array(array(array('_route' => '_842'), array('a', 'b', 'c'), null, null, false, null)), + 32282 => array(array(array('_route' => '_860'), array('a', 'b', 'c'), null, null, false, null)), + 32332 => array(array(array('_route' => '_704'), array('a', 'b', 'c'), null, null, false, null)), + 32381 => array(array(array('_route' => '_727'), array('a', 'b', 'c'), null, null, false, null)), + 32430 => array(array(array('_route' => '_777'), array('a', 'b', 'c'), null, null, false, null)), + 32482 => array(array(array('_route' => '_838'), array('a', 'b', 'c'), null, null, false, null)), + 32530 => array(array(array('_route' => '_861'), array('a', 'b', 'c'), null, null, false, null)), + 32583 => array(array(array('_route' => '_849'), array('a', 'b', 'c'), null, null, false, null)), + 32631 => array(array(array('_route' => '_982'), array('a', 'b', 'c'), null, null, false, null)), + 32679 => array(array(array('_route' => '_986'), array('a', 'b', 'c'), null, null, false, null)), + 32741 => array(array(array('_route' => '_508'), array('a', 'b', 'c'), null, null, false, null)), + 32788 => array(array(array('_route' => '_517'), array('a', 'b', 'c'), null, null, false, null)), + 32837 => array(array(array('_route' => '_622'), array('a', 'b', 'c'), null, null, false, null)), + 32890 => array(array(array('_route' => '_513'), array('a', 'b', 'c'), null, null, false, null)), + 32938 => array(array(array('_route' => '_655'), array('a', 'b', 'c'), null, null, false, null)), + 32986 => array(array(array('_route' => '_843'), array('a', 'b', 'c'), null, null, false, null)), + 33034 => array(array(array('_route' => '_939'), array('a', 'b', 'c'), null, null, false, null)), + 33084 => array(array(array('_route' => '_529'), array('a', 'b', 'c'), null, null, false, null)), + 33136 => array(array(array('_route' => '_535'), array('a', 'b', 'c'), null, null, false, null)), + 33184 => array(array(array('_route' => '_685'), array('a', 'b', 'c'), null, null, false, null)), + 33240 => array(array(array('_route' => '_559'), array('a', 'b', 'c'), null, null, false, null)), + 33287 => array(array(array('_route' => '_661'), array('a', 'b', 'c'), null, null, false, null)), + 33336 => array(array(array('_route' => '_768'), array('a', 'b', 'c'), null, null, false, null)), + 33389 => array(array(array('_route' => '_589'), array('a', 'b', 'c'), null, null, false, null)), + 33437 => array(array(array('_route' => '_647'), array('a', 'b', 'c'), null, null, false, null)), + 33485 => array(array(array('_route' => '_652'), array('a', 'b', 'c'), null, null, false, null)), + 33533 => array(array(array('_route' => '_834'), array('a', 'b', 'c'), null, null, false, null)), + 33586 => array(array(array('_route' => '_591'), array('a', 'b', 'c'), null, null, false, null)), + 33634 => array(array(array('_route' => '_599'), array('a', 'b', 'c'), null, null, false, null)), + 33687 => array(array(array('_route' => '_787'), array('a', 'b', 'c'), null, null, false, null)), + 33734 => array(array(array('_route' => '_848'), array('a', 'b', 'c'), null, null, false, null)), + 33787 => array(array(array('_route' => '_796'), array('a', 'b', 'c'), null, null, false, null)), + 33835 => array(array(array('_route' => '_877'), array('a', 'b', 'c'), null, null, false, null)), + 33885 => array(array(array('_route' => '_809'), array('a', 'b', 'c'), null, null, false, null)), + 33934 => array(array(array('_route' => '_817'), array('a', 'b', 'c'), null, null, false, null)), + 33986 => array(array(array('_route' => '_819'), array('a', 'b', 'c'), null, null, false, null)), + 34034 => array(array(array('_route' => '_865'), array('a', 'b', 'c'), null, null, false, null)), + 34084 => array(array(array('_route' => '_919'), array('a', 'b', 'c'), null, null, false, null)), + 34133 => array(array(array('_route' => '_949'), array('a', 'b', 'c'), null, null, false, null)), + 34191 => array(array(array('_route' => '_510'), array('a', 'b', 'c'), null, null, false, null)), + 34239 => array(array(array('_route' => '_590'), array('a', 'b', 'c'), null, null, false, null)), + 34287 => array(array(array('_route' => '_597'), array('a', 'b', 'c'), null, null, false, null)), + 34335 => array(array(array('_route' => '_682'), array('a', 'b', 'c'), null, null, false, null)), + 34383 => array(array(array('_route' => '_723'), array('a', 'b', 'c'), null, null, false, null)), + 34436 => array(array(array('_route' => '_521'), array('a', 'b', 'c'), null, null, false, null)), + 34484 => array(array(array('_route' => '_594'), array('a', 'b', 'c'), null, null, false, null)), + 34532 => array(array(array('_route' => '_689'), array('a', 'b', 'c'), null, null, false, null)), + 34580 => array(array(array('_route' => '_713'), array('a', 'b', 'c'), null, null, false, null)), + 34628 => array(array(array('_route' => '_889'), array('a', 'b', 'c'), null, null, false, null)), + 34681 => array(array(array('_route' => '_531'), array('a', 'b', 'c'), null, null, false, null)), + 34729 => array(array(array('_route' => '_639'), array('a', 'b', 'c'), null, null, false, null)), + 34780 => array(array(array('_route' => '_646'), array('a', 'b', 'c'), null, null, false, null)), + 34827 => array(array(array('_route' => '_659'), array('a', 'b', 'c'), null, null, false, null)), + 34876 => array(array(array('_route' => '_959'), array('a', 'b', 'c'), null, null, false, null)), + 34929 => array(array(array('_route' => '_550'), array('a', 'b', 'c'), null, null, false, null)), + 34977 => array(array(array('_route' => '_833'), array('a', 'b', 'c'), null, null, false, null)), + 35025 => array(array(array('_route' => '_899'), array('a', 'b', 'c'), null, null, false, null)), + 35081 => array(array(array('_route' => '_580'), array('a', 'b', 'c'), null, null, false, null)), + 35128 => array(array(array('_route' => '_762'), array('a', 'b', 'c'), null, null, false, null)), + 35177 => array(array(array('_route' => '_896'), array('a', 'b', 'c'), null, null, false, null)), + 35230 => array(array(array('_route' => '_595'), array('a', 'b', 'c'), null, null, false, null)), + 35278 => array(array(array('_route' => '_933'), array('a', 'b', 'c'), null, null, false, null)), + 35328 => array(array(array('_route' => '_610'), array('a', 'b', 'c'), null, null, false, null)), + 35380 => array(array(array('_route' => '_629'), array('a', 'b', 'c'), null, null, false, null)), + 35428 => array(array(array('_route' => '_744'), array('a', 'b', 'c'), null, null, false, null)), + 35481 => array(array(array('_route' => '_674'), array('a', 'b', 'c'), null, null, false, null)), + 35529 => array(array(array('_route' => '_726'), array('a', 'b', 'c'), null, null, false, null)), + 35577 => array(array(array('_route' => '_929'), array('a', 'b', 'c'), null, null, false, null)), + 35627 => array(array(array('_route' => '_696'), array('a', 'b', 'c'), null, null, false, null)), + 35679 => array(array(array('_route' => '_841'), array('a', 'b', 'c'), null, null, false, null)), + 35727 => array(array(array('_route' => '_890'), array('a', 'b', 'c'), null, null, false, null)), + 35777 => array(array(array('_route' => '_885'), array('a', 'b', 'c'), null, null, false, null)), + 35826 => array(array(array('_route' => '_888'), array('a', 'b', 'c'), null, null, false, null)), + 35875 => array(array(array('_route' => '_996'), array('a', 'b', 'c'), null, null, false, null)), + 35933 => array(array(array('_route' => '_511'), array('a', 'b', 'c'), null, null, false, null)), + 35981 => array(array(array('_route' => '_576'), array('a', 'b', 'c'), null, null, false, null)), + 36029 => array(array(array('_route' => '_623'), array('a', 'b', 'c'), null, null, false, null)), + 36082 => array(array(array('_route' => '_560'), array('a', 'b', 'c'), null, null, false, null)), + 36129 => array(array(array('_route' => '_585'), array('a', 'b', 'c'), null, null, false, null)), + 36182 => array(array(array('_route' => '_570'), array('a', 'b', 'c'), null, null, false, null)), + 36230 => array(array(array('_route' => '_578'), array('a', 'b', 'c'), null, null, false, null)), + 36281 => array(array(array('_route' => '_780'), array('a', 'b', 'c'), null, null, false, null)), + 36328 => array(array(array('_route' => '_808'), array('a', 'b', 'c'), null, null, false, null)), + 36382 => array(array(array('_route' => '_593'), array('a', 'b', 'c'), null, null, false, null)), + 36430 => array(array(array('_route' => '_900'), array('a', 'b', 'c'), null, null, false, null)), + 36483 => array(array(array('_route' => '_632'), array('a', 'b', 'c'), null, null, false, null)), + 36531 => array(array(array('_route' => '_654'), array('a', 'b', 'c'), null, null, false, null)), + 36579 => array(array(array('_route' => '_721'), array('a', 'b', 'c'), null, null, false, null)), + 36627 => array(array(array('_route' => '_836'), array('a', 'b', 'c'), null, null, false, null)), + 36680 => array(array(array('_route' => '_637'), array('a', 'b', 'c'), null, null, false, null)), + 36728 => array(array(array('_route' => '_737'), array('a', 'b', 'c'), null, null, false, null)), + 36784 => array(array(array('_route' => '_699'), array('a', 'b', 'c'), null, null, false, null)), + 36831 => array(array(array('_route' => '_822'), array('a', 'b', 'c'), null, null, false, null)), + 36880 => array(array(array('_route' => '_853'), array('a', 'b', 'c'), null, null, false, null)), + 36933 => array(array(array('_route' => '_708'), array('a', 'b', 'c'), null, null, false, null)), + 36981 => array(array(array('_route' => '_871'), array('a', 'b', 'c'), null, null, false, null)), + 37034 => array(array(array('_route' => '_752'), array('a', 'b', 'c'), null, null, false, null)), + 37082 => array(array(array('_route' => '_989'), array('a', 'b', 'c'), null, null, false, null)), + 37132 => array(array(array('_route' => '_855'), array('a', 'b', 'c'), null, null, false, null)), + 37184 => array(array(array('_route' => '_858'), array('a', 'b', 'c'), null, null, false, null)), + 37232 => array(array(array('_route' => '_898'), array('a', 'b', 'c'), null, null, false, null)), + 37282 => array(array(array('_route' => '_903'), array('a', 'b', 'c'), null, null, false, null)), + 37331 => array(array(array('_route' => '_909'), array('a', 'b', 'c'), null, null, false, null)), + 37380 => array(array(array('_route' => '_950'), array('a', 'b', 'c'), null, null, false, null)), + 37441 => array(array(array('_route' => '_512'), array('a', 'b', 'c'), null, null, false, null)), + 37488 => array(array(array('_route' => '_691'), array('a', 'b', 'c'), null, null, false, null)), + 37537 => array(array(array('_route' => '_686'), array('a', 'b', 'c'), null, null, false, null)), + 37587 => array(array(array('_route' => '_527'), array('a', 'b', 'c'), null, null, false, null)), + 37639 => array(array(array('_route' => '_541'), array('a', 'b', 'c'), null, null, false, null)), + 37687 => array(array(array('_route' => '_956'), array('a', 'b', 'c'), null, null, false, null)), + 37740 => array(array(array('_route' => '_555'), array('a', 'b', 'c'), null, null, false, null)), + 37788 => array(array(array('_route' => '_681'), array('a', 'b', 'c'), null, null, false, null)), + 37841 => array(array(array('_route' => '_556'), array('a', 'b', 'c'), null, null, false, null)), + 37889 => array(array(array('_route' => '_802'), array('a', 'b', 'c'), null, null, false, null)), + 37939 => array(array(array('_route' => '_558'), array('a', 'b', 'c'), null, null, false, null)), + 37991 => array(array(array('_route' => '_564'), array('a', 'b', 'c'), null, null, false, null)), + 38039 => array(array(array('_route' => '_670'), array('a', 'b', 'c'), null, null, false, null)), + 38087 => array(array(array('_route' => '_884'), array('a', 'b', 'c'), null, null, false, null)), + 38140 => array(array(array('_route' => '_627'), array('a', 'b', 'c'), null, null, false, null)), + 38187 => array(array(array('_route' => '_746'), array('a', 'b', 'c'), null, null, false, null)), + 38240 => array(array(array('_route' => '_668'), array('a', 'b', 'c'), null, null, false, null)), + 38291 => array(array(array('_route' => '_712'), array('a', 'b', 'c'), null, null, false, null)), + 38338 => array(array(array('_route' => '_863'), array('a', 'b', 'c'), null, null, false, null)), + 38387 => array(array(array('_route' => '_801'), array('a', 'b', 'c'), null, null, false, null)), + 38440 => array(array(array('_route' => '_709'), array('a', 'b', 'c'), null, null, false, null)), + 38488 => array(array(array('_route' => '_850'), array('a', 'b', 'c'), null, null, false, null)), + 38536 => array(array(array('_route' => '_918'), array('a', 'b', 'c'), null, null, false, null)), + 38586 => array(array(array('_route' => '_803'), array('a', 'b', 'c'), null, null, false, null)), + 38638 => array(array(array('_route' => '_864'), array('a', 'b', 'c'), null, null, false, null)), + 38686 => array(array(array('_route' => '_880'), array('a', 'b', 'c'), null, null, false, null)), + 38734 => array(array(array('_route' => '_927'), array('a', 'b', 'c'), null, null, false, null)), + 38787 => array(array(array('_route' => '_930'), array('a', 'b', 'c'), null, null, false, null)), + 38835 => array(array(array('_route' => '_951'), array('a', 'b', 'c'), null, null, false, null)), + 38883 => array(array(array('_route' => '_963'), array('a', 'b', 'c'), null, null, false, null)), + 38942 => array(array(array('_route' => '_519'), array('a', 'b', 'c'), null, null, false, null)), + 38990 => array(array(array('_route' => '_823'), array('a', 'b', 'c'), null, null, false, null)), + 39038 => array(array(array('_route' => '_954'), array('a', 'b', 'c'), null, null, false, null)), + 39091 => array(array(array('_route' => '_525'), array('a', 'b', 'c'), null, null, false, null)), + 39139 => array(array(array('_route' => '_991'), array('a', 'b', 'c'), null, null, false, null)), + 39189 => array(array(array('_route' => '_536'), array('a', 'b', 'c'), null, null, false, null)), + 39241 => array(array(array('_route' => '_545'), array('a', 'b', 'c'), null, null, false, null)), + 39289 => array(array(array('_route' => '_944'), array('a', 'b', 'c'), null, null, false, null)), + 39342 => array(array(array('_route' => '_557'), array('a', 'b', 'c'), null, null, false, null)), + 39390 => array(array(array('_route' => '_783'), array('a', 'b', 'c'), null, null, false, null)), + 39438 => array(array(array('_route' => '_807'), array('a', 'b', 'c'), null, null, false, null)), + 39491 => array(array(array('_route' => '_586'), array('a', 'b', 'c'), null, null, false, null)), + 39539 => array(array(array('_route' => '_711'), array('a', 'b', 'c'), null, null, false, null)), + 39592 => array(array(array('_route' => '_598'), array('a', 'b', 'c'), null, null, false, null)), + 39640 => array(array(array('_route' => '_635'), array('a', 'b', 'c'), null, null, false, null)), + 39688 => array(array(array('_route' => '_983'), array('a', 'b', 'c'), null, null, false, null)), + 39741 => array(array(array('_route' => '_634'), array('a', 'b', 'c'), null, null, false, null)), + 39789 => array(array(array('_route' => '_641'), array('a', 'b', 'c'), null, null, false, null)), + 39840 => array(array(array('_route' => '_779'), array('a', 'b', 'c'), null, null, false, null)), + 39887 => array(array(array('_route' => '_876'), array('a', 'b', 'c'), null, null, false, null)), + 39936 => array(array(array('_route' => '_811'), array('a', 'b', 'c'), null, null, false, null)), + 39984 => array(array(array('_route' => '_824'), array('a', 'b', 'c'), null, null, false, null)), + 40037 => array(array(array('_route' => '_660'), array('a', 'b', 'c'), null, null, false, null)), + 40085 => array(array(array('_route' => '_789'), array('a', 'b', 'c'), null, null, false, null)), + 40138 => array(array(array('_route' => '_733'), array('a', 'b', 'c'), null, null, false, null)), + 40186 => array(array(array('_route' => '_735'), array('a', 'b', 'c'), null, null, false, null)), + 40234 => array(array(array('_route' => '_882'), array('a', 'b', 'c'), null, null, false, null)), + 40282 => array(array(array('_route' => '_967'), array('a', 'b', 'c'), null, null, false, null)), + 40332 => array(array(array('_route' => '_736'), array('a', 'b', 'c'), null, null, false, null)), + 40381 => array(array(array('_route' => '_753'), array('a', 'b', 'c'), null, null, false, null)), + 40430 => array(array(array('_route' => '_786'), array('a', 'b', 'c'), null, null, false, null)), + 40479 => array(array(array('_route' => '_907'), array('a', 'b', 'c'), null, null, false, null)), + 40528 => array(array(array('_route' => '_920'), array('a', 'b', 'c'), null, null, false, null)), + 40577 => array(array(array('_route' => '_971'), array('a', 'b', 'c'), null, null, false, null)), + 40635 => array(array(array('_route' => '_520'), array('a', 'b', 'c'), null, null, false, null)), + 40683 => array(array(array('_route' => '_891'), array('a', 'b', 'c'), null, null, false, null)), + 40739 => array(array(array('_route' => '_534'), array('a', 'b', 'c'), null, null, false, null)), + 40785 => array(array(array('_route' => '_602'), array('a', 'b', 'c'), null, null, false, null)), + 40834 => array(array(array('_route' => '_605'), array('a', 'b', 'c'), null, null, false, null)), + 40882 => array(array(array('_route' => '_979'), array('a', 'b', 'c'), null, null, false, null)), + 40932 => array(array(array('_route' => '_547'), array('a', 'b', 'c'), null, null, false, null)), + 40987 => array(array(array('_route' => '_549'), array('a', 'b', 'c'), null, null, false, null)), + 41034 => array(array(array('_route' => '_755'), array('a', 'b', 'c'), null, null, false, null)), + 41083 => array(array(array('_route' => '_922'), array('a', 'b', 'c'), null, null, false, null)), + 41131 => array(array(array('_route' => '_977'), array('a', 'b', 'c'), null, null, false, null)), + 41184 => array(array(array('_route' => '_565'), array('a', 'b', 'c'), null, null, false, null)), + 41232 => array(array(array('_route' => '_926'), array('a', 'b', 'c'), null, null, false, null)), + 41282 => array(array(array('_route' => '_571'), array('a', 'b', 'c'), null, null, false, null)), + 41331 => array(array(array('_route' => '_581'), array('a', 'b', 'c'), null, null, false, null)), + 41380 => array(array(array('_route' => '_619'), array('a', 'b', 'c'), null, null, false, null)), + 41429 => array(array(array('_route' => '_636'), array('a', 'b', 'c'), null, null, false, null)), + 41481 => array(array(array('_route' => '_679'), array('a', 'b', 'c'), null, null, false, null)), + 41529 => array(array(array('_route' => '_866'), array('a', 'b', 'c'), null, null, false, null)), + 41577 => array(array(array('_route' => '_973'), array('a', 'b', 'c'), null, null, false, null)), + 41630 => array(array(array('_route' => '_690'), array('a', 'b', 'c'), null, null, false, null)), + 41678 => array(array(array('_route' => '_775'), array('a', 'b', 'c'), null, null, false, null)), + 41731 => array(array(array('_route' => '_722'), array('a', 'b', 'c'), null, null, false, null)), + 41779 => array(array(array('_route' => '_906'), array('a', 'b', 'c'), null, null, false, null)), + 41827 => array(array(array('_route' => '_946'), array('a', 'b', 'c'), null, null, false, null)), + 41877 => array(array(array('_route' => '_788'), array('a', 'b', 'c'), null, null, false, null)), + 41929 => array(array(array('_route' => '_828'), array('a', 'b', 'c'), null, null, false, null)), + 41977 => array(array(array('_route' => '_892'), array('a', 'b', 'c'), null, null, false, null)), + 42025 => array(array(array('_route' => '_972'), array('a', 'b', 'c'), null, null, false, null)), + 42075 => array(array(array('_route' => '_829'), array('a', 'b', 'c'), null, null, false, null)), + 42127 => array(array(array('_route' => '_923'), array('a', 'b', 'c'), null, null, false, null)), + 42175 => array(array(array('_route' => '_947'), array('a', 'b', 'c'), null, null, false, null)), + 42234 => array(array(array('_route' => '_526'), array('a', 'b', 'c'), null, null, false, null)), + 42282 => array(array(array('_route' => '_614'), array('a', 'b', 'c'), null, null, false, null)), + 42330 => array(array(array('_route' => '_621'), array('a', 'b', 'c'), null, null, false, null)), + 42383 => array(array(array('_route' => '_543'), array('a', 'b', 'c'), null, null, false, null)), + 42431 => array(array(array('_route' => '_812'), array('a', 'b', 'c'), null, null, false, null)), + 42487 => array(array(array('_route' => '_548'), array('a', 'b', 'c'), null, null, false, null)), + 42534 => array(array(array('_route' => '_747'), array('a', 'b', 'c'), null, null, false, null)), + 42583 => array(array(array('_route' => '_715'), array('a', 'b', 'c'), null, null, false, null)), + 42631 => array(array(array('_route' => '_940'), array('a', 'b', 'c'), null, null, false, null)), + 42684 => array(array(array('_route' => '_563'), array('a', 'b', 'c'), null, null, false, null)), + 42732 => array(array(array('_route' => '_611'), array('a', 'b', 'c'), null, null, false, null)), + 42780 => array(array(array('_route' => '_830'), array('a', 'b', 'c'), null, null, false, null)), + 42833 => array(array(array('_route' => '_569'), array('a', 'b', 'c'), null, null, false, null)), + 42881 => array(array(array('_route' => '_908'), array('a', 'b', 'c'), null, null, false, null)), + 42929 => array(array(array('_route' => '_913'), array('a', 'b', 'c'), null, null, false, null)), + 42982 => array(array(array('_route' => '_644'), array('a', 'b', 'c'), null, null, false, null)), + 43030 => array(array(array('_route' => '_776'), array('a', 'b', 'c'), null, null, false, null)), + 43078 => array(array(array('_route' => '_856'), array('a', 'b', 'c'), null, null, false, null)), + 43131 => array(array(array('_route' => '_650'), array('a', 'b', 'c'), null, null, false, null)), + 43179 => array(array(array('_route' => '_761'), array('a', 'b', 'c'), null, null, false, null)), + 43232 => array(array(array('_route' => '_663'), array('a', 'b', 'c'), null, null, false, null)), + 43280 => array(array(array('_route' => '_754'), array('a', 'b', 'c'), null, null, false, null)), + 43333 => array(array(array('_route' => '_665'), array('a', 'b', 'c'), null, null, false, null)), + 43381 => array(array(array('_route' => '_805'), array('a', 'b', 'c'), null, null, false, null)), + 43429 => array(array(array('_route' => '_846'), array('a', 'b', 'c'), null, null, false, null)), + 43477 => array(array(array('_route' => '_857'), array('a', 'b', 'c'), null, null, false, null)), + 43530 => array(array(array('_route' => '_675'), array('a', 'b', 'c'), null, null, false, null)), + 43578 => array(array(array('_route' => '_839'), array('a', 'b', 'c'), null, null, false, null)), + 43626 => array(array(array('_route' => '_968'), array('a', 'b', 'c'), null, null, false, null)), + 43676 => array(array(array('_route' => '_697'), array('a', 'b', 'c'), null, null, false, null)), + 43728 => array(array(array('_route' => '_725'), array('a', 'b', 'c'), null, null, false, null)), + 43776 => array(array(array('_route' => '_794'), array('a', 'b', 'c'), null, null, false, null)), + 43829 => array(array(array('_route' => '_773'), array('a', 'b', 'c'), null, null, false, null)), + 43877 => array(array(array('_route' => '_992'), array('a', 'b', 'c'), null, null, false, null)), + 43930 => array(array(array('_route' => '_901'), array('a', 'b', 'c'), null, null, false, null)), + 43978 => array(array(array('_route' => '_970'), array('a', 'b', 'c'), null, null, false, null)), + 44028 => array(array(array('_route' => '_964'), array('a', 'b', 'c'), null, null, false, null)), + 44086 => array(array(array('_route' => '_530'), array('a', 'b', 'c'), null, null, false, null)), + 44134 => array(array(array('_route' => '_703'), array('a', 'b', 'c'), null, null, false, null)), + 44187 => array(array(array('_route' => '_533'), array('a', 'b', 'c'), null, null, false, null)), + 44235 => array(array(array('_route' => '_739'), array('a', 'b', 'c'), null, null, false, null)), + 44283 => array(array(array('_route' => '_791'), array('a', 'b', 'c'), null, null, false, null)), + 44331 => array(array(array('_route' => '_987'), array('a', 'b', 'c'), null, null, false, null)), + 44384 => array(array(array('_route' => '_566'), array('a', 'b', 'c'), null, null, false, null)), + 44432 => array(array(array('_route' => '_592'), array('a', 'b', 'c'), null, null, false, null)), + 44488 => array(array(array('_route' => '_568'), array('a', 'b', 'c'), null, null, false, null)), + 44534 => array(array(array('_route' => '_868'), array('a', 'b', 'c'), null, null, false, null)), + 44583 => array(array(array('_route' => '_878'), array('a', 'b', 'c'), null, null, false, null)), + 44636 => array(array(array('_route' => '_588'), array('a', 'b', 'c'), null, null, false, null)), + 44684 => array(array(array('_route' => '_793'), array('a', 'b', 'c'), null, null, false, null)), + 44732 => array(array(array('_route' => '_917'), array('a', 'b', 'c'), null, null, false, null)), + 44785 => array(array(array('_route' => '_600'), array('a', 'b', 'c'), null, null, false, null)), + 44833 => array(array(array('_route' => '_728'), array('a', 'b', 'c'), null, null, false, null)), + 44886 => array(array(array('_route' => '_603'), array('a', 'b', 'c'), null, null, false, null)), + 44934 => array(array(array('_route' => '_765'), array('a', 'b', 'c'), null, null, false, null)), + 44987 => array(array(array('_route' => '_607'), array('a', 'b', 'c'), null, null, false, null)), + 45035 => array(array(array('_route' => '_676'), array('a', 'b', 'c'), null, null, false, null)), + 45083 => array(array(array('_route' => '_804'), array('a', 'b', 'c'), null, null, false, null)), + 45136 => array(array(array('_route' => '_609'), array('a', 'b', 'c'), null, null, false, null)), + 45184 => array(array(array('_route' => '_961'), array('a', 'b', 'c'), null, null, false, null)), + 45232 => array(array(array('_route' => '_980'), array('a', 'b', 'c'), null, null, false, null)), + 45282 => array(array(array('_route' => '_714'), array('a', 'b', 'c'), null, null, false, null)), + 45334 => array(array(array('_route' => '_730'), array('a', 'b', 'c'), null, null, false, null)), + 45382 => array(array(array('_route' => '_806'), array('a', 'b', 'c'), null, null, false, null)), + 45430 => array(array(array('_route' => '_825'), array('a', 'b', 'c'), null, null, false, null)), + 45478 => array(array(array('_route' => '_879'), array('a', 'b', 'c'), null, null, false, null)), + 45526 => array(array(array('_route' => '_893'), array('a', 'b', 'c'), null, null, false, null)), + 45576 => array(array(array('_route' => '_928'), array('a', 'b', 'c'), null, null, false, null)), + 45628 => array(array(array('_route' => '_932'), array('a', 'b', 'c'), null, null, false, null)), + 45676 => array(array(array('_route' => '_958'), array('a', 'b', 'c'), null, null, false, null)), + 45726 => array(array(array('_route' => '_984'), array('a', 'b', 'c'), null, null, false, null)), + 45784 => array(array(array('_route' => '_538'), array('a', 'b', 'c'), null, null, false, null)), + 45832 => array(array(array('_route' => '_993'), array('a', 'b', 'c'), null, null, false, null)), + 45882 => array(array(array('_route' => '_542'), array('a', 'b', 'c'), null, null, false, null)), + 45934 => array(array(array('_route' => '_551'), array('a', 'b', 'c'), null, null, false, null)), + 45982 => array(array(array('_route' => '_687'), array('a', 'b', 'c'), null, null, false, null)), + 46030 => array(array(array('_route' => '_724'), array('a', 'b', 'c'), null, null, false, null)), + 46078 => array(array(array('_route' => '_925'), array('a', 'b', 'c'), null, null, false, null)), + 46131 => array(array(array('_route' => '_587'), array('a', 'b', 'c'), null, null, false, null)), + 46179 => array(array(array('_route' => '_914'), array('a', 'b', 'c'), null, null, false, null)), + 46229 => array(array(array('_route' => '_616'), array('a', 'b', 'c'), null, null, false, null)), + 46284 => array(array(array('_route' => '_677'), array('a', 'b', 'c'), null, null, false, null)), + 46331 => array(array(array('_route' => '_815'), array('a', 'b', 'c'), null, null, false, null)), + 46380 => array(array(array('_route' => '_781'), array('a', 'b', 'c'), null, null, false, null)), + 46430 => array(array(array('_route' => '_717'), array('a', 'b', 'c'), null, null, false, null)), + 46482 => array(array(array('_route' => '_782'), array('a', 'b', 'c'), null, null, false, null)), + 46530 => array(array(array('_route' => '_832'), array('a', 'b', 'c'), null, null, false, null)), + 46583 => array(array(array('_route' => '_795'), array('a', 'b', 'c'), null, null, false, null)), + 46631 => array(array(array('_route' => '_887'), array('a', 'b', 'c'), null, null, false, null)), + 46681 => array(array(array('_route' => '_800'), array('a', 'b', 'c'), null, null, false, null)), + 46730 => array(array(array('_route' => '_826'), array('a', 'b', 'c'), null, null, false, null)), + 46779 => array(array(array('_route' => '_881'), array('a', 'b', 'c'), null, null, false, null)), + 46828 => array(array(array('_route' => '_886'), array('a', 'b', 'c'), null, null, false, null)), + 46877 => array(array(array('_route' => '_938'), array('a', 'b', 'c'), null, null, false, null)), + 46935 => array(array(array('_route' => '_540'), array('a', 'b', 'c'), null, null, false, null)), + 46983 => array(array(array('_route' => '_643'), array('a', 'b', 'c'), null, null, false, null)), + 47033 => array(array(array('_route' => '_544'), array('a', 'b', 'c'), null, null, false, null)), + 47082 => array(array(array('_route' => '_552'), array('a', 'b', 'c'), null, null, false, null)), + 47134 => array(array(array('_route' => '_567'), array('a', 'b', 'c'), null, null, false, null)), + 47182 => array(array(array('_route' => '_608'), array('a', 'b', 'c'), null, null, false, null)), + 47230 => array(array(array('_route' => '_698'), array('a', 'b', 'c'), null, null, false, null)), + 47278 => array(array(array('_route' => '_988'), array('a', 'b', 'c'), null, null, false, null)), + 47331 => array(array(array('_route' => '_583'), array('a', 'b', 'c'), null, null, false, null)), + 47379 => array(array(array('_route' => '_998'), array('a', 'b', 'c'), null, null, false, null)), + 47432 => array(array(array('_route' => '_604'), array('a', 'b', 'c'), null, null, false, null)), + 47480 => array(array(array('_route' => '_630'), array('a', 'b', 'c'), null, null, false, null)), + 47528 => array(array(array('_route' => '_706'), array('a', 'b', 'c'), null, null, false, null)), + 47576 => array(array(array('_route' => '_976'), array('a', 'b', 'c'), null, null, false, null)), + 47629 => array(array(array('_route' => '_673'), array('a', 'b', 'c'), null, null, false, null)), + 47677 => array(array(array('_route' => '_678'), array('a', 'b', 'c'), null, null, false, null)), + 47725 => array(array(array('_route' => '_931'), array('a', 'b', 'c'), null, null, false, null)), + 47775 => array(array(array('_route' => '_751'), array('a', 'b', 'c'), null, null, false, null)), + 47824 => array(array(array('_route' => '_766'), array('a', 'b', 'c'), null, null, false, null)), + 47876 => array(array(array('_route' => '_792'), array('a', 'b', 'c'), null, null, false, null)), + 47924 => array(array(array('_route' => '_814'), array('a', 'b', 'c'), null, null, false, null)), + 47974 => array(array(array('_route' => '_798'), array('a', 'b', 'c'), null, null, false, null)), + 48026 => array(array(array('_route' => '_851'), array('a', 'b', 'c'), null, null, false, null)), + 48074 => array(array(array('_route' => '_941'), array('a', 'b', 'c'), null, null, false, null)), + 48122 => array(array(array('_route' => '_953'), array('a', 'b', 'c'), null, null, false, null)), + 48170 => array(array(array('_route' => '_975'), array('a', 'b', 'c'), null, null, false, null)), + 48220 => array(array(array('_route' => '_873'), array('a', 'b', 'c'), null, null, false, null)), + 48269 => array(array(array('_route' => '_936'), array('a', 'b', 'c'), null, null, false, null)), + 48318 => array(array(array('_route' => '_994'), array('a', 'b', 'c'), null, null, false, null)), + 48376 => array(array(array('_route' => '_562'), array('a', 'b', 'c'), null, null, false, null)), + 48424 => array(array(array('_route' => '_770'), array('a', 'b', 'c'), null, null, false, null)), + 48475 => array(array(array('_route' => '_774'), array('a', 'b', 'c'), null, null, false, null)), + 48522 => array(array(array('_route' => '_966'), array('a', 'b', 'c'), null, null, false, null)), + 48573 => array(array(array('_route' => '_582'), array('a', 'b', 'c'), null, null, false, null)), + 48625 => array(array(array('_route' => '_606'), array('a', 'b', 'c'), null, null, false, null)), + 48673 => array(array(array('_route' => '_648'), array('a', 'b', 'c'), null, null, false, null)), + 48723 => array(array(array('_route' => '_624'), array('a', 'b', 'c'), null, null, false, null)), + 48775 => array(array(array('_route' => '_626'), array('a', 'b', 'c'), null, null, false, null)), + 48823 => array(array(array('_route' => '_821'), array('a', 'b', 'c'), null, null, false, null)), + 48873 => array(array(array('_route' => '_628'), array('a', 'b', 'c'), null, null, false, null)), + 48922 => array(array(array('_route' => '_638'), array('a', 'b', 'c'), null, null, false, null)), + 48974 => array(array(array('_route' => '_640'), array('a', 'b', 'c'), null, null, false, null)), + 49022 => array(array(array('_route' => '_990'), array('a', 'b', 'c'), null, null, false, null)), + 49072 => array(array(array('_route' => '_705'), array('a', 'b', 'c'), null, null, false, null)), + 49121 => array(array(array('_route' => '_757'), array('a', 'b', 'c'), null, null, false, null)), + 49176 => array(array(array('_route' => '_785'), array('a', 'b', 'c'), null, null, false, null)), + 49223 => array(array(array('_route' => '_875'), array('a', 'b', 'c'), null, null, false, null)), + 49270 => array(array(array('_route' => '_894'), array('a', 'b', 'c'), null, null, false, null)), + 49319 => array(array(array('_route' => '_945'), array('a', 'b', 'c'), null, null, false, null)), + 49375 => array(array(array('_route' => '_816'), array('a', 'b', 'c'), null, null, false, null)), + 49422 => array(array(array('_route' => '_872'), array('a', 'b', 'c'), null, null, false, null)), + 49471 => array(array(array('_route' => '_921'), array('a', 'b', 'c'), null, null, false, null)), + 49519 => array(array(array('_route' => '_960'), array('a', 'b', 'c'), null, null, false, null)), + 49567 => array(array(array('_route' => '_974'), array('a', 'b', 'c'), null, null, false, null)), + 49620 => array(array(array('_route' => '_835'), array('a', 'b', 'c'), null, null, false, null)), + 49668 => array(array(array('_route' => '_934'), array('a', 'b', 'c'), null, null, false, null)), + 49718 => array(array(array('_route' => '_869'), array('a', 'b', 'c'), null, null, false, null)), ); - - foreach ($regexList as $offset => $regex) { - while (preg_match($regex, $matchedPathinfo, $matches)) { - switch ($m = (int) $matches['MARK']) { - default: - $routes = array( - 54 => array(array('_route' => '_0'), array('a', 'b', 'c'), null, null), - 102 => array(array('_route' => '_190'), array('a', 'b', 'c'), null, null), - 147 => array(array('_route' => '_478'), array('a', 'b', 'c'), null, null), - 194 => array(array('_route' => '_259'), array('a', 'b', 'c'), null, null), - 240 => array(array('_route' => '_368'), array('a', 'b', 'c'), null, null), - 291 => array(array('_route' => '_1'), array('a', 'b', 'c'), null, null), - 337 => array(array('_route' => '_116'), array('a', 'b', 'c'), null, null), - 383 => array(array('_route' => '_490'), array('a', 'b', 'c'), null, null), - 434 => array(array('_route' => '_2'), array('a', 'b', 'c'), null, null), - 480 => array(array('_route' => '_124'), array('a', 'b', 'c'), null, null), - 526 => array(array('_route' => '_389'), array('a', 'b', 'c'), null, null), - 577 => array(array('_route' => '_8'), array('a', 'b', 'c'), null, null), - 623 => array(array('_route' => '_104'), array('a', 'b', 'c'), null, null), - 677 => array(array('_route' => '_12'), array('a', 'b', 'c'), null, null), - 722 => array(array('_route' => '_442'), array('a', 'b', 'c'), null, null), - 769 => array(array('_route' => '_253'), array('a', 'b', 'c'), null, null), - 820 => array(array('_route' => '_13'), array('a', 'b', 'c'), null, null), - 866 => array(array('_route' => '_254'), array('a', 'b', 'c'), null, null), - 912 => array(array('_route' => '_347'), array('a', 'b', 'c'), null, null), - 963 => array(array('_route' => '_16'), array('a', 'b', 'c'), null, null), - 1009 => array(array('_route' => '_87'), array('a', 'b', 'c'), null, null), - 1058 => array(array('_route' => '_31'), array('a', 'b', 'c'), null, null), - 1109 => array(array('_route' => '_50'), array('a', 'b', 'c'), null, null), - 1156 => array(array('_route' => '_219'), array('a', 'b', 'c'), null, null), - 1203 => array(array('_route' => '_332'), array('a', 'b', 'c'), null, null), - 1250 => array(array('_route' => '_359'), array('a', 'b', 'c'), null, null), - 1302 => array(array('_route' => '_183'), array('a', 'b', 'c'), null, null), - 1349 => array(array('_route' => '_500'), array('a', 'b', 'c'), null, null), - 1401 => array(array('_route' => '_214'), array('a', 'b', 'c'), null, null), - 1448 => array(array('_route' => '_321'), array('a', 'b', 'c'), null, null), - 1497 => array(array('_route' => '_243'), array('a', 'b', 'c'), null, null), - 1545 => array(array('_route' => '_328'), array('a', 'b', 'c'), null, null), - 1596 => array(array('_route' => '_362'), array('a', 'b', 'c'), null, null), - 1643 => array(array('_route' => '_488'), array('a', 'b', 'c'), null, null), - 1701 => array(array('_route' => '_3'), array('a', 'b', 'c'), null, null), - 1751 => array(array('_route' => '_102'), array('a', 'b', 'c'), null, null), - 1797 => array(array('_route' => '_220'), array('a', 'b', 'c'), null, null), - 1845 => array(array('_route' => '_127'), array('a', 'b', 'c'), null, null), - 1897 => array(array('_route' => '_5'), array('a', 'b', 'c'), null, null), - 1944 => array(array('_route' => '_242'), array('a', 'b', 'c'), null, null), - 1991 => array(array('_route' => '_397'), array('a', 'b', 'c'), null, null), - 2038 => array(array('_route' => '_454'), array('a', 'b', 'c'), null, null), - 2090 => array(array('_route' => '_34'), array('a', 'b', 'c'), null, null), - 2137 => array(array('_route' => '_281'), array('a', 'b', 'c'), null, null), - 2189 => array(array('_route' => '_64'), array('a', 'b', 'c'), null, null), - 2236 => array(array('_route' => '_205'), array('a', 'b', 'c'), null, null), - 2291 => array(array('_route' => '_71'), array('a', 'b', 'c'), null, null), - 2337 => array(array('_route' => '_203'), array('a', 'b', 'c'), null, null), - 2385 => array(array('_route' => '_97'), array('a', 'b', 'c'), null, null), - 2437 => array(array('_route' => '_98'), array('a', 'b', 'c'), null, null), - 2484 => array(array('_route' => '_267'), array('a', 'b', 'c'), null, null), - 2531 => array(array('_route' => '_309'), array('a', 'b', 'c'), null, null), - 2586 => array(array('_route' => '_117'), array('a', 'b', 'c'), null, null), - 2631 => array(array('_route' => '_211'), array('a', 'b', 'c'), null, null), - 2679 => array(array('_route' => '_484'), array('a', 'b', 'c'), null, null), - 2731 => array(array('_route' => '_139'), array('a', 'b', 'c'), null, null), - 2778 => array(array('_route' => '_421'), array('a', 'b', 'c'), null, null), - 2830 => array(array('_route' => '_185'), array('a', 'b', 'c'), null, null), - 2877 => array(array('_route' => '_439'), array('a', 'b', 'c'), null, null), - 2926 => array(array('_route' => '_218'), array('a', 'b', 'c'), null, null), - 2977 => array(array('_route' => '_233'), array('a', 'b', 'c'), null, null), - 3024 => array(array('_route' => '_483'), array('a', 'b', 'c'), null, null), - 3073 => array(array('_route' => '_265'), array('a', 'b', 'c'), null, null), - 3124 => array(array('_route' => '_299'), array('a', 'b', 'c'), null, null), - 3171 => array(array('_route' => '_351'), array('a', 'b', 'c'), null, null), - 3218 => array(array('_route' => '_472'), array('a', 'b', 'c'), null, null), - 3267 => array(array('_route' => '_360'), array('a', 'b', 'c'), null, null), - 3315 => array(array('_route' => '_466'), array('a', 'b', 'c'), null, null), - 3372 => array(array('_route' => '_4'), array('a', 'b', 'c'), null, null), - 3419 => array(array('_route' => '_142'), array('a', 'b', 'c'), null, null), - 3466 => array(array('_route' => '_151'), array('a', 'b', 'c'), null, null), - 3513 => array(array('_route' => '_308'), array('a', 'b', 'c'), null, null), - 3560 => array(array('_route' => '_440'), array('a', 'b', 'c'), null, null), - 3612 => array(array('_route' => '_14'), array('a', 'b', 'c'), null, null), - 3659 => array(array('_route' => '_358'), array('a', 'b', 'c'), null, null), - 3711 => array(array('_route' => '_37'), array('a', 'b', 'c'), null, null), - 3758 => array(array('_route' => '_38'), array('a', 'b', 'c'), null, null), - 3805 => array(array('_route' => '_146'), array('a', 'b', 'c'), null, null), - 3852 => array(array('_route' => '_194'), array('a', 'b', 'c'), null, null), - 3899 => array(array('_route' => '_487'), array('a', 'b', 'c'), null, null), - 3948 => array(array('_route' => '_42'), array('a', 'b', 'c'), null, null), - 3999 => array(array('_route' => '_54'), array('a', 'b', 'c'), null, null), - 4046 => array(array('_route' => '_326'), array('a', 'b', 'c'), null, null), - 4098 => array(array('_route' => '_68'), array('a', 'b', 'c'), null, null), - 4145 => array(array('_route' => '_108'), array('a', 'b', 'c'), null, null), - 4197 => array(array('_route' => '_74'), array('a', 'b', 'c'), null, null), - 4244 => array(array('_route' => '_315'), array('a', 'b', 'c'), null, null), - 4291 => array(array('_route' => '_374'), array('a', 'b', 'c'), null, null), - 4343 => array(array('_route' => '_99'), array('a', 'b', 'c'), null, null), - 4390 => array(array('_route' => '_238'), array('a', 'b', 'c'), null, null), - 4442 => array(array('_route' => '_107'), array('a', 'b', 'c'), null, null), - 4489 => array(array('_route' => '_409'), array('a', 'b', 'c'), null, null), - 4541 => array(array('_route' => '_122'), array('a', 'b', 'c'), null, null), - 4588 => array(array('_route' => '_379'), array('a', 'b', 'c'), null, null), - 4635 => array(array('_route' => '_390'), array('a', 'b', 'c'), null, null), - 4687 => array(array('_route' => '_171'), array('a', 'b', 'c'), null, null), - 4734 => array(array('_route' => '_260'), array('a', 'b', 'c'), null, null), - 4781 => array(array('_route' => '_434'), array('a', 'b', 'c'), null, null), - 4830 => array(array('_route' => '_189'), array('a', 'b', 'c'), null, null), - 4878 => array(array('_route' => '_467'), array('a', 'b', 'c'), null, null), - 4935 => array(array('_route' => '_6'), array('a', 'b', 'c'), null, null), - 4982 => array(array('_route' => '_286'), array('a', 'b', 'c'), null, null), - 5029 => array(array('_route' => '_438'), array('a', 'b', 'c'), null, null), - 5081 => array(array('_route' => '_19'), array('a', 'b', 'c'), null, null), - 5131 => array(array('_route' => '_24'), array('a', 'b', 'c'), null, null), - 5177 => array(array('_route' => '_172'), array('a', 'b', 'c'), null, null), - 5230 => array(array('_route' => '_33'), array('a', 'b', 'c'), null, null), - 5277 => array(array('_route' => '_400'), array('a', 'b', 'c'), null, null), - 5324 => array(array('_route' => '_427'), array('a', 'b', 'c'), null, null), - 5376 => array(array('_route' => '_35'), array('a', 'b', 'c'), null, null), - 5423 => array(array('_route' => '_156'), array('a', 'b', 'c'), null, null), - 5475 => array(array('_route' => '_36'), array('a', 'b', 'c'), null, null), - 5522 => array(array('_route' => '_251'), array('a', 'b', 'c'), null, null), - 5574 => array(array('_route' => '_43'), array('a', 'b', 'c'), null, null), - 5621 => array(array('_route' => '_292'), array('a', 'b', 'c'), null, null), - 5668 => array(array('_route' => '_411'), array('a', 'b', 'c'), null, null), - 5720 => array(array('_route' => '_69'), array('a', 'b', 'c'), null, null), - 5767 => array(array('_route' => '_159'), array('a', 'b', 'c'), null, null), - 5814 => array(array('_route' => '_170'), array('a', 'b', 'c'), null, null), - 5861 => array(array('_route' => '_376'), array('a', 'b', 'c'), null, null), - 5913 => array(array('_route' => '_131'), array('a', 'b', 'c'), null, null), - 5960 => array(array('_route' => '_446'), array('a', 'b', 'c'), null, null), - 6015 => array(array('_route' => '_140'), array('a', 'b', 'c'), null, null), - 6061 => array(array('_route' => '_353'), array('a', 'b', 'c'), null, null), - 6112 => array(array('_route' => '_224'), array('a', 'b', 'c'), null, null), - 6158 => array(array('_route' => '_346'), array('a', 'b', 'c'), null, null), - 6204 => array(array('_route' => '_443'), array('a', 'b', 'c'), null, null), - 6254 => array(array('_route' => '_154'), array('a', 'b', 'c'), null, null), - 6305 => array(array('_route' => '_212'), array('a', 'b', 'c'), null, null), - 6352 => array(array('_route' => '_313'), array('a', 'b', 'c'), null, null), - 6399 => array(array('_route' => '_395'), array('a', 'b', 'c'), null, null), - 6446 => array(array('_route' => '_441'), array('a', 'b', 'c'), null, null), - 6498 => array(array('_route' => '_223'), array('a', 'b', 'c'), null, null), - 6545 => array(array('_route' => '_303'), array('a', 'b', 'c'), null, null), - 6594 => array(array('_route' => '_410'), array('a', 'b', 'c'), null, null), - 6642 => array(array('_route' => '_494'), array('a', 'b', 'c'), null, null), - 6702 => array(array('_route' => '_7'), array('a', 'b', 'c'), null, null), - 6748 => array(array('_route' => '_268'), array('a', 'b', 'c'), null, null), - 6796 => array(array('_route' => '_178'), array('a', 'b', 'c'), null, null), - 6843 => array(array('_route' => '_179'), array('a', 'b', 'c'), null, null), - 6890 => array(array('_route' => '_416'), array('a', 'b', 'c'), null, null), - 6942 => array(array('_route' => '_25'), array('a', 'b', 'c'), null, null), - 6989 => array(array('_route' => '_307'), array('a', 'b', 'c'), null, null), - 7036 => array(array('_route' => '_387'), array('a', 'b', 'c'), null, null), - 7083 => array(array('_route' => '_471'), array('a', 'b', 'c'), null, null), - 7132 => array(array('_route' => '_90'), array('a', 'b', 'c'), null, null), - 7183 => array(array('_route' => '_95'), array('a', 'b', 'c'), null, null), - 7230 => array(array('_route' => '_338'), array('a', 'b', 'c'), null, null), - 7277 => array(array('_route' => '_401'), array('a', 'b', 'c'), null, null), - 7329 => array(array('_route' => '_147'), array('a', 'b', 'c'), null, null), - 7376 => array(array('_route' => '_319'), array('a', 'b', 'c'), null, null), - 7423 => array(array('_route' => '_354'), array('a', 'b', 'c'), null, null), - 7470 => array(array('_route' => '_428'), array('a', 'b', 'c'), null, null), - 7522 => array(array('_route' => '_162'), array('a', 'b', 'c'), null, null), - 7572 => array(array('_route' => '_175'), array('a', 'b', 'c'), null, null), - 7618 => array(array('_route' => '_455'), array('a', 'b', 'c'), null, null), - 7666 => array(array('_route' => '_355'), array('a', 'b', 'c'), null, null), - 7718 => array(array('_route' => '_197'), array('a', 'b', 'c'), null, null), - 7768 => array(array('_route' => '_202'), array('a', 'b', 'c'), null, null), - 7813 => array(array('_route' => '_489'), array('a', 'b', 'c'), null, null), - 7863 => array(array('_route' => '_199'), array('a', 'b', 'c'), null, null), - 7914 => array(array('_route' => '_263'), array('a', 'b', 'c'), null, null), - 7961 => array(array('_route' => '_406'), array('a', 'b', 'c'), null, null), - 8010 => array(array('_route' => '_289'), array('a', 'b', 'c'), null, null), - 8058 => array(array('_route' => '_325'), array('a', 'b', 'c'), null, null), - 8106 => array(array('_route' => '_378'), array('a', 'b', 'c'), null, null), - 8154 => array(array('_route' => '_468'), array('a', 'b', 'c'), null, null), - 8211 => array(array('_route' => '_9'), array('a', 'b', 'c'), null, null), - 8258 => array(array('_route' => '_216'), array('a', 'b', 'c'), null, null), - 8307 => array(array('_route' => '_26'), array('a', 'b', 'c'), null, null), - 8355 => array(array('_route' => '_62'), array('a', 'b', 'c'), null, null), - 8406 => array(array('_route' => '_81'), array('a', 'b', 'c'), null, null), - 8453 => array(array('_route' => '_318'), array('a', 'b', 'c'), null, null), - 8505 => array(array('_route' => '_121'), array('a', 'b', 'c'), null, null), - 8551 => array(array('_route' => '_182'), array('a', 'b', 'c'), null, null), - 8603 => array(array('_route' => '_136'), array('a', 'b', 'c'), null, null), - 8650 => array(array('_route' => '_415'), array('a', 'b', 'c'), null, null), - 8697 => array(array('_route' => '_457'), array('a', 'b', 'c'), null, null), - 8744 => array(array('_route' => '_463'), array('a', 'b', 'c'), null, null), - 8796 => array(array('_route' => '_148'), array('a', 'b', 'c'), null, null), - 8843 => array(array('_route' => '_273'), array('a', 'b', 'c'), null, null), - 8892 => array(array('_route' => '_284'), array('a', 'b', 'c'), null, null), - 8940 => array(array('_route' => '_288'), array('a', 'b', 'c'), null, null), - 8991 => array(array('_route' => '_295'), array('a', 'b', 'c'), null, null), - 9038 => array(array('_route' => '_305'), array('a', 'b', 'c'), null, null), - 9085 => array(array('_route' => '_453'), array('a', 'b', 'c'), null, null), - 9134 => array(array('_route' => '_340'), array('a', 'b', 'c'), null, null), - 9185 => array(array('_route' => '_371'), array('a', 'b', 'c'), null, null), - 9232 => array(array('_route' => '_417'), array('a', 'b', 'c'), null, null), - 9284 => array(array('_route' => '_382'), array('a', 'b', 'c'), null, null), - 9331 => array(array('_route' => '_404'), array('a', 'b', 'c'), null, null), - 9389 => array(array('_route' => '_10'), array('a', 'b', 'c'), null, null), - 9436 => array(array('_route' => '_279'), array('a', 'b', 'c'), null, null), - 9483 => array(array('_route' => '_377'), array('a', 'b', 'c'), null, null), - 9535 => array(array('_route' => '_39'), array('a', 'b', 'c'), null, null), - 9582 => array(array('_route' => '_40'), array('a', 'b', 'c'), null, null), - 9629 => array(array('_route' => '_264'), array('a', 'b', 'c'), null, null), - 9676 => array(array('_route' => '_449'), array('a', 'b', 'c'), null, null), - 9728 => array(array('_route' => '_46'), array('a', 'b', 'c'), null, null), - 9775 => array(array('_route' => '_257'), array('a', 'b', 'c'), null, null), - 9822 => array(array('_route' => '_274'), array('a', 'b', 'c'), null, null), - 9869 => array(array('_route' => '_388'), array('a', 'b', 'c'), null, null), - 9921 => array(array('_route' => '_53'), array('a', 'b', 'c'), null, null), - 9968 => array(array('_route' => '_345'), array('a', 'b', 'c'), null, null), - 10020 => array(array('_route' => '_73'), array('a', 'b', 'c'), null, null), - 10068 => array(array('_route' => '_296'), array('a', 'b', 'c'), null, null), - 10121 => array(array('_route' => '_75'), array('a', 'b', 'c'), null, null), - 10169 => array(array('_route' => '_458'), array('a', 'b', 'c'), null, null), - 10225 => array(array('_route' => '_79'), array('a', 'b', 'c'), null, null), - 10272 => array(array('_route' => '_129'), array('a', 'b', 'c'), null, null), - 10319 => array(array('_route' => '_418'), array('a', 'b', 'c'), null, null), - 10368 => array(array('_route' => '_225'), array('a', 'b', 'c'), null, null), - 10416 => array(array('_route' => '_479'), array('a', 'b', 'c'), null, null), - 10466 => array(array('_route' => '_120'), array('a', 'b', 'c'), null, null), - 10515 => array(array('_route' => '_276'), array('a', 'b', 'c'), null, null), - 10564 => array(array('_route' => '_370'), array('a', 'b', 'c'), null, null), - 10616 => array(array('_route' => '_385'), array('a', 'b', 'c'), null, null), - 10664 => array(array('_route' => '_469'), array('a', 'b', 'c'), null, null), - 10714 => array(array('_route' => '_435'), array('a', 'b', 'c'), null, null), - 10772 => array(array('_route' => '_11'), array('a', 'b', 'c'), null, null), - 10820 => array(array('_route' => '_105'), array('a', 'b', 'c'), null, null), - 10868 => array(array('_route' => '_132'), array('a', 'b', 'c'), null, null), - 10921 => array(array('_route' => '_18'), array('a', 'b', 'c'), null, null), - 10969 => array(array('_route' => '_210'), array('a', 'b', 'c'), null, null), - 11017 => array(array('_route' => '_329'), array('a', 'b', 'c'), null, null), - 11073 => array(array('_route' => '_29'), array('a', 'b', 'c'), null, null), - 11120 => array(array('_route' => '_480'), array('a', 'b', 'c'), null, null), - 11169 => array(array('_route' => '_426'), array('a', 'b', 'c'), null, null), - 11222 => array(array('_route' => '_32'), array('a', 'b', 'c'), null, null), - 11270 => array(array('_route' => '_217'), array('a', 'b', 'c'), null, null), - 11318 => array(array('_route' => '_275'), array('a', 'b', 'c'), null, null), - 11371 => array(array('_route' => '_45'), array('a', 'b', 'c'), null, null), - 11419 => array(array('_route' => '_157'), array('a', 'b', 'c'), null, null), - 11467 => array(array('_route' => '_184'), array('a', 'b', 'c'), null, null), - 11515 => array(array('_route' => '_250'), array('a', 'b', 'c'), null, null), - 11563 => array(array('_route' => '_356'), array('a', 'b', 'c'), null, null), - 11616 => array(array('_route' => '_47'), array('a', 'b', 'c'), null, null), - 11664 => array(array('_route' => '_445'), array('a', 'b', 'c'), null, null), - 11714 => array(array('_route' => '_48'), array('a', 'b', 'c'), null, null), - 11766 => array(array('_route' => '_58'), array('a', 'b', 'c'), null, null), - 11814 => array(array('_route' => '_414'), array('a', 'b', 'c'), null, null), - 11862 => array(array('_route' => '_431'), array('a', 'b', 'c'), null, null), - 11915 => array(array('_route' => '_84'), array('a', 'b', 'c'), null, null), - 11963 => array(array('_route' => '_294'), array('a', 'b', 'c'), null, null), - 12011 => array(array('_route' => '_336'), array('a', 'b', 'c'), null, null), - 12059 => array(array('_route' => '_465'), array('a', 'b', 'c'), null, null), - 12112 => array(array('_route' => '_103'), array('a', 'b', 'c'), null, null), - 12160 => array(array('_route' => '_111'), array('a', 'b', 'c'), null, null), - 12208 => array(array('_route' => '_207'), array('a', 'b', 'c'), null, null), - 12256 => array(array('_route' => '_402'), array('a', 'b', 'c'), null, null), - 12309 => array(array('_route' => '_230'), array('a', 'b', 'c'), null, null), - 12356 => array(array('_route' => '_331'), array('a', 'b', 'c'), null, null), - 12406 => array(array('_route' => '_248'), array('a', 'b', 'c'), null, null), - 12455 => array(array('_route' => '_282'), array('a', 'b', 'c'), null, null), - 12513 => array(array('_route' => '_15'), array('a', 'b', 'c'), null, null), - 12561 => array(array('_route' => '_130'), array('a', 'b', 'c'), null, null), - 12609 => array(array('_route' => '_231'), array('a', 'b', 'c'), null, null), - 12657 => array(array('_route' => '_365'), array('a', 'b', 'c'), null, null), - 12705 => array(array('_route' => '_448'), array('a', 'b', 'c'), null, null), - 12758 => array(array('_route' => '_20'), array('a', 'b', 'c'), null, null), - 12806 => array(array('_route' => '_93'), array('a', 'b', 'c'), null, null), - 12854 => array(array('_route' => '_186'), array('a', 'b', 'c'), null, null), - 12902 => array(array('_route' => '_460'), array('a', 'b', 'c'), null, null), - 12955 => array(array('_route' => '_52'), array('a', 'b', 'c'), null, null), - 13003 => array(array('_route' => '_447'), array('a', 'b', 'c'), null, null), - 13056 => array(array('_route' => '_56'), array('a', 'b', 'c'), null, null), - 13104 => array(array('_route' => '_133'), array('a', 'b', 'c'), null, null), - 13152 => array(array('_route' => '_297'), array('a', 'b', 'c'), null, null), - 13205 => array(array('_route' => '_82'), array('a', 'b', 'c'), null, null), - 13253 => array(array('_route' => '_165'), array('a', 'b', 'c'), null, null), - 13301 => array(array('_route' => '_213'), array('a', 'b', 'c'), null, null), - 13351 => array(array('_route' => '_86'), array('a', 'b', 'c'), null, null), - 13403 => array(array('_route' => '_92'), array('a', 'b', 'c'), null, null), - 13450 => array(array('_route' => '_280'), array('a', 'b', 'c'), null, null), - 13500 => array(array('_route' => '_143'), array('a', 'b', 'c'), null, null), - 13549 => array(array('_route' => '_177'), array('a', 'b', 'c'), null, null), - 13601 => array(array('_route' => '_188'), array('a', 'b', 'c'), null, null), - 13649 => array(array('_route' => '_311'), array('a', 'b', 'c'), null, null), - 13697 => array(array('_route' => '_350'), array('a', 'b', 'c'), null, null), - 13750 => array(array('_route' => '_226'), array('a', 'b', 'c'), null, null), - 13798 => array(array('_route' => '_291'), array('a', 'b', 'c'), null, null), - 13851 => array(array('_route' => '_244'), array('a', 'b', 'c'), null, null), - 13898 => array(array('_route' => '_287'), array('a', 'b', 'c'), null, null), - 13951 => array(array('_route' => '_300'), array('a', 'b', 'c'), null, null), - 13999 => array(array('_route' => '_451'), array('a', 'b', 'c'), null, null), - 14047 => array(array('_route' => '_452'), array('a', 'b', 'c'), null, null), - 14095 => array(array('_route' => '_481'), array('a', 'b', 'c'), null, null), - 14145 => array(array('_route' => '_312'), array('a', 'b', 'c'), null, null), - 14203 => array(array('_route' => '_17'), array('a', 'b', 'c'), null, null), - 14251 => array(array('_route' => '_227'), array('a', 'b', 'c'), null, null), - 14299 => array(array('_route' => '_393'), array('a', 'b', 'c'), null, null), - 14349 => array(array('_route' => '_57'), array('a', 'b', 'c'), null, null), - 14401 => array(array('_route' => '_61'), array('a', 'b', 'c'), null, null), - 14449 => array(array('_route' => '_112'), array('a', 'b', 'c'), null, null), - 14500 => array(array('_route' => '_135'), array('a', 'b', 'c'), null, null), - 14547 => array(array('_route' => '_271'), array('a', 'b', 'c'), null, null), - 14596 => array(array('_route' => '_459'), array('a', 'b', 'c'), null, null), - 14649 => array(array('_route' => '_67'), array('a', 'b', 'c'), null, null), - 14697 => array(array('_route' => '_113'), array('a', 'b', 'c'), null, null), - 14745 => array(array('_route' => '_497'), array('a', 'b', 'c'), null, null), - 14795 => array(array('_route' => '_70'), array('a', 'b', 'c'), null, null), - 14847 => array(array('_route' => '_89'), array('a', 'b', 'c'), null, null), - 14895 => array(array('_route' => '_128'), array('a', 'b', 'c'), null, null), - 14948 => array(array('_route' => '_150'), array('a', 'b', 'c'), null, null), - 14996 => array(array('_route' => '_166'), array('a', 'b', 'c'), null, null), - 15047 => array(array('_route' => '_206'), array('a', 'b', 'c'), null, null), - 15094 => array(array('_route' => '_419'), array('a', 'b', 'c'), null, null), - 15148 => array(array('_route' => '_201'), array('a', 'b', 'c'), null, null), - 15196 => array(array('_route' => '_314'), array('a', 'b', 'c'), null, null), - 15244 => array(array('_route' => '_429'), array('a', 'b', 'c'), null, null), - 15297 => array(array('_route' => '_228'), array('a', 'b', 'c'), null, null), - 15345 => array(array('_route' => '_477'), array('a', 'b', 'c'), null, null), - 15395 => array(array('_route' => '_272'), array('a', 'b', 'c'), null, null), - 15444 => array(array('_route' => '_486'), array('a', 'b', 'c'), null, null), - 15502 => array(array('_route' => '_21'), array('a', 'b', 'c'), null, null), - 15550 => array(array('_route' => '_247'), array('a', 'b', 'c'), null, null), - 15598 => array(array('_route' => '_424'), array('a', 'b', 'c'), null, null), - 15646 => array(array('_route' => '_499'), array('a', 'b', 'c'), null, null), - 15699 => array(array('_route' => '_23'), array('a', 'b', 'c'), null, null), - 15747 => array(array('_route' => '_152'), array('a', 'b', 'c'), null, null), - 15795 => array(array('_route' => '_304'), array('a', 'b', 'c'), null, null), - 15843 => array(array('_route' => '_352'), array('a', 'b', 'c'), null, null), - 15896 => array(array('_route' => '_28'), array('a', 'b', 'c'), null, null), - 15944 => array(array('_route' => '_240'), array('a', 'b', 'c'), null, null), - 16000 => array(array('_route' => '_30'), array('a', 'b', 'c'), null, null), - 16047 => array(array('_route' => '_41'), array('a', 'b', 'c'), null, null), - 16096 => array(array('_route' => '_301'), array('a', 'b', 'c'), null, null), - 16149 => array(array('_route' => '_66'), array('a', 'b', 'c'), null, null), - 16197 => array(array('_route' => '_72'), array('a', 'b', 'c'), null, null), - 16245 => array(array('_route' => '_320'), array('a', 'b', 'c'), null, null), - 16298 => array(array('_route' => '_78'), array('a', 'b', 'c'), null, null), - 16346 => array(array('_route' => '_337'), array('a', 'b', 'c'), null, null), - 16394 => array(array('_route' => '_399'), array('a', 'b', 'c'), null, null), - 16442 => array(array('_route' => '_495'), array('a', 'b', 'c'), null, null), - 16492 => array(array('_route' => '_85'), array('a', 'b', 'c'), null, null), - 16544 => array(array('_route' => '_101'), array('a', 'b', 'c'), null, null), - 16592 => array(array('_route' => '_176'), array('a', 'b', 'c'), null, null), - 16640 => array(array('_route' => '_246'), array('a', 'b', 'c'), null, null), - 16693 => array(array('_route' => '_125'), array('a', 'b', 'c'), null, null), - 16741 => array(array('_route' => '_341'), array('a', 'b', 'c'), null, null), - 16794 => array(array('_route' => '_137'), array('a', 'b', 'c'), null, null), - 16842 => array(array('_route' => '_270'), array('a', 'b', 'c'), null, null), - 16890 => array(array('_route' => '_386'), array('a', 'b', 'c'), null, null), - 16943 => array(array('_route' => '_169'), array('a', 'b', 'c'), null, null), - 16991 => array(array('_route' => '_200'), array('a', 'b', 'c'), null, null), - 17039 => array(array('_route' => '_262'), array('a', 'b', 'c'), null, null), - 17092 => array(array('_route' => '_187'), array('a', 'b', 'c'), null, null), - 17140 => array(array('_route' => '_333'), array('a', 'b', 'c'), null, null), - 17190 => array(array('_route' => '_215'), array('a', 'b', 'c'), null, null), - 17239 => array(array('_route' => '_316'), array('a', 'b', 'c'), null, null), - 17288 => array(array('_route' => '_343'), array('a', 'b', 'c'), null, null), - 17346 => array(array('_route' => '_22'), array('a', 'b', 'c'), null, null), - 17394 => array(array('_route' => '_420'), array('a', 'b', 'c'), null, null), - 17447 => array(array('_route' => '_55'), array('a', 'b', 'c'), null, null), - 17494 => array(array('_route' => '_496'), array('a', 'b', 'c'), null, null), - 17547 => array(array('_route' => '_153'), array('a', 'b', 'c'), null, null), - 17595 => array(array('_route' => '_344'), array('a', 'b', 'c'), null, null), - 17648 => array(array('_route' => '_160'), array('a', 'b', 'c'), null, null), - 17696 => array(array('_route' => '_398'), array('a', 'b', 'c'), null, null), - 17749 => array(array('_route' => '_161'), array('a', 'b', 'c'), null, null), - 17797 => array(array('_route' => '_193'), array('a', 'b', 'c'), null, null), - 17847 => array(array('_route' => '_174'), array('a', 'b', 'c'), null, null), - 17899 => array(array('_route' => '_209'), array('a', 'b', 'c'), null, null), - 17947 => array(array('_route' => '_261'), array('a', 'b', 'c'), null, null), - 18000 => array(array('_route' => '_222'), array('a', 'b', 'c'), null, null), - 18048 => array(array('_route' => '_323'), array('a', 'b', 'c'), null, null), - 18096 => array(array('_route' => '_380'), array('a', 'b', 'c'), null, null), - 18149 => array(array('_route' => '_232'), array('a', 'b', 'c'), null, null), - 18197 => array(array('_route' => '_383'), array('a', 'b', 'c'), null, null), - 18247 => array(array('_route' => '_306'), array('a', 'b', 'c'), null, null), - 18296 => array(array('_route' => '_327'), array('a', 'b', 'c'), null, null), - 18345 => array(array('_route' => '_364'), array('a', 'b', 'c'), null, null), - 18397 => array(array('_route' => '_403'), array('a', 'b', 'c'), null, null), - 18445 => array(array('_route' => '_405'), array('a', 'b', 'c'), null, null), - 18495 => array(array('_route' => '_412'), array('a', 'b', 'c'), null, null), - 18553 => array(array('_route' => '_27'), array('a', 'b', 'c'), null, null), - 18601 => array(array('_route' => '_134'), array('a', 'b', 'c'), null, null), - 18649 => array(array('_route' => '_245'), array('a', 'b', 'c'), null, null), - 18702 => array(array('_route' => '_59'), array('a', 'b', 'c'), null, null), - 18750 => array(array('_route' => '_208'), array('a', 'b', 'c'), null, null), - 18803 => array(array('_route' => '_60'), array('a', 'b', 'c'), null, null), - 18851 => array(array('_route' => '_119'), array('a', 'b', 'c'), null, null), - 18902 => array(array('_route' => '_163'), array('a', 'b', 'c'), null, null), - 18949 => array(array('_route' => '_249'), array('a', 'b', 'c'), null, null), - 18998 => array(array('_route' => '_278'), array('a', 'b', 'c'), null, null), - 19051 => array(array('_route' => '_63'), array('a', 'b', 'c'), null, null), - 19099 => array(array('_route' => '_195'), array('a', 'b', 'c'), null, null), - 19147 => array(array('_route' => '_252'), array('a', 'b', 'c'), null, null), - 19195 => array(array('_route' => '_461'), array('a', 'b', 'c'), null, null), - 19248 => array(array('_route' => '_126'), array('a', 'b', 'c'), null, null), - 19296 => array(array('_route' => '_158'), array('a', 'b', 'c'), null, null), - 19344 => array(array('_route' => '_221'), array('a', 'b', 'c'), null, null), - 19392 => array(array('_route' => '_269'), array('a', 'b', 'c'), null, null), - 19440 => array(array('_route' => '_310'), array('a', 'b', 'c'), null, null), - 19496 => array(array('_route' => '_138'), array('a', 'b', 'c'), null, null), - 19543 => array(array('_route' => '_348'), array('a', 'b', 'c'), null, null), - 19592 => array(array('_route' => '_236'), array('a', 'b', 'c'), null, null), - 19640 => array(array('_route' => '_433'), array('a', 'b', 'c'), null, null), - 19693 => array(array('_route' => '_141'), array('a', 'b', 'c'), null, null), - 19741 => array(array('_route' => '_283'), array('a', 'b', 'c'), null, null), - 19794 => array(array('_route' => '_144'), array('a', 'b', 'c'), null, null), - 19842 => array(array('_route' => '_191'), array('a', 'b', 'c'), null, null), - 19895 => array(array('_route' => '_168'), array('a', 'b', 'c'), null, null), - 19943 => array(array('_route' => '_363'), array('a', 'b', 'c'), null, null), - 19991 => array(array('_route' => '_381'), array('a', 'b', 'c'), null, null), - 20044 => array(array('_route' => '_180'), array('a', 'b', 'c'), null, null), - 20092 => array(array('_route' => '_339'), array('a', 'b', 'c'), null, null), - 20142 => array(array('_route' => '_196'), array('a', 'b', 'c'), null, null), - 20194 => array(array('_route' => '_198'), array('a', 'b', 'c'), null, null), - 20242 => array(array('_route' => '_285'), array('a', 'b', 'c'), null, null), - 20292 => array(array('_route' => '_349'), array('a', 'b', 'c'), null, null), - 20344 => array(array('_route' => '_367'), array('a', 'b', 'c'), null, null), - 20392 => array(array('_route' => '_384'), array('a', 'b', 'c'), null, null), - 20440 => array(array('_route' => '_498'), array('a', 'b', 'c'), null, null), - 20490 => array(array('_route' => '_369'), array('a', 'b', 'c'), null, null), - 20542 => array(array('_route' => '_408'), array('a', 'b', 'c'), null, null), - 20590 => array(array('_route' => '_413'), array('a', 'b', 'c'), null, null), - 20652 => array(array('_route' => '_44'), array('a', 'b', 'c'), null, null), - 20699 => array(array('_route' => '_256'), array('a', 'b', 'c'), null, null), - 20748 => array(array('_route' => '_173'), array('a', 'b', 'c'), null, null), - 20796 => array(array('_route' => '_266'), array('a', 'b', 'c'), null, null), - 20844 => array(array('_route' => '_392'), array('a', 'b', 'c'), null, null), - 20892 => array(array('_route' => '_430'), array('a', 'b', 'c'), null, null), - 20940 => array(array('_route' => '_482'), array('a', 'b', 'c'), null, null), - 20993 => array(array('_route' => '_49'), array('a', 'b', 'c'), null, null), - 21041 => array(array('_route' => '_94'), array('a', 'b', 'c'), null, null), - 21089 => array(array('_route' => '_407'), array('a', 'b', 'c'), null, null), - 21142 => array(array('_route' => '_65'), array('a', 'b', 'c'), null, null), - 21190 => array(array('_route' => '_181'), array('a', 'b', 'c'), null, null), - 21238 => array(array('_route' => '_437'), array('a', 'b', 'c'), null, null), - 21291 => array(array('_route' => '_76'), array('a', 'b', 'c'), null, null), - 21339 => array(array('_route' => '_357'), array('a', 'b', 'c'), null, null), - 21392 => array(array('_route' => '_80'), array('a', 'b', 'c'), null, null), - 21440 => array(array('_route' => '_106'), array('a', 'b', 'c'), null, null), - 21493 => array(array('_route' => '_83'), array('a', 'b', 'c'), null, null), - 21541 => array(array('_route' => '_255'), array('a', 'b', 'c'), null, null), - 21589 => array(array('_route' => '_330'), array('a', 'b', 'c'), null, null), - 21642 => array(array('_route' => '_100'), array('a', 'b', 'c'), null, null), - 21690 => array(array('_route' => '_396'), array('a', 'b', 'c'), null, null), - 21738 => array(array('_route' => '_422'), array('a', 'b', 'c'), null, null), - 21791 => array(array('_route' => '_149'), array('a', 'b', 'c'), null, null), - 21839 => array(array('_route' => '_324'), array('a', 'b', 'c'), null, null), - 21892 => array(array('_route' => '_164'), array('a', 'b', 'c'), null, null), - 21940 => array(array('_route' => '_423'), array('a', 'b', 'c'), null, null), - 21990 => array(array('_route' => '_241'), array('a', 'b', 'c'), null, null), - 22042 => array(array('_route' => '_290'), array('a', 'b', 'c'), null, null), - 22090 => array(array('_route' => '_335'), array('a', 'b', 'c'), null, null), - 22140 => array(array('_route' => '_373'), array('a', 'b', 'c'), null, null), - 22189 => array(array('_route' => '_375'), array('a', 'b', 'c'), null, null), - 22238 => array(array('_route' => '_450'), array('a', 'b', 'c'), null, null), - 22287 => array(array('_route' => '_464'), array('a', 'b', 'c'), null, null), - 22345 => array(array('_route' => '_51'), array('a', 'b', 'c'), null, null), - 22393 => array(array('_route' => '_77'), array('a', 'b', 'c'), null, null), - 22441 => array(array('_route' => '_234'), array('a', 'b', 'c'), null, null), - 22489 => array(array('_route' => '_394'), array('a', 'b', 'c'), null, null), - 22542 => array(array('_route' => '_88'), array('a', 'b', 'c'), null, null), - 22590 => array(array('_route' => '_155'), array('a', 'b', 'c'), null, null), - 22643 => array(array('_route' => '_96'), array('a', 'b', 'c'), null, null), - 22691 => array(array('_route' => '_298'), array('a', 'b', 'c'), null, null), - 22739 => array(array('_route' => '_470'), array('a', 'b', 'c'), null, null), - 22792 => array(array('_route' => '_109'), array('a', 'b', 'c'), null, null), - 22840 => array(array('_route' => '_204'), array('a', 'b', 'c'), null, null), - 22893 => array(array('_route' => '_115'), array('a', 'b', 'c'), null, null), - 22941 => array(array('_route' => '_145'), array('a', 'b', 'c'), null, null), - 22994 => array(array('_route' => '_123'), array('a', 'b', 'c'), null, null), - 23042 => array(array('_route' => '_277'), array('a', 'b', 'c'), null, null), - 23090 => array(array('_route' => '_473'), array('a', 'b', 'c'), null, null), - 23143 => array(array('_route' => '_334'), array('a', 'b', 'c'), null, null), - 23191 => array(array('_route' => '_493'), array('a', 'b', 'c'), null, null), - 23244 => array(array('_route' => '_372'), array('a', 'b', 'c'), null, null), - 23292 => array(array('_route' => '_432'), array('a', 'b', 'c'), null, null), - 23340 => array(array('_route' => '_436'), array('a', 'b', 'c'), null, null), - 23393 => array(array('_route' => '_425'), array('a', 'b', 'c'), null, null), - 23441 => array(array('_route' => '_456'), array('a', 'b', 'c'), null, null), - 23489 => array(array('_route' => '_474'), array('a', 'b', 'c'), null, null), - 23539 => array(array('_route' => '_485'), array('a', 'b', 'c'), null, null), - 23594 => array(array('_route' => '_91'), array('a', 'b', 'c'), null, null), - 23646 => array(array('_route' => '_110'), array('a', 'b', 'c'), null, null), - 23694 => array(array('_route' => '_114'), array('a', 'b', 'c'), null, null), - 23750 => array(array('_route' => '_118'), array('a', 'b', 'c'), null, null), - 23796 => array(array('_route' => '_475'), array('a', 'b', 'c'), null, null), - 23844 => array(array('_route' => '_366'), array('a', 'b', 'c'), null, null), - 23897 => array(array('_route' => '_167'), array('a', 'b', 'c'), null, null), - 23945 => array(array('_route' => '_192'), array('a', 'b', 'c'), null, null), - 23993 => array(array('_route' => '_342'), array('a', 'b', 'c'), null, null), - 24046 => array(array('_route' => '_229'), array('a', 'b', 'c'), null, null), - 24097 => array(array('_route' => '_235'), array('a', 'b', 'c'), null, null), - 24144 => array(array('_route' => '_302'), array('a', 'b', 'c'), null, null), - 24193 => array(array('_route' => '_322'), array('a', 'b', 'c'), null, null), - 24246 => array(array('_route' => '_237'), array('a', 'b', 'c'), null, null), - 24294 => array(array('_route' => '_293'), array('a', 'b', 'c'), null, null), - 24347 => array(array('_route' => '_239'), array('a', 'b', 'c'), null, null), - 24395 => array(array('_route' => '_444'), array('a', 'b', 'c'), null, null), - 24443 => array(array('_route' => '_491'), array('a', 'b', 'c'), null, null), - 24491 => array(array('_route' => '_492'), array('a', 'b', 'c'), null, null), - 24541 => array(array('_route' => '_258'), array('a', 'b', 'c'), null, null), - 24590 => array(array('_route' => '_317'), array('a', 'b', 'c'), null, null), - 24639 => array(array('_route' => '_361'), array('a', 'b', 'c'), null, null), - 24688 => array(array('_route' => '_391'), array('a', 'b', 'c'), null, null), - 24737 => array(array('_route' => '_462'), array('a', 'b', 'c'), null, null), - 24786 => array(array('_route' => '_476'), array('a', 'b', 'c'), null, null), - 24837 => array(array('_route' => '_501'), array('a', 'b', 'c'), null, null), - 24889 => array(array('_route' => '_514'), array('a', 'b', 'c'), null, null), - 24937 => array(array('_route' => '_731'), array('a', 'b', 'c'), null, null), - 24990 => array(array('_route' => '_522'), array('a', 'b', 'c'), null, null), - 25038 => array(array('_route' => '_693'), array('a', 'b', 'c'), null, null), - 25091 => array(array('_route' => '_537'), array('a', 'b', 'c'), null, null), - 25139 => array(array('_route' => '_554'), array('a', 'b', 'c'), null, null), - 25187 => array(array('_route' => '_645'), array('a', 'b', 'c'), null, null), - 25235 => array(array('_route' => '_862'), array('a', 'b', 'c'), null, null), - 25288 => array(array('_route' => '_539'), array('a', 'b', 'c'), null, null), - 25336 => array(array('_route' => '_729'), array('a', 'b', 'c'), null, null), - 25384 => array(array('_route' => '_897'), array('a', 'b', 'c'), null, null), - 25437 => array(array('_route' => '_561'), array('a', 'b', 'c'), null, null), - 25485 => array(array('_route' => '_615'), array('a', 'b', 'c'), null, null), - 25533 => array(array('_route' => '_764'), array('a', 'b', 'c'), null, null), - 25581 => array(array('_route' => '_948'), array('a', 'b', 'c'), null, null), - 25634 => array(array('_route' => '_617'), array('a', 'b', 'c'), null, null), - 25682 => array(array('_route' => '_671'), array('a', 'b', 'c'), null, null), - 25735 => array(array('_route' => '_649'), array('a', 'b', 'c'), null, null), - 25783 => array(array('_route' => '_651'), array('a', 'b', 'c'), null, null), - 25831 => array(array('_route' => '_684'), array('a', 'b', 'c'), null, null), - 25884 => array(array('_route' => '_669'), array('a', 'b', 'c'), null, null), - 25932 => array(array('_route' => '_743'), array('a', 'b', 'c'), null, null), - 25980 => array(array('_route' => '_962'), array('a', 'b', 'c'), null, null), - 26033 => array(array('_route' => '_694'), array('a', 'b', 'c'), null, null), - 26081 => array(array('_route' => '_985'), array('a', 'b', 'c'), null, null), - 26134 => array(array('_route' => '_707'), array('a', 'b', 'c'), null, null), - 26182 => array(array('_route' => '_718'), array('a', 'b', 'c'), null, null), - 26235 => array(array('_route' => '_720'), array('a', 'b', 'c'), null, null), - 26283 => array(array('_route' => '_745'), array('a', 'b', 'c'), null, null), - 26333 => array(array('_route' => '_874'), array('a', 'b', 'c'), null, null), - 26391 => array(array('_route' => '_502'), array('a', 'b', 'c'), null, null), - 26439 => array(array('_route' => '_667'), array('a', 'b', 'c'), null, null), - 26487 => array(array('_route' => '_911'), array('a', 'b', 'c'), null, null), - 26535 => array(array('_route' => '_942'), array('a', 'b', 'c'), null, null), - 26585 => array(array('_route' => '_504'), array('a', 'b', 'c'), null, null), - 26637 => array(array('_route' => '_524'), array('a', 'b', 'c'), null, null), - 26685 => array(array('_route' => '_732'), array('a', 'b', 'c'), null, null), - 26738 => array(array('_route' => '_596'), array('a', 'b', 'c'), null, null), - 26786 => array(array('_route' => '_601'), array('a', 'b', 'c'), null, null), - 26839 => array(array('_route' => '_620'), array('a', 'b', 'c'), null, null), - 26887 => array(array('_route' => '_631'), array('a', 'b', 'c'), null, null), - 26935 => array(array('_route' => '_771'), array('a', 'b', 'c'), null, null), - 26983 => array(array('_route' => '_937'), array('a', 'b', 'c'), null, null), - 27031 => array(array('_route' => '_999'), array('a', 'b', 'c'), null, null), - 27084 => array(array('_route' => '_657'), array('a', 'b', 'c'), null, null), - 27132 => array(array('_route' => '_701'), array('a', 'b', 'c'), null, null), - 27185 => array(array('_route' => '_662'), array('a', 'b', 'c'), null, null), - 27233 => array(array('_route' => '_797'), array('a', 'b', 'c'), null, null), - 27281 => array(array('_route' => '_924'), array('a', 'b', 'c'), null, null), - 27334 => array(array('_route' => '_702'), array('a', 'b', 'c'), null, null), - 27382 => array(array('_route' => '_750'), array('a', 'b', 'c'), null, null), - 27435 => array(array('_route' => '_749'), array('a', 'b', 'c'), null, null), - 27483 => array(array('_route' => '_837'), array('a', 'b', 'c'), null, null), - 27533 => array(array('_route' => '_758'), array('a', 'b', 'c'), null, null), - 27585 => array(array('_route' => '_810'), array('a', 'b', 'c'), null, null), - 27633 => array(array('_route' => '_902'), array('a', 'b', 'c'), null, null), - 27683 => array(array('_route' => '_845'), array('a', 'b', 'c'), null, null), - 27741 => array(array('_route' => '_503'), array('a', 'b', 'c'), null, null), - 27792 => array(array('_route' => '_756'), array('a', 'b', 'c'), null, null), - 27839 => array(array('_route' => '_799'), array('a', 'b', 'c'), null, null), - 27888 => array(array('_route' => '_769'), array('a', 'b', 'c'), null, null), - 27936 => array(array('_route' => '_981'), array('a', 'b', 'c'), null, null), - 27989 => array(array('_route' => '_507'), array('a', 'b', 'c'), null, null), - 28037 => array(array('_route' => '_672'), array('a', 'b', 'c'), null, null), - 28085 => array(array('_route' => '_790'), array('a', 'b', 'c'), null, null), - 28138 => array(array('_route' => '_515'), array('a', 'b', 'c'), null, null), - 28186 => array(array('_route' => '_523'), array('a', 'b', 'c'), null, null), - 28234 => array(array('_route' => '_957'), array('a', 'b', 'c'), null, null), - 28282 => array(array('_route' => '_995'), array('a', 'b', 'c'), null, null), - 28335 => array(array('_route' => '_532'), array('a', 'b', 'c'), null, null), - 28383 => array(array('_route' => '_642'), array('a', 'b', 'c'), null, null), - 28433 => array(array('_route' => '_579'), array('a', 'b', 'c'), null, null), - 28485 => array(array('_route' => '_625'), array('a', 'b', 'c'), null, null), - 28533 => array(array('_route' => '_916'), array('a', 'b', 'c'), null, null), - 28586 => array(array('_route' => '_633'), array('a', 'b', 'c'), null, null), - 28634 => array(array('_route' => '_656'), array('a', 'b', 'c'), null, null), - 28687 => array(array('_route' => '_658'), array('a', 'b', 'c'), null, null), - 28735 => array(array('_route' => '_943'), array('a', 'b', 'c'), null, null), - 28788 => array(array('_route' => '_664'), array('a', 'b', 'c'), null, null), - 28836 => array(array('_route' => '_852'), array('a', 'b', 'c'), null, null), - 28884 => array(array('_route' => '_870'), array('a', 'b', 'c'), null, null), - 28937 => array(array('_route' => '_683'), array('a', 'b', 'c'), null, null), - 28985 => array(array('_route' => '_915'), array('a', 'b', 'c'), null, null), - 29038 => array(array('_route' => '_719'), array('a', 'b', 'c'), null, null), - 29086 => array(array('_route' => '_859'), array('a', 'b', 'c'), null, null), - 29134 => array(array('_route' => '_912'), array('a', 'b', 'c'), null, null), - 29182 => array(array('_route' => '_978'), array('a', 'b', 'c'), null, null), - 29235 => array(array('_route' => '_738'), array('a', 'b', 'c'), null, null), - 29283 => array(array('_route' => '_883'), array('a', 'b', 'c'), null, null), - 29333 => array(array('_route' => '_741'), array('a', 'b', 'c'), null, null), - 29382 => array(array('_route' => '_760'), array('a', 'b', 'c'), null, null), - 29431 => array(array('_route' => '_895'), array('a', 'b', 'c'), null, null), - 29489 => array(array('_route' => '_505'), array('a', 'b', 'c'), null, null), - 29537 => array(array('_route' => '_935'), array('a', 'b', 'c'), null, null), - 29590 => array(array('_route' => '_509'), array('a', 'b', 'c'), null, null), - 29638 => array(array('_route' => '_820'), array('a', 'b', 'c'), null, null), - 29686 => array(array('_route' => '_910'), array('a', 'b', 'c'), null, null), - 29739 => array(array('_route' => '_518'), array('a', 'b', 'c'), null, null), - 29787 => array(array('_route' => '_618'), array('a', 'b', 'c'), null, null), - 29840 => array(array('_route' => '_546'), array('a', 'b', 'c'), null, null), - 29888 => array(array('_route' => '_740'), array('a', 'b', 'c'), null, null), - 29936 => array(array('_route' => '_867'), array('a', 'b', 'c'), null, null), - 29989 => array(array('_route' => '_572'), array('a', 'b', 'c'), null, null), - 30037 => array(array('_route' => '_952'), array('a', 'b', 'c'), null, null), - 30090 => array(array('_route' => '_573'), array('a', 'b', 'c'), null, null), - 30138 => array(array('_route' => '_692'), array('a', 'b', 'c'), null, null), - 30186 => array(array('_route' => '_700'), array('a', 'b', 'c'), null, null), - 30234 => array(array('_route' => '_772'), array('a', 'b', 'c'), null, null), - 30284 => array(array('_route' => '_653'), array('a', 'b', 'c'), null, null), - 30336 => array(array('_route' => '_695'), array('a', 'b', 'c'), null, null), - 30384 => array(array('_route' => '_748'), array('a', 'b', 'c'), null, null), - 30437 => array(array('_route' => '_710'), array('a', 'b', 'c'), null, null), - 30485 => array(array('_route' => '_716'), array('a', 'b', 'c'), null, null), - 30533 => array(array('_route' => '_969'), array('a', 'b', 'c'), null, null), - 30586 => array(array('_route' => '_734'), array('a', 'b', 'c'), null, null), - 30634 => array(array('_route' => '_742'), array('a', 'b', 'c'), null, null), - 30682 => array(array('_route' => '_844'), array('a', 'b', 'c'), null, null), - 30735 => array(array('_route' => '_763'), array('a', 'b', 'c'), null, null), - 30783 => array(array('_route' => '_965'), array('a', 'b', 'c'), null, null), - 30836 => array(array('_route' => '_778'), array('a', 'b', 'c'), null, null), - 30884 => array(array('_route' => '_813'), array('a', 'b', 'c'), null, null), - 30932 => array(array('_route' => '_831'), array('a', 'b', 'c'), null, null), - 30982 => array(array('_route' => '_955'), array('a', 'b', 'c'), null, null), - 31031 => array(array('_route' => '_997'), array('a', 'b', 'c'), null, null), - 31089 => array(array('_route' => '_506'), array('a', 'b', 'c'), null, null), - 31137 => array(array('_route' => '_575'), array('a', 'b', 'c'), null, null), - 31190 => array(array('_route' => '_516'), array('a', 'b', 'c'), null, null), - 31238 => array(array('_route' => '_553'), array('a', 'b', 'c'), null, null), - 31291 => array(array('_route' => '_528'), array('a', 'b', 'c'), null, null), - 31339 => array(array('_route' => '_847'), array('a', 'b', 'c'), null, null), - 31387 => array(array('_route' => '_904'), array('a', 'b', 'c'), null, null), - 31440 => array(array('_route' => '_574'), array('a', 'b', 'c'), null, null), - 31488 => array(array('_route' => '_818'), array('a', 'b', 'c'), null, null), - 31538 => array(array('_route' => '_577'), array('a', 'b', 'c'), null, null), - 31590 => array(array('_route' => '_584'), array('a', 'b', 'c'), null, null), - 31638 => array(array('_route' => '_905'), array('a', 'b', 'c'), null, null), - 31691 => array(array('_route' => '_612'), array('a', 'b', 'c'), null, null), - 31739 => array(array('_route' => '_688'), array('a', 'b', 'c'), null, null), - 31787 => array(array('_route' => '_854'), array('a', 'b', 'c'), null, null), - 31840 => array(array('_route' => '_613'), array('a', 'b', 'c'), null, null), - 31888 => array(array('_route' => '_767'), array('a', 'b', 'c'), null, null), - 31941 => array(array('_route' => '_666'), array('a', 'b', 'c'), null, null), - 31989 => array(array('_route' => '_759'), array('a', 'b', 'c'), null, null), - 32037 => array(array('_route' => '_827'), array('a', 'b', 'c'), null, null), - 32085 => array(array('_route' => '_840'), array('a', 'b', 'c'), null, null), - 32138 => array(array('_route' => '_680'), array('a', 'b', 'c'), null, null), - 32186 => array(array('_route' => '_784'), array('a', 'b', 'c'), null, null), - 32234 => array(array('_route' => '_842'), array('a', 'b', 'c'), null, null), - 32282 => array(array('_route' => '_860'), array('a', 'b', 'c'), null, null), - 32332 => array(array('_route' => '_704'), array('a', 'b', 'c'), null, null), - 32381 => array(array('_route' => '_727'), array('a', 'b', 'c'), null, null), - 32430 => array(array('_route' => '_777'), array('a', 'b', 'c'), null, null), - 32482 => array(array('_route' => '_838'), array('a', 'b', 'c'), null, null), - 32530 => array(array('_route' => '_861'), array('a', 'b', 'c'), null, null), - 32583 => array(array('_route' => '_849'), array('a', 'b', 'c'), null, null), - 32631 => array(array('_route' => '_982'), array('a', 'b', 'c'), null, null), - 32679 => array(array('_route' => '_986'), array('a', 'b', 'c'), null, null), - 32741 => array(array('_route' => '_508'), array('a', 'b', 'c'), null, null), - 32788 => array(array('_route' => '_517'), array('a', 'b', 'c'), null, null), - 32837 => array(array('_route' => '_622'), array('a', 'b', 'c'), null, null), - 32890 => array(array('_route' => '_513'), array('a', 'b', 'c'), null, null), - 32938 => array(array('_route' => '_655'), array('a', 'b', 'c'), null, null), - 32986 => array(array('_route' => '_843'), array('a', 'b', 'c'), null, null), - 33034 => array(array('_route' => '_939'), array('a', 'b', 'c'), null, null), - 33084 => array(array('_route' => '_529'), array('a', 'b', 'c'), null, null), - 33136 => array(array('_route' => '_535'), array('a', 'b', 'c'), null, null), - 33184 => array(array('_route' => '_685'), array('a', 'b', 'c'), null, null), - 33240 => array(array('_route' => '_559'), array('a', 'b', 'c'), null, null), - 33287 => array(array('_route' => '_661'), array('a', 'b', 'c'), null, null), - 33336 => array(array('_route' => '_768'), array('a', 'b', 'c'), null, null), - 33389 => array(array('_route' => '_589'), array('a', 'b', 'c'), null, null), - 33437 => array(array('_route' => '_647'), array('a', 'b', 'c'), null, null), - 33485 => array(array('_route' => '_652'), array('a', 'b', 'c'), null, null), - 33533 => array(array('_route' => '_834'), array('a', 'b', 'c'), null, null), - 33586 => array(array('_route' => '_591'), array('a', 'b', 'c'), null, null), - 33634 => array(array('_route' => '_599'), array('a', 'b', 'c'), null, null), - 33687 => array(array('_route' => '_787'), array('a', 'b', 'c'), null, null), - 33734 => array(array('_route' => '_848'), array('a', 'b', 'c'), null, null), - 33787 => array(array('_route' => '_796'), array('a', 'b', 'c'), null, null), - 33835 => array(array('_route' => '_877'), array('a', 'b', 'c'), null, null), - 33885 => array(array('_route' => '_809'), array('a', 'b', 'c'), null, null), - 33934 => array(array('_route' => '_817'), array('a', 'b', 'c'), null, null), - 33986 => array(array('_route' => '_819'), array('a', 'b', 'c'), null, null), - 34034 => array(array('_route' => '_865'), array('a', 'b', 'c'), null, null), - 34084 => array(array('_route' => '_919'), array('a', 'b', 'c'), null, null), - 34133 => array(array('_route' => '_949'), array('a', 'b', 'c'), null, null), - 34191 => array(array('_route' => '_510'), array('a', 'b', 'c'), null, null), - 34239 => array(array('_route' => '_590'), array('a', 'b', 'c'), null, null), - 34287 => array(array('_route' => '_597'), array('a', 'b', 'c'), null, null), - 34335 => array(array('_route' => '_682'), array('a', 'b', 'c'), null, null), - 34383 => array(array('_route' => '_723'), array('a', 'b', 'c'), null, null), - 34436 => array(array('_route' => '_521'), array('a', 'b', 'c'), null, null), - 34484 => array(array('_route' => '_594'), array('a', 'b', 'c'), null, null), - 34532 => array(array('_route' => '_689'), array('a', 'b', 'c'), null, null), - 34580 => array(array('_route' => '_713'), array('a', 'b', 'c'), null, null), - 34628 => array(array('_route' => '_889'), array('a', 'b', 'c'), null, null), - 34681 => array(array('_route' => '_531'), array('a', 'b', 'c'), null, null), - 34729 => array(array('_route' => '_639'), array('a', 'b', 'c'), null, null), - 34780 => array(array('_route' => '_646'), array('a', 'b', 'c'), null, null), - 34827 => array(array('_route' => '_659'), array('a', 'b', 'c'), null, null), - 34876 => array(array('_route' => '_959'), array('a', 'b', 'c'), null, null), - 34929 => array(array('_route' => '_550'), array('a', 'b', 'c'), null, null), - 34977 => array(array('_route' => '_833'), array('a', 'b', 'c'), null, null), - 35025 => array(array('_route' => '_899'), array('a', 'b', 'c'), null, null), - 35081 => array(array('_route' => '_580'), array('a', 'b', 'c'), null, null), - 35128 => array(array('_route' => '_762'), array('a', 'b', 'c'), null, null), - 35177 => array(array('_route' => '_896'), array('a', 'b', 'c'), null, null), - 35230 => array(array('_route' => '_595'), array('a', 'b', 'c'), null, null), - 35278 => array(array('_route' => '_933'), array('a', 'b', 'c'), null, null), - 35328 => array(array('_route' => '_610'), array('a', 'b', 'c'), null, null), - 35380 => array(array('_route' => '_629'), array('a', 'b', 'c'), null, null), - 35428 => array(array('_route' => '_744'), array('a', 'b', 'c'), null, null), - 35481 => array(array('_route' => '_674'), array('a', 'b', 'c'), null, null), - 35529 => array(array('_route' => '_726'), array('a', 'b', 'c'), null, null), - 35577 => array(array('_route' => '_929'), array('a', 'b', 'c'), null, null), - 35627 => array(array('_route' => '_696'), array('a', 'b', 'c'), null, null), - 35679 => array(array('_route' => '_841'), array('a', 'b', 'c'), null, null), - 35727 => array(array('_route' => '_890'), array('a', 'b', 'c'), null, null), - 35777 => array(array('_route' => '_885'), array('a', 'b', 'c'), null, null), - 35826 => array(array('_route' => '_888'), array('a', 'b', 'c'), null, null), - 35875 => array(array('_route' => '_996'), array('a', 'b', 'c'), null, null), - 35933 => array(array('_route' => '_511'), array('a', 'b', 'c'), null, null), - 35981 => array(array('_route' => '_576'), array('a', 'b', 'c'), null, null), - 36029 => array(array('_route' => '_623'), array('a', 'b', 'c'), null, null), - 36082 => array(array('_route' => '_560'), array('a', 'b', 'c'), null, null), - 36129 => array(array('_route' => '_585'), array('a', 'b', 'c'), null, null), - 36182 => array(array('_route' => '_570'), array('a', 'b', 'c'), null, null), - 36230 => array(array('_route' => '_578'), array('a', 'b', 'c'), null, null), - 36281 => array(array('_route' => '_780'), array('a', 'b', 'c'), null, null), - 36328 => array(array('_route' => '_808'), array('a', 'b', 'c'), null, null), - 36382 => array(array('_route' => '_593'), array('a', 'b', 'c'), null, null), - 36430 => array(array('_route' => '_900'), array('a', 'b', 'c'), null, null), - 36483 => array(array('_route' => '_632'), array('a', 'b', 'c'), null, null), - 36531 => array(array('_route' => '_654'), array('a', 'b', 'c'), null, null), - 36579 => array(array('_route' => '_721'), array('a', 'b', 'c'), null, null), - 36627 => array(array('_route' => '_836'), array('a', 'b', 'c'), null, null), - 36680 => array(array('_route' => '_637'), array('a', 'b', 'c'), null, null), - 36728 => array(array('_route' => '_737'), array('a', 'b', 'c'), null, null), - 36784 => array(array('_route' => '_699'), array('a', 'b', 'c'), null, null), - 36831 => array(array('_route' => '_822'), array('a', 'b', 'c'), null, null), - 36880 => array(array('_route' => '_853'), array('a', 'b', 'c'), null, null), - 36933 => array(array('_route' => '_708'), array('a', 'b', 'c'), null, null), - 36981 => array(array('_route' => '_871'), array('a', 'b', 'c'), null, null), - 37034 => array(array('_route' => '_752'), array('a', 'b', 'c'), null, null), - 37082 => array(array('_route' => '_989'), array('a', 'b', 'c'), null, null), - 37132 => array(array('_route' => '_855'), array('a', 'b', 'c'), null, null), - 37184 => array(array('_route' => '_858'), array('a', 'b', 'c'), null, null), - 37232 => array(array('_route' => '_898'), array('a', 'b', 'c'), null, null), - 37282 => array(array('_route' => '_903'), array('a', 'b', 'c'), null, null), - 37331 => array(array('_route' => '_909'), array('a', 'b', 'c'), null, null), - 37380 => array(array('_route' => '_950'), array('a', 'b', 'c'), null, null), - 37441 => array(array('_route' => '_512'), array('a', 'b', 'c'), null, null), - 37488 => array(array('_route' => '_691'), array('a', 'b', 'c'), null, null), - 37537 => array(array('_route' => '_686'), array('a', 'b', 'c'), null, null), - 37587 => array(array('_route' => '_527'), array('a', 'b', 'c'), null, null), - 37639 => array(array('_route' => '_541'), array('a', 'b', 'c'), null, null), - 37687 => array(array('_route' => '_956'), array('a', 'b', 'c'), null, null), - 37740 => array(array('_route' => '_555'), array('a', 'b', 'c'), null, null), - 37788 => array(array('_route' => '_681'), array('a', 'b', 'c'), null, null), - 37841 => array(array('_route' => '_556'), array('a', 'b', 'c'), null, null), - 37889 => array(array('_route' => '_802'), array('a', 'b', 'c'), null, null), - 37939 => array(array('_route' => '_558'), array('a', 'b', 'c'), null, null), - 37991 => array(array('_route' => '_564'), array('a', 'b', 'c'), null, null), - 38039 => array(array('_route' => '_670'), array('a', 'b', 'c'), null, null), - 38087 => array(array('_route' => '_884'), array('a', 'b', 'c'), null, null), - 38140 => array(array('_route' => '_627'), array('a', 'b', 'c'), null, null), - 38187 => array(array('_route' => '_746'), array('a', 'b', 'c'), null, null), - 38240 => array(array('_route' => '_668'), array('a', 'b', 'c'), null, null), - 38291 => array(array('_route' => '_712'), array('a', 'b', 'c'), null, null), - 38338 => array(array('_route' => '_863'), array('a', 'b', 'c'), null, null), - 38387 => array(array('_route' => '_801'), array('a', 'b', 'c'), null, null), - 38440 => array(array('_route' => '_709'), array('a', 'b', 'c'), null, null), - 38488 => array(array('_route' => '_850'), array('a', 'b', 'c'), null, null), - 38536 => array(array('_route' => '_918'), array('a', 'b', 'c'), null, null), - 38586 => array(array('_route' => '_803'), array('a', 'b', 'c'), null, null), - 38638 => array(array('_route' => '_864'), array('a', 'b', 'c'), null, null), - 38686 => array(array('_route' => '_880'), array('a', 'b', 'c'), null, null), - 38734 => array(array('_route' => '_927'), array('a', 'b', 'c'), null, null), - 38787 => array(array('_route' => '_930'), array('a', 'b', 'c'), null, null), - 38835 => array(array('_route' => '_951'), array('a', 'b', 'c'), null, null), - 38883 => array(array('_route' => '_963'), array('a', 'b', 'c'), null, null), - 38942 => array(array('_route' => '_519'), array('a', 'b', 'c'), null, null), - 38990 => array(array('_route' => '_823'), array('a', 'b', 'c'), null, null), - 39038 => array(array('_route' => '_954'), array('a', 'b', 'c'), null, null), - 39091 => array(array('_route' => '_525'), array('a', 'b', 'c'), null, null), - 39139 => array(array('_route' => '_991'), array('a', 'b', 'c'), null, null), - 39189 => array(array('_route' => '_536'), array('a', 'b', 'c'), null, null), - 39241 => array(array('_route' => '_545'), array('a', 'b', 'c'), null, null), - 39289 => array(array('_route' => '_944'), array('a', 'b', 'c'), null, null), - 39342 => array(array('_route' => '_557'), array('a', 'b', 'c'), null, null), - 39390 => array(array('_route' => '_783'), array('a', 'b', 'c'), null, null), - 39438 => array(array('_route' => '_807'), array('a', 'b', 'c'), null, null), - 39491 => array(array('_route' => '_586'), array('a', 'b', 'c'), null, null), - 39539 => array(array('_route' => '_711'), array('a', 'b', 'c'), null, null), - 39592 => array(array('_route' => '_598'), array('a', 'b', 'c'), null, null), - 39640 => array(array('_route' => '_635'), array('a', 'b', 'c'), null, null), - 39688 => array(array('_route' => '_983'), array('a', 'b', 'c'), null, null), - 39741 => array(array('_route' => '_634'), array('a', 'b', 'c'), null, null), - 39789 => array(array('_route' => '_641'), array('a', 'b', 'c'), null, null), - 39840 => array(array('_route' => '_779'), array('a', 'b', 'c'), null, null), - 39887 => array(array('_route' => '_876'), array('a', 'b', 'c'), null, null), - 39936 => array(array('_route' => '_811'), array('a', 'b', 'c'), null, null), - 39984 => array(array('_route' => '_824'), array('a', 'b', 'c'), null, null), - 40037 => array(array('_route' => '_660'), array('a', 'b', 'c'), null, null), - 40085 => array(array('_route' => '_789'), array('a', 'b', 'c'), null, null), - 40138 => array(array('_route' => '_733'), array('a', 'b', 'c'), null, null), - 40186 => array(array('_route' => '_735'), array('a', 'b', 'c'), null, null), - 40234 => array(array('_route' => '_882'), array('a', 'b', 'c'), null, null), - 40282 => array(array('_route' => '_967'), array('a', 'b', 'c'), null, null), - 40332 => array(array('_route' => '_736'), array('a', 'b', 'c'), null, null), - 40381 => array(array('_route' => '_753'), array('a', 'b', 'c'), null, null), - 40430 => array(array('_route' => '_786'), array('a', 'b', 'c'), null, null), - 40479 => array(array('_route' => '_907'), array('a', 'b', 'c'), null, null), - 40528 => array(array('_route' => '_920'), array('a', 'b', 'c'), null, null), - 40577 => array(array('_route' => '_971'), array('a', 'b', 'c'), null, null), - 40635 => array(array('_route' => '_520'), array('a', 'b', 'c'), null, null), - 40683 => array(array('_route' => '_891'), array('a', 'b', 'c'), null, null), - 40739 => array(array('_route' => '_534'), array('a', 'b', 'c'), null, null), - 40785 => array(array('_route' => '_602'), array('a', 'b', 'c'), null, null), - 40834 => array(array('_route' => '_605'), array('a', 'b', 'c'), null, null), - 40882 => array(array('_route' => '_979'), array('a', 'b', 'c'), null, null), - 40932 => array(array('_route' => '_547'), array('a', 'b', 'c'), null, null), - 40987 => array(array('_route' => '_549'), array('a', 'b', 'c'), null, null), - 41034 => array(array('_route' => '_755'), array('a', 'b', 'c'), null, null), - 41083 => array(array('_route' => '_922'), array('a', 'b', 'c'), null, null), - 41131 => array(array('_route' => '_977'), array('a', 'b', 'c'), null, null), - 41184 => array(array('_route' => '_565'), array('a', 'b', 'c'), null, null), - 41232 => array(array('_route' => '_926'), array('a', 'b', 'c'), null, null), - 41282 => array(array('_route' => '_571'), array('a', 'b', 'c'), null, null), - 41331 => array(array('_route' => '_581'), array('a', 'b', 'c'), null, null), - 41380 => array(array('_route' => '_619'), array('a', 'b', 'c'), null, null), - 41429 => array(array('_route' => '_636'), array('a', 'b', 'c'), null, null), - 41481 => array(array('_route' => '_679'), array('a', 'b', 'c'), null, null), - 41529 => array(array('_route' => '_866'), array('a', 'b', 'c'), null, null), - 41577 => array(array('_route' => '_973'), array('a', 'b', 'c'), null, null), - 41630 => array(array('_route' => '_690'), array('a', 'b', 'c'), null, null), - 41678 => array(array('_route' => '_775'), array('a', 'b', 'c'), null, null), - 41731 => array(array('_route' => '_722'), array('a', 'b', 'c'), null, null), - 41779 => array(array('_route' => '_906'), array('a', 'b', 'c'), null, null), - 41827 => array(array('_route' => '_946'), array('a', 'b', 'c'), null, null), - 41877 => array(array('_route' => '_788'), array('a', 'b', 'c'), null, null), - 41929 => array(array('_route' => '_828'), array('a', 'b', 'c'), null, null), - 41977 => array(array('_route' => '_892'), array('a', 'b', 'c'), null, null), - 42025 => array(array('_route' => '_972'), array('a', 'b', 'c'), null, null), - 42075 => array(array('_route' => '_829'), array('a', 'b', 'c'), null, null), - 42127 => array(array('_route' => '_923'), array('a', 'b', 'c'), null, null), - 42175 => array(array('_route' => '_947'), array('a', 'b', 'c'), null, null), - 42234 => array(array('_route' => '_526'), array('a', 'b', 'c'), null, null), - 42282 => array(array('_route' => '_614'), array('a', 'b', 'c'), null, null), - 42330 => array(array('_route' => '_621'), array('a', 'b', 'c'), null, null), - 42383 => array(array('_route' => '_543'), array('a', 'b', 'c'), null, null), - 42431 => array(array('_route' => '_812'), array('a', 'b', 'c'), null, null), - 42487 => array(array('_route' => '_548'), array('a', 'b', 'c'), null, null), - 42534 => array(array('_route' => '_747'), array('a', 'b', 'c'), null, null), - 42583 => array(array('_route' => '_715'), array('a', 'b', 'c'), null, null), - 42631 => array(array('_route' => '_940'), array('a', 'b', 'c'), null, null), - 42684 => array(array('_route' => '_563'), array('a', 'b', 'c'), null, null), - 42732 => array(array('_route' => '_611'), array('a', 'b', 'c'), null, null), - 42780 => array(array('_route' => '_830'), array('a', 'b', 'c'), null, null), - 42833 => array(array('_route' => '_569'), array('a', 'b', 'c'), null, null), - 42881 => array(array('_route' => '_908'), array('a', 'b', 'c'), null, null), - 42929 => array(array('_route' => '_913'), array('a', 'b', 'c'), null, null), - 42982 => array(array('_route' => '_644'), array('a', 'b', 'c'), null, null), - 43030 => array(array('_route' => '_776'), array('a', 'b', 'c'), null, null), - 43078 => array(array('_route' => '_856'), array('a', 'b', 'c'), null, null), - 43131 => array(array('_route' => '_650'), array('a', 'b', 'c'), null, null), - 43179 => array(array('_route' => '_761'), array('a', 'b', 'c'), null, null), - 43232 => array(array('_route' => '_663'), array('a', 'b', 'c'), null, null), - 43280 => array(array('_route' => '_754'), array('a', 'b', 'c'), null, null), - 43333 => array(array('_route' => '_665'), array('a', 'b', 'c'), null, null), - 43381 => array(array('_route' => '_805'), array('a', 'b', 'c'), null, null), - 43429 => array(array('_route' => '_846'), array('a', 'b', 'c'), null, null), - 43477 => array(array('_route' => '_857'), array('a', 'b', 'c'), null, null), - 43530 => array(array('_route' => '_675'), array('a', 'b', 'c'), null, null), - 43578 => array(array('_route' => '_839'), array('a', 'b', 'c'), null, null), - 43626 => array(array('_route' => '_968'), array('a', 'b', 'c'), null, null), - 43676 => array(array('_route' => '_697'), array('a', 'b', 'c'), null, null), - 43728 => array(array('_route' => '_725'), array('a', 'b', 'c'), null, null), - 43776 => array(array('_route' => '_794'), array('a', 'b', 'c'), null, null), - 43829 => array(array('_route' => '_773'), array('a', 'b', 'c'), null, null), - 43877 => array(array('_route' => '_992'), array('a', 'b', 'c'), null, null), - 43930 => array(array('_route' => '_901'), array('a', 'b', 'c'), null, null), - 43978 => array(array('_route' => '_970'), array('a', 'b', 'c'), null, null), - 44028 => array(array('_route' => '_964'), array('a', 'b', 'c'), null, null), - 44086 => array(array('_route' => '_530'), array('a', 'b', 'c'), null, null), - 44134 => array(array('_route' => '_703'), array('a', 'b', 'c'), null, null), - 44187 => array(array('_route' => '_533'), array('a', 'b', 'c'), null, null), - 44235 => array(array('_route' => '_739'), array('a', 'b', 'c'), null, null), - 44283 => array(array('_route' => '_791'), array('a', 'b', 'c'), null, null), - 44331 => array(array('_route' => '_987'), array('a', 'b', 'c'), null, null), - 44384 => array(array('_route' => '_566'), array('a', 'b', 'c'), null, null), - 44432 => array(array('_route' => '_592'), array('a', 'b', 'c'), null, null), - 44488 => array(array('_route' => '_568'), array('a', 'b', 'c'), null, null), - 44534 => array(array('_route' => '_868'), array('a', 'b', 'c'), null, null), - 44583 => array(array('_route' => '_878'), array('a', 'b', 'c'), null, null), - 44636 => array(array('_route' => '_588'), array('a', 'b', 'c'), null, null), - 44684 => array(array('_route' => '_793'), array('a', 'b', 'c'), null, null), - 44732 => array(array('_route' => '_917'), array('a', 'b', 'c'), null, null), - 44785 => array(array('_route' => '_600'), array('a', 'b', 'c'), null, null), - 44833 => array(array('_route' => '_728'), array('a', 'b', 'c'), null, null), - 44886 => array(array('_route' => '_603'), array('a', 'b', 'c'), null, null), - 44934 => array(array('_route' => '_765'), array('a', 'b', 'c'), null, null), - 44987 => array(array('_route' => '_607'), array('a', 'b', 'c'), null, null), - 45035 => array(array('_route' => '_676'), array('a', 'b', 'c'), null, null), - 45083 => array(array('_route' => '_804'), array('a', 'b', 'c'), null, null), - 45136 => array(array('_route' => '_609'), array('a', 'b', 'c'), null, null), - 45184 => array(array('_route' => '_961'), array('a', 'b', 'c'), null, null), - 45232 => array(array('_route' => '_980'), array('a', 'b', 'c'), null, null), - 45282 => array(array('_route' => '_714'), array('a', 'b', 'c'), null, null), - 45334 => array(array('_route' => '_730'), array('a', 'b', 'c'), null, null), - 45382 => array(array('_route' => '_806'), array('a', 'b', 'c'), null, null), - 45430 => array(array('_route' => '_825'), array('a', 'b', 'c'), null, null), - 45478 => array(array('_route' => '_879'), array('a', 'b', 'c'), null, null), - 45526 => array(array('_route' => '_893'), array('a', 'b', 'c'), null, null), - 45576 => array(array('_route' => '_928'), array('a', 'b', 'c'), null, null), - 45628 => array(array('_route' => '_932'), array('a', 'b', 'c'), null, null), - 45676 => array(array('_route' => '_958'), array('a', 'b', 'c'), null, null), - 45726 => array(array('_route' => '_984'), array('a', 'b', 'c'), null, null), - 45784 => array(array('_route' => '_538'), array('a', 'b', 'c'), null, null), - 45832 => array(array('_route' => '_993'), array('a', 'b', 'c'), null, null), - 45882 => array(array('_route' => '_542'), array('a', 'b', 'c'), null, null), - 45934 => array(array('_route' => '_551'), array('a', 'b', 'c'), null, null), - 45982 => array(array('_route' => '_687'), array('a', 'b', 'c'), null, null), - 46030 => array(array('_route' => '_724'), array('a', 'b', 'c'), null, null), - 46078 => array(array('_route' => '_925'), array('a', 'b', 'c'), null, null), - 46131 => array(array('_route' => '_587'), array('a', 'b', 'c'), null, null), - 46179 => array(array('_route' => '_914'), array('a', 'b', 'c'), null, null), - 46229 => array(array('_route' => '_616'), array('a', 'b', 'c'), null, null), - 46284 => array(array('_route' => '_677'), array('a', 'b', 'c'), null, null), - 46331 => array(array('_route' => '_815'), array('a', 'b', 'c'), null, null), - 46380 => array(array('_route' => '_781'), array('a', 'b', 'c'), null, null), - 46430 => array(array('_route' => '_717'), array('a', 'b', 'c'), null, null), - 46482 => array(array('_route' => '_782'), array('a', 'b', 'c'), null, null), - 46530 => array(array('_route' => '_832'), array('a', 'b', 'c'), null, null), - 46583 => array(array('_route' => '_795'), array('a', 'b', 'c'), null, null), - 46631 => array(array('_route' => '_887'), array('a', 'b', 'c'), null, null), - 46681 => array(array('_route' => '_800'), array('a', 'b', 'c'), null, null), - 46730 => array(array('_route' => '_826'), array('a', 'b', 'c'), null, null), - 46779 => array(array('_route' => '_881'), array('a', 'b', 'c'), null, null), - 46828 => array(array('_route' => '_886'), array('a', 'b', 'c'), null, null), - 46877 => array(array('_route' => '_938'), array('a', 'b', 'c'), null, null), - 46935 => array(array('_route' => '_540'), array('a', 'b', 'c'), null, null), - 46983 => array(array('_route' => '_643'), array('a', 'b', 'c'), null, null), - 47033 => array(array('_route' => '_544'), array('a', 'b', 'c'), null, null), - 47082 => array(array('_route' => '_552'), array('a', 'b', 'c'), null, null), - 47134 => array(array('_route' => '_567'), array('a', 'b', 'c'), null, null), - 47182 => array(array('_route' => '_608'), array('a', 'b', 'c'), null, null), - 47230 => array(array('_route' => '_698'), array('a', 'b', 'c'), null, null), - 47278 => array(array('_route' => '_988'), array('a', 'b', 'c'), null, null), - 47331 => array(array('_route' => '_583'), array('a', 'b', 'c'), null, null), - 47379 => array(array('_route' => '_998'), array('a', 'b', 'c'), null, null), - 47432 => array(array('_route' => '_604'), array('a', 'b', 'c'), null, null), - 47480 => array(array('_route' => '_630'), array('a', 'b', 'c'), null, null), - 47528 => array(array('_route' => '_706'), array('a', 'b', 'c'), null, null), - 47576 => array(array('_route' => '_976'), array('a', 'b', 'c'), null, null), - 47629 => array(array('_route' => '_673'), array('a', 'b', 'c'), null, null), - 47677 => array(array('_route' => '_678'), array('a', 'b', 'c'), null, null), - 47725 => array(array('_route' => '_931'), array('a', 'b', 'c'), null, null), - 47775 => array(array('_route' => '_751'), array('a', 'b', 'c'), null, null), - 47824 => array(array('_route' => '_766'), array('a', 'b', 'c'), null, null), - 47876 => array(array('_route' => '_792'), array('a', 'b', 'c'), null, null), - 47924 => array(array('_route' => '_814'), array('a', 'b', 'c'), null, null), - 47974 => array(array('_route' => '_798'), array('a', 'b', 'c'), null, null), - 48026 => array(array('_route' => '_851'), array('a', 'b', 'c'), null, null), - 48074 => array(array('_route' => '_941'), array('a', 'b', 'c'), null, null), - 48122 => array(array('_route' => '_953'), array('a', 'b', 'c'), null, null), - 48170 => array(array('_route' => '_975'), array('a', 'b', 'c'), null, null), - 48220 => array(array('_route' => '_873'), array('a', 'b', 'c'), null, null), - 48269 => array(array('_route' => '_936'), array('a', 'b', 'c'), null, null), - 48318 => array(array('_route' => '_994'), array('a', 'b', 'c'), null, null), - 48376 => array(array('_route' => '_562'), array('a', 'b', 'c'), null, null), - 48424 => array(array('_route' => '_770'), array('a', 'b', 'c'), null, null), - 48475 => array(array('_route' => '_774'), array('a', 'b', 'c'), null, null), - 48522 => array(array('_route' => '_966'), array('a', 'b', 'c'), null, null), - 48573 => array(array('_route' => '_582'), array('a', 'b', 'c'), null, null), - 48625 => array(array('_route' => '_606'), array('a', 'b', 'c'), null, null), - 48673 => array(array('_route' => '_648'), array('a', 'b', 'c'), null, null), - 48723 => array(array('_route' => '_624'), array('a', 'b', 'c'), null, null), - 48775 => array(array('_route' => '_626'), array('a', 'b', 'c'), null, null), - 48823 => array(array('_route' => '_821'), array('a', 'b', 'c'), null, null), - 48873 => array(array('_route' => '_628'), array('a', 'b', 'c'), null, null), - 48922 => array(array('_route' => '_638'), array('a', 'b', 'c'), null, null), - 48974 => array(array('_route' => '_640'), array('a', 'b', 'c'), null, null), - 49022 => array(array('_route' => '_990'), array('a', 'b', 'c'), null, null), - 49072 => array(array('_route' => '_705'), array('a', 'b', 'c'), null, null), - 49121 => array(array('_route' => '_757'), array('a', 'b', 'c'), null, null), - 49176 => array(array('_route' => '_785'), array('a', 'b', 'c'), null, null), - 49223 => array(array('_route' => '_875'), array('a', 'b', 'c'), null, null), - 49270 => array(array('_route' => '_894'), array('a', 'b', 'c'), null, null), - 49319 => array(array('_route' => '_945'), array('a', 'b', 'c'), null, null), - 49375 => array(array('_route' => '_816'), array('a', 'b', 'c'), null, null), - 49422 => array(array('_route' => '_872'), array('a', 'b', 'c'), null, null), - 49471 => array(array('_route' => '_921'), array('a', 'b', 'c'), null, null), - 49519 => array(array('_route' => '_960'), array('a', 'b', 'c'), null, null), - 49567 => array(array('_route' => '_974'), array('a', 'b', 'c'), null, null), - 49620 => array(array('_route' => '_835'), array('a', 'b', 'c'), null, null), - 49668 => array(array('_route' => '_934'), array('a', 'b', 'c'), null, null), - 49718 => array(array('_route' => '_869'), array('a', 'b', 'c'), null, null), - ); - - list($ret, $vars, $requiredMethods, $requiredSchemes) = $routes[$m]; - - foreach ($vars as $i => $v) { - if (isset($matches[1 + $i])) { - $ret[$v] = $matches[1 + $i]; - } - } - - $hasRequiredScheme = !$requiredSchemes || isset($requiredSchemes[$context->getScheme()]); - if ($requiredMethods && !isset($requiredMethods[$canonicalMethod]) && !isset($requiredMethods[$requestMethod])) { - if ($hasRequiredScheme) { - $allow += $requiredMethods; - } - break; - } - if (!$hasRequiredScheme) { - $allowSchemes += $requiredSchemes; - break; - } - - return $ret; - } - - if (49718 === $m) { - break; - } - $regex = substr_replace($regex, 'F', $m - $offset, 1 + strlen($m)); - $offset += strlen($m); - } - } - if ('/' === $pathinfo && !$allow && !$allowSchemes) { - throw new Symfony\Component\Routing\Exception\NoConfigurationException(); - } - - throw $allow ? new MethodNotAllowedException(array_keys($allow)) : new ResourceNotFoundException(); } } diff --git a/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher11.php b/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher11.php index 173cc1527..62638a15f 100644 --- a/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher11.php +++ b/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher11.php @@ -1,7 +1,6 @@ context = $context; - } - - public function match($pathinfo) - { - $allow = $allowSchemes = array(); - if ($ret = $this->doMatch($pathinfo, $allow, $allowSchemes)) { - return $ret; - } - if ($allow) { - throw new MethodNotAllowedException(array_keys($allow)); - } - if (!in_array($this->context->getMethod(), array('HEAD', 'GET'), true)) { - // no-op - } elseif ($allowSchemes) { - redirect_scheme: - $scheme = $this->context->getScheme(); - $this->context->setScheme(key($allowSchemes)); - try { - if ($ret = $this->doMatch($pathinfo)) { - return $this->redirect($pathinfo, $ret['_route'], $this->context->getScheme()) + $ret; - } - } finally { - $this->context->setScheme($scheme); - } - } elseif ('/' !== $pathinfo) { - $pathinfo = '/' !== $pathinfo[-1] ? $pathinfo.'/' : substr($pathinfo, 0, -1); - if ($ret = $this->doMatch($pathinfo, $allow, $allowSchemes)) { - return $this->redirect($pathinfo, $ret['_route']) + $ret; - } - if ($allowSchemes) { - goto redirect_scheme; - } - } - - throw new ResourceNotFoundException(); - } - - private function doMatch(string $rawPathinfo, array &$allow = array(), array &$allowSchemes = array()): ?array - { - $allow = $allowSchemes = array(); - $pathinfo = rawurldecode($rawPathinfo); - $context = $this->context; - $requestMethod = $canonicalMethod = $context->getMethod(); - - if ('HEAD' === $requestMethod) { - $canonicalMethod = 'GET'; - } - - $matchedPathinfo = $pathinfo; - $regexList = array( + $this->regexpList = array( 0 => '{^(?' .'|/(en|fr)/(?' - .'|admin/post/(?' - .'|(*:33)' - .'|new(*:43)' - .'|(\\d+)(*:55)' - .'|(\\d+)/edit(*:72)' - .'|(\\d+)/delete(*:91)' - .')' - .'|blog/(?' - .'|(*:107)' - .'|rss\\.xml(*:123)' - .'|p(?' - .'|age/([^/]++)(*:147)' - .'|osts/([^/]++)(*:168)' + .'|admin/post(?' + .'|(*:32)' + .'|/(?' + .'|new(*:46)' + .'|(\\d+)(*:58)' + .'|(\\d+)/edit(*:75)' + .'|(\\d+)/delete(*:94)' + .')' + .')' + .'|blog(?' + .'|(*:110)' + .'|/(?' + .'|rss\\.xml(*:130)' + .'|p(?' + .'|age/([^/]++)(*:154)' + .'|osts/([^/]++)(*:175)' + .')' + .'|comments/(\\d+)/new(*:202)' + .'|search(*:216)' .')' - .'|comments/(\\d+)/new(*:195)' - .'|search(*:209)' .')' .'|log(?' - .'|in(*:226)' - .'|out(*:237)' + .'|in(*:234)' + .'|out(*:245)' .')' .')' - .'|/(en|fr)?(*:256)' - .')$}sD', + .'|/(en|fr)?(*:264)' + .')(?:/?)$}sD', + ); + $this->dynamicRoutes = array( + 32 => array(array(array('_route' => 'a', '_locale' => 'en'), array('_locale'), null, null, true, null)), + 46 => array(array(array('_route' => 'b', '_locale' => 'en'), array('_locale'), null, null, false, null)), + 58 => array(array(array('_route' => 'c', '_locale' => 'en'), array('_locale', 'id'), null, null, false, null)), + 75 => array(array(array('_route' => 'd', '_locale' => 'en'), array('_locale', 'id'), null, null, false, null)), + 94 => array(array(array('_route' => 'e', '_locale' => 'en'), array('_locale', 'id'), null, null, false, null)), + 110 => array(array(array('_route' => 'f', '_locale' => 'en'), array('_locale'), null, null, true, null)), + 130 => array(array(array('_route' => 'g', '_locale' => 'en'), array('_locale'), null, null, false, null)), + 154 => array(array(array('_route' => 'h', '_locale' => 'en'), array('_locale', 'page'), null, null, false, null)), + 175 => array(array(array('_route' => 'i', '_locale' => 'en'), array('_locale', 'page'), null, null, false, null)), + 202 => array(array(array('_route' => 'j', '_locale' => 'en'), array('_locale', 'id'), null, null, false, null)), + 216 => array(array(array('_route' => 'k', '_locale' => 'en'), array('_locale'), null, null, false, null)), + 234 => array(array(array('_route' => 'l', '_locale' => 'en'), array('_locale'), null, null, false, null)), + 245 => array(array(array('_route' => 'm', '_locale' => 'en'), array('_locale'), null, null, false, null)), + 264 => array(array(array('_route' => 'n', '_locale' => 'en'), array('_locale'), null, null, false, null)), ); - - foreach ($regexList as $offset => $regex) { - while (preg_match($regex, $matchedPathinfo, $matches)) { - switch ($m = (int) $matches['MARK']) { - default: - $routes = array( - 33 => array(array('_route' => 'a', '_locale' => 'en'), array('_locale'), null, null), - 43 => array(array('_route' => 'b', '_locale' => 'en'), array('_locale'), null, null), - 55 => array(array('_route' => 'c', '_locale' => 'en'), array('_locale', 'id'), null, null), - 72 => array(array('_route' => 'd', '_locale' => 'en'), array('_locale', 'id'), null, null), - 91 => array(array('_route' => 'e', '_locale' => 'en'), array('_locale', 'id'), null, null), - 107 => array(array('_route' => 'f', '_locale' => 'en'), array('_locale'), null, null), - 123 => array(array('_route' => 'g', '_locale' => 'en'), array('_locale'), null, null), - 147 => array(array('_route' => 'h', '_locale' => 'en'), array('_locale', 'page'), null, null), - 168 => array(array('_route' => 'i', '_locale' => 'en'), array('_locale', 'page'), null, null), - 195 => array(array('_route' => 'j', '_locale' => 'en'), array('_locale', 'id'), null, null), - 209 => array(array('_route' => 'k', '_locale' => 'en'), array('_locale'), null, null), - 226 => array(array('_route' => 'l', '_locale' => 'en'), array('_locale'), null, null), - 237 => array(array('_route' => 'm', '_locale' => 'en'), array('_locale'), null, null), - 256 => array(array('_route' => 'n', '_locale' => 'en'), array('_locale'), null, null), - ); - - list($ret, $vars, $requiredMethods, $requiredSchemes) = $routes[$m]; - - foreach ($vars as $i => $v) { - if (isset($matches[1 + $i])) { - $ret[$v] = $matches[1 + $i]; - } - } - - $hasRequiredScheme = !$requiredSchemes || isset($requiredSchemes[$context->getScheme()]); - if ($requiredMethods && !isset($requiredMethods[$canonicalMethod]) && !isset($requiredMethods[$requestMethod])) { - if ($hasRequiredScheme) { - $allow += $requiredMethods; - } - break; - } - if (!$hasRequiredScheme) { - $allowSchemes += $requiredSchemes; - break; - } - - return $ret; - } - - if (256 === $m) { - break; - } - $regex = substr_replace($regex, 'F', $m - $offset, 1 + strlen($m)); - $offset += strlen($m); - } - } - if ('/' === $pathinfo && !$allow && !$allowSchemes) { - throw new Symfony\Component\Routing\Exception\NoConfigurationException(); - } - - return null; } } diff --git a/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher12.php b/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher12.php index eba4c8ace..df4d926a4 100644 --- a/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher12.php +++ b/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher12.php @@ -1,7 +1,6 @@ context = $context; - } - - public function match($rawPathinfo) - { - $allow = $allowSchemes = array(); - $pathinfo = rawurldecode($rawPathinfo); - $context = $this->context; - $requestMethod = $canonicalMethod = $context->getMethod(); - - if ('HEAD' === $requestMethod) { - $canonicalMethod = 'GET'; - } - - $matchedPathinfo = $pathinfo; - $regexList = array( + $this->regexpList = array( 0 => '{^(?' .'|/abc([^/]++)/(?' .'|1(?' @@ -45,56 +32,15 @@ class ProjectUrlMatcher extends Symfony\Component\Routing\Matcher\UrlMatcher .')' .')' .')' - .')$}sD', + .')(?:/?)$}sD', + ); + $this->dynamicRoutes = array( + 27 => array(array(array('_route' => 'r1'), array('foo'), null, null, false, null)), + 38 => array(array(array('_route' => 'r10'), array('foo'), null, null, false, null)), + 46 => array(array(array('_route' => 'r100'), array('foo'), null, null, false, null)), + 59 => array(array(array('_route' => 'r2'), array('foo'), null, null, false, null)), + 70 => array(array(array('_route' => 'r20'), array('foo'), null, null, false, null)), + 78 => array(array(array('_route' => 'r200'), array('foo'), null, null, false, null)), ); - - foreach ($regexList as $offset => $regex) { - while (preg_match($regex, $matchedPathinfo, $matches)) { - switch ($m = (int) $matches['MARK']) { - default: - $routes = array( - 27 => array(array('_route' => 'r1'), array('foo'), null, null), - 38 => array(array('_route' => 'r10'), array('foo'), null, null), - 46 => array(array('_route' => 'r100'), array('foo'), null, null), - 59 => array(array('_route' => 'r2'), array('foo'), null, null), - 70 => array(array('_route' => 'r20'), array('foo'), null, null), - 78 => array(array('_route' => 'r200'), array('foo'), null, null), - ); - - list($ret, $vars, $requiredMethods, $requiredSchemes) = $routes[$m]; - - foreach ($vars as $i => $v) { - if (isset($matches[1 + $i])) { - $ret[$v] = $matches[1 + $i]; - } - } - - $hasRequiredScheme = !$requiredSchemes || isset($requiredSchemes[$context->getScheme()]); - if ($requiredMethods && !isset($requiredMethods[$canonicalMethod]) && !isset($requiredMethods[$requestMethod])) { - if ($hasRequiredScheme) { - $allow += $requiredMethods; - } - break; - } - if (!$hasRequiredScheme) { - $allowSchemes += $requiredSchemes; - break; - } - - return $ret; - } - - if (78 === $m) { - break; - } - $regex = substr_replace($regex, 'F', $m - $offset, 1 + strlen($m)); - $offset += strlen($m); - } - } - if ('/' === $pathinfo && !$allow && !$allowSchemes) { - throw new Symfony\Component\Routing\Exception\NoConfigurationException(); - } - - throw $allow ? new MethodNotAllowedException(array_keys($allow)) : new ResourceNotFoundException(); } } diff --git a/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher13.php b/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher13.php index 5cda7753d..3c13a26ba 100644 --- a/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher13.php +++ b/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher13.php @@ -1,7 +1,6 @@ context = $context; - } - - public function match($rawPathinfo) - { - $allow = $allowSchemes = array(); - $pathinfo = rawurldecode($rawPathinfo); - $context = $this->context; - $requestMethod = $canonicalMethod = $context->getMethod(); - $host = strtolower($context->getHost()); - - if ('HEAD' === $requestMethod) { - $canonicalMethod = 'GET'; - } - - $matchedPathinfo = $host.'.'.$pathinfo; - $regexList = array( + $this->matchHost = true; + $this->regexpList = array( 0 => '{^(?' .'|(?i:([^\\.]++)\\.exampple\\.com)\\.(?' .'|/abc([^/]++)(?' .'|(*:56)' .')' .')' - .')$}sD', + .')(?:/?)$}sD', + ); + $this->dynamicRoutes = array( + 56 => array( + array(array('_route' => 'r1'), array('foo', 'foo'), null, null, false, null), + array(array('_route' => 'r2'), array('foo', 'foo'), null, null, false, null), + ), ); - - foreach ($regexList as $offset => $regex) { - while (preg_match($regex, $matchedPathinfo, $matches)) { - switch ($m = (int) $matches['MARK']) { - case 56: - $matches = array('foo' => $matches[1] ?? null, 'foo' => $matches[2] ?? null); - - // r1 - return $this->mergeDefaults(array('_route' => 'r1') + $matches, array()); - - // r2 - return $this->mergeDefaults(array('_route' => 'r2') + $matches, array()); - - break; - } - - if (56 === $m) { - break; - } - $regex = substr_replace($regex, 'F', $m - $offset, 1 + strlen($m)); - $offset += strlen($m); - } - } - if ('/' === $pathinfo && !$allow && !$allowSchemes) { - throw new Symfony\Component\Routing\Exception\NoConfigurationException(); - } - - throw $allow ? new MethodNotAllowedException(array_keys($allow)) : new ResourceNotFoundException(); } } diff --git a/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher2.php b/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher2.php index 5aec5db01..8d71ee5e0 100644 --- a/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher2.php +++ b/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher2.php @@ -1,7 +1,6 @@ context = $context; - } - - public function match($pathinfo) - { - $allow = $allowSchemes = array(); - if ($ret = $this->doMatch($pathinfo, $allow, $allowSchemes)) { - return $ret; - } - if ($allow) { - throw new MethodNotAllowedException(array_keys($allow)); - } - if (!in_array($this->context->getMethod(), array('HEAD', 'GET'), true)) { - // no-op - } elseif ($allowSchemes) { - redirect_scheme: - $scheme = $this->context->getScheme(); - $this->context->setScheme(key($allowSchemes)); - try { - if ($ret = $this->doMatch($pathinfo)) { - return $this->redirect($pathinfo, $ret['_route'], $this->context->getScheme()) + $ret; - } - } finally { - $this->context->setScheme($scheme); - } - } elseif ('/' !== $pathinfo) { - $pathinfo = '/' !== $pathinfo[-1] ? $pathinfo.'/' : substr($pathinfo, 0, -1); - if ($ret = $this->doMatch($pathinfo, $allow, $allowSchemes)) { - return $this->redirect($pathinfo, $ret['_route']) + $ret; - } - if ($allowSchemes) { - goto redirect_scheme; - } - } - - throw new ResourceNotFoundException(); - } - - private function doMatch(string $rawPathinfo, array &$allow = array(), array &$allowSchemes = array()): ?array - { - $allow = $allowSchemes = array(); - $pathinfo = rawurldecode($rawPathinfo); - $context = $this->context; - $requestMethod = $canonicalMethod = $context->getMethod(); - $host = strtolower($context->getHost()); - - if ('HEAD' === $requestMethod) { - $canonicalMethod = 'GET'; - } - - switch ($pathinfo) { - default: - $routes = array( - '/test/baz' => array(array('_route' => 'baz'), null, null, null), - '/test/baz.html' => array(array('_route' => 'baz2'), null, null, null), - '/test/baz3/' => array(array('_route' => 'baz3'), null, null, null), - '/foofoo' => array(array('_route' => 'foofoo', 'def' => 'test'), null, null, null), - '/spa ce' => array(array('_route' => 'space'), null, null, null), - '/multi/new' => array(array('_route' => 'overridden2'), null, null, null), - '/multi/hey/' => array(array('_route' => 'hey'), null, null, null), - '/ababa' => array(array('_route' => 'ababa'), null, null, null), - '/route1' => array(array('_route' => 'route1'), 'a.example.com', null, null), - '/c2/route2' => array(array('_route' => 'route2'), 'a.example.com', null, null), - '/route4' => array(array('_route' => 'route4'), 'a.example.com', null, null), - '/c2/route3' => array(array('_route' => 'route3'), 'b.example.com', null, null), - '/route5' => array(array('_route' => 'route5'), 'c.example.com', null, null), - '/route6' => array(array('_route' => 'route6'), null, null, null), - '/route11' => array(array('_route' => 'route11'), '#^(?P[^\\.]++)\\.example\\.com$#sDi', null, null), - '/route12' => array(array('_route' => 'route12', 'var1' => 'val'), '#^(?P[^\\.]++)\\.example\\.com$#sDi', null, null), - '/route17' => array(array('_route' => 'route17'), null, null, null), - '/secure' => array(array('_route' => 'secure'), null, null, array('https' => 0)), - '/nonsecure' => array(array('_route' => 'nonsecure'), null, null, array('http' => 0)), - ); - - if (!isset($routes[$pathinfo])) { - break; - } - list($ret, $requiredHost, $requiredMethods, $requiredSchemes) = $routes[$pathinfo]; - - if ($requiredHost) { - if ('#' !== $requiredHost[0] ? $requiredHost !== $host : !preg_match($requiredHost, $host, $hostMatches)) { - break; - } - if ('#' === $requiredHost[0] && $hostMatches) { - $hostMatches['_route'] = $ret['_route']; - $ret = $this->mergeDefaults($hostMatches, $ret); - } - } - - $hasRequiredScheme = !$requiredSchemes || isset($requiredSchemes[$context->getScheme()]); - if ($requiredMethods && !isset($requiredMethods[$canonicalMethod]) && !isset($requiredMethods[$requestMethod])) { - if ($hasRequiredScheme) { - $allow += $requiredMethods; - } - break; - } - if (!$hasRequiredScheme) { - $allowSchemes += $requiredSchemes; - break; - } - - return $ret; - } - - $matchedPathinfo = $host.'.'.$pathinfo; - $regexList = array( + $this->matchHost = true; + $this->staticRoutes = array( + '/test/baz' => array(array(array('_route' => 'baz'), null, null, null, false, null)), + '/test/baz.html' => array(array(array('_route' => 'baz2'), null, null, null, false, null)), + '/test/baz3' => array(array(array('_route' => 'baz3'), null, null, null, true, null)), + '/foofoo' => array(array(array('_route' => 'foofoo', 'def' => 'test'), null, null, null, false, null)), + '/spa ce' => array(array(array('_route' => 'space'), null, null, null, false, null)), + '/multi/new' => array(array(array('_route' => 'overridden2'), null, null, null, false, null)), + '/multi/hey' => array(array(array('_route' => 'hey'), null, null, null, true, null)), + '/ababa' => array(array(array('_route' => 'ababa'), null, null, null, false, null)), + '/route1' => array(array(array('_route' => 'route1'), 'a.example.com', null, null, false, null)), + '/c2/route2' => array(array(array('_route' => 'route2'), 'a.example.com', null, null, false, null)), + '/route4' => array(array(array('_route' => 'route4'), 'a.example.com', null, null, false, null)), + '/c2/route3' => array(array(array('_route' => 'route3'), 'b.example.com', null, null, false, null)), + '/route5' => array(array(array('_route' => 'route5'), 'c.example.com', null, null, false, null)), + '/route6' => array(array(array('_route' => 'route6'), null, null, null, false, null)), + '/route11' => array(array(array('_route' => 'route11'), '#^(?P[^\\.]++)\\.example\\.com$#sDi', null, null, false, null)), + '/route12' => array(array(array('_route' => 'route12', 'var1' => 'val'), '#^(?P[^\\.]++)\\.example\\.com$#sDi', null, null, false, null)), + '/route17' => array(array(array('_route' => 'route17'), null, null, null, false, null)), + '/secure' => array(array(array('_route' => 'secure'), null, null, array('https' => 0), false, null)), + '/nonsecure' => array(array(array('_route' => 'nonsecure'), null, null, array('http' => 0), false, null)), + ); + $this->regexpList = array( 0 => '{^(?' .'|(?:(?:[^./]*+\\.)++)(?' .'|/foo/(baz|symfony)(*:47)' @@ -125,160 +44,72 @@ class ProjectUrlMatcher extends Symfony\Component\Routing\Tests\Fixtures\Redirec .'|/([^/]++)(*:70)' .'|head/([^/]++)(*:90)' .')' - .'|/test/([^/]++)/(?' - .'|(*:116)' + .'|/test/([^/]++)(?' + .'|(*:115)' .')' - .'|/([\']+)(*:132)' + .'|/([\']+)(*:131)' .'|/a/(?' .'|b\'b/([^/]++)(?' - .'|(*:161)' - .'|(*:169)' + .'|(*:160)' + .'|(*:168)' .')' - .'|(.*)(*:182)' + .'|(.*)(*:181)' .'|b\'b/([^/]++)(?' - .'|(*:205)' - .'|(*:213)' + .'|(*:204)' + .'|(*:212)' .')' .')' - .'|/multi/hello(?:/([^/]++))?(*:249)' + .'|/multi/hello(?:/([^/]++))?(*:248)' .'|/([^/]++)/b/([^/]++)(?' - .'|(*:280)' - .'|(*:288)' + .'|(*:279)' + .'|(*:287)' .')' - .'|/aba/([^/]++)(*:310)' + .'|/aba/([^/]++)(*:309)' .')|(?i:([^\\.]++)\\.example\\.com)\\.(?' .'|/route1(?' - .'|3/([^/]++)(*:372)' - .'|4/([^/]++)(*:390)' + .'|3/([^/]++)(*:371)' + .'|4/([^/]++)(*:389)' .')' .')|(?i:c\\.example\\.com)\\.(?' - .'|/route15/([^/]++)(*:442)' + .'|/route15/([^/]++)(*:441)' .')|(?:(?:[^./]*+\\.)++)(?' - .'|/route16/([^/]++)(*:490)' + .'|/route16/([^/]++)(*:489)' .'|/a/(?' - .'|a\\.\\.\\.(*:511)' + .'|a\\.\\.\\.(*:510)' .'|b/(?' - .'|([^/]++)(*:532)' - .'|c/([^/]++)(*:550)' + .'|([^/]++)(*:531)' + .'|c/([^/]++)(*:549)' .')' .')' .')' - .')$}sD', + .')(?:/?)$}sD', + ); + $this->dynamicRoutes = array( + 47 => array(array(array('_route' => 'foo', 'def' => 'test'), array('bar'), null, null, false, null)), + 70 => array(array(array('_route' => 'bar'), array('foo'), array('GET' => 0, 'HEAD' => 1), null, false, null)), + 90 => array(array(array('_route' => 'barhead'), array('foo'), array('GET' => 0), null, false, null)), + 115 => array( + array(array('_route' => 'baz4'), array('foo'), null, null, true, null), + array(array('_route' => 'baz5'), array('foo'), array('POST' => 0), null, true, null), + array(array('_route' => 'baz.baz6'), array('foo'), array('PUT' => 0), null, true, null), + ), + 131 => array(array(array('_route' => 'quoter'), array('quoter'), null, null, false, null)), + 160 => array(array(array('_route' => 'foo1'), array('foo'), array('PUT' => 0), null, false, null)), + 168 => array(array(array('_route' => 'bar1'), array('bar'), null, null, false, null)), + 181 => array(array(array('_route' => 'overridden'), array('var'), null, null, false, null)), + 204 => array(array(array('_route' => 'foo2'), array('foo1'), null, null, false, null)), + 212 => array(array(array('_route' => 'bar2'), array('bar1'), null, null, false, null)), + 248 => array(array(array('_route' => 'helloWorld', 'who' => 'World!'), array('who'), null, null, false, null)), + 279 => array(array(array('_route' => 'foo3'), array('_locale', 'foo'), null, null, false, null)), + 287 => array(array(array('_route' => 'bar3'), array('_locale', 'bar'), null, null, false, null)), + 309 => array(array(array('_route' => 'foo4'), array('foo'), null, null, false, null)), + 371 => array(array(array('_route' => 'route13'), array('var1', 'name'), null, null, false, null)), + 389 => array(array(array('_route' => 'route14', 'var1' => 'val'), array('var1', 'name'), null, null, false, null)), + 441 => array(array(array('_route' => 'route15'), array('name'), null, null, false, null)), + 489 => array(array(array('_route' => 'route16', 'var1' => 'val'), array('name'), null, null, false, null)), + 510 => array(array(array('_route' => 'a'), array(), null, null, false, null)), + 531 => array(array(array('_route' => 'b'), array('var'), null, null, false, null)), + 549 => array(array(array('_route' => 'c'), array('var'), null, null, false, null)), ); - - foreach ($regexList as $offset => $regex) { - while (preg_match($regex, $matchedPathinfo, $matches)) { - switch ($m = (int) $matches['MARK']) { - case 116: - $matches = array('foo' => $matches[1] ?? null); - - // baz4 - return $this->mergeDefaults(array('_route' => 'baz4') + $matches, array()); - - // baz5 - $ret = $this->mergeDefaults(array('_route' => 'baz5') + $matches, array()); - if (!isset(($a = array('POST' => 0))[$requestMethod])) { - $allow += $a; - goto not_baz5; - } - - return $ret; - not_baz5: - - // baz.baz6 - $ret = $this->mergeDefaults(array('_route' => 'baz.baz6') + $matches, array()); - if (!isset(($a = array('PUT' => 0))[$requestMethod])) { - $allow += $a; - goto not_bazbaz6; - } - - return $ret; - not_bazbaz6: - - break; - case 161: - $matches = array('foo' => $matches[1] ?? null); - - // foo1 - $ret = $this->mergeDefaults(array('_route' => 'foo1') + $matches, array()); - if (!isset(($a = array('PUT' => 0))[$requestMethod])) { - $allow += $a; - goto not_foo1; - } - - return $ret; - not_foo1: - - break; - case 205: - $matches = array('foo1' => $matches[1] ?? null); - - // foo2 - return $this->mergeDefaults(array('_route' => 'foo2') + $matches, array()); - - break; - case 280: - $matches = array('_locale' => $matches[1] ?? null, 'foo' => $matches[2] ?? null); - - // foo3 - return $this->mergeDefaults(array('_route' => 'foo3') + $matches, array()); - - break; - default: - $routes = array( - 47 => array(array('_route' => 'foo', 'def' => 'test'), array('bar'), null, null), - 70 => array(array('_route' => 'bar'), array('foo'), array('GET' => 0, 'HEAD' => 1), null), - 90 => array(array('_route' => 'barhead'), array('foo'), array('GET' => 0), null), - 132 => array(array('_route' => 'quoter'), array('quoter'), null, null), - 169 => array(array('_route' => 'bar1'), array('bar'), null, null), - 182 => array(array('_route' => 'overridden'), array('var'), null, null), - 213 => array(array('_route' => 'bar2'), array('bar1'), null, null), - 249 => array(array('_route' => 'helloWorld', 'who' => 'World!'), array('who'), null, null), - 288 => array(array('_route' => 'bar3'), array('_locale', 'bar'), null, null), - 310 => array(array('_route' => 'foo4'), array('foo'), null, null), - 372 => array(array('_route' => 'route13'), array('var1', 'name'), null, null), - 390 => array(array('_route' => 'route14', 'var1' => 'val'), array('var1', 'name'), null, null), - 442 => array(array('_route' => 'route15'), array('name'), null, null), - 490 => array(array('_route' => 'route16', 'var1' => 'val'), array('name'), null, null), - 511 => array(array('_route' => 'a'), array(), null, null), - 532 => array(array('_route' => 'b'), array('var'), null, null), - 550 => array(array('_route' => 'c'), array('var'), null, null), - ); - - list($ret, $vars, $requiredMethods, $requiredSchemes) = $routes[$m]; - - foreach ($vars as $i => $v) { - if (isset($matches[1 + $i])) { - $ret[$v] = $matches[1 + $i]; - } - } - - $hasRequiredScheme = !$requiredSchemes || isset($requiredSchemes[$context->getScheme()]); - if ($requiredMethods && !isset($requiredMethods[$canonicalMethod]) && !isset($requiredMethods[$requestMethod])) { - if ($hasRequiredScheme) { - $allow += $requiredMethods; - } - break; - } - if (!$hasRequiredScheme) { - $allowSchemes += $requiredSchemes; - break; - } - - return $ret; - } - - if (550 === $m) { - break; - } - $regex = substr_replace($regex, 'F', $m - $offset, 1 + strlen($m)); - $offset += strlen($m); - } - } - if ('/' === $pathinfo && !$allow && !$allowSchemes) { - throw new Symfony\Component\Routing\Exception\NoConfigurationException(); - } - - return null; } } diff --git a/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher3.php b/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher3.php index 6f1c45aa9..49b4b77cd 100644 --- a/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher3.php +++ b/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher3.php @@ -1,7 +1,6 @@ context = $context; - } - - public function match($rawPathinfo) - { - $allow = $allowSchemes = array(); - $pathinfo = rawurldecode($rawPathinfo); - $context = $this->context; - $requestMethod = $canonicalMethod = $context->getMethod(); - - if ('HEAD' === $requestMethod) { - $canonicalMethod = 'GET'; - } - - switch ($pathinfo) { - case '/with-condition': - // with-condition - if (($context->getMethod() == "GET")) { - return array('_route' => 'with-condition'); - } - break; - default: - $routes = array( - '/rootprefix/test' => array(array('_route' => 'static'), null, null, null), - ); - - if (!isset($routes[$pathinfo])) { - break; - } - list($ret, $requiredHost, $requiredMethods, $requiredSchemes) = $routes[$pathinfo]; - - $hasRequiredScheme = !$requiredSchemes || isset($requiredSchemes[$context->getScheme()]); - if ($requiredMethods && !isset($requiredMethods[$canonicalMethod]) && !isset($requiredMethods[$requestMethod])) { - if ($hasRequiredScheme) { - $allow += $requiredMethods; - } - break; - } - if (!$hasRequiredScheme) { - $allowSchemes += $requiredSchemes; - break; - } - - return $ret; - } - - $matchedPathinfo = $pathinfo; - $regexList = array( + $this->staticRoutes = array( + '/rootprefix/test' => array(array(array('_route' => 'static'), null, null, null, false, null)), + '/with-condition' => array(array(array('_route' => 'with-condition'), null, null, null, false, -1)), + ); + $this->regexpList = array( 0 => '{^(?' .'|/rootprefix/([^/]++)(*:27)' - .')$}sD', + .')(?:/?)$}sD', ); - - foreach ($regexList as $offset => $regex) { - while (preg_match($regex, $matchedPathinfo, $matches)) { - switch ($m = (int) $matches['MARK']) { - default: - $routes = array( - 27 => array(array('_route' => 'dynamic'), array('var'), null, null), - ); - - list($ret, $vars, $requiredMethods, $requiredSchemes) = $routes[$m]; - - foreach ($vars as $i => $v) { - if (isset($matches[1 + $i])) { - $ret[$v] = $matches[1 + $i]; - } - } - - $hasRequiredScheme = !$requiredSchemes || isset($requiredSchemes[$context->getScheme()]); - if ($requiredMethods && !isset($requiredMethods[$canonicalMethod]) && !isset($requiredMethods[$requestMethod])) { - if ($hasRequiredScheme) { - $allow += $requiredMethods; - } - break; - } - if (!$hasRequiredScheme) { - $allowSchemes += $requiredSchemes; - break; - } - - return $ret; - } - - if (27 === $m) { - break; - } - $regex = substr_replace($regex, 'F', $m - $offset, 1 + strlen($m)); - $offset += strlen($m); + $this->dynamicRoutes = array( + 27 => array(array(array('_route' => 'dynamic'), array('var'), null, null, false, null)), + ); + $this->checkCondition = static function ($condition, $context, $request) { + switch ($condition) { + case -1: return ($context->getMethod() == "GET"); } - } - if ('/' === $pathinfo && !$allow && !$allowSchemes) { - throw new Symfony\Component\Routing\Exception\NoConfigurationException(); - } - - throw $allow ? new MethodNotAllowedException(array_keys($allow)) : new ResourceNotFoundException(); + }; } } diff --git a/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher4.php b/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher4.php index 418f8e0b1..7d99de407 100644 --- a/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher4.php +++ b/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher4.php @@ -1,7 +1,6 @@ context = $context; - } - - public function match($rawPathinfo) - { - $allow = $allowSchemes = array(); - $pathinfo = rawurldecode($rawPathinfo); - $context = $this->context; - $requestMethod = $canonicalMethod = $context->getMethod(); - - if ('HEAD' === $requestMethod) { - $canonicalMethod = 'GET'; - } - - switch ($pathinfo) { - case '/put_and_post': - // put_and_post - $ret = array('_route' => 'put_and_post'); - if (!isset(($a = array('PUT' => 0, 'POST' => 1))[$requestMethod])) { - $allow += $a; - goto not_put_and_post; - } - - return $ret; - not_put_and_post: - // put_and_get_and_head - $ret = array('_route' => 'put_and_get_and_head'); - if (!isset(($a = array('PUT' => 0, 'GET' => 1, 'HEAD' => 2))[$canonicalMethod])) { - $allow += $a; - goto not_put_and_get_and_head; - } - - return $ret; - not_put_and_get_and_head: - break; - default: - $routes = array( - '/just_head' => array(array('_route' => 'just_head'), null, array('HEAD' => 0), null), - '/head_and_get' => array(array('_route' => 'head_and_get'), null, array('HEAD' => 0, 'GET' => 1), null), - '/get_and_head' => array(array('_route' => 'get_and_head'), null, array('GET' => 0, 'HEAD' => 1), null), - '/post_and_head' => array(array('_route' => 'post_and_head'), null, array('POST' => 0, 'HEAD' => 1), null), - ); - - if (!isset($routes[$pathinfo])) { - break; - } - list($ret, $requiredHost, $requiredMethods, $requiredSchemes) = $routes[$pathinfo]; - - $hasRequiredScheme = !$requiredSchemes || isset($requiredSchemes[$context->getScheme()]); - if ($requiredMethods && !isset($requiredMethods[$canonicalMethod]) && !isset($requiredMethods[$requestMethod])) { - if ($hasRequiredScheme) { - $allow += $requiredMethods; - } - break; - } - if (!$hasRequiredScheme) { - $allowSchemes += $requiredSchemes; - break; - } - - return $ret; - } - - if ('/' === $pathinfo && !$allow && !$allowSchemes) { - throw new Symfony\Component\Routing\Exception\NoConfigurationException(); - } - - throw $allow ? new MethodNotAllowedException(array_keys($allow)) : new ResourceNotFoundException(); + $this->staticRoutes = array( + '/just_head' => array(array(array('_route' => 'just_head'), null, array('HEAD' => 0), null, false, null)), + '/head_and_get' => array(array(array('_route' => 'head_and_get'), null, array('HEAD' => 0, 'GET' => 1), null, false, null)), + '/get_and_head' => array(array(array('_route' => 'get_and_head'), null, array('GET' => 0, 'HEAD' => 1), null, false, null)), + '/post_and_head' => array(array(array('_route' => 'post_and_head'), null, array('POST' => 0, 'HEAD' => 1), null, false, null)), + '/put_and_post' => array( + array(array('_route' => 'put_and_post'), null, array('PUT' => 0, 'POST' => 1), null, false, null), + array(array('_route' => 'put_and_get_and_head'), null, array('PUT' => 0, 'GET' => 1, 'HEAD' => 2), null, false, null), + ), + ); } } diff --git a/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher5.php b/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher5.php index 976a25fbe..001e6cdd5 100644 --- a/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher5.php +++ b/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher5.php @@ -1,7 +1,6 @@ context = $context; - } - - public function match($pathinfo) - { - $allow = $allowSchemes = array(); - if ($ret = $this->doMatch($pathinfo, $allow, $allowSchemes)) { - return $ret; - } - if ($allow) { - throw new MethodNotAllowedException(array_keys($allow)); - } - if (!in_array($this->context->getMethod(), array('HEAD', 'GET'), true)) { - // no-op - } elseif ($allowSchemes) { - redirect_scheme: - $scheme = $this->context->getScheme(); - $this->context->setScheme(key($allowSchemes)); - try { - if ($ret = $this->doMatch($pathinfo)) { - return $this->redirect($pathinfo, $ret['_route'], $this->context->getScheme()) + $ret; - } - } finally { - $this->context->setScheme($scheme); - } - } elseif ('/' !== $pathinfo) { - $pathinfo = '/' !== $pathinfo[-1] ? $pathinfo.'/' : substr($pathinfo, 0, -1); - if ($ret = $this->doMatch($pathinfo, $allow, $allowSchemes)) { - return $this->redirect($pathinfo, $ret['_route']) + $ret; - } - if ($allowSchemes) { - goto redirect_scheme; - } - } - - throw new ResourceNotFoundException(); - } - - private function doMatch(string $rawPathinfo, array &$allow = array(), array &$allowSchemes = array()): ?array - { - $allow = $allowSchemes = array(); - $pathinfo = rawurldecode($rawPathinfo); - $context = $this->context; - $requestMethod = $canonicalMethod = $context->getMethod(); - - if ('HEAD' === $requestMethod) { - $canonicalMethod = 'GET'; - } - - switch ($pathinfo) { - default: - $routes = array( - '/a/11' => array(array('_route' => 'a_first'), null, null, null), - '/a/22' => array(array('_route' => 'a_second'), null, null, null), - '/a/333' => array(array('_route' => 'a_third'), null, null, null), - '/a/44/' => array(array('_route' => 'a_fourth'), null, null, null), - '/a/55/' => array(array('_route' => 'a_fifth'), null, null, null), - '/a/66/' => array(array('_route' => 'a_sixth'), null, null, null), - '/nested/group/a/' => array(array('_route' => 'nested_a'), null, null, null), - '/nested/group/b/' => array(array('_route' => 'nested_b'), null, null, null), - '/nested/group/c/' => array(array('_route' => 'nested_c'), null, null, null), - '/slashed/group/' => array(array('_route' => 'slashed_a'), null, null, null), - '/slashed/group/b/' => array(array('_route' => 'slashed_b'), null, null, null), - '/slashed/group/c/' => array(array('_route' => 'slashed_c'), null, null, null), - ); - - if (!isset($routes[$pathinfo])) { - break; - } - list($ret, $requiredHost, $requiredMethods, $requiredSchemes) = $routes[$pathinfo]; - - $hasRequiredScheme = !$requiredSchemes || isset($requiredSchemes[$context->getScheme()]); - if ($requiredMethods && !isset($requiredMethods[$canonicalMethod]) && !isset($requiredMethods[$requestMethod])) { - if ($hasRequiredScheme) { - $allow += $requiredMethods; - } - break; - } - if (!$hasRequiredScheme) { - $allowSchemes += $requiredSchemes; - break; - } - - return $ret; - } - - $matchedPathinfo = $pathinfo; - $regexList = array( + $this->staticRoutes = array( + '/a/11' => array(array(array('_route' => 'a_first'), null, null, null, false, null)), + '/a/22' => array(array(array('_route' => 'a_second'), null, null, null, false, null)), + '/a/333' => array(array(array('_route' => 'a_third'), null, null, null, false, null)), + '/a/44' => array(array(array('_route' => 'a_fourth'), null, null, null, true, null)), + '/a/55' => array(array(array('_route' => 'a_fifth'), null, null, null, true, null)), + '/a/66' => array(array(array('_route' => 'a_sixth'), null, null, null, true, null)), + '/nested/group/a' => array(array(array('_route' => 'nested_a'), null, null, null, true, null)), + '/nested/group/b' => array(array(array('_route' => 'nested_b'), null, null, null, true, null)), + '/nested/group/c' => array(array(array('_route' => 'nested_c'), null, null, null, true, null)), + '/slashed/group' => array(array(array('_route' => 'slashed_a'), null, null, null, true, null)), + '/slashed/group/b' => array(array(array('_route' => 'slashed_b'), null, null, null, true, null)), + '/slashed/group/c' => array(array(array('_route' => 'slashed_c'), null, null, null, true, null)), + ); + $this->regexpList = array( 0 => '{^(?' .'|/([^/]++)(*:16)' .'|/nested/([^/]++)(*:39)' - .')$}sD', + .')(?:/?)$}sD', + ); + $this->dynamicRoutes = array( + 16 => array(array(array('_route' => 'a_wildcard'), array('param'), null, null, false, null)), + 39 => array(array(array('_route' => 'nested_wildcard'), array('param'), null, null, false, null)), ); - - foreach ($regexList as $offset => $regex) { - while (preg_match($regex, $matchedPathinfo, $matches)) { - switch ($m = (int) $matches['MARK']) { - default: - $routes = array( - 16 => array(array('_route' => 'a_wildcard'), array('param'), null, null), - 39 => array(array('_route' => 'nested_wildcard'), array('param'), null, null), - ); - - list($ret, $vars, $requiredMethods, $requiredSchemes) = $routes[$m]; - - foreach ($vars as $i => $v) { - if (isset($matches[1 + $i])) { - $ret[$v] = $matches[1 + $i]; - } - } - - $hasRequiredScheme = !$requiredSchemes || isset($requiredSchemes[$context->getScheme()]); - if ($requiredMethods && !isset($requiredMethods[$canonicalMethod]) && !isset($requiredMethods[$requestMethod])) { - if ($hasRequiredScheme) { - $allow += $requiredMethods; - } - break; - } - if (!$hasRequiredScheme) { - $allowSchemes += $requiredSchemes; - break; - } - - return $ret; - } - - if (39 === $m) { - break; - } - $regex = substr_replace($regex, 'F', $m - $offset, 1 + strlen($m)); - $offset += strlen($m); - } - } - if ('/' === $pathinfo && !$allow && !$allowSchemes) { - throw new Symfony\Component\Routing\Exception\NoConfigurationException(); - } - - return null; } } diff --git a/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher6.php b/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher6.php index 9cebf2d92..3f74b33f7 100644 --- a/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher6.php +++ b/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher6.php @@ -1,7 +1,6 @@ context = $context; - } - - public function match($rawPathinfo) - { - $allow = $allowSchemes = array(); - $pathinfo = rawurldecode($rawPathinfo); - $context = $this->context; - $requestMethod = $canonicalMethod = $context->getMethod(); - - if ('HEAD' === $requestMethod) { - $canonicalMethod = 'GET'; - } - - switch ($pathinfo) { - default: - $routes = array( - '/trailing/simple/no-methods/' => array(array('_route' => 'simple_trailing_slash_no_methods'), null, null, null), - '/trailing/simple/get-method/' => array(array('_route' => 'simple_trailing_slash_GET_method'), null, array('GET' => 0), null), - '/trailing/simple/head-method/' => array(array('_route' => 'simple_trailing_slash_HEAD_method'), null, array('HEAD' => 0), null), - '/trailing/simple/post-method/' => array(array('_route' => 'simple_trailing_slash_POST_method'), null, array('POST' => 0), null), - '/not-trailing/simple/no-methods' => array(array('_route' => 'simple_not_trailing_slash_no_methods'), null, null, null), - '/not-trailing/simple/get-method' => array(array('_route' => 'simple_not_trailing_slash_GET_method'), null, array('GET' => 0), null), - '/not-trailing/simple/head-method' => array(array('_route' => 'simple_not_trailing_slash_HEAD_method'), null, array('HEAD' => 0), null), - '/not-trailing/simple/post-method' => array(array('_route' => 'simple_not_trailing_slash_POST_method'), null, array('POST' => 0), null), - ); - - if (!isset($routes[$pathinfo])) { - break; - } - list($ret, $requiredHost, $requiredMethods, $requiredSchemes) = $routes[$pathinfo]; - - $hasRequiredScheme = !$requiredSchemes || isset($requiredSchemes[$context->getScheme()]); - if ($requiredMethods && !isset($requiredMethods[$canonicalMethod]) && !isset($requiredMethods[$requestMethod])) { - if ($hasRequiredScheme) { - $allow += $requiredMethods; - } - break; - } - if (!$hasRequiredScheme) { - $allowSchemes += $requiredSchemes; - break; - } - - return $ret; - } - - $matchedPathinfo = $pathinfo; - $regexList = array( + $this->staticRoutes = array( + '/trailing/simple/no-methods' => array(array(array('_route' => 'simple_trailing_slash_no_methods'), null, null, null, true, null)), + '/trailing/simple/get-method' => array(array(array('_route' => 'simple_trailing_slash_GET_method'), null, array('GET' => 0), null, true, null)), + '/trailing/simple/head-method' => array(array(array('_route' => 'simple_trailing_slash_HEAD_method'), null, array('HEAD' => 0), null, true, null)), + '/trailing/simple/post-method' => array(array(array('_route' => 'simple_trailing_slash_POST_method'), null, array('POST' => 0), null, true, null)), + '/not-trailing/simple/no-methods' => array(array(array('_route' => 'simple_not_trailing_slash_no_methods'), null, null, null, false, null)), + '/not-trailing/simple/get-method' => array(array(array('_route' => 'simple_not_trailing_slash_GET_method'), null, array('GET' => 0), null, false, null)), + '/not-trailing/simple/head-method' => array(array(array('_route' => 'simple_not_trailing_slash_HEAD_method'), null, array('HEAD' => 0), null, false, null)), + '/not-trailing/simple/post-method' => array(array(array('_route' => 'simple_not_trailing_slash_POST_method'), null, array('POST' => 0), null, false, null)), + ); + $this->regexpList = array( 0 => '{^(?' .'|/trailing/regex/(?' - .'|no\\-methods/([^/]++)/(*:47)' - .'|get\\-method/([^/]++)/(*:75)' - .'|head\\-method/([^/]++)/(*:104)' - .'|post\\-method/([^/]++)/(*:134)' + .'|no\\-methods/([^/]++)(*:46)' + .'|get\\-method/([^/]++)(*:73)' + .'|head\\-method/([^/]++)(*:101)' + .'|post\\-method/([^/]++)(*:130)' .')' .'|/not\\-trailing/regex/(?' - .'|no\\-methods/([^/]++)(*:187)' - .'|get\\-method/([^/]++)(*:215)' - .'|head\\-method/([^/]++)(*:244)' - .'|post\\-method/([^/]++)(*:273)' + .'|no\\-methods/([^/]++)(*:183)' + .'|get\\-method/([^/]++)(*:211)' + .'|head\\-method/([^/]++)(*:240)' + .'|post\\-method/([^/]++)(*:269)' .')' - .')$}sD', + .')(?:/?)$}sD', + ); + $this->dynamicRoutes = array( + 46 => array(array(array('_route' => 'regex_trailing_slash_no_methods'), array('param'), null, null, true, null)), + 73 => array(array(array('_route' => 'regex_trailing_slash_GET_method'), array('param'), array('GET' => 0), null, true, null)), + 101 => array(array(array('_route' => 'regex_trailing_slash_HEAD_method'), array('param'), array('HEAD' => 0), null, true, null)), + 130 => array(array(array('_route' => 'regex_trailing_slash_POST_method'), array('param'), array('POST' => 0), null, true, null)), + 183 => array(array(array('_route' => 'regex_not_trailing_slash_no_methods'), array('param'), null, null, false, null)), + 211 => array(array(array('_route' => 'regex_not_trailing_slash_GET_method'), array('param'), array('GET' => 0), null, false, null)), + 240 => array(array(array('_route' => 'regex_not_trailing_slash_HEAD_method'), array('param'), array('HEAD' => 0), null, false, null)), + 269 => array(array(array('_route' => 'regex_not_trailing_slash_POST_method'), array('param'), array('POST' => 0), null, false, null)), ); - - foreach ($regexList as $offset => $regex) { - while (preg_match($regex, $matchedPathinfo, $matches)) { - switch ($m = (int) $matches['MARK']) { - default: - $routes = array( - 47 => array(array('_route' => 'regex_trailing_slash_no_methods'), array('param'), null, null), - 75 => array(array('_route' => 'regex_trailing_slash_GET_method'), array('param'), array('GET' => 0), null), - 104 => array(array('_route' => 'regex_trailing_slash_HEAD_method'), array('param'), array('HEAD' => 0), null), - 134 => array(array('_route' => 'regex_trailing_slash_POST_method'), array('param'), array('POST' => 0), null), - 187 => array(array('_route' => 'regex_not_trailing_slash_no_methods'), array('param'), null, null), - 215 => array(array('_route' => 'regex_not_trailing_slash_GET_method'), array('param'), array('GET' => 0), null), - 244 => array(array('_route' => 'regex_not_trailing_slash_HEAD_method'), array('param'), array('HEAD' => 0), null), - 273 => array(array('_route' => 'regex_not_trailing_slash_POST_method'), array('param'), array('POST' => 0), null), - ); - - list($ret, $vars, $requiredMethods, $requiredSchemes) = $routes[$m]; - - foreach ($vars as $i => $v) { - if (isset($matches[1 + $i])) { - $ret[$v] = $matches[1 + $i]; - } - } - - $hasRequiredScheme = !$requiredSchemes || isset($requiredSchemes[$context->getScheme()]); - if ($requiredMethods && !isset($requiredMethods[$canonicalMethod]) && !isset($requiredMethods[$requestMethod])) { - if ($hasRequiredScheme) { - $allow += $requiredMethods; - } - break; - } - if (!$hasRequiredScheme) { - $allowSchemes += $requiredSchemes; - break; - } - - return $ret; - } - - if (273 === $m) { - break; - } - $regex = substr_replace($regex, 'F', $m - $offset, 1 + strlen($m)); - $offset += strlen($m); - } - } - if ('/' === $pathinfo && !$allow && !$allowSchemes) { - throw new Symfony\Component\Routing\Exception\NoConfigurationException(); - } - - throw $allow ? new MethodNotAllowedException(array_keys($allow)) : new ResourceNotFoundException(); } } diff --git a/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher7.php b/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher7.php index b2b707213..468db6f14 100644 --- a/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher7.php +++ b/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher7.php @@ -1,7 +1,6 @@ context = $context; - } - - public function match($pathinfo) - { - $allow = $allowSchemes = array(); - if ($ret = $this->doMatch($pathinfo, $allow, $allowSchemes)) { - return $ret; - } - if ($allow) { - throw new MethodNotAllowedException(array_keys($allow)); - } - if (!in_array($this->context->getMethod(), array('HEAD', 'GET'), true)) { - // no-op - } elseif ($allowSchemes) { - redirect_scheme: - $scheme = $this->context->getScheme(); - $this->context->setScheme(key($allowSchemes)); - try { - if ($ret = $this->doMatch($pathinfo)) { - return $this->redirect($pathinfo, $ret['_route'], $this->context->getScheme()) + $ret; - } - } finally { - $this->context->setScheme($scheme); - } - } elseif ('/' !== $pathinfo) { - $pathinfo = '/' !== $pathinfo[-1] ? $pathinfo.'/' : substr($pathinfo, 0, -1); - if ($ret = $this->doMatch($pathinfo, $allow, $allowSchemes)) { - return $this->redirect($pathinfo, $ret['_route']) + $ret; - } - if ($allowSchemes) { - goto redirect_scheme; - } - } - - throw new ResourceNotFoundException(); - } - - private function doMatch(string $rawPathinfo, array &$allow = array(), array &$allowSchemes = array()): ?array - { - $allow = $allowSchemes = array(); - $pathinfo = rawurldecode($rawPathinfo); - $context = $this->context; - $requestMethod = $canonicalMethod = $context->getMethod(); - - if ('HEAD' === $requestMethod) { - $canonicalMethod = 'GET'; - } - - switch ($pathinfo) { - default: - $routes = array( - '/trailing/simple/no-methods/' => array(array('_route' => 'simple_trailing_slash_no_methods'), null, null, null), - '/trailing/simple/get-method/' => array(array('_route' => 'simple_trailing_slash_GET_method'), null, array('GET' => 0), null), - '/trailing/simple/head-method/' => array(array('_route' => 'simple_trailing_slash_HEAD_method'), null, array('HEAD' => 0), null), - '/trailing/simple/post-method/' => array(array('_route' => 'simple_trailing_slash_POST_method'), null, array('POST' => 0), null), - '/not-trailing/simple/no-methods' => array(array('_route' => 'simple_not_trailing_slash_no_methods'), null, null, null), - '/not-trailing/simple/get-method' => array(array('_route' => 'simple_not_trailing_slash_GET_method'), null, array('GET' => 0), null), - '/not-trailing/simple/head-method' => array(array('_route' => 'simple_not_trailing_slash_HEAD_method'), null, array('HEAD' => 0), null), - '/not-trailing/simple/post-method' => array(array('_route' => 'simple_not_trailing_slash_POST_method'), null, array('POST' => 0), null), - ); - - if (!isset($routes[$pathinfo])) { - break; - } - list($ret, $requiredHost, $requiredMethods, $requiredSchemes) = $routes[$pathinfo]; - - $hasRequiredScheme = !$requiredSchemes || isset($requiredSchemes[$context->getScheme()]); - if ($requiredMethods && !isset($requiredMethods[$canonicalMethod]) && !isset($requiredMethods[$requestMethod])) { - if ($hasRequiredScheme) { - $allow += $requiredMethods; - } - break; - } - if (!$hasRequiredScheme) { - $allowSchemes += $requiredSchemes; - break; - } - - return $ret; - } - - $matchedPathinfo = $pathinfo; - $regexList = array( + $this->staticRoutes = array( + '/trailing/simple/no-methods' => array(array(array('_route' => 'simple_trailing_slash_no_methods'), null, null, null, true, null)), + '/trailing/simple/get-method' => array(array(array('_route' => 'simple_trailing_slash_GET_method'), null, array('GET' => 0), null, true, null)), + '/trailing/simple/head-method' => array(array(array('_route' => 'simple_trailing_slash_HEAD_method'), null, array('HEAD' => 0), null, true, null)), + '/trailing/simple/post-method' => array(array(array('_route' => 'simple_trailing_slash_POST_method'), null, array('POST' => 0), null, true, null)), + '/not-trailing/simple/no-methods' => array(array(array('_route' => 'simple_not_trailing_slash_no_methods'), null, null, null, false, null)), + '/not-trailing/simple/get-method' => array(array(array('_route' => 'simple_not_trailing_slash_GET_method'), null, array('GET' => 0), null, false, null)), + '/not-trailing/simple/head-method' => array(array(array('_route' => 'simple_not_trailing_slash_HEAD_method'), null, array('HEAD' => 0), null, false, null)), + '/not-trailing/simple/post-method' => array(array(array('_route' => 'simple_not_trailing_slash_POST_method'), null, array('POST' => 0), null, false, null)), + ); + $this->regexpList = array( 0 => '{^(?' .'|/trailing/regex/(?' - .'|no\\-methods/([^/]++)/(*:47)' - .'|get\\-method/([^/]++)/(*:75)' - .'|head\\-method/([^/]++)/(*:104)' - .'|post\\-method/([^/]++)/(*:134)' + .'|no\\-methods/([^/]++)(*:46)' + .'|get\\-method/([^/]++)(*:73)' + .'|head\\-method/([^/]++)(*:101)' + .'|post\\-method/([^/]++)(*:130)' .')' .'|/not\\-trailing/regex/(?' - .'|no\\-methods/([^/]++)(*:187)' - .'|get\\-method/([^/]++)(*:215)' - .'|head\\-method/([^/]++)(*:244)' - .'|post\\-method/([^/]++)(*:273)' + .'|no\\-methods/([^/]++)(*:183)' + .'|get\\-method/([^/]++)(*:211)' + .'|head\\-method/([^/]++)(*:240)' + .'|post\\-method/([^/]++)(*:269)' .')' - .')$}sD', + .')(?:/?)$}sD', + ); + $this->dynamicRoutes = array( + 46 => array(array(array('_route' => 'regex_trailing_slash_no_methods'), array('param'), null, null, true, null)), + 73 => array(array(array('_route' => 'regex_trailing_slash_GET_method'), array('param'), array('GET' => 0), null, true, null)), + 101 => array(array(array('_route' => 'regex_trailing_slash_HEAD_method'), array('param'), array('HEAD' => 0), null, true, null)), + 130 => array(array(array('_route' => 'regex_trailing_slash_POST_method'), array('param'), array('POST' => 0), null, true, null)), + 183 => array(array(array('_route' => 'regex_not_trailing_slash_no_methods'), array('param'), null, null, false, null)), + 211 => array(array(array('_route' => 'regex_not_trailing_slash_GET_method'), array('param'), array('GET' => 0), null, false, null)), + 240 => array(array(array('_route' => 'regex_not_trailing_slash_HEAD_method'), array('param'), array('HEAD' => 0), null, false, null)), + 269 => array(array(array('_route' => 'regex_not_trailing_slash_POST_method'), array('param'), array('POST' => 0), null, false, null)), ); - - foreach ($regexList as $offset => $regex) { - while (preg_match($regex, $matchedPathinfo, $matches)) { - switch ($m = (int) $matches['MARK']) { - default: - $routes = array( - 47 => array(array('_route' => 'regex_trailing_slash_no_methods'), array('param'), null, null), - 75 => array(array('_route' => 'regex_trailing_slash_GET_method'), array('param'), array('GET' => 0), null), - 104 => array(array('_route' => 'regex_trailing_slash_HEAD_method'), array('param'), array('HEAD' => 0), null), - 134 => array(array('_route' => 'regex_trailing_slash_POST_method'), array('param'), array('POST' => 0), null), - 187 => array(array('_route' => 'regex_not_trailing_slash_no_methods'), array('param'), null, null), - 215 => array(array('_route' => 'regex_not_trailing_slash_GET_method'), array('param'), array('GET' => 0), null), - 244 => array(array('_route' => 'regex_not_trailing_slash_HEAD_method'), array('param'), array('HEAD' => 0), null), - 273 => array(array('_route' => 'regex_not_trailing_slash_POST_method'), array('param'), array('POST' => 0), null), - ); - - list($ret, $vars, $requiredMethods, $requiredSchemes) = $routes[$m]; - - foreach ($vars as $i => $v) { - if (isset($matches[1 + $i])) { - $ret[$v] = $matches[1 + $i]; - } - } - - $hasRequiredScheme = !$requiredSchemes || isset($requiredSchemes[$context->getScheme()]); - if ($requiredMethods && !isset($requiredMethods[$canonicalMethod]) && !isset($requiredMethods[$requestMethod])) { - if ($hasRequiredScheme) { - $allow += $requiredMethods; - } - break; - } - if (!$hasRequiredScheme) { - $allowSchemes += $requiredSchemes; - break; - } - - return $ret; - } - - if (273 === $m) { - break; - } - $regex = substr_replace($regex, 'F', $m - $offset, 1 + strlen($m)); - $offset += strlen($m); - } - } - if ('/' === $pathinfo && !$allow && !$allowSchemes) { - throw new Symfony\Component\Routing\Exception\NoConfigurationException(); - } - - return null; } } diff --git a/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher8.php b/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher8.php index 38bbfa224..9068923af 100644 --- a/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher8.php +++ b/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher8.php @@ -1,7 +1,6 @@ context = $context; - } - - public function match($rawPathinfo) - { - $allow = $allowSchemes = array(); - $pathinfo = rawurldecode($rawPathinfo); - $context = $this->context; - $requestMethod = $canonicalMethod = $context->getMethod(); - - if ('HEAD' === $requestMethod) { - $canonicalMethod = 'GET'; - } - - $matchedPathinfo = $pathinfo; - $regexList = array( + $this->regexpList = array( 0 => '{^(?' .'|/(a)(*:11)' - .')$}sD', + .')(?:/?)$}sD', 11 => '{^(?' .'|/(.)(*:22)' - .')$}sDu', + .')(?:/?)$}sDu', 22 => '{^(?' .'|/(.)(*:33)' - .')$}sD', + .')(?:/?)$}sD', + ); + $this->dynamicRoutes = array( + 11 => array(array(array('_route' => 'a'), array('a'), null, null, false, null)), + 22 => array(array(array('_route' => 'b'), array('a'), null, null, false, null)), + 33 => array(array(array('_route' => 'c'), array('a'), null, null, false, null)), ); - - foreach ($regexList as $offset => $regex) { - while (preg_match($regex, $matchedPathinfo, $matches)) { - switch ($m = (int) $matches['MARK']) { - default: - $routes = array( - 11 => array(array('_route' => 'a'), array('a'), null, null), - 22 => array(array('_route' => 'b'), array('a'), null, null), - 33 => array(array('_route' => 'c'), array('a'), null, null), - ); - - list($ret, $vars, $requiredMethods, $requiredSchemes) = $routes[$m]; - - foreach ($vars as $i => $v) { - if (isset($matches[1 + $i])) { - $ret[$v] = $matches[1 + $i]; - } - } - - $hasRequiredScheme = !$requiredSchemes || isset($requiredSchemes[$context->getScheme()]); - if ($requiredMethods && !isset($requiredMethods[$canonicalMethod]) && !isset($requiredMethods[$requestMethod])) { - if ($hasRequiredScheme) { - $allow += $requiredMethods; - } - break; - } - if (!$hasRequiredScheme) { - $allowSchemes += $requiredSchemes; - break; - } - - return $ret; - } - - if (33 === $m) { - break; - } - $regex = substr_replace($regex, 'F', $m - $offset, 1 + strlen($m)); - $offset += strlen($m); - } - } - if ('/' === $pathinfo && !$allow && !$allowSchemes) { - throw new Symfony\Component\Routing\Exception\NoConfigurationException(); - } - - throw $allow ? new MethodNotAllowedException(array_keys($allow)) : new ResourceNotFoundException(); } } diff --git a/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher9.php b/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher9.php index cfcd1d440..8684b5953 100644 --- a/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher9.php +++ b/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher9.php @@ -1,7 +1,6 @@ context = $context; - } - - public function match($rawPathinfo) - { - $allow = $allowSchemes = array(); - $pathinfo = rawurldecode($rawPathinfo); - $context = $this->context; - $requestMethod = $canonicalMethod = $context->getMethod(); - $host = strtolower($context->getHost()); - - if ('HEAD' === $requestMethod) { - $canonicalMethod = 'GET'; - } - - switch ($pathinfo) { - case '/': - // a - if (preg_match('#^(?P[^\\.]++)\\.e\\.c\\.b\\.a$#sDi', $host, $hostMatches)) { - return $this->mergeDefaults(array('_route' => 'a') + $hostMatches, array()); - } - // c - if (preg_match('#^(?P[^\\.]++)\\.e\\.c\\.b\\.a$#sDi', $host, $hostMatches)) { - return $this->mergeDefaults(array('_route' => 'c') + $hostMatches, array()); - } - // b - if ('d.c.b.a' === $host) { - return array('_route' => 'b'); - } - break; - } - - if ('/' === $pathinfo && !$allow && !$allowSchemes) { - throw new Symfony\Component\Routing\Exception\NoConfigurationException(); - } - - throw $allow ? new MethodNotAllowedException(array_keys($allow)) : new ResourceNotFoundException(); + $this->matchHost = true; + $this->staticRoutes = array( + '/' => array( + array(array('_route' => 'a'), '#^(?P[^\\.]++)\\.e\\.c\\.b\\.a$#sDi', null, null, false, null), + array(array('_route' => 'c'), '#^(?P[^\\.]++)\\.e\\.c\\.b\\.a$#sDi', null, null, false, null), + array(array('_route' => 'b'), 'd.c.b.a', null, null, false, null), + ), + ); } } diff --git a/vendor/symfony/routing/Tests/Fixtures/requirements_without_placeholder_name.yml b/vendor/symfony/routing/Tests/Fixtures/requirements_without_placeholder_name.yml new file mode 100644 index 000000000..be8f04dd6 --- /dev/null +++ b/vendor/symfony/routing/Tests/Fixtures/requirements_without_placeholder_name.yml @@ -0,0 +1,4 @@ +foo: + path: '/{foo}' + requirements: + - '\d+' diff --git a/vendor/symfony/routing/Tests/Generator/Dumper/PhpGeneratorDumperTest.php b/vendor/symfony/routing/Tests/Generator/Dumper/PhpGeneratorDumperTest.php index dcfb2304c..45464c3a9 100644 --- a/vendor/symfony/routing/Tests/Generator/Dumper/PhpGeneratorDumperTest.php +++ b/vendor/symfony/routing/Tests/Generator/Dumper/PhpGeneratorDumperTest.php @@ -84,19 +84,20 @@ class PhpGeneratorDumperTest extends TestCase $this->assertEquals('/app.php/testing2', $relativeUrlWithoutParameter); } - public function testDumpWithLocalizedRoutes() + public function testDumpWithSimpleLocalizedRoutes() { + $this->routeCollection->add('test', (new Route('/foo'))); $this->routeCollection->add('test.en', (new Route('/testing/is/fun'))->setDefault('_locale', 'en')->setDefault('_canonical_route', 'test')); $this->routeCollection->add('test.nl', (new Route('/testen/is/leuk'))->setDefault('_locale', 'nl')->setDefault('_canonical_route', 'test')); $code = $this->generatorDumper->dump(array( - 'class' => 'LocalizedProjectUrlGenerator', + 'class' => 'SimpleLocalizedProjectUrlGenerator', )); file_put_contents($this->testTmpFilepath, $code); include $this->testTmpFilepath; $context = new RequestContext('/app.php'); - $projectUrlGenerator = new \LocalizedProjectUrlGenerator($context, null, 'en'); + $projectUrlGenerator = new \SimpleLocalizedProjectUrlGenerator($context, null, 'en'); $urlWithDefaultLocale = $projectUrlGenerator->generate('test'); $urlWithSpecifiedLocale = $projectUrlGenerator->generate('test', array('_locale' => 'nl')); @@ -109,6 +110,57 @@ class PhpGeneratorDumperTest extends TestCase $this->assertEquals('/app.php/testen/is/leuk', $urlWithSpecifiedLocale); $this->assertEquals('/app.php/testing/is/fun', $urlWithEnglishContext); $this->assertEquals('/app.php/testen/is/leuk', $urlWithDutchContext); + + // test with full route name + $this->assertEquals('/app.php/testing/is/fun', $projectUrlGenerator->generate('test.en')); + + $context->setParameter('_locale', 'de_DE'); + // test that it fall backs to another route when there is no matching localized route + $this->assertEquals('/app.php/foo', $projectUrlGenerator->generate('test')); + } + + /** + * @expectedException \Symfony\Component\Routing\Exception\RouteNotFoundException + * @expectedExceptionMessage Unable to generate a URL for the named route "test" as such route does not exist. + */ + public function testDumpWithRouteNotFoundLocalizedRoutes() + { + $this->routeCollection->add('test.en', (new Route('/testing/is/fun'))->setDefault('_locale', 'en')->setDefault('_canonical_route', 'test')); + + $code = $this->generatorDumper->dump(array( + 'class' => 'RouteNotFoundLocalizedProjectUrlGenerator', + )); + file_put_contents($this->testTmpFilepath, $code); + include $this->testTmpFilepath; + + $projectUrlGenerator = new \RouteNotFoundLocalizedProjectUrlGenerator(new RequestContext('/app.php'), null, 'pl_PL'); + $projectUrlGenerator->generate('test'); + } + + public function testDumpWithFallbackLocaleLocalizedRoutes() + { + $this->routeCollection->add('test.en', (new Route('/testing/is/fun'))->setDefault('_canonical_route', 'test')); + $this->routeCollection->add('test.nl', (new Route('/testen/is/leuk'))->setDefault('_canonical_route', 'test')); + $this->routeCollection->add('test.fr', (new Route('/tester/est/amusant'))->setDefault('_canonical_route', 'test')); + + $code = $this->generatorDumper->dump(array( + 'class' => 'FallbackLocaleLocalizedProjectUrlGenerator', + )); + file_put_contents($this->testTmpFilepath, $code); + include $this->testTmpFilepath; + + $context = new RequestContext('/app.php'); + $context->setParameter('_locale', 'en_GB'); + $projectUrlGenerator = new \FallbackLocaleLocalizedProjectUrlGenerator($context, null, null); + + // test with context _locale + $this->assertEquals('/app.php/testing/is/fun', $projectUrlGenerator->generate('test')); + // test with parameters _locale + $this->assertEquals('/app.php/testen/is/leuk', $projectUrlGenerator->generate('test', array('_locale' => 'nl_BE'))); + + $projectUrlGenerator = new \FallbackLocaleLocalizedProjectUrlGenerator(new RequestContext('/app.php'), null, 'fr_CA'); + // test with default locale + $this->assertEquals('/app.php/tester/est/amusant', $projectUrlGenerator->generate('test')); } public function testDumpWithTooManyRoutes() diff --git a/vendor/symfony/routing/Tests/Loader/AnnotationClassLoaderTest.php b/vendor/symfony/routing/Tests/Loader/AnnotationClassLoaderTest.php index dd9af9db2..cacce677f 100644 --- a/vendor/symfony/routing/Tests/Loader/AnnotationClassLoaderTest.php +++ b/vendor/symfony/routing/Tests/Loader/AnnotationClassLoaderTest.php @@ -33,6 +33,7 @@ use Symfony\Component\Routing\Tests\Fixtures\AnnotationFixtures\MissingRouteName use Symfony\Component\Routing\Tests\Fixtures\AnnotationFixtures\NothingButNameController; use Symfony\Component\Routing\Tests\Fixtures\AnnotationFixtures\PrefixedActionLocalizedRouteController; use Symfony\Component\Routing\Tests\Fixtures\AnnotationFixtures\PrefixedActionPathController; +use Symfony\Component\Routing\Tests\Fixtures\AnnotationFixtures\RequirementsWithoutPlaceholderNameController; use Symfony\Component\Routing\Tests\Fixtures\AnnotationFixtures\RouteWithPrefixController; class AnnotationClassLoaderTest extends AbstractAnnotationLoaderTest @@ -87,11 +88,25 @@ class AnnotationClassLoaderTest extends AbstractAnnotationLoaderTest $this->assertEquals('/path', $routes->get('action')->getPath()); } + /** + * @group legacy + * @expectedDeprecation A placeholder name must be a string (0 given). Did you forget to specify the placeholder key for the requirement "foo" in "Symfony\Component\Routing\Tests\Fixtures\AnnotationFixtures\RequirementsWithoutPlaceholderNameController"? + * @expectedDeprecation A placeholder name must be a string (1 given). Did you forget to specify the placeholder key for the requirement "\d+" in "Symfony\Component\Routing\Tests\Fixtures\AnnotationFixtures\RequirementsWithoutPlaceholderNameController"? + * @expectedDeprecation A placeholder name must be a string (0 given). Did you forget to specify the placeholder key for the requirement "foo" of route "foo" in "Symfony\Component\Routing\Tests\Fixtures\AnnotationFixtures\RequirementsWithoutPlaceholderNameController::foo()"? + * @expectedDeprecation A placeholder name must be a string (1 given). Did you forget to specify the placeholder key for the requirement "\d+" of route "foo" in "Symfony\Component\Routing\Tests\Fixtures\AnnotationFixtures\RequirementsWithoutPlaceholderNameController::foo()"? + */ + public function testRequirementsWithoutPlaceholderName() + { + $this->loader->load(RequirementsWithoutPlaceholderNameController::class); + } + public function testInvokableControllerLoader() { $routes = $this->loader->load(InvokableController::class); $this->assertCount(1, $routes); $this->assertEquals('/here', $routes->get('lol')->getPath()); + $this->assertEquals(array('GET', 'POST'), $routes->get('lol')->getMethods()); + $this->assertEquals(array('https'), $routes->get('lol')->getSchemes()); } public function testInvokableLocalizedControllerLoading() @@ -134,7 +149,7 @@ class AnnotationClassLoaderTest extends AbstractAnnotationLoaderTest $this->assertEquals('/the/path', $routes->get('post')->getPath()); } - public function testLocalizedMethodActionControllers() + public function testInvokableClassRouteLoadWithMethodAnnotation() { $routes = $this->loader->load(LocalizedMethodActionControllers::class); $this->assertCount(4, $routes); diff --git a/vendor/symfony/routing/Tests/Loader/YamlFileLoaderTest.php b/vendor/symfony/routing/Tests/Loader/YamlFileLoaderTest.php index 41f87bb58..26a72e333 100644 --- a/vendor/symfony/routing/Tests/Loader/YamlFileLoaderTest.php +++ b/vendor/symfony/routing/Tests/Loader/YamlFileLoaderTest.php @@ -304,4 +304,14 @@ class YamlFileLoaderTest extends TestCase $this->assertEquals('/slash/', $routeCollection->get('a_app_homepage')->getPath()); $this->assertEquals('/no-slash', $routeCollection->get('b_app_homepage')->getPath()); } + + /** + * @group legacy + * @expectedDeprecation A placeholder name must be a string (0 given). Did you forget to specify the placeholder key for the requirement "\d+" of route "foo" in "%srequirements_without_placeholder_name.yml"? + */ + public function testRequirementsWithoutPlaceholderName() + { + $loader = new YamlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures'))); + $loader->load('requirements_without_placeholder_name.yml'); + } } diff --git a/vendor/symfony/routing/Tests/Matcher/Dumper/PhpMatcherDumperTest.php b/vendor/symfony/routing/Tests/Matcher/Dumper/PhpMatcherDumperTest.php index 166129ccc..a5cb04351 100644 --- a/vendor/symfony/routing/Tests/Matcher/Dumper/PhpMatcherDumperTest.php +++ b/vendor/symfony/routing/Tests/Matcher/Dumper/PhpMatcherDumperTest.php @@ -472,9 +472,6 @@ class PhpMatcherDumperTest extends TestCase ); } - /** - * @param $dumper - */ private function generateDumpedMatcher(RouteCollection $collection, $redirectableStub = false) { $options = array('class' => $this->matcherClass); diff --git a/vendor/symfony/routing/Tests/Matcher/RedirectableUrlMatcherTest.php b/vendor/symfony/routing/Tests/Matcher/RedirectableUrlMatcherTest.php index e36796224..f1d6b5325 100644 --- a/vendor/symfony/routing/Tests/Matcher/RedirectableUrlMatcherTest.php +++ b/vendor/symfony/routing/Tests/Matcher/RedirectableUrlMatcherTest.php @@ -141,6 +141,25 @@ class RedirectableUrlMatcherTest extends UrlMatcherTest $this->assertSame(array('_route' => 'foo'), $matcher->match('/foo')); } + public function testFallbackPage() + { + $coll = new RouteCollection(); + $coll->add('foo', new Route('/foo/')); + $coll->add('bar', new Route('/{name}')); + + $matcher = $this->getUrlMatcher($coll); + $matcher->expects($this->once())->method('redirect')->with('/foo/', 'foo')->will($this->returnValue(array('_route' => 'foo'))); + $this->assertSame(array('_route' => 'foo'), $matcher->match('/foo')); + + $coll = new RouteCollection(); + $coll->add('foo', new Route('/foo')); + $coll->add('bar', new Route('/{name}/')); + + $matcher = $this->getUrlMatcher($coll); + $matcher->expects($this->once())->method('redirect')->with('/foo', 'foo')->will($this->returnValue(array('_route' => 'foo'))); + $this->assertSame(array('_route' => 'foo'), $matcher->match('/foo/')); + } + public function testMissingTrailingSlashAndScheme() { $coll = new RouteCollection(); @@ -151,6 +170,23 @@ class RedirectableUrlMatcherTest extends UrlMatcherTest $matcher->match('/foo'); } + public function testSlashAndVerbPrecedenceWithRedirection() + { + $coll = new RouteCollection(); + $coll->add('a', new Route('/api/customers/{customerId}/contactpersons', array(), array(), array(), '', array(), array('post'))); + $coll->add('b', new Route('/api/customers/{customerId}/contactpersons/', array(), array(), array(), '', array(), array('get'))); + + $matcher = $this->getUrlMatcher($coll); + $expected = array( + '_route' => 'b', + 'customerId' => '123', + ); + $this->assertEquals($expected, $matcher->match('/api/customers/123/contactpersons/')); + + $matcher->expects($this->once())->method('redirect')->with('/api/customers/123/contactpersons/')->willReturn(array()); + $this->assertEquals($expected, $matcher->match('/api/customers/123/contactpersons')); + } + protected function getUrlMatcher(RouteCollection $routes, RequestContext $context = null) { return $this->getMockForAbstractClass('Symfony\Component\Routing\Matcher\RedirectableUrlMatcher', array($routes, $context ?: new RequestContext())); diff --git a/vendor/symfony/routing/Tests/Matcher/UrlMatcherTest.php b/vendor/symfony/routing/Tests/Matcher/UrlMatcherTest.php index c1add9627..bcaf3dee7 100644 --- a/vendor/symfony/routing/Tests/Matcher/UrlMatcherTest.php +++ b/vendor/symfony/routing/Tests/Matcher/UrlMatcherTest.php @@ -455,6 +455,9 @@ class UrlMatcherTest extends TestCase { $coll = new RouteCollection(); $route = new Route('/foo/{bar}'); + $route->setCondition('request.getBaseUrl() == "/bar"'); + $coll->add('bar', $route); + $route = new Route('/foo/{bar}'); $route->setCondition('request.getBaseUrl() == "/sub/front.php" and request.getPathInfo() == "/foo/bar"'); $coll->add('foo', $route); $matcher = $this->getUrlMatcher($coll, new RequestContext('/sub/front.php')); @@ -680,6 +683,59 @@ class UrlMatcherTest extends TestCase $this->assertEquals('b', $matcher->match('/bar/abc.123')['_route']); } + public function testSlashVariant() + { + $coll = new RouteCollection(); + $coll->add('a', new Route('/foo/{bar}', array(), array('bar' => '.*'))); + + $matcher = $this->getUrlMatcher($coll); + $this->assertEquals('a', $matcher->match('/foo/')['_route']); + } + + public function testSlashVariant2() + { + $coll = new RouteCollection(); + $coll->add('a', new Route('/foo/{bar}/', array(), array('bar' => '.*'))); + + $matcher = $this->getUrlMatcher($coll); + $this->assertEquals(array('_route' => 'a', 'bar' => 'bar'), $matcher->match('/foo/bar/')); + } + + public function testSlashWithVerb() + { + $coll = new RouteCollection(); + $coll->add('a', new Route('/{foo}', array(), array(), array(), '', array(), array('put', 'delete'))); + $coll->add('b', new Route('/bar/')); + + $matcher = $this->getUrlMatcher($coll); + $this->assertSame(array('_route' => 'b'), $matcher->match('/bar/')); + } + + public function testSlashAndVerbPrecedence() + { + $coll = new RouteCollection(); + $coll->add('a', new Route('/api/customers/{customerId}/contactpersons/', array(), array(), array(), '', array(), array('post'))); + $coll->add('b', new Route('/api/customers/{customerId}/contactpersons', array(), array(), array(), '', array(), array('get'))); + + $matcher = $this->getUrlMatcher($coll); + $expected = array( + '_route' => 'b', + 'customerId' => '123', + ); + $this->assertEquals($expected, $matcher->match('/api/customers/123/contactpersons')); + + $coll = new RouteCollection(); + $coll->add('a', new Route('/api/customers/{customerId}/contactpersons/', array(), array(), array(), '', array(), array('get'))); + $coll->add('b', new Route('/api/customers/{customerId}/contactpersons', array(), array(), array(), '', array(), array('post'))); + + $matcher = $this->getUrlMatcher($coll, new RequestContext('', 'POST')); + $expected = array( + '_route' => 'b', + 'customerId' => '123', + ); + $this->assertEquals($expected, $matcher->match('/api/customers/123/contactpersons')); + } + protected function getUrlMatcher(RouteCollection $routes, RequestContext $context = null) { return new UrlMatcher($routes, $context ?: new RequestContext()); diff --git a/vendor/symfony/routing/composer.json b/vendor/symfony/routing/composer.json index 052b0e113..be489ee98 100644 --- a/vendor/symfony/routing/composer.json +++ b/vendor/symfony/routing/composer.json @@ -19,7 +19,7 @@ "php": "^7.1.3" }, "require-dev": { - "symfony/config": "~3.4|~4.0", + "symfony/config": "~4.2", "symfony/http-foundation": "~3.4|~4.0", "symfony/yaml": "~3.4|~4.0", "symfony/expression-language": "~3.4|~4.0", @@ -28,7 +28,7 @@ "psr/log": "~1.0" }, "conflict": { - "symfony/config": "<3.4", + "symfony/config": "<4.2", "symfony/dependency-injection": "<3.4", "symfony/yaml": "<3.4" }, @@ -49,7 +49,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-master": "4.1-dev" + "dev-master": "4.2-dev" } } } diff --git a/vendor/symfony/routing/phpunit.xml.dist b/vendor/symfony/routing/phpunit.xml.dist index bcc095952..df742eab0 100644 --- a/vendor/symfony/routing/phpunit.xml.dist +++ b/vendor/symfony/routing/phpunit.xml.dist @@ -1,7 +1,7 @@ array(), 'obsolete' => array(), ); + $intlDomain = $domain.MessageCatalogueInterface::INTL_DOMAIN_SUFFIX; foreach ($this->source->all($domain) as $id => $message) { $this->messages[$domain]['all'][$id] = $message; - $this->result->add(array($id => $message), $domain); + $this->result->add(array($id => $message), $this->source->defines($id, $intlDomain) ? $intlDomain : $domain); if (null !== $keyMetadata = $this->source->getMetadata($id, $domain)) { $this->result->setMetadata($id, $keyMetadata, $domain); } @@ -45,7 +48,7 @@ class MergeOperation extends AbstractOperation if (!$this->source->has($id, $domain)) { $this->messages[$domain]['all'][$id] = $message; $this->messages[$domain]['new'][$id] = $message; - $this->result->add(array($id => $message), $domain); + $this->result->add(array($id => $message), $this->target->defines($id, $intlDomain) ? $intlDomain : $domain); if (null !== $keyMetadata = $this->target->getMetadata($id, $domain)) { $this->result->setMetadata($id, $keyMetadata, $domain); } diff --git a/vendor/symfony/translation/Catalogue/TargetOperation.php b/vendor/symfony/translation/Catalogue/TargetOperation.php index f3b0a29df..6264525c9 100644 --- a/vendor/symfony/translation/Catalogue/TargetOperation.php +++ b/vendor/symfony/translation/Catalogue/TargetOperation.php @@ -11,6 +11,8 @@ namespace Symfony\Component\Translation\Catalogue; +use Symfony\Component\Translation\MessageCatalogueInterface; + /** * Target operation between two catalogues: * intersection = source ∩ target = {x: x ∈ source ∧ x ∈ target} @@ -33,6 +35,7 @@ class TargetOperation extends AbstractOperation 'new' => array(), 'obsolete' => array(), ); + $intlDomain = $domain.MessageCatalogueInterface::INTL_DOMAIN_SUFFIX; // For 'all' messages, the code can't be simplified as ``$this->messages[$domain]['all'] = $target->all($domain);``, // because doing so will drop messages like {x: x ∈ source ∧ x ∉ target.all ∧ x ∈ target.fallback} @@ -46,7 +49,7 @@ class TargetOperation extends AbstractOperation foreach ($this->source->all($domain) as $id => $message) { if ($this->target->has($id, $domain)) { $this->messages[$domain]['all'][$id] = $message; - $this->result->add(array($id => $message), $domain); + $this->result->add(array($id => $message), $this->target->defines($id, $intlDomain) ? $intlDomain : $domain); if (null !== $keyMetadata = $this->source->getMetadata($id, $domain)) { $this->result->setMetadata($id, $keyMetadata, $domain); } @@ -59,7 +62,7 @@ class TargetOperation extends AbstractOperation if (!$this->source->has($id, $domain)) { $this->messages[$domain]['all'][$id] = $message; $this->messages[$domain]['new'][$id] = $message; - $this->result->add(array($id => $message), $domain); + $this->result->add(array($id => $message), $this->target->defines($id, $intlDomain) ? $intlDomain : $domain); if (null !== $keyMetadata = $this->target->getMetadata($id, $domain)) { $this->result->setMetadata($id, $keyMetadata, $domain); } diff --git a/vendor/symfony/translation/Command/XliffLintCommand.php b/vendor/symfony/translation/Command/XliffLintCommand.php index 378788f5b..67bb7764b 100644 --- a/vendor/symfony/translation/Command/XliffLintCommand.php +++ b/vendor/symfony/translation/Command/XliffLintCommand.php @@ -13,10 +13,12 @@ namespace Symfony\Component\Translation\Command; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Exception\RuntimeException; +use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Style\SymfonyStyle; +use Symfony\Component\Translation\Util\XliffUtils; /** * Validates XLIFF files syntax and outputs encountered errors. @@ -33,13 +35,15 @@ class XliffLintCommand extends Command private $displayCorrectFiles; private $directoryIteratorProvider; private $isReadableProvider; + private $requireStrictFileNames; - public function __construct(string $name = null, callable $directoryIteratorProvider = null, callable $isReadableProvider = null) + public function __construct(string $name = null, callable $directoryIteratorProvider = null, callable $isReadableProvider = null, bool $requireStrictFileNames = true) { parent::__construct($name); $this->directoryIteratorProvider = $directoryIteratorProvider; $this->isReadableProvider = $isReadableProvider; + $this->requireStrictFileNames = $requireStrictFileNames; } /** @@ -49,7 +53,7 @@ class XliffLintCommand extends Command { $this ->setDescription('Lints a XLIFF file and outputs encountered errors') - ->addArgument('filename', null, 'A file or a directory or STDIN') + ->addArgument('filename', InputArgument::IS_ARRAY, 'A file or a directory or STDIN') ->addOption('format', null, InputOption::VALUE_REQUIRED, 'The output format', 'txt') ->setHelp(<<%command.name% command lints a XLIFF file and outputs to STDOUT @@ -76,11 +80,11 @@ EOF protected function execute(InputInterface $input, OutputInterface $output) { $io = new SymfonyStyle($input, $output); - $filename = $input->getArgument('filename'); + $filenames = (array) $input->getArgument('filename'); $this->format = $input->getOption('format'); $this->displayCorrectFiles = $output->isVerbose(); - if (!$filename) { + if (0 === \count($filenames)) { if (!$stdin = $this->getStdin()) { throw new RuntimeException('Please provide a filename or pipe file content to STDIN.'); } @@ -88,13 +92,15 @@ EOF return $this->display($io, array($this->validate($stdin))); } - if (!$this->isReadable($filename)) { - throw new RuntimeException(sprintf('File or directory "%s" is not readable.', $filename)); - } - $filesInfo = array(); - foreach ($this->getFiles($filename) as $file) { - $filesInfo[] = $this->validate(file_get_contents($file), $file); + foreach ($filenames as $filename) { + if (!$this->isReadable($filename)) { + throw new RuntimeException(sprintf('File or directory "%s" is not readable.', $filename)); + } + + foreach ($this->getFiles($filename) as $file) { + $filesInfo[] = $this->validate(file_get_contents($file), $file); + } } return $this->display($io, $filesInfo); @@ -115,30 +121,28 @@ EOF $document->loadXML($content); if (null !== $targetLanguage = $this->getTargetLanguageFromFile($document)) { - $expectedFileExtension = sprintf('%s.xlf', str_replace('-', '_', $targetLanguage)); - $realFileExtension = explode('.', basename($file), 2)[1] ?? ''; + $normalizedLocale = preg_quote(str_replace('-', '_', $targetLanguage), '/'); + // strict file names require translation files to be named '____.locale.xlf' + // otherwise, both '____.locale.xlf' and 'locale.____.xlf' are allowed + $expectedFilenamePattern = $this->requireStrictFileNames ? sprintf('/^.*\.%s\.xlf/', $normalizedLocale) : sprintf('/^(.*\.%s\.xlf|%s\..*\.xlf)/', $normalizedLocale, $normalizedLocale); - if ($expectedFileExtension !== $realFileExtension) { + if (0 === preg_match($expectedFilenamePattern, basename($file))) { $errors[] = array( 'line' => -1, 'column' => -1, - 'message' => sprintf('There is a mismatch between the file extension ("%s") and the "%s" value used in the "target-language" attribute of the file.', $realFileExtension, $targetLanguage), + 'message' => sprintf('There is a mismatch between the language included in the file name ("%s") and the "%s" value used in the "target-language" attribute of the file.', basename($file), $targetLanguage), ); } } - $document->schemaValidate(__DIR__.'/../Resources/schemas/xliff-core-1.2-strict.xsd'); - foreach (libxml_get_errors() as $xmlError) { + foreach (XliffUtils::validateSchema($document) as $xmlError) { $errors[] = array( - 'line' => $xmlError->line, - 'column' => $xmlError->column, - 'message' => trim($xmlError->message), + 'line' => $xmlError['line'], + 'column' => $xmlError['column'], + 'message' => $xmlError['message'], ); } - libxml_clear_errors(); - libxml_use_internal_errors(false); - return array('file' => $file, 'valid' => 0 === \count($errors), 'messages' => $errors); } diff --git a/vendor/symfony/translation/DataCollector/TranslationDataCollector.php b/vendor/symfony/translation/DataCollector/TranslationDataCollector.php index edd712dd1..b28151914 100644 --- a/vendor/symfony/translation/DataCollector/TranslationDataCollector.php +++ b/vendor/symfony/translation/DataCollector/TranslationDataCollector.php @@ -97,6 +97,9 @@ class TranslationDataCollector extends DataCollector implements LateDataCollecto return !empty($this->data['locale']) ? $this->data['locale'] : null; } + /** + * @internal since Symfony 4.2 + */ public function getFallbackLocales() { return (isset($this->data['fallback_locales']) && \count($this->data['fallback_locales']) > 0) ? $this->data['fallback_locales'] : array(); diff --git a/vendor/symfony/translation/DataCollectorTranslator.php b/vendor/symfony/translation/DataCollectorTranslator.php index 5d4d819e0..ca6bedc71 100644 --- a/vendor/symfony/translation/DataCollectorTranslator.php +++ b/vendor/symfony/translation/DataCollectorTranslator.php @@ -12,11 +12,14 @@ namespace Symfony\Component\Translation; use Symfony\Component\Translation\Exception\InvalidArgumentException; +use Symfony\Component\Translation\TranslatorInterface as LegacyTranslatorInterface; +use Symfony\Contracts\Translation\LocaleAwareInterface; +use Symfony\Contracts\Translation\TranslatorInterface; /** * @author Abdellatif Ait boudad */ -class DataCollectorTranslator implements TranslatorInterface, TranslatorBagInterface +class DataCollectorTranslator implements LegacyTranslatorInterface, TranslatorInterface, TranslatorBagInterface { const MESSAGE_DEFINED = 0; const MESSAGE_MISSING = 1; @@ -32,10 +35,13 @@ class DataCollectorTranslator implements TranslatorInterface, TranslatorBagInter /** * @param TranslatorInterface $translator The translator must implement TranslatorBagInterface */ - public function __construct(TranslatorInterface $translator) + public function __construct($translator) { - if (!$translator instanceof TranslatorBagInterface) { - throw new InvalidArgumentException(sprintf('The Translator "%s" must implement TranslatorInterface and TranslatorBagInterface.', \get_class($translator))); + if (!$translator instanceof LegacyTranslatorInterface && !$translator instanceof TranslatorInterface) { + throw new \TypeError(sprintf('Argument 1 passed to %s() must be an instance of %s, %s given.', __METHOD__, TranslatorInterface::class, \is_object($translator) ? \get_class($translator) : \gettype($translator))); + } + if (!$translator instanceof TranslatorBagInterface || !$translator instanceof LocaleAwareInterface) { + throw new InvalidArgumentException(sprintf('The Translator "%s" must implement TranslatorInterface, TranslatorBagInterface and LocaleAwareInterface.', \get_class($translator))); } $this->translator = $translator; @@ -54,11 +60,18 @@ class DataCollectorTranslator implements TranslatorInterface, TranslatorBagInter /** * {@inheritdoc} + * + * @deprecated since Symfony 4.2, use the trans() method instead with a %count% parameter */ public function transChoice($id, $number, array $parameters = array(), $domain = null, $locale = null) { + if ($this->translator instanceof TranslatorInterface) { + $trans = $this->translator->trans($id, array('%count%' => $number) + $parameters, $domain, $locale); + } + $trans = $this->translator->transChoice($id, $number, $parameters, $domain, $locale); - $this->collectMessage($locale, $domain, $id, $trans, $parameters, $number); + + $this->collectMessage($locale, $domain, $id, $trans, array('%count%' => $number) + $parameters); return $trans; } @@ -90,7 +103,7 @@ class DataCollectorTranslator implements TranslatorInterface, TranslatorBagInter /** * Gets the fallback locales. * - * @return array $locales The fallback locales + * @return array The fallback locales */ public function getFallbackLocales() { @@ -106,7 +119,7 @@ class DataCollectorTranslator implements TranslatorInterface, TranslatorBagInter */ public function __call($method, $args) { - return \call_user_func_array(array($this->translator, $method), $args); + return $this->translator->{$method}(...$args); } /** @@ -123,9 +136,8 @@ class DataCollectorTranslator implements TranslatorInterface, TranslatorBagInter * @param string $id * @param string $translation * @param array|null $parameters - * @param int|null $number */ - private function collectMessage($locale, $domain, $id, $translation, $parameters = array(), $number = null) + private function collectMessage($locale, $domain, $id, $translation, $parameters = array()) { if (null === $domain) { $domain = 'messages'; @@ -158,8 +170,8 @@ class DataCollectorTranslator implements TranslatorInterface, TranslatorBagInter 'id' => $id, 'translation' => $translation, 'parameters' => $parameters, - 'transChoiceNumber' => $number, 'state' => $state, + 'transChoiceNumber' => isset($parameters['%count%']) && is_numeric($parameters['%count%']) ? $parameters['%count%'] : null, ); } } diff --git a/vendor/symfony/translation/Dumper/FileDumper.php b/vendor/symfony/translation/Dumper/FileDumper.php index 5b10e4520..8afcf6089 100644 --- a/vendor/symfony/translation/Dumper/FileDumper.php +++ b/vendor/symfony/translation/Dumper/FileDumper.php @@ -45,7 +45,7 @@ abstract class FileDumper implements DumperInterface /** * Sets backup flag. * - * @param bool + * @param bool $backup * * @deprecated since Symfony 4.1 */ @@ -76,7 +76,26 @@ abstract class FileDumper implements DumperInterface throw new RuntimeException(sprintf('Unable to create directory "%s".', $directory)); } } - // save file + + $intlDomain = $domain.MessageCatalogue::INTL_DOMAIN_SUFFIX; + $intlMessages = $messages->all($intlDomain); + + if ($intlMessages) { + $intlPath = $options['path'].'/'.$this->getRelativePath($intlDomain, $messages->getLocale()); + file_put_contents($intlPath, $this->formatCatalogue($messages, $intlDomain, $options)); + + $messages->replace(array(), $intlDomain); + + try { + if ($messages->all($domain)) { + file_put_contents($fullpath, $this->formatCatalogue($messages, $domain, $options)); + } + continue; + } finally { + $messages->replace($intlMessages, $intlDomain); + } + } + file_put_contents($fullpath, $this->formatCatalogue($messages, $domain, $options)); } } diff --git a/vendor/symfony/translation/Dumper/JsonFileDumper.php b/vendor/symfony/translation/Dumper/JsonFileDumper.php index 32bdaf518..a4db4d6ab 100644 --- a/vendor/symfony/translation/Dumper/JsonFileDumper.php +++ b/vendor/symfony/translation/Dumper/JsonFileDumper.php @@ -25,11 +25,7 @@ class JsonFileDumper extends FileDumper */ public function formatCatalogue(MessageCatalogue $messages, $domain, array $options = array()) { - if (isset($options['json_encoding'])) { - $flags = $options['json_encoding']; - } else { - $flags = JSON_PRETTY_PRINT; - } + $flags = $options['json_encoding'] ?? JSON_PRETTY_PRINT; return json_encode($messages->all($domain), $flags); } diff --git a/vendor/symfony/translation/Exception/ExceptionInterface.php b/vendor/symfony/translation/Exception/ExceptionInterface.php index c85fb93ca..8f9c54ef7 100644 --- a/vendor/symfony/translation/Exception/ExceptionInterface.php +++ b/vendor/symfony/translation/Exception/ExceptionInterface.php @@ -16,6 +16,6 @@ namespace Symfony\Component\Translation\Exception; * * @author Fabien Potencier */ -interface ExceptionInterface +interface ExceptionInterface extends \Throwable { } diff --git a/vendor/symfony/translation/Formatter/ChoiceMessageFormatterInterface.php b/vendor/symfony/translation/Formatter/ChoiceMessageFormatterInterface.php index 92acbcafe..6bc68384a 100644 --- a/vendor/symfony/translation/Formatter/ChoiceMessageFormatterInterface.php +++ b/vendor/symfony/translation/Formatter/ChoiceMessageFormatterInterface.php @@ -13,6 +13,8 @@ namespace Symfony\Component\Translation\Formatter; /** * @author Abdellatif Ait boudad + * + * @deprecated since Symfony 4.2, use MessageFormatterInterface::format() with a %count% parameter instead */ interface ChoiceMessageFormatterInterface { diff --git a/vendor/symfony/translation/Formatter/IntlFormatter.php b/vendor/symfony/translation/Formatter/IntlFormatter.php new file mode 100644 index 000000000..338d5151f --- /dev/null +++ b/vendor/symfony/translation/Formatter/IntlFormatter.php @@ -0,0 +1,55 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Formatter; + +use Symfony\Component\Translation\Exception\InvalidArgumentException; +use Symfony\Component\Translation\Exception\LogicException; + +/** + * @author Guilherme Blanco + * @author Abdellatif Ait boudad + */ +class IntlFormatter implements IntlFormatterInterface +{ + private $hasMessageFormatter; + private $cache = array(); + + /** + * {@inheritdoc} + */ + public function formatIntl(string $message, string $locale, array $parameters = array()): string + { + if (!$formatter = $this->cache[$locale][$message] ?? null) { + if (!($this->hasMessageFormatter ?? $this->hasMessageFormatter = class_exists(\MessageFormatter::class))) { + throw new LogicException('Cannot parse message translation: please install the "intl" PHP extension or the "symfony/polyfill-intl-messageformatter" package.'); + } + try { + $this->cache[$locale][$message] = $formatter = new \MessageFormatter($locale, $message); + } catch (\IntlException $e) { + throw new InvalidArgumentException(sprintf('Invalid message format (error #%d): %s.', intl_get_error_code(), intl_get_error_message()), 0, $e); + } + } + + foreach ($parameters as $key => $value) { + if (\in_array($key[0] ?? null, array('%', '{'), true)) { + unset($parameters[$key]); + $parameters[trim($key, '%{ }')] = $value; + } + } + + if (false === $message = $formatter->format($parameters)) { + throw new InvalidArgumentException(sprintf('Unable to format message (error #%s): %s.', $formatter->getErrorCode(), $formatter->getErrorMessage())); + } + + return $message; + } +} diff --git a/vendor/symfony/translation/Formatter/IntlFormatterInterface.php b/vendor/symfony/translation/Formatter/IntlFormatterInterface.php new file mode 100644 index 000000000..5fc5d97d2 --- /dev/null +++ b/vendor/symfony/translation/Formatter/IntlFormatterInterface.php @@ -0,0 +1,27 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Formatter; + +/** + * Formats ICU message patterns. + * + * @author Nicolas Grekas + */ +interface IntlFormatterInterface +{ + /** + * Formats a localized message using rules defined by ICU MessageFormat. + * + * @see http://icu-project.org/apiref/icu4c/classMessageFormat.html#details + */ + public function formatIntl(string $message, string $locale, array $parameters = array()): string; +} diff --git a/vendor/symfony/translation/Formatter/MessageFormatter.php b/vendor/symfony/translation/Formatter/MessageFormatter.php index e174be36c..e36f242c8 100644 --- a/vendor/symfony/translation/Formatter/MessageFormatter.php +++ b/vendor/symfony/translation/Formatter/MessageFormatter.php @@ -11,21 +11,32 @@ namespace Symfony\Component\Translation\Formatter; +use Symfony\Component\Translation\IdentityTranslator; use Symfony\Component\Translation\MessageSelector; +use Symfony\Component\Translation\TranslatorInterface as LegacyTranslatorInterface; +use Symfony\Contracts\Translation\TranslatorInterface; /** * @author Abdellatif Ait boudad */ -class MessageFormatter implements MessageFormatterInterface, ChoiceMessageFormatterInterface +class MessageFormatter implements MessageFormatterInterface, IntlFormatterInterface, ChoiceMessageFormatterInterface { - private $selector; + private $translator; + private $intlFormatter; /** - * @param MessageSelector|null $selector The message selector for pluralization + * @param TranslatorInterface|null $translator An identity translator to use as selector for pluralization */ - public function __construct(MessageSelector $selector = null) + public function __construct($translator = null, IntlFormatterInterface $intlFormatter = null) { - $this->selector = $selector ?: new MessageSelector(); + if ($translator instanceof MessageSelector) { + $translator = new IdentityTranslator($translator); + } elseif (null !== $translator && !$translator instanceof TranslatorInterface && !$translator instanceof LegacyTranslatorInterface) { + throw new \TypeError(sprintf('Argument 1 passed to %s() must be an instance of %s, %s given.', __METHOD__, TranslatorInterface::class, \is_object($translator) ? \get_class($translator) : \gettype($translator))); + } + + $this->translator = $translator ?? new IdentityTranslator(); + $this->intlFormatter = $intlFormatter ?? new IntlFormatter(); } /** @@ -33,16 +44,36 @@ class MessageFormatter implements MessageFormatterInterface, ChoiceMessageFormat */ public function format($message, $locale, array $parameters = array()) { + if ($this->translator instanceof TranslatorInterface) { + return $this->translator->trans($message, $parameters, null, $locale); + } + return strtr($message, $parameters); } /** * {@inheritdoc} */ + public function formatIntl(string $message, string $locale, array $parameters = array()): string + { + return $this->intlFormatter->formatIntl($message, $locale, $parameters); + } + + /** + * {@inheritdoc} + * + * @deprecated since Symfony 4.2, use format() with a %count% parameter instead + */ public function choiceFormat($message, $number, $locale, array $parameters = array()) { - $parameters = array_merge(array('%count%' => $number), $parameters); + @trigger_error(sprintf('The "%s()" method is deprecated since Symfony 4.2, use the format() one instead with a %%count%% parameter.', __METHOD__), E_USER_DEPRECATED); - return $this->format($this->selector->choose($message, (int) $number, $locale), $locale, $parameters); + $parameters = array('%count%' => $number) + $parameters; + + if ($this->translator instanceof TranslatorInterface) { + return $this->format($message, $locale, $parameters); + } + + return $this->format($this->translator->transChoice($message, $number, array(), null, $locale), $locale, $parameters); } } diff --git a/vendor/symfony/translation/IdentityTranslator.php b/vendor/symfony/translation/IdentityTranslator.php index 82b247015..31abdaab1 100644 --- a/vendor/symfony/translation/IdentityTranslator.php +++ b/vendor/symfony/translation/IdentityTranslator.php @@ -11,53 +11,51 @@ namespace Symfony\Component\Translation; +use Symfony\Component\Translation\TranslatorInterface as LegacyTranslatorInterface; +use Symfony\Contracts\Translation\TranslatorInterface; +use Symfony\Contracts\Translation\TranslatorTrait; + /** * IdentityTranslator does not translate anything. * * @author Fabien Potencier */ -class IdentityTranslator implements TranslatorInterface +class IdentityTranslator implements LegacyTranslatorInterface, TranslatorInterface { + use TranslatorTrait; + private $selector; - private $locale; /** * @param MessageSelector|null $selector The message selector for pluralization */ public function __construct(MessageSelector $selector = null) { - $this->selector = $selector ?: new MessageSelector(); - } - - /** - * {@inheritdoc} - */ - public function setLocale($locale) - { - $this->locale = $locale; - } - - /** - * {@inheritdoc} - */ - public function getLocale() - { - return $this->locale ?: \Locale::getDefault(); - } - - /** - * {@inheritdoc} - */ - public function trans($id, array $parameters = array(), $domain = null, $locale = null) - { - return strtr((string) $id, $parameters); + $this->selector = $selector; + + if (__CLASS__ !== \get_class($this)) { + @trigger_error(sprintf('Calling "%s()" is deprecated since Symfony 4.2.'), E_USER_DEPRECATED); + } } /** * {@inheritdoc} + * + * @deprecated since Symfony 4.2, use the trans() method instead with a %count% parameter */ public function transChoice($id, $number, array $parameters = array(), $domain = null, $locale = null) { - return strtr($this->selector->choose((string) $id, (int) $number, $locale ?: $this->getLocale()), $parameters); + @trigger_error(sprintf('The "%s()" method is deprecated since Symfony 4.2, use the trans() one instead with a "%count%" parameter.', __METHOD__), E_USER_DEPRECATED); + + if ($this->selector) { + return strtr($this->selector->choose((string) $id, $number, $locale ?: $this->getLocale()), $parameters); + } + + return $this->trans($id, array('%count%' => $number) + $parameters, $domain, $locale); + } + + private function getPluralizationRule(int $number, string $locale): int + { + return PluralizationRules::get($number, $locale, false); } } diff --git a/vendor/symfony/translation/Interval.php b/vendor/symfony/translation/Interval.php index 9e2cae648..a0e484da8 100644 --- a/vendor/symfony/translation/Interval.php +++ b/vendor/symfony/translation/Interval.php @@ -11,6 +11,8 @@ namespace Symfony\Component\Translation; +@trigger_error(sprintf('The "%s" class is deprecated since Symfony 4.2, use IdentityTranslator instead.', Interval::class), E_USER_DEPRECATED); + use Symfony\Component\Translation\Exception\InvalidArgumentException; /** @@ -32,6 +34,7 @@ use Symfony\Component\Translation\Exception\InvalidArgumentException; * @author Fabien Potencier * * @see http://en.wikipedia.org/wiki/Interval_%28mathematics%29#The_ISO_notation + * @deprecated since Symfony 4.2, use IdentityTranslator instead */ class Interval { diff --git a/vendor/symfony/translation/Loader/XliffFileLoader.php b/vendor/symfony/translation/Loader/XliffFileLoader.php index 9c6b8c9f4..1106ec65f 100644 --- a/vendor/symfony/translation/Loader/XliffFileLoader.php +++ b/vendor/symfony/translation/Loader/XliffFileLoader.php @@ -13,10 +13,10 @@ namespace Symfony\Component\Translation\Loader; use Symfony\Component\Config\Resource\FileResource; use Symfony\Component\Config\Util\XmlUtils; -use Symfony\Component\Translation\Exception\InvalidArgumentException; use Symfony\Component\Translation\Exception\InvalidResourceException; use Symfony\Component\Translation\Exception\NotFoundResourceException; use Symfony\Component\Translation\MessageCatalogue; +use Symfony\Component\Translation\Util\XliffUtils; /** * XliffFileLoader loads translations from XLIFF files. @@ -56,8 +56,10 @@ class XliffFileLoader implements LoaderInterface throw new InvalidResourceException(sprintf('Unable to load "%s": %s', $resource, $e->getMessage()), $e->getCode(), $e); } - $xliffVersion = $this->getVersionNumber($dom); - $this->validateSchema($xliffVersion, $dom, $this->getSchema($xliffVersion)); + $xliffVersion = XliffUtils::getVersionNumber($dom); + if ($errors = XliffUtils::validateSchema($dom)) { + throw new InvalidResourceException(sprintf('Invalid resource provided: "%s"; Errors: %s', $xliffVersion, XliffUtils::getErrorsAsString($errors))); + } if ('1.2' === $xliffVersion) { $this->extractXliff1($dom, $catalogue, $domain); @@ -91,7 +93,7 @@ class XliffFileLoader implements LoaderInterface $source = isset($attributes['resname']) && $attributes['resname'] ? $attributes['resname'] : $translation->source; // If the xlf file has another encoding specified, try to convert it because // simple_xml will always return utf-8 encoded values - $target = $this->utf8ToCharset((string) (isset($translation->target) ? $translation->target : $source), $encoding); + $target = $this->utf8ToCharset((string) (isset($translation->target) ? $translation->target : $translation->source), $encoding); $catalogue->set((string) $source, $target, $domain); @@ -169,123 +171,6 @@ class XliffFileLoader implements LoaderInterface return $content; } - /** - * Validates and parses the given file into a DOMDocument. - * - * @throws InvalidResourceException - */ - private function validateSchema(string $file, \DOMDocument $dom, string $schema) - { - $internalErrors = libxml_use_internal_errors(true); - - $disableEntities = libxml_disable_entity_loader(false); - - if (!@$dom->schemaValidateSource($schema)) { - libxml_disable_entity_loader($disableEntities); - - throw new InvalidResourceException(sprintf('Invalid resource provided: "%s"; Errors: %s', $file, implode("\n", $this->getXmlErrors($internalErrors)))); - } - - libxml_disable_entity_loader($disableEntities); - - $dom->normalizeDocument(); - - libxml_clear_errors(); - libxml_use_internal_errors($internalErrors); - } - - private function getSchema($xliffVersion) - { - if ('1.2' === $xliffVersion) { - $schemaSource = file_get_contents(__DIR__.'/schema/dic/xliff-core/xliff-core-1.2-strict.xsd'); - $xmlUri = 'http://www.w3.org/2001/xml.xsd'; - } elseif ('2.0' === $xliffVersion) { - $schemaSource = file_get_contents(__DIR__.'/schema/dic/xliff-core/xliff-core-2.0.xsd'); - $xmlUri = 'informativeCopiesOf3rdPartySchemas/w3c/xml.xsd'; - } else { - throw new InvalidArgumentException(sprintf('No support implemented for loading XLIFF version "%s".', $xliffVersion)); - } - - return $this->fixXmlLocation($schemaSource, $xmlUri); - } - - /** - * Internally changes the URI of a dependent xsd to be loaded locally. - */ - private function fixXmlLocation(string $schemaSource, string $xmlUri): string - { - $newPath = str_replace('\\', '/', __DIR__).'/schema/dic/xliff-core/xml.xsd'; - $parts = explode('/', $newPath); - $locationstart = 'file:///'; - if (0 === stripos($newPath, 'phar://')) { - $tmpfile = tempnam(sys_get_temp_dir(), 'symfony'); - if ($tmpfile) { - copy($newPath, $tmpfile); - $parts = explode('/', str_replace('\\', '/', $tmpfile)); - } else { - array_shift($parts); - $locationstart = 'phar:///'; - } - } - - $drive = '\\' === \DIRECTORY_SEPARATOR ? array_shift($parts).'/' : ''; - $newPath = $locationstart.$drive.implode('/', array_map('rawurlencode', $parts)); - - return str_replace($xmlUri, $newPath, $schemaSource); - } - - /** - * Returns the XML errors of the internal XML parser. - */ - private function getXmlErrors(bool $internalErrors): array - { - $errors = array(); - foreach (libxml_get_errors() as $error) { - $errors[] = sprintf('[%s %s] %s (in %s - line %d, column %d)', - LIBXML_ERR_WARNING == $error->level ? 'WARNING' : 'ERROR', - $error->code, - trim($error->message), - $error->file ?: 'n/a', - $error->line, - $error->column - ); - } - - libxml_clear_errors(); - libxml_use_internal_errors($internalErrors); - - return $errors; - } - - /** - * Gets xliff file version based on the root "version" attribute. - * Defaults to 1.2 for backwards compatibility. - * - * @throws InvalidArgumentException - */ - private function getVersionNumber(\DOMDocument $dom): string - { - /** @var \DOMNode $xliff */ - foreach ($dom->getElementsByTagName('xliff') as $xliff) { - $version = $xliff->attributes->getNamedItem('version'); - if ($version) { - return $version->nodeValue; - } - - $namespace = $xliff->attributes->getNamedItem('xmlns'); - if ($namespace) { - if (0 !== substr_compare('urn:oasis:names:tc:xliff:document:', $namespace->nodeValue, 0, 34)) { - throw new InvalidArgumentException(sprintf('Not a valid XLIFF namespace "%s"', $namespace)); - } - - return substr($namespace, 34); - } - } - - // Falls back to v1.2 - return '1.2'; - } - private function parseNotesMetadata(\SimpleXMLElement $noteElement = null, string $encoding = null): array { $notes = array(); diff --git a/vendor/symfony/translation/Loader/schema/dic/xliff-core/xliff-core-1.2-strict.xsd b/vendor/symfony/translation/Loader/schema/dic/xliff-core/xliff-core-1.2-strict.xsd deleted file mode 100644 index 3ce2a8e8a..000000000 --- a/vendor/symfony/translation/Loader/schema/dic/xliff-core/xliff-core-1.2-strict.xsd +++ /dev/null @@ -1,2223 +0,0 @@ - - - - - - - - - - - - - - - Values for the attribute 'context-type'. - - - - - Indicates a database content. - - - - - Indicates the content of an element within an XML document. - - - - - Indicates the name of an element within an XML document. - - - - - Indicates the line number from the sourcefile (see context-type="sourcefile") where the <source> is found. - - - - - Indicates a the number of parameters contained within the <source>. - - - - - Indicates notes pertaining to the parameters in the <source>. - - - - - Indicates the content of a record within a database. - - - - - Indicates the name of a record within a database. - - - - - Indicates the original source file in the case that multiple files are merged to form the original file from which the XLIFF file is created. This differs from the original <file> attribute in that this sourcefile is one of many that make up that file. - - - - - - - Values for the attribute 'count-type'. - - - - - Indicates the count units are items that are used X times in a certain context; example: this is a reusable text unit which is used 42 times in other texts. - - - - - Indicates the count units are translation units existing already in the same document. - - - - - Indicates a total count. - - - - - - - Values for the attribute 'ctype' when used other elements than <ph> or <x>. - - - - - Indicates a run of bolded text. - - - - - Indicates a run of text in italics. - - - - - Indicates a run of underlined text. - - - - - Indicates a run of hyper-text. - - - - - - - Values for the attribute 'ctype' when used with <ph> or <x>. - - - - - Indicates a inline image. - - - - - Indicates a page break. - - - - - Indicates a line break. - - - - - - - - - - - - Values for the attribute 'datatype'. - - - - - Indicates Active Server Page data. - - - - - Indicates C source file data. - - - - - Indicates Channel Definition Format (CDF) data. - - - - - Indicates ColdFusion data. - - - - - Indicates C++ source file data. - - - - - Indicates C-Sharp data. - - - - - Indicates strings from C, ASM, and driver files data. - - - - - Indicates comma-separated values data. - - - - - Indicates database data. - - - - - Indicates portions of document that follows data and contains metadata. - - - - - Indicates portions of document that precedes data and contains metadata. - - - - - Indicates data from standard UI file operations dialogs (e.g., Open, Save, Save As, Export, Import). - - - - - Indicates standard user input screen data. - - - - - Indicates HyperText Markup Language (HTML) data - document instance. - - - - - Indicates content within an HTML document’s <body> element. - - - - - Indicates Windows INI file data. - - - - - Indicates Interleaf data. - - - - - Indicates Java source file data (extension '.java'). - - - - - Indicates Java property resource bundle data. - - - - - Indicates Java list resource bundle data. - - - - - Indicates JavaScript source file data. - - - - - Indicates JScript source file data. - - - - - Indicates information relating to formatting. - - - - - Indicates LISP source file data. - - - - - Indicates information relating to margin formats. - - - - - Indicates a file containing menu. - - - - - Indicates numerically identified string table. - - - - - Indicates Maker Interchange Format (MIF) data. - - - - - Indicates that the datatype attribute value is a MIME Type value and is defined in the mime-type attribute. - - - - - Indicates GNU Machine Object data. - - - - - Indicates Message Librarian strings created by Novell's Message Librarian Tool. - - - - - Indicates information to be displayed at the bottom of each page of a document. - - - - - Indicates information to be displayed at the top of each page of a document. - - - - - Indicates a list of property values (e.g., settings within INI files or preferences dialog). - - - - - Indicates Pascal source file data. - - - - - Indicates Hypertext Preprocessor data. - - - - - Indicates plain text file (no formatting other than, possibly, wrapping). - - - - - Indicates GNU Portable Object file. - - - - - Indicates dynamically generated user defined document. e.g. Oracle Report, Crystal Report, etc. - - - - - Indicates Windows .NET binary resources. - - - - - Indicates Windows .NET Resources. - - - - - Indicates Rich Text Format (RTF) data. - - - - - Indicates Standard Generalized Markup Language (SGML) data - document instance. - - - - - Indicates Standard Generalized Markup Language (SGML) data - Document Type Definition (DTD). - - - - - Indicates Scalable Vector Graphic (SVG) data. - - - - - Indicates VisualBasic Script source file. - - - - - Indicates warning message. - - - - - Indicates Windows (Win32) resources (i.e. resources extracted from an RC script, a message file, or a compiled file). - - - - - Indicates Extensible HyperText Markup Language (XHTML) data - document instance. - - - - - Indicates Extensible Markup Language (XML) data - document instance. - - - - - Indicates Extensible Markup Language (XML) data - Document Type Definition (DTD). - - - - - Indicates Extensible Stylesheet Language (XSL) data. - - - - - Indicates XUL elements. - - - - - - - Values for the attribute 'mtype'. - - - - - Indicates the marked text is an abbreviation. - - - - - ISO-12620 2.1.8: A term resulting from the omission of any part of the full term while designating the same concept. - - - - - ISO-12620 2.1.8.1: An abbreviated form of a simple term resulting from the omission of some of its letters (e.g. 'adj.' for 'adjective'). - - - - - ISO-12620 2.1.8.4: An abbreviated form of a term made up of letters from the full form of a multiword term strung together into a sequence pronounced only syllabically (e.g. 'radar' for 'radio detecting and ranging'). - - - - - ISO-12620: A proper-name term, such as the name of an agency or other proper entity. - - - - - ISO-12620 2.1.18.1: A recurrent word combination characterized by cohesion in that the components of the collocation must co-occur within an utterance or series of utterances, even though they do not necessarily have to maintain immediate proximity to one another. - - - - - ISO-12620 2.1.5: A synonym for an international scientific term that is used in general discourse in a given language. - - - - - Indicates the marked text is a date and/or time. - - - - - ISO-12620 2.1.15: An expression used to represent a concept based on a statement that two mathematical expressions are, for instance, equal as identified by the equal sign (=), or assigned to one another by a similar sign. - - - - - ISO-12620 2.1.7: The complete representation of a term for which there is an abbreviated form. - - - - - ISO-12620 2.1.14: Figures, symbols or the like used to express a concept briefly, such as a mathematical or chemical formula. - - - - - ISO-12620 2.1.1: The concept designation that has been chosen to head a terminological record. - - - - - ISO-12620 2.1.8.3: An abbreviated form of a term consisting of some of the initial letters of the words making up a multiword term or the term elements making up a compound term when these letters are pronounced individually (e.g. 'BSE' for 'bovine spongiform encephalopathy'). - - - - - ISO-12620 2.1.4: A term that is part of an international scientific nomenclature as adopted by an appropriate scientific body. - - - - - ISO-12620 2.1.6: A term that has the same or nearly identical orthographic or phonemic form in many languages. - - - - - ISO-12620 2.1.16: An expression used to represent a concept based on mathematical or logical relations, such as statements of inequality, set relationships, Boolean operations, and the like. - - - - - ISO-12620 2.1.17: A unit to track object. - - - - - Indicates the marked text is a name. - - - - - ISO-12620 2.1.3: A term that represents the same or a very similar concept as another term in the same language, but for which interchangeability is limited to some contexts and inapplicable in others. - - - - - ISO-12620 2.1.17.2: A unique alphanumeric designation assigned to an object in a manufacturing system. - - - - - Indicates the marked text is a phrase. - - - - - ISO-12620 2.1.18: Any group of two or more words that form a unit, the meaning of which frequently cannot be deduced based on the combined sense of the words making up the phrase. - - - - - Indicates the marked text should not be translated. - - - - - ISO-12620 2.1.12: A form of a term resulting from an operation whereby non-Latin writing systems are converted to the Latin alphabet. - - - - - Indicates that the marked text represents a segment. - - - - - ISO-12620 2.1.18.2: A fixed, lexicalized phrase. - - - - - ISO-12620 2.1.8.2: A variant of a multiword term that includes fewer words than the full form of the term (e.g. 'Group of Twenty-four' for 'Intergovernmental Group of Twenty-four on International Monetary Affairs'). - - - - - ISO-12620 2.1.17.1: Stock keeping unit, an inventory item identified by a unique alphanumeric designation assigned to an object in an inventory control system. - - - - - ISO-12620 2.1.19: A fixed chunk of recurring text. - - - - - ISO-12620 2.1.13: A designation of a concept by letters, numerals, pictograms or any combination thereof. - - - - - ISO-12620 2.1.2: Any term that represents the same or a very similar concept as the main entry term in a term entry. - - - - - ISO-12620 2.1.18.3: Phraseological unit in a language that expresses the same semantic content as another phrase in that same language. - - - - - Indicates the marked text is a term. - - - - - ISO-12620 2.1.11: A form of a term resulting from an operation whereby the characters of one writing system are represented by characters from another writing system, taking into account the pronunciation of the characters converted. - - - - - ISO-12620 2.1.10: A form of a term resulting from an operation whereby the characters of an alphabetic writing system are represented by characters from another alphabetic writing system. - - - - - ISO-12620 2.1.8.5: An abbreviated form of a term resulting from the omission of one or more term elements or syllables (e.g. 'flu' for 'influenza'). - - - - - ISO-12620 2.1.9: One of the alternate forms of a term. - - - - - - - Values for the attribute 'restype'. - - - - - Indicates a Windows RC AUTO3STATE control. - - - - - Indicates a Windows RC AUTOCHECKBOX control. - - - - - Indicates a Windows RC AUTORADIOBUTTON control. - - - - - Indicates a Windows RC BEDIT control. - - - - - Indicates a bitmap, for example a BITMAP resource in Windows. - - - - - Indicates a button object, for example a BUTTON control Windows. - - - - - Indicates a caption, such as the caption of a dialog box. - - - - - Indicates the cell in a table, for example the content of the <td> element in HTML. - - - - - Indicates check box object, for example a CHECKBOX control in Windows. - - - - - Indicates a menu item with an associated checkbox. - - - - - Indicates a list box, but with a check-box for each item. - - - - - Indicates a color selection dialog. - - - - - Indicates a combination of edit box and listbox object, for example a COMBOBOX control in Windows. - - - - - Indicates an initialization entry of an extended combobox DLGINIT resource block. (code 0x1234). - - - - - Indicates an initialization entry of a combobox DLGINIT resource block (code 0x0403). - - - - - Indicates a UI base class element that cannot be represented by any other element. - - - - - Indicates a context menu. - - - - - Indicates a Windows RC CTEXT control. - - - - - Indicates a cursor, for example a CURSOR resource in Windows. - - - - - Indicates a date/time picker. - - - - - Indicates a Windows RC DEFPUSHBUTTON control. - - - - - Indicates a dialog box. - - - - - Indicates a Windows RC DLGINIT resource block. - - - - - Indicates an edit box object, for example an EDIT control in Windows. - - - - - Indicates a filename. - - - - - Indicates a file dialog. - - - - - Indicates a footnote. - - - - - Indicates a font name. - - - - - Indicates a footer. - - - - - Indicates a frame object. - - - - - Indicates a XUL grid element. - - - - - Indicates a groupbox object, for example a GROUPBOX control in Windows. - - - - - Indicates a header item. - - - - - Indicates a heading, such has the content of <h1>, <h2>, etc. in HTML. - - - - - Indicates a Windows RC HEDIT control. - - - - - Indicates a horizontal scrollbar. - - - - - Indicates an icon, for example an ICON resource in Windows. - - - - - Indicates a Windows RC IEDIT control. - - - - - Indicates keyword list, such as the content of the Keywords meta-data in HTML, or a K footnote in WinHelp RTF. - - - - - Indicates a label object. - - - - - Indicates a label that is also a HTML link (not necessarily a URL). - - - - - Indicates a list (a group of list-items, for example an <ol> or <ul> element in HTML). - - - - - Indicates a listbox object, for example an LISTBOX control in Windows. - - - - - Indicates an list item (an entry in a list). - - - - - Indicates a Windows RC LTEXT control. - - - - - Indicates a menu (a group of menu-items). - - - - - Indicates a toolbar containing one or more tope level menus. - - - - - Indicates a menu item (an entry in a menu). - - - - - Indicates a XUL menuseparator element. - - - - - Indicates a message, for example an entry in a MESSAGETABLE resource in Windows. - - - - - Indicates a calendar control. - - - - - Indicates an edit box beside a spin control. - - - - - Indicates a catch all for rectangular areas. - - - - - Indicates a standalone menu not necessarily associated with a menubar. - - - - - Indicates a pushbox object, for example a PUSHBOX control in Windows. - - - - - Indicates a Windows RC PUSHBUTTON control. - - - - - Indicates a radio button object. - - - - - Indicates a menuitem with associated radio button. - - - - - Indicates raw data resources for an application. - - - - - Indicates a row in a table. - - - - - Indicates a Windows RC RTEXT control. - - - - - Indicates a user navigable container used to show a portion of a document. - - - - - Indicates a generic divider object (e.g. menu group separator). - - - - - Windows accelerators, shortcuts in resource or property files. - - - - - Indicates a UI control to indicate process activity but not progress. - - - - - Indicates a splitter bar. - - - - - Indicates a Windows RC STATE3 control. - - - - - Indicates a window for providing feedback to the users, like 'read-only', etc. - - - - - Indicates a string, for example an entry in a STRINGTABLE resource in Windows. - - - - - Indicates a layers of controls with a tab to select layers. - - - - - Indicates a display and edits regular two-dimensional tables of cells. - - - - - Indicates a XUL textbox element. - - - - - Indicates a UI button that can be toggled to on or off state. - - - - - Indicates an array of controls, usually buttons. - - - - - Indicates a pop up tool tip text. - - - - - Indicates a bar with a pointer indicating a position within a certain range. - - - - - Indicates a control that displays a set of hierarchical data. - - - - - Indicates a URI (URN or URL). - - - - - Indicates a Windows RC USERBUTTON control. - - - - - Indicates a user-defined control like CONTROL control in Windows. - - - - - Indicates the text of a variable. - - - - - Indicates version information about a resource like VERSIONINFO in Windows. - - - - - Indicates a vertical scrollbar. - - - - - Indicates a graphical window. - - - - - - - Values for the attribute 'size-unit'. - - - - - Indicates a size in 8-bit bytes. - - - - - Indicates a size in Unicode characters. - - - - - Indicates a size in columns. Used for HTML text area. - - - - - Indicates a size in centimeters. - - - - - Indicates a size in dialog units, as defined in Windows resources. - - - - - Indicates a size in 'font-size' units (as defined in CSS). - - - - - Indicates a size in 'x-height' units (as defined in CSS). - - - - - Indicates a size in glyphs. A glyph is considered to be one or more combined Unicode characters that represent a single displayable text character. Sometimes referred to as a 'grapheme cluster' - - - - - Indicates a size in inches. - - - - - Indicates a size in millimeters. - - - - - Indicates a size in percentage. - - - - - Indicates a size in pixels. - - - - - Indicates a size in point. - - - - - Indicates a size in rows. Used for HTML text area. - - - - - - - Values for the attribute 'state'. - - - - - Indicates the terminating state. - - - - - Indicates only non-textual information needs adaptation. - - - - - Indicates both text and non-textual information needs adaptation. - - - - - Indicates only non-textual information needs review. - - - - - Indicates both text and non-textual information needs review. - - - - - Indicates that only the text of the item needs to be reviewed. - - - - - Indicates that the item needs to be translated. - - - - - Indicates that the item is new. For example, translation units that were not in a previous version of the document. - - - - - Indicates that changes are reviewed and approved. - - - - - Indicates that the item has been translated. - - - - - - - Values for the attribute 'state-qualifier'. - - - - - Indicates an exact match. An exact match occurs when a source text of a segment is exactly the same as the source text of a segment that was translated previously. - - - - - Indicates a fuzzy match. A fuzzy match occurs when a source text of a segment is very similar to the source text of a segment that was translated previously (e.g. when the difference is casing, a few changed words, white-space discripancy, etc.). - - - - - Indicates a match based on matching IDs (in addition to matching text). - - - - - Indicates a translation derived from a glossary. - - - - - Indicates a translation derived from existing translation. - - - - - Indicates a translation derived from machine translation. - - - - - Indicates a translation derived from a translation repository. - - - - - Indicates a translation derived from a translation memory. - - - - - Indicates the translation is suggested by machine translation. - - - - - Indicates that the item has been rejected because of incorrect grammar. - - - - - Indicates that the item has been rejected because it is incorrect. - - - - - Indicates that the item has been rejected because it is too long or too short. - - - - - Indicates that the item has been rejected because of incorrect spelling. - - - - - Indicates the translation is suggested by translation memory. - - - - - - - Values for the attribute 'unit'. - - - - - Refers to words. - - - - - Refers to pages. - - - - - Refers to <trans-unit> elements. - - - - - Refers to <bin-unit> elements. - - - - - Refers to glyphs. - - - - - Refers to <trans-unit> and/or <bin-unit> elements. - - - - - Refers to the occurrences of instances defined by the count-type value. - - - - - Refers to characters. - - - - - Refers to lines. - - - - - Refers to sentences. - - - - - Refers to paragraphs. - - - - - Refers to segments. - - - - - Refers to placeables (inline elements). - - - - - - - Values for the attribute 'priority'. - - - - - Highest priority. - - - - - High priority. - - - - - High priority, but not as important as 2. - - - - - High priority, but not as important as 3. - - - - - Medium priority, but more important than 6. - - - - - Medium priority, but less important than 5. - - - - - Low priority, but more important than 8. - - - - - Low priority, but more important than 9. - - - - - Low priority. - - - - - Lowest priority. - - - - - - - - - This value indicates that all properties can be reformatted. This value must be used alone. - - - - - This value indicates that no properties should be reformatted. This value must be used alone. - - - - - - - - - - - - - This value indicates that all information in the coord attribute can be modified. - - - - - This value indicates that the x information in the coord attribute can be modified. - - - - - This value indicates that the y information in the coord attribute can be modified. - - - - - This value indicates that the cx information in the coord attribute can be modified. - - - - - This value indicates that the cy information in the coord attribute can be modified. - - - - - This value indicates that all the information in the font attribute can be modified. - - - - - This value indicates that the name information in the font attribute can be modified. - - - - - This value indicates that the size information in the font attribute can be modified. - - - - - This value indicates that the weight information in the font attribute can be modified. - - - - - This value indicates that the information in the css-style attribute can be modified. - - - - - This value indicates that the information in the style attribute can be modified. - - - - - This value indicates that the information in the exstyle attribute can be modified. - - - - - - - - - - - - - Indicates that the context is informational in nature, specifying for example, how a term should be translated. Thus, should be displayed to anyone editing the XLIFF document. - - - - - Indicates that the context-group is used to specify where the term was found in the translatable source. Thus, it is not displayed. - - - - - Indicates that the context information should be used during translation memory lookups. Thus, it is not displayed. - - - - - - - - - Represents a translation proposal from a translation memory or other resource. - - - - - Represents a previous version of the target element. - - - - - Represents a rejected version of the target element. - - - - - Represents a translation to be used for reference purposes only, for example from a related product or a different language. - - - - - Represents a proposed translation that was used for the translation of the trans-unit, possibly modified. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Values for the attribute 'coord'. - - - - - - - - Version values: 1.0 and 1.1 are allowed for backward compatibility. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/symfony/translation/LoggingTranslator.php b/vendor/symfony/translation/LoggingTranslator.php index 014567086..4fe756d7a 100644 --- a/vendor/symfony/translation/LoggingTranslator.php +++ b/vendor/symfony/translation/LoggingTranslator.php @@ -13,11 +13,14 @@ namespace Symfony\Component\Translation; use Psr\Log\LoggerInterface; use Symfony\Component\Translation\Exception\InvalidArgumentException; +use Symfony\Component\Translation\TranslatorInterface as LegacyTranslatorInterface; +use Symfony\Contracts\Translation\LocaleAwareInterface; +use Symfony\Contracts\Translation\TranslatorInterface; /** * @author Abdellatif Ait boudad */ -class LoggingTranslator implements TranslatorInterface, TranslatorBagInterface +class LoggingTranslator implements TranslatorInterface, LegacyTranslatorInterface, TranslatorBagInterface { /** * @var TranslatorInterface|TranslatorBagInterface @@ -30,10 +33,13 @@ class LoggingTranslator implements TranslatorInterface, TranslatorBagInterface * @param TranslatorInterface $translator The translator must implement TranslatorBagInterface * @param LoggerInterface $logger */ - public function __construct(TranslatorInterface $translator, LoggerInterface $logger) + public function __construct($translator, LoggerInterface $logger) { - if (!$translator instanceof TranslatorBagInterface) { - throw new InvalidArgumentException(sprintf('The Translator "%s" must implement TranslatorInterface and TranslatorBagInterface.', \get_class($translator))); + if (!$translator instanceof LegacyTranslatorInterface && !$translator instanceof TranslatorInterface) { + throw new \TypeError(sprintf('Argument 1 passed to %s() must be an instance of %s, %s given.', __METHOD__, TranslatorInterface::class, \is_object($translator) ? \get_class($translator) : \gettype($translator))); + } + if (!$translator instanceof TranslatorBagInterface || !$translator instanceof LocaleAwareInterface) { + throw new InvalidArgumentException(sprintf('The Translator "%s" must implement TranslatorInterface, TranslatorBagInterface and LocaleAwareInterface.', \get_class($translator))); } $this->translator = $translator; @@ -53,10 +59,19 @@ class LoggingTranslator implements TranslatorInterface, TranslatorBagInterface /** * {@inheritdoc} + * + * @deprecated since Symfony 4.2, use the trans() method instead with a %count% parameter */ public function transChoice($id, $number, array $parameters = array(), $domain = null, $locale = null) { - $trans = $this->translator->transChoice($id, $number, $parameters, $domain, $locale); + @trigger_error(sprintf('The "%s()" method is deprecated since Symfony 4.2, use the trans() one instead with a "%count%" parameter.', __METHOD__), E_USER_DEPRECATED); + + if ($this->translator instanceof TranslatorInterface) { + $trans = $this->translator->trans($id, array('%count%' => $number) + $parameters, $domain, $locale); + } else { + $trans = $this->translator->transChoice($id, $number, $parameters, $domain, $locale); + } + $this->log($id, $domain, $locale); return $trans; @@ -89,7 +104,7 @@ class LoggingTranslator implements TranslatorInterface, TranslatorBagInterface /** * Gets the fallback locales. * - * @return array $locales The fallback locales + * @return array The fallback locales */ public function getFallbackLocales() { @@ -105,7 +120,7 @@ class LoggingTranslator implements TranslatorInterface, TranslatorBagInterface */ public function __call($method, $args) { - return \call_user_func_array(array($this->translator, $method), $args); + return $this->translator->{$method}(...$args); } /** diff --git a/vendor/symfony/translation/MessageCatalogue.php b/vendor/symfony/translation/MessageCatalogue.php index c36ea30ec..7a7657c0a 100644 --- a/vendor/symfony/translation/MessageCatalogue.php +++ b/vendor/symfony/translation/MessageCatalogue.php @@ -49,7 +49,17 @@ class MessageCatalogue implements MessageCatalogueInterface, MetadataAwareInterf */ public function getDomains() { - return array_keys($this->messages); + $domains = array(); + $suffixLength = \strlen(self::INTL_DOMAIN_SUFFIX); + + foreach ($this->messages as $domain => $messages) { + if (\strlen($domain) > $suffixLength && false !== $i = strpos($domain, self::INTL_DOMAIN_SUFFIX, -$suffixLength)) { + $domain = substr($domain, 0, $i); + } + $domains[$domain] = $domain; + } + + return array_values($domains); } /** @@ -57,11 +67,23 @@ class MessageCatalogue implements MessageCatalogueInterface, MetadataAwareInterf */ public function all($domain = null) { - if (null === $domain) { - return $this->messages; + if (null !== $domain) { + return ($this->messages[$domain.self::INTL_DOMAIN_SUFFIX] ?? array()) + ($this->messages[$domain] ?? array()); } - return isset($this->messages[$domain]) ? $this->messages[$domain] : array(); + $allMessages = array(); + $suffixLength = \strlen(self::INTL_DOMAIN_SUFFIX); + + foreach ($this->messages as $domain => $messages) { + if (\strlen($domain) > $suffixLength && false !== $i = strpos($domain, self::INTL_DOMAIN_SUFFIX, -$suffixLength)) { + $domain = substr($domain, 0, $i); + $allMessages[$domain] = $messages + ($allMessages[$domain] ?? array()); + } else { + $allMessages[$domain] = ($allMessages[$domain] ?? array()) + $messages; + } + } + + return $allMessages; } /** @@ -77,7 +99,7 @@ class MessageCatalogue implements MessageCatalogueInterface, MetadataAwareInterf */ public function has($id, $domain = 'messages') { - if (isset($this->messages[$domain][$id])) { + if (isset($this->messages[$domain][$id]) || isset($this->messages[$domain.self::INTL_DOMAIN_SUFFIX][$id])) { return true; } @@ -93,7 +115,7 @@ class MessageCatalogue implements MessageCatalogueInterface, MetadataAwareInterf */ public function defines($id, $domain = 'messages') { - return isset($this->messages[$domain][$id]); + return isset($this->messages[$domain][$id]) || isset($this->messages[$domain.self::INTL_DOMAIN_SUFFIX][$id]); } /** @@ -101,6 +123,10 @@ class MessageCatalogue implements MessageCatalogueInterface, MetadataAwareInterf */ public function get($id, $domain = 'messages') { + if (isset($this->messages[$domain.self::INTL_DOMAIN_SUFFIX][$id])) { + return $this->messages[$domain.self::INTL_DOMAIN_SUFFIX][$id]; + } + if (isset($this->messages[$domain][$id])) { return $this->messages[$domain][$id]; } @@ -117,7 +143,7 @@ class MessageCatalogue implements MessageCatalogueInterface, MetadataAwareInterf */ public function replace($messages, $domain = 'messages') { - $this->messages[$domain] = array(); + unset($this->messages[$domain], $this->messages[$domain.self::INTL_DOMAIN_SUFFIX]); $this->add($messages, $domain); } @@ -144,6 +170,10 @@ class MessageCatalogue implements MessageCatalogueInterface, MetadataAwareInterf } foreach ($catalogue->all() as $domain => $messages) { + if ($intlMessages = $catalogue->all($domain.self::INTL_DOMAIN_SUFFIX)) { + $this->add($intlMessages, $domain.self::INTL_DOMAIN_SUFFIX); + $messages = array_diff_key($messages, $intlMessages); + } $this->add($messages, $domain); } diff --git a/vendor/symfony/translation/MessageCatalogueInterface.php b/vendor/symfony/translation/MessageCatalogueInterface.php index e0dbb2bd9..f3d3f5ea9 100644 --- a/vendor/symfony/translation/MessageCatalogueInterface.php +++ b/vendor/symfony/translation/MessageCatalogueInterface.php @@ -20,6 +20,8 @@ use Symfony\Component\Config\Resource\ResourceInterface; */ interface MessageCatalogueInterface { + const INTL_DOMAIN_SUFFIX = '+intl-icu'; + /** * Gets the catalogue locale. * diff --git a/vendor/symfony/translation/MessageSelector.php b/vendor/symfony/translation/MessageSelector.php index 5de171c5f..06639417b 100644 --- a/vendor/symfony/translation/MessageSelector.php +++ b/vendor/symfony/translation/MessageSelector.php @@ -11,6 +11,8 @@ namespace Symfony\Component\Translation; +@trigger_error(sprintf('The "%s" class is deprecated since Symfony 4.2, use IdentityTranslator instead.', MessageSelector::class), E_USER_DEPRECATED); + use Symfony\Component\Translation\Exception\InvalidArgumentException; /** @@ -18,6 +20,8 @@ use Symfony\Component\Translation\Exception\InvalidArgumentException; * * @author Fabien Potencier * @author Bernhard Schussek + * + * @deprecated since Symfony 4.2, use IdentityTranslator instead. */ class MessageSelector { @@ -39,9 +43,9 @@ class MessageSelector * The two methods can also be mixed: * {0} There are no apples|one: There is one apple|more: There are %count% apples * - * @param string $message The message being translated - * @param int $number The number of items represented for the message - * @param string $locale The locale to use for choosing + * @param string $message The message being translated + * @param int|float $number The number of items represented for the message + * @param string $locale The locale to use for choosing * * @return string * diff --git a/vendor/symfony/translation/PluralizationRules.php b/vendor/symfony/translation/PluralizationRules.php index 3aca0ba96..362f6a1f1 100644 --- a/vendor/symfony/translation/PluralizationRules.php +++ b/vendor/symfony/translation/PluralizationRules.php @@ -15,6 +15,8 @@ namespace Symfony\Component\Translation; * Returns the plural rules for a given locale. * * @author Fabien Potencier + * + * @deprecated since Symfony 4.2, use IdentityTranslator instead */ class PluralizationRules { @@ -28,8 +30,12 @@ class PluralizationRules * * @return int The plural position */ - public static function get($number, $locale) + public static function get($number, $locale/*, bool $triggerDeprecation = true*/) { + if (3 > \func_num_args() || \func_get_arg(2)) { + @trigger_error(sprintf('The "%s" class is deprecated since Symfony 4.2.', __CLASS__), E_USER_DEPRECATED); + } + if ('pt_BR' === $locale) { // temporary set a locale for brazilian $locale = 'xbr'; @@ -196,6 +202,8 @@ class PluralizationRules */ public static function set(callable $rule, $locale) { + @trigger_error(sprintf('The "%s" class is deprecated since Symfony 4.2.', __CLASS__), E_USER_DEPRECATED); + if ('pt_BR' === $locale) { // temporary set a locale for brazilian $locale = 'xbr'; diff --git a/vendor/symfony/translation/Resources/data/parents.json b/vendor/symfony/translation/Resources/data/parents.json new file mode 100644 index 000000000..09709d230 --- /dev/null +++ b/vendor/symfony/translation/Resources/data/parents.json @@ -0,0 +1,136 @@ +{ + "az_Cyrl": "root", + "bs_Cyrl": "root", + "en_150": "en_001", + "en_AG": "en_001", + "en_AI": "en_001", + "en_AT": "en_150", + "en_AU": "en_001", + "en_BB": "en_001", + "en_BE": "en_001", + "en_BM": "en_001", + "en_BS": "en_001", + "en_BW": "en_001", + "en_BZ": "en_001", + "en_CA": "en_001", + "en_CC": "en_001", + "en_CH": "en_150", + "en_CK": "en_001", + "en_CM": "en_001", + "en_CX": "en_001", + "en_CY": "en_001", + "en_DE": "en_150", + "en_DG": "en_001", + "en_DK": "en_150", + "en_DM": "en_001", + "en_ER": "en_001", + "en_FI": "en_150", + "en_FJ": "en_001", + "en_FK": "en_001", + "en_FM": "en_001", + "en_GB": "en_001", + "en_GD": "en_001", + "en_GG": "en_001", + "en_GH": "en_001", + "en_GI": "en_001", + "en_GM": "en_001", + "en_GY": "en_001", + "en_HK": "en_001", + "en_IE": "en_001", + "en_IL": "en_001", + "en_IM": "en_001", + "en_IN": "en_001", + "en_IO": "en_001", + "en_JE": "en_001", + "en_JM": "en_001", + "en_KE": "en_001", + "en_KI": "en_001", + "en_KN": "en_001", + "en_KY": "en_001", + "en_LC": "en_001", + "en_LR": "en_001", + "en_LS": "en_001", + "en_MG": "en_001", + "en_MO": "en_001", + "en_MS": "en_001", + "en_MT": "en_001", + "en_MU": "en_001", + "en_MW": "en_001", + "en_MY": "en_001", + "en_NA": "en_001", + "en_NF": "en_001", + "en_NG": "en_001", + "en_NL": "en_150", + "en_NR": "en_001", + "en_NU": "en_001", + "en_NZ": "en_001", + "en_PG": "en_001", + "en_PH": "en_001", + "en_PK": "en_001", + "en_PN": "en_001", + "en_PW": "en_001", + "en_RW": "en_001", + "en_SB": "en_001", + "en_SC": "en_001", + "en_SD": "en_001", + "en_SE": "en_150", + "en_SG": "en_001", + "en_SH": "en_001", + "en_SI": "en_150", + "en_SL": "en_001", + "en_SS": "en_001", + "en_SX": "en_001", + "en_SZ": "en_001", + "en_TC": "en_001", + "en_TK": "en_001", + "en_TO": "en_001", + "en_TT": "en_001", + "en_TV": "en_001", + "en_TZ": "en_001", + "en_UG": "en_001", + "en_VC": "en_001", + "en_VG": "en_001", + "en_VU": "en_001", + "en_WS": "en_001", + "en_ZA": "en_001", + "en_ZM": "en_001", + "en_ZW": "en_001", + "es_AR": "es_419", + "es_BO": "es_419", + "es_BR": "es_419", + "es_BZ": "es_419", + "es_CL": "es_419", + "es_CO": "es_419", + "es_CR": "es_419", + "es_CU": "es_419", + "es_DO": "es_419", + "es_EC": "es_419", + "es_GT": "es_419", + "es_HN": "es_419", + "es_MX": "es_419", + "es_NI": "es_419", + "es_PA": "es_419", + "es_PE": "es_419", + "es_PR": "es_419", + "es_PY": "es_419", + "es_SV": "es_419", + "es_US": "es_419", + "es_UY": "es_419", + "es_VE": "es_419", + "pa_Arab": "root", + "pt_AO": "pt_PT", + "pt_CH": "pt_PT", + "pt_CV": "pt_PT", + "pt_GQ": "pt_PT", + "pt_GW": "pt_PT", + "pt_LU": "pt_PT", + "pt_MO": "pt_PT", + "pt_MZ": "pt_PT", + "pt_ST": "pt_PT", + "pt_TL": "pt_PT", + "sr_Latn": "root", + "uz_Arab": "root", + "uz_Cyrl": "root", + "zh_Hant": "root", + "zh_Hant_MO": "zh_Hant_HK" +} diff --git a/vendor/symfony/translation/Resources/schemas/xliff-core-1.2-strict.xsd b/vendor/symfony/translation/Resources/schemas/xliff-core-1.2-strict.xsd index 4102d6472..dface628c 100644 --- a/vendor/symfony/translation/Resources/schemas/xliff-core-1.2-strict.xsd +++ b/vendor/symfony/translation/Resources/schemas/xliff-core-1.2-strict.xsd @@ -30,7 +30,7 @@ Jan-10-2006 --> - + diff --git a/vendor/symfony/translation/Loader/schema/dic/xliff-core/xliff-core-2.0.xsd b/vendor/symfony/translation/Resources/schemas/xliff-core-2.0.xsd similarity index 100% rename from vendor/symfony/translation/Loader/schema/dic/xliff-core/xliff-core-2.0.xsd rename to vendor/symfony/translation/Resources/schemas/xliff-core-2.0.xsd diff --git a/vendor/symfony/translation/Loader/schema/dic/xliff-core/xml.xsd b/vendor/symfony/translation/Resources/schemas/xml.xsd similarity index 100% rename from vendor/symfony/translation/Loader/schema/dic/xliff-core/xml.xsd rename to vendor/symfony/translation/Resources/schemas/xml.xsd diff --git a/vendor/symfony/translation/Tests/Catalogue/MergeOperationTest.php b/vendor/symfony/translation/Tests/Catalogue/MergeOperationTest.php index 8b51c15da..9a6884788 100644 --- a/vendor/symfony/translation/Tests/Catalogue/MergeOperationTest.php +++ b/vendor/symfony/translation/Tests/Catalogue/MergeOperationTest.php @@ -53,6 +53,20 @@ class MergeOperationTest extends AbstractOperationTest ); } + public function testGetResultFromIntlDomain() + { + $this->assertEquals( + new MessageCatalogue('en', array( + 'messages' => array('a' => 'old_a', 'b' => 'old_b'), + 'messages+intl-icu' => array('d' => 'old_d', 'c' => 'new_c'), + )), + $this->createOperation( + new MessageCatalogue('en', array('messages' => array('a' => 'old_a', 'b' => 'old_b'), 'messages+intl-icu' => array('d' => 'old_d'))), + new MessageCatalogue('en', array('messages+intl-icu' => array('a' => 'new_a', 'c' => 'new_c'))) + )->getResult() + ); + } + public function testGetResultWithMetadata() { $leftCatalogue = new MessageCatalogue('en', array('messages' => array('a' => 'old_a', 'b' => 'old_b'))); diff --git a/vendor/symfony/translation/Tests/Catalogue/TargetOperationTest.php b/vendor/symfony/translation/Tests/Catalogue/TargetOperationTest.php index 271d17fb8..83b0550d4 100644 --- a/vendor/symfony/translation/Tests/Catalogue/TargetOperationTest.php +++ b/vendor/symfony/translation/Tests/Catalogue/TargetOperationTest.php @@ -53,6 +53,20 @@ class TargetOperationTest extends AbstractOperationTest ); } + public function testGetResultFromIntlDomain() + { + $this->assertEquals( + new MessageCatalogue('en', array( + 'messages' => array('a' => 'old_a'), + 'messages+intl-icu' => array('c' => 'new_c'), + )), + $this->createOperation( + new MessageCatalogue('en', array('messages' => array('a' => 'old_a'), 'messages+intl-icu' => array('b' => 'old_b'))), + new MessageCatalogue('en', array('messages' => array('a' => 'new_a'), 'messages+intl-icu' => array('c' => 'new_c'))) + )->getResult() + ); + } + public function testGetResultWithMetadata() { $leftCatalogue = new MessageCatalogue('en', array('messages' => array('a' => 'old_a', 'b' => 'old_b'))); diff --git a/vendor/symfony/translation/Tests/Command/XliffLintCommandTest.php b/vendor/symfony/translation/Tests/Command/XliffLintCommandTest.php index e37600c3e..758ac981a 100644 --- a/vendor/symfony/translation/Tests/Command/XliffLintCommandTest.php +++ b/vendor/symfony/translation/Tests/Command/XliffLintCommandTest.php @@ -40,6 +40,38 @@ class XliffLintCommandTest extends TestCase $this->assertContains('OK', trim($tester->getDisplay())); } + public function testLintCorrectFiles() + { + $tester = $this->createCommandTester(); + $filename1 = $this->createFile(); + $filename2 = $this->createFile(); + + $tester->execute( + array('filename' => array($filename1, $filename2)), + array('verbosity' => OutputInterface::VERBOSITY_VERBOSE, 'decorated' => false) + ); + + $this->assertEquals(0, $tester->getStatusCode(), 'Returns 0 in case of success'); + $this->assertContains('OK', trim($tester->getDisplay())); + } + + /** + * @dataProvider provideStrictFilenames + */ + public function testStrictFilenames($requireStrictFileNames, $fileNamePattern, $targetLanguage, $mustFail) + { + $tester = $this->createCommandTester($requireStrictFileNames); + $filename = $this->createFile('note', $targetLanguage, $fileNamePattern); + + $tester->execute( + array('filename' => $filename), + array('verbosity' => OutputInterface::VERBOSITY_VERBOSE, 'decorated' => false) + ); + + $this->assertEquals($mustFail ? 1 : 0, $tester->getStatusCode()); + $this->assertContains($mustFail ? '[WARNING] 0 XLIFF files have valid syntax and 1 contain errors.' : '[OK] All 1 XLIFF files contain valid syntax.', $tester->getDisplay()); + } + public function testLintIncorrectXmlSyntax() { $tester = $this->createCommandTester(); @@ -59,7 +91,7 @@ class XliffLintCommandTest extends TestCase $tester->execute(array('filename' => $filename), array('decorated' => false)); $this->assertEquals(1, $tester->getStatusCode(), 'Returns 1 in case of error'); - $this->assertContains('There is a mismatch between the file extension ("en.xlf") and the "es" value used in the "target-language" attribute of the file.', trim($tester->getDisplay())); + $this->assertContains('There is a mismatch between the language included in the file name ("messages.en.xlf") and the "es" value used in the "target-language" attribute of the file.', trim($tester->getDisplay())); } /** @@ -102,7 +134,7 @@ EOF; /** * @return string Path to the new file */ - private function createFile($sourceContent = 'note', $targetLanguage = 'en') + private function createFile($sourceContent = 'note', $targetLanguage = 'en', $fileNamePattern = 'messages.%locale%.xlf') { $xliffContent = << @@ -118,7 +150,7 @@ EOF; XLIFF; - $filename = sprintf('%s/translation-xliff-lint-test/messages.en.xlf', sys_get_temp_dir()); + $filename = sprintf('%s/translation-xliff-lint-test/%s', sys_get_temp_dir(), str_replace('%locale%', 'en', $fileNamePattern)); file_put_contents($filename, $xliffContent); $this->files[] = $filename; @@ -129,11 +161,11 @@ XLIFF; /** * @return CommandTester */ - private function createCommandTester($application = null) + private function createCommandTester($requireStrictFileNames = true, $application = null) { if (!$application) { $application = new Application(); - $application->add(new XliffLintCommand()); + $application->add(new XliffLintCommand(null, null, null, $requireStrictFileNames)); } $command = $application->find('lint:xliff'); @@ -160,4 +192,16 @@ XLIFF; } rmdir(sys_get_temp_dir().'/translation-xliff-lint-test'); } + + public function provideStrictFilenames() + { + yield array(false, 'messages.%locale%.xlf', 'en', false); + yield array(false, 'messages.%locale%.xlf', 'es', true); + yield array(false, '%locale%.messages.xlf', 'en', false); + yield array(false, '%locale%.messages.xlf', 'es', true); + yield array(true, 'messages.%locale%.xlf', 'en', false); + yield array(true, 'messages.%locale%.xlf', 'es', true); + yield array(true, '%locale%.messages.xlf', 'en', true); + yield array(true, '%locale%.messages.xlf', 'es', true); + } } diff --git a/vendor/symfony/translation/Tests/DataCollectorTranslatorTest.php b/vendor/symfony/translation/Tests/DataCollectorTranslatorTest.php index 1cdd33b39..19e056c12 100644 --- a/vendor/symfony/translation/Tests/DataCollectorTranslatorTest.php +++ b/vendor/symfony/translation/Tests/DataCollectorTranslatorTest.php @@ -25,7 +25,7 @@ class DataCollectorTranslatorTest extends TestCase $collector->trans('foo'); $collector->trans('bar'); - $collector->transChoice('choice', 0); + $collector->trans('choice', array('%count%' => 0)); $collector->trans('bar_ru'); $collector->trans('bar_ru', array('foo' => 'bar')); @@ -54,7 +54,7 @@ class DataCollectorTranslatorTest extends TestCase 'locale' => 'en', 'domain' => 'messages', 'state' => DataCollectorTranslator::MESSAGE_MISSING, - 'parameters' => array(), + 'parameters' => array('%count%' => 0), 'transChoiceNumber' => 0, ); $expectedMessages[] = array( @@ -79,6 +79,30 @@ class DataCollectorTranslatorTest extends TestCase $this->assertEquals($expectedMessages, $collector->getCollectedMessages()); } + /** + * @group legacy + */ + public function testCollectMessagesTransChoice() + { + $collector = $this->createCollector(); + $collector->setFallbackLocales(array('fr', 'ru')); + $collector->transChoice('choice', 0); + + $expectedMessages = array(); + + $expectedMessages[] = array( + 'id' => 'choice', + 'translation' => 'choice', + 'locale' => 'en', + 'domain' => 'messages', + 'state' => DataCollectorTranslator::MESSAGE_MISSING, + 'parameters' => array('%count%' => 0), + 'transChoiceNumber' => 0, + ); + + $this->assertEquals($expectedMessages, $collector->getCollectedMessages()); + } + private function createCollector() { $translator = new Translator('en'); diff --git a/vendor/symfony/translation/Tests/Dumper/FileDumperTest.php b/vendor/symfony/translation/Tests/Dumper/FileDumperTest.php index d1524d6e5..908f22d74 100644 --- a/vendor/symfony/translation/Tests/Dumper/FileDumperTest.php +++ b/vendor/symfony/translation/Tests/Dumper/FileDumperTest.php @@ -32,6 +32,30 @@ class FileDumperTest extends TestCase @unlink($tempDir.'/messages.en.concrete'); } + public function testDumpIntl() + { + $tempDir = sys_get_temp_dir(); + + $catalogue = new MessageCatalogue('en'); + $catalogue->add(array('foo' => 'bar'), 'd1'); + $catalogue->add(array('bar' => 'foo'), 'd1+intl-icu'); + $catalogue->add(array('bar' => 'foo'), 'd2+intl-icu'); + + $dumper = new ConcreteFileDumper(); + @unlink($tempDir.'/d2.en.concrete'); + $dumper->dump($catalogue, array('path' => $tempDir)); + + $this->assertStringEqualsFile($tempDir.'/d1.en.concrete', 'foo=bar'); + @unlink($tempDir.'/d1.en.concrete'); + + $this->assertStringEqualsFile($tempDir.'/d1+intl-icu.en.concrete', 'bar=foo'); + @unlink($tempDir.'/d1+intl-icu.en.concrete'); + + $this->assertFileNotExists($tempDir.'/d2.en.concrete'); + $this->assertStringEqualsFile($tempDir.'/d2+intl-icu.en.concrete', 'bar=foo'); + @unlink($tempDir.'/d2+intl-icu.en.concrete'); + } + public function testDumpCreatesNestedDirectoriesAndFile() { $tempDir = sys_get_temp_dir(); @@ -56,7 +80,7 @@ class ConcreteFileDumper extends FileDumper { public function formatCatalogue(MessageCatalogue $messages, $domain, array $options = array()) { - return ''; + return http_build_query($messages->all($domain), '', '&'); } protected function getExtension() diff --git a/vendor/symfony/translation/Tests/Formatter/IntlFormatterTest.php b/vendor/symfony/translation/Tests/Formatter/IntlFormatterTest.php new file mode 100644 index 000000000..89eaa18f3 --- /dev/null +++ b/vendor/symfony/translation/Tests/Formatter/IntlFormatterTest.php @@ -0,0 +1,96 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Tests\Formatter; + +use Symfony\Component\Translation\Exception\InvalidArgumentException; +use Symfony\Component\Translation\Formatter\IntlFormatter; +use Symfony\Component\Translation\Formatter\IntlFormatterInterface; + +/** + * @requires extension intl + */ +class IntlFormatterTest extends \PHPUnit\Framework\TestCase +{ + /** + * @dataProvider provideDataForFormat + */ + public function testFormat($expected, $message, $arguments) + { + $this->assertEquals($expected, trim((new IntlFormatter())->formatIntl($message, 'en', $arguments))); + } + + public function testInvalidFormat() + { + $this->expectException(InvalidArgumentException::class); + (new IntlFormatter())->formatIntl('{foo', 'en', array(2)); + } + + public function testFormatWithNamedArguments() + { + if (version_compare(INTL_ICU_VERSION, '4.8', '<')) { + $this->markTestSkipped('Format with named arguments can only be run with ICU 4.8 or higher and PHP >= 5.5'); + } + + $chooseMessage = <<<'_MSG_' +{gender_of_host, select, + female {{num_guests, plural, offset:1 + =0 {{host} does not give a party.} + =1 {{host} invites {guest} to her party.} + =2 {{host} invites {guest} and one other person to her party.} + other {{host} invites {guest} as one of the # people invited to her party.}}} + male {{num_guests, plural, offset:1 + =0 {{host} does not give a party.} + =1 {{host} invites {guest} to his party.} + =2 {{host} invites {guest} and one other person to his party.} + other {{host} invites {guest} as one of the # people invited to his party.}}} + other {{num_guests, plural, offset:1 + =0 {{host} does not give a party.} + =1 {{host} invites {guest} to their party.} + =2 {{host} invites {guest} and one other person to their party.} + other {{host} invites {guest} as one of the # people invited to their party.}}}} +_MSG_; + + $message = (new IntlFormatter())->formatIntl($chooseMessage, 'en', array( + 'gender_of_host' => 'male', + 'num_guests' => 10, + 'host' => 'Fabien', + 'guest' => 'Guilherme', + )); + + $this->assertEquals('Fabien invites Guilherme as one of the 9 people invited to his party.', $message); + } + + public function provideDataForFormat() + { + return array( + array( + 'There is one apple', + 'There is one apple', + array(), + ), + array( + '4,560 monkeys on 123 trees make 37.073 monkeys per tree', + '{0,number,integer} monkeys on {1,number,integer} trees make {2,number} monkeys per tree', + array(4560, 123, 4560 / 123), + ), + ); + } + + public function testPercentsAndBracketsAreTrimmed() + { + $formatter = new IntlFormatter(); + $this->assertInstanceof(IntlFormatterInterface::class, $formatter); + $this->assertSame('Hello Fab', $formatter->formatIntl('Hello {name}', 'en', array('name' => 'Fab'))); + $this->assertSame('Hello Fab', $formatter->formatIntl('Hello {name}', 'en', array('%name%' => 'Fab'))); + $this->assertSame('Hello Fab', $formatter->formatIntl('Hello {name}', 'en', array('{{ name }}' => 'Fab'))); + } +} diff --git a/vendor/symfony/translation/Tests/Formatter/MessageFormatterTest.php b/vendor/symfony/translation/Tests/Formatter/MessageFormatterTest.php index 1fa736e7e..f4c96aa12 100644 --- a/vendor/symfony/translation/Tests/Formatter/MessageFormatterTest.php +++ b/vendor/symfony/translation/Tests/Formatter/MessageFormatterTest.php @@ -26,6 +26,7 @@ class MessageFormatterTest extends TestCase /** * @dataProvider getTransChoiceMessages + * @group legacy */ public function testFormatPlural($expected, $message, $number, $parameters) { diff --git a/vendor/symfony/translation/Tests/IdentityTranslatorTest.php b/vendor/symfony/translation/Tests/IdentityTranslatorTest.php index 78288da40..be0a548aa 100644 --- a/vendor/symfony/translation/Tests/IdentityTranslatorTest.php +++ b/vendor/symfony/translation/Tests/IdentityTranslatorTest.php @@ -11,86 +11,13 @@ namespace Symfony\Component\Translation\Tests; -use PHPUnit\Framework\TestCase; -use Symfony\Component\Intl\Util\IntlTestHelper; use Symfony\Component\Translation\IdentityTranslator; +use Symfony\Contracts\Tests\Translation\TranslatorTest; -class IdentityTranslatorTest extends TestCase +class IdentityTranslatorTest extends TranslatorTest { - /** - * @dataProvider getTransTests - */ - public function testTrans($expected, $id, $parameters) + public function getTranslator() { - $translator = new IdentityTranslator(); - - $this->assertEquals($expected, $translator->trans($id, $parameters)); - } - - /** - * @dataProvider getTransChoiceTests - */ - public function testTransChoiceWithExplicitLocale($expected, $id, $number, $parameters) - { - $translator = new IdentityTranslator(); - $translator->setLocale('en'); - - $this->assertEquals($expected, $translator->transChoice($id, $number, $parameters)); - } - - /** - * @dataProvider getTransChoiceTests - */ - public function testTransChoiceWithDefaultLocale($expected, $id, $number, $parameters) - { - \Locale::setDefault('en'); - - $translator = new IdentityTranslator(); - - $this->assertEquals($expected, $translator->transChoice($id, $number, $parameters)); - } - - public function testGetSetLocale() - { - $translator = new IdentityTranslator(); - $translator->setLocale('en'); - - $this->assertEquals('en', $translator->getLocale()); - } - - public function testGetLocaleReturnsDefaultLocaleIfNotSet() - { - // in order to test with "pt_BR" - IntlTestHelper::requireFullIntl($this, false); - - $translator = new IdentityTranslator(); - - \Locale::setDefault('en'); - $this->assertEquals('en', $translator->getLocale()); - - \Locale::setDefault('pt_BR'); - $this->assertEquals('pt_BR', $translator->getLocale()); - } - - public function getTransTests() - { - return array( - array('Symfony is great!', 'Symfony is great!', array()), - array('Symfony is awesome!', 'Symfony is %what%!', array('%what%' => 'awesome')), - ); - } - - public function getTransChoiceTests() - { - return array( - array('There are no apples', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 0, array('%count%' => 0)), - array('There is one apple', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 1, array('%count%' => 1)), - array('There are 10 apples', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 10, array('%count%' => 10)), - array('There are 0 apples', 'There is 1 apple|There are %count% apples', 0, array('%count%' => 0)), - array('There is 1 apple', 'There is 1 apple|There are %count% apples', 1, array('%count%' => 1)), - array('There are 10 apples', 'There is 1 apple|There are %count% apples', 10, array('%count%' => 10)), - // custom validation messages may be coded with a fixed value - array('There are 2 apples', 'There are 2 apples', 2, array('%count%' => 2)), - ); + return new IdentityTranslator(); } } diff --git a/vendor/symfony/translation/Tests/IntervalTest.php b/vendor/symfony/translation/Tests/IntervalTest.php index 99b209a70..a8dd18caa 100644 --- a/vendor/symfony/translation/Tests/IntervalTest.php +++ b/vendor/symfony/translation/Tests/IntervalTest.php @@ -14,6 +14,9 @@ namespace Symfony\Component\Translation\Tests; use PHPUnit\Framework\TestCase; use Symfony\Component\Translation\Interval; +/** + * @group legacy + */ class IntervalTest extends TestCase { /** diff --git a/vendor/symfony/translation/Tests/Loader/XliffFileLoaderTest.php b/vendor/symfony/translation/Tests/Loader/XliffFileLoaderTest.php index 94406fd5f..c6958486c 100644 --- a/vendor/symfony/translation/Tests/Loader/XliffFileLoaderTest.php +++ b/vendor/symfony/translation/Tests/Loader/XliffFileLoaderTest.php @@ -66,7 +66,7 @@ class XliffFileLoaderTest extends TestCase $loader = new XliffFileLoader(); $catalogue = $loader->load(__DIR__.'/../fixtures/resname.xlf', 'en', 'domain1'); - $this->assertEquals(array('foo' => 'bar', 'bar' => 'baz', 'baz' => 'foo'), $catalogue->all('domain1')); + $this->assertEquals(array('foo' => 'bar', 'bar' => 'baz', 'baz' => 'foo', 'qux' => 'qux source'), $catalogue->all('domain1')); } public function testIncompleteResource() diff --git a/vendor/symfony/translation/Tests/LoggingTranslatorTest.php b/vendor/symfony/translation/Tests/LoggingTranslatorTest.php index 022379e93..0e43cbecf 100644 --- a/vendor/symfony/translation/Tests/LoggingTranslatorTest.php +++ b/vendor/symfony/translation/Tests/LoggingTranslatorTest.php @@ -21,17 +21,19 @@ class LoggingTranslatorTest extends TestCase public function testTransWithNoTranslationIsLogged() { $logger = $this->getMockBuilder('Psr\Log\LoggerInterface')->getMock(); - $logger->expects($this->exactly(2)) + $logger->expects($this->exactly(1)) ->method('warning') ->with('Translation not found.') ; $translator = new Translator('ar'); $loggableTranslator = new LoggingTranslator($translator, $logger); - $loggableTranslator->transChoice('some_message2', 10, array('%count%' => 10)); $loggableTranslator->trans('bar'); } + /** + * @group legacy + */ public function testTransChoiceFallbackIsLogged() { $logger = $this->getMockBuilder('Psr\Log\LoggerInterface')->getMock(); @@ -47,4 +49,20 @@ class LoggingTranslatorTest extends TestCase $loggableTranslator = new LoggingTranslator($translator, $logger); $loggableTranslator->transChoice('some_message2', 10, array('%count%' => 10)); } + + /** + * @group legacy + */ + public function testTransChoiceWithNoTranslationIsLogged() + { + $logger = $this->getMockBuilder('Psr\Log\LoggerInterface')->getMock(); + $logger->expects($this->exactly(1)) + ->method('warning') + ->with('Translation not found.') + ; + + $translator = new Translator('ar'); + $loggableTranslator = new LoggingTranslator($translator, $logger); + $loggableTranslator->transChoice('some_message2', 10, array('%count%' => 10)); + } } diff --git a/vendor/symfony/translation/Tests/MessageCatalogueTest.php b/vendor/symfony/translation/Tests/MessageCatalogueTest.php index 1ab824696..3339f3db2 100644 --- a/vendor/symfony/translation/Tests/MessageCatalogueTest.php +++ b/vendor/symfony/translation/Tests/MessageCatalogueTest.php @@ -25,9 +25,9 @@ class MessageCatalogueTest extends TestCase public function testGetDomains() { - $catalogue = new MessageCatalogue('en', array('domain1' => array(), 'domain2' => array())); + $catalogue = new MessageCatalogue('en', array('domain1' => array(), 'domain2' => array(), 'domain2+intl-icu' => array(), 'domain3+intl-icu' => array())); - $this->assertEquals(array('domain1', 'domain2'), $catalogue->getDomains()); + $this->assertEquals(array('domain1', 'domain2', 'domain3'), $catalogue->getDomains()); } public function testAll() @@ -37,24 +37,43 @@ class MessageCatalogueTest extends TestCase $this->assertEquals(array('foo' => 'foo'), $catalogue->all('domain1')); $this->assertEquals(array(), $catalogue->all('domain88')); $this->assertEquals($messages, $catalogue->all()); + + $messages = array('domain1+intl-icu' => array('foo' => 'bar')) + $messages + array( + 'domain2+intl-icu' => array('bar' => 'foo'), + 'domain3+intl-icu' => array('biz' => 'biz'), + ); + $catalogue = new MessageCatalogue('en', $messages); + + $this->assertEquals(array('foo' => 'bar'), $catalogue->all('domain1')); + $this->assertEquals(array('bar' => 'foo'), $catalogue->all('domain2')); + $this->assertEquals(array('biz' => 'biz'), $catalogue->all('domain3')); + + $messages = array( + 'domain1' => array('foo' => 'bar'), + 'domain2' => array('bar' => 'foo'), + 'domain3' => array('biz' => 'biz'), + ); + $this->assertEquals($messages, $catalogue->all()); } public function testHas() { - $catalogue = new MessageCatalogue('en', array('domain1' => array('foo' => 'foo'), 'domain2' => array('bar' => 'bar'))); + $catalogue = new MessageCatalogue('en', array('domain1' => array('foo' => 'foo'), 'domain2+intl-icu' => array('bar' => 'bar'))); $this->assertTrue($catalogue->has('foo', 'domain1')); + $this->assertTrue($catalogue->has('bar', 'domain2')); $this->assertFalse($catalogue->has('bar', 'domain1')); $this->assertFalse($catalogue->has('foo', 'domain88')); } public function testGetSet() { - $catalogue = new MessageCatalogue('en', array('domain1' => array('foo' => 'foo'), 'domain2' => array('bar' => 'bar'))); + $catalogue = new MessageCatalogue('en', array('domain1' => array('foo' => 'foo'), 'domain2' => array('bar' => 'bar'), 'domain2+intl-icu' => array('bar' => 'foo'))); $catalogue->set('foo1', 'foo1', 'domain1'); $this->assertEquals('foo', $catalogue->get('foo', 'domain1')); $this->assertEquals('foo1', $catalogue->get('foo1', 'domain1')); + $this->assertEquals('foo', $catalogue->get('bar', 'domain2')); } public function testAdd() @@ -75,7 +94,7 @@ class MessageCatalogueTest extends TestCase public function testReplace() { - $catalogue = new MessageCatalogue('en', array('domain1' => array('foo' => 'foo'), 'domain2' => array('bar' => 'bar'))); + $catalogue = new MessageCatalogue('en', array('domain1' => array('foo' => 'foo'), 'domain1+intl-icu' => array('bar' => 'bar'))); $catalogue->replace($messages = array('foo1' => 'foo1'), 'domain1'); $this->assertEquals($messages, $catalogue->all('domain1')); @@ -89,16 +108,18 @@ class MessageCatalogueTest extends TestCase $r1 = $this->getMockBuilder('Symfony\Component\Config\Resource\ResourceInterface')->getMock(); $r1->expects($this->any())->method('__toString')->will($this->returnValue('r1')); - $catalogue = new MessageCatalogue('en', array('domain1' => array('foo' => 'foo'), 'domain2' => array('bar' => 'bar'))); + $catalogue = new MessageCatalogue('en', array('domain1' => array('foo' => 'foo'))); $catalogue->addResource($r); - $catalogue1 = new MessageCatalogue('en', array('domain1' => array('foo1' => 'foo1'))); + $catalogue1 = new MessageCatalogue('en', array('domain1' => array('foo1' => 'foo1'), 'domain2+intl-icu' => array('bar' => 'bar'))); $catalogue1->addResource($r1); $catalogue->addCatalogue($catalogue1); $this->assertEquals('foo', $catalogue->get('foo', 'domain1')); $this->assertEquals('foo1', $catalogue->get('foo1', 'domain1')); + $this->assertEquals('bar', $catalogue->get('bar', 'domain2')); + $this->assertEquals('bar', $catalogue->get('bar', 'domain2+intl-icu')); $this->assertEquals(array($r, $r1), $catalogue->getResources()); } diff --git a/vendor/symfony/translation/Tests/MessageSelectorTest.php b/vendor/symfony/translation/Tests/MessageSelectorTest.php index 42b7e0a3f..5f85c5b23 100644 --- a/vendor/symfony/translation/Tests/MessageSelectorTest.php +++ b/vendor/symfony/translation/Tests/MessageSelectorTest.php @@ -14,6 +14,9 @@ namespace Symfony\Component\Translation\Tests; use PHPUnit\Framework\TestCase; use Symfony\Component\Translation\MessageSelector; +/** + * @group legacy + */ class MessageSelectorTest extends TestCase { /** diff --git a/vendor/symfony/translation/Tests/PluralizationRulesTest.php b/vendor/symfony/translation/Tests/PluralizationRulesTest.php index 5eb6c01f5..0da8757aa 100644 --- a/vendor/symfony/translation/Tests/PluralizationRulesTest.php +++ b/vendor/symfony/translation/Tests/PluralizationRulesTest.php @@ -26,6 +26,8 @@ use Symfony\Component\Translation\PluralizationRules; * The goal to cover all languages is to far fetched so this test case is smaller. * * @author Clemens Tolboom clemens@build2be.nl + * + * @group legacy */ class PluralizationRulesTest extends TestCase { diff --git a/vendor/symfony/translation/Tests/TranslatorCacheTest.php b/vendor/symfony/translation/Tests/TranslatorCacheTest.php index 3e71ae74e..13ae9cb10 100644 --- a/vendor/symfony/translation/Tests/TranslatorCacheTest.php +++ b/vendor/symfony/translation/Tests/TranslatorCacheTest.php @@ -24,7 +24,7 @@ class TranslatorCacheTest extends TestCase protected function setUp() { - $this->tmpDir = sys_get_temp_dir().'/sf2_translation'; + $this->tmpDir = sys_get_temp_dir().'/sf_translation'; $this->deleteTmpDir(); } @@ -66,13 +66,17 @@ class TranslatorCacheTest extends TestCase $translator = new Translator($locale, null, $this->tmpDir, $debug); $translator->addLoader($format, new ArrayLoader()); $translator->addResource($format, array($msgid => 'OK'), $locale); + $translator->addResource($format, array($msgid.'+intl' => 'OK'), $locale, 'messages+intl-icu'); $translator->trans($msgid); + $translator->trans($msgid.'+intl', array(), 'messages+intl-icu'); // Try again and see we get a valid result whilst no loader can be used $translator = new Translator($locale, null, $this->tmpDir, $debug); $translator->addLoader($format, $this->createFailingLoader()); $translator->addResource($format, array($msgid => 'OK'), $locale); + $translator->addResource($format, array($msgid.'+intl' => 'OK'), $locale, 'messages+intl-icu'); $this->assertEquals('OK', $translator->trans($msgid), '-> caching does not work in '.($debug ? 'debug' : 'production')); + $this->assertEquals('OK', $translator->trans($msgid.'+intl', array(), 'messages+intl-icu')); } public function testCatalogueIsReloadedWhenResourcesAreNoLongerFresh() @@ -212,6 +216,7 @@ class TranslatorCacheTest extends TestCase $translator->addResource('array', array('foo' => 'foo (a)'), 'a'); $translator->addResource('array', array('foo' => 'foo (b)'), 'b'); $translator->addResource('array', array('bar' => 'bar (b)'), 'b'); + $translator->addResource('array', array('baz' => 'baz (b)'), 'b', 'messages+intl-icu'); $catalogue = $translator->getCatalogue('a'); $this->assertFalse($catalogue->defines('bar')); // Sure, the "a" catalogue does not contain that message. @@ -230,12 +235,14 @@ class TranslatorCacheTest extends TestCase $translator->addResource('array', array('foo' => 'foo (a)'), 'a'); $translator->addResource('array', array('foo' => 'foo (b)'), 'b'); $translator->addResource('array', array('bar' => 'bar (b)'), 'b'); + $translator->addResource('array', array('baz' => 'baz (b)'), 'b', 'messages+intl-icu'); $catalogue = $translator->getCatalogue('a'); $this->assertFalse($catalogue->defines('bar')); $fallback = $catalogue->getFallbackCatalogue(); $this->assertTrue($fallback->defines('foo')); + $this->assertTrue($fallback->defines('baz', 'messages+intl-icu')); } public function testRefreshCacheWhenResourcesAreNoLongerFresh() diff --git a/vendor/symfony/translation/Tests/TranslatorTest.php b/vendor/symfony/translation/Tests/TranslatorTest.php index 3e54839f7..bbc8ce2d2 100644 --- a/vendor/symfony/translation/Tests/TranslatorTest.php +++ b/vendor/symfony/translation/Tests/TranslatorTest.php @@ -234,6 +234,42 @@ class TranslatorTest extends TestCase $this->assertEquals('bar', $translator->trans('foo', array(), 'resources')); } + public function testTransWithIcuFallbackLocale() + { + $translator = new Translator('en_GB'); + $translator->addLoader('array', new ArrayLoader()); + $translator->addResource('array', array('foo' => 'foofoo'), 'en_GB'); + $translator->addResource('array', array('bar' => 'foobar'), 'en_001'); + $translator->addResource('array', array('baz' => 'foobaz'), 'en'); + $this->assertSame('foofoo', $translator->trans('foo')); + $this->assertSame('foobar', $translator->trans('bar')); + $this->assertSame('foobaz', $translator->trans('baz')); + } + + public function testTransWithIcuVariantFallbackLocale() + { + $translator = new Translator('en_GB_scouse'); + $translator->addLoader('array', new ArrayLoader()); + $translator->addResource('array', array('foo' => 'foofoo'), 'en_GB_scouse'); + $translator->addResource('array', array('bar' => 'foobar'), 'en_GB'); + $translator->addResource('array', array('baz' => 'foobaz'), 'en_001'); + $translator->addResource('array', array('qux' => 'fooqux'), 'en'); + $this->assertSame('foofoo', $translator->trans('foo')); + $this->assertSame('foobar', $translator->trans('bar')); + $this->assertSame('foobaz', $translator->trans('baz')); + $this->assertSame('fooqux', $translator->trans('qux')); + } + + public function testTransWithIcuRootFallbackLocale() + { + $translator = new Translator('az_Cyrl'); + $translator->addLoader('array', new ArrayLoader()); + $translator->addResource('array', array('foo' => 'foofoo'), 'az_Cyrl'); + $translator->addResource('array', array('bar' => 'foobar'), 'az'); + $this->assertSame('foofoo', $translator->trans('foo')); + $this->assertSame('bar', $translator->trans('bar')); + } + public function testTransWithFallbackLocaleBis() { $translator = new Translator('en_US'); @@ -357,6 +393,7 @@ class TranslatorTest extends TestCase /** * @dataProvider getTransChoiceTests + * @group legacy */ public function testTransChoice($expected, $id, $translation, $number, $parameters, $locale, $domain) { @@ -370,6 +407,7 @@ class TranslatorTest extends TestCase /** * @dataProvider getInvalidLocalesTests * @expectedException \Symfony\Component\Translation\Exception\InvalidArgumentException + * @group legacy */ public function testTransChoiceInvalidLocale($locale) { @@ -382,6 +420,7 @@ class TranslatorTest extends TestCase /** * @dataProvider getValidLocalesTests + * @group legacy */ public function testTransChoiceValidLocale($locale) { @@ -463,7 +502,7 @@ class TranslatorTest extends TestCase array('Il y a 0 pomme', new StringClass('{0} There are no appless|{1} There is one apple|]1,Inf] There is %count% apples'), '[0,1] Il y a %count% pomme|]1,Inf] Il y a %count% pommes', 0, array(), 'fr', ''), // Override %count% with a custom value - array('Il y a quelques pommes', 'one: There is one apple|more: There are %count% apples', 'one: Il y a %count% pomme|more: Il y a %count% pommes', 2, array('%count%' => 'quelques'), 'fr', ''), + array('Il y a quelques pommes', 'one: There is one apple|more: There are %count% apples', 'one: Il y a %count% pomme|more: Il y a quelques pommes', 2, array('%count%' => 'quelques'), 'fr', ''), ); } @@ -501,6 +540,24 @@ class TranslatorTest extends TestCase ); } + /** + * @requires extension intl + */ + public function testIntlFormattedDomain() + { + $translator = new Translator('en'); + $translator->addLoader('array', new ArrayLoader()); + + $translator->addResource('array', array('some_message' => 'Hello %name%'), 'en'); + $this->assertSame('Hello Bob', $translator->trans('some_message', array('%name%' => 'Bob'))); + + $translator->addResource('array', array('some_message' => 'Hi {name}'), 'en', 'messages+intl-icu'); + $this->assertSame('Hi Bob', $translator->trans('some_message', array('%name%' => 'Bob'))); + } + + /** + * @group legacy + */ public function testTransChoiceFallback() { $translator = new Translator('ru'); @@ -511,6 +568,9 @@ class TranslatorTest extends TestCase $this->assertEquals('10 things', $translator->transChoice('some_message2', 10, array('%count%' => 10))); } + /** + * @group legacy + */ public function testTransChoiceFallbackBis() { $translator = new Translator('ru'); @@ -521,6 +581,9 @@ class TranslatorTest extends TestCase $this->assertEquals('10 things', $translator->transChoice('some_message2', 10, array('%count%' => 10))); } + /** + * @group legacy + */ public function testTransChoiceFallbackWithNoTranslation() { $translator = new Translator('ru'); diff --git a/vendor/symfony/translation/Tests/fixtures/resname.xlf b/vendor/symfony/translation/Tests/fixtures/resname.xlf index 2df16af94..4fa5c0017 100644 --- a/vendor/symfony/translation/Tests/fixtures/resname.xlf +++ b/vendor/symfony/translation/Tests/fixtures/resname.xlf @@ -14,6 +14,9 @@ baz foo + + qux source + diff --git a/vendor/symfony/translation/Translator.php b/vendor/symfony/translation/Translator.php index 97690410e..7fcb77853 100644 --- a/vendor/symfony/translation/Translator.php +++ b/vendor/symfony/translation/Translator.php @@ -19,14 +19,17 @@ use Symfony\Component\Translation\Exception\LogicException; use Symfony\Component\Translation\Exception\NotFoundResourceException; use Symfony\Component\Translation\Exception\RuntimeException; use Symfony\Component\Translation\Formatter\ChoiceMessageFormatterInterface; +use Symfony\Component\Translation\Formatter\IntlFormatterInterface; use Symfony\Component\Translation\Formatter\MessageFormatter; use Symfony\Component\Translation\Formatter\MessageFormatterInterface; use Symfony\Component\Translation\Loader\LoaderInterface; +use Symfony\Component\Translation\TranslatorInterface as LegacyTranslatorInterface; +use Symfony\Contracts\Translation\TranslatorInterface; /** * @author Fabien Potencier */ -class Translator implements TranslatorInterface, TranslatorBagInterface +class Translator implements LegacyTranslatorInterface, TranslatorInterface, TranslatorBagInterface { /** * @var MessageCatalogueInterface[] @@ -73,6 +76,13 @@ class Translator implements TranslatorInterface, TranslatorBagInterface */ private $configCacheFactory; + /** + * @var array|null + */ + private $parentLocales; + + private $hasIntlFormatter; + /** * @throws InvalidArgumentException If a locale contains invalid characters */ @@ -87,6 +97,7 @@ class Translator implements TranslatorInterface, TranslatorBagInterface $this->formatter = $formatter; $this->cacheDir = $cacheDir; $this->debug = $debug; + $this->hasIntlFormatter = $formatter instanceof IntlFormatterInterface; } public function setConfigCacheFactory(ConfigCacheFactoryInterface $configCacheFactory) @@ -171,7 +182,9 @@ class Translator implements TranslatorInterface, TranslatorBagInterface /** * Gets the fallback locales. * - * @return array $locales The fallback locales + * @internal since Symfony 4.2 + * + * @return array The fallback locales */ public function getFallbackLocales() { @@ -187,14 +200,34 @@ class Translator implements TranslatorInterface, TranslatorBagInterface $domain = 'messages'; } - return $this->formatter->format($this->getCatalogue($locale)->get((string) $id, $domain), $locale, $parameters); + $id = (string) $id; + $catalogue = $this->getCatalogue($locale); + $locale = $catalogue->getLocale(); + while (!$catalogue->defines($id, $domain)) { + if ($cat = $catalogue->getFallbackCatalogue()) { + $catalogue = $cat; + $locale = $catalogue->getLocale(); + } else { + break; + } + } + + if ($this->hasIntlFormatter && $catalogue->defines($id, $domain.MessageCatalogue::INTL_DOMAIN_SUFFIX)) { + return $this->formatter->formatIntl($catalogue->get($id, $domain), $locale, $parameters); + } + + return $this->formatter->format($catalogue->get($id, $domain), $locale, $parameters); } /** * {@inheritdoc} + * + * @deprecated since Symfony 4.2, use the trans() method instead with a %count% parameter */ public function transChoice($id, $number, array $parameters = array(), $domain = null, $locale = null) { + @trigger_error(sprintf('The "%s()" method is deprecated since Symfony 4.2, use the trans() one instead with a "%%count%%" parameter.', __METHOD__), E_USER_DEPRECATED); + if (!$this->formatter instanceof ChoiceMessageFormatterInterface) { throw new LogicException(sprintf('The formatter "%s" does not support plural translations.', \get_class($this->formatter))); } @@ -215,6 +248,10 @@ class Translator implements TranslatorInterface, TranslatorBagInterface } } + if ($this->hasIntlFormatter && $catalogue->defines($id, $domain.MessageCatalogue::INTL_DOMAIN_SUFFIX)) { + return $this->formatter->formatIntl($catalogue->get($id, $domain), $locale, array('%count%' => $number) + $parameters); + } + return $this->formatter->choiceFormat($catalogue->get($id, $domain), $number, $locale, $parameters); } @@ -316,7 +353,7 @@ return \$catalogue; EOF , $locale, - var_export($this->catalogues[$locale]->all(), true), + var_export($this->getAllMessages($this->catalogues[$locale]), true), $fallbackContent ); @@ -342,7 +379,7 @@ EOF , $fallbackSuffix, $fallback, - var_export($fallbackCatalogue->all(), true), + var_export($this->getAllMessages($fallbackCatalogue), true), $currentSuffix, $fallbackSuffix ); @@ -381,7 +418,7 @@ EOF $this->initializeCatalogue($fallback); } - $fallbackCatalogue = new MessageCatalogue($fallback, $this->catalogues[$fallback]->all()); + $fallbackCatalogue = new MessageCatalogue($fallback, $this->getAllMessages($this->catalogues[$fallback])); foreach ($this->catalogues[$fallback]->getResources() as $resource) { $fallbackCatalogue->addResource($resource); } @@ -392,6 +429,10 @@ EOF protected function computeFallbackLocales($locale) { + if (null === $this->parentLocales) { + $parentLocales = \json_decode(\file_get_contents(__DIR__.'/Resources/data/parents.json'), true); + } + $locales = array(); foreach ($this->fallbackLocales as $fallback) { if ($fallback === $locale) { @@ -401,8 +442,20 @@ EOF $locales[] = $fallback; } - if (false !== strrchr($locale, '_')) { - array_unshift($locales, substr($locale, 0, -\strlen(strrchr($locale, '_')))); + while ($locale) { + $parent = $parentLocales[$locale] ?? null; + + if (!$parent && false !== strrchr($locale, '_')) { + $locale = substr($locale, 0, -\strlen(strrchr($locale, '_'))); + } elseif ('root' !== $parent) { + $locale = $parent; + } else { + $locale = null; + } + + if (null !== $locale) { + array_unshift($locales, $locale); + } } return array_unique($locales); @@ -434,4 +487,21 @@ EOF return $this->configCacheFactory; } + + private function getAllMessages(MessageCatalogueInterface $catalogue): array + { + $allMessages = array(); + + foreach ($catalogue->all() as $domain => $messages) { + if ($intlMessages = $catalogue->all($domain.MessageCatalogue::INTL_DOMAIN_SUFFIX)) { + $allMessages[$domain.MessageCatalogue::INTL_DOMAIN_SUFFIX] = $intlMessages; + $messages = array_diff_key($messages, $intlMessages); + } + if ($messages) { + $allMessages[$domain] = $messages; + } + } + + return $allMessages; + } } diff --git a/vendor/symfony/translation/TranslatorInterface.php b/vendor/symfony/translation/TranslatorInterface.php index 9fcfd5bcf..3ecef054b 100644 --- a/vendor/symfony/translation/TranslatorInterface.php +++ b/vendor/symfony/translation/TranslatorInterface.php @@ -12,13 +12,16 @@ namespace Symfony\Component\Translation; use Symfony\Component\Translation\Exception\InvalidArgumentException; +use Symfony\Contracts\Translation\LocaleAwareInterface; /** * TranslatorInterface. * * @author Fabien Potencier + * + * @deprecated since Symfony 4.2, use Symfony\Contracts\Translation\TranslatorInterface instead */ -interface TranslatorInterface +interface TranslatorInterface extends LocaleAwareInterface { /** * Translates the given message. diff --git a/vendor/symfony/translation/Util/ArrayConverter.php b/vendor/symfony/translation/Util/ArrayConverter.php index b98e7ce82..e8b7559df 100644 --- a/vendor/symfony/translation/Util/ArrayConverter.php +++ b/vendor/symfony/translation/Util/ArrayConverter.php @@ -69,7 +69,7 @@ class ArrayConverter $elem = &$elem[$part]; } - if (\is_array($elem) && \count($elem) > 0 && $parentOfElem) { + if ($elem && \is_array($elem) && $parentOfElem) { /* Process next case: * 'foo.bar': 'test1' * 'foo': 'test2' diff --git a/vendor/symfony/translation/Util/XliffUtils.php b/vendor/symfony/translation/Util/XliffUtils.php new file mode 100644 index 000000000..9f024e598 --- /dev/null +++ b/vendor/symfony/translation/Util/XliffUtils.php @@ -0,0 +1,163 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Util; + +use Symfony\Component\Translation\Exception\InvalidArgumentException; +use Symfony\Component\Translation\Exception\InvalidResourceException; + +/** + * Provides some utility methods for XLIFF translation files, such as validating + * their contents according to the XSD schema. + * + * @author Fabien Potencier + */ +class XliffUtils +{ + /** + * Gets xliff file version based on the root "version" attribute. + * + * Defaults to 1.2 for backwards compatibility. + * + * @throws InvalidArgumentException + */ + public static function getVersionNumber(\DOMDocument $dom): string + { + /** @var \DOMNode $xliff */ + foreach ($dom->getElementsByTagName('xliff') as $xliff) { + $version = $xliff->attributes->getNamedItem('version'); + if ($version) { + return $version->nodeValue; + } + + $namespace = $xliff->attributes->getNamedItem('xmlns'); + if ($namespace) { + if (0 !== substr_compare('urn:oasis:names:tc:xliff:document:', $namespace->nodeValue, 0, 34)) { + throw new InvalidArgumentException(sprintf('Not a valid XLIFF namespace "%s"', $namespace)); + } + + return substr($namespace, 34); + } + } + + // Falls back to v1.2 + return '1.2'; + } + + /** + * Validates and parses the given file into a DOMDocument. + * + * @throws InvalidResourceException + */ + public static function validateSchema(\DOMDocument $dom): array + { + $xliffVersion = static::getVersionNumber($dom); + $internalErrors = libxml_use_internal_errors(true); + $disableEntities = libxml_disable_entity_loader(false); + + $isValid = @$dom->schemaValidateSource(self::getSchema($xliffVersion)); + if (!$isValid) { + libxml_disable_entity_loader($disableEntities); + + return self::getXmlErrors($internalErrors); + } + + libxml_disable_entity_loader($disableEntities); + + $dom->normalizeDocument(); + + libxml_clear_errors(); + libxml_use_internal_errors($internalErrors); + + return array(); + } + + public static function getErrorsAsString(array $xmlErrors): string + { + $errorsAsString = ''; + + foreach ($xmlErrors as $error) { + $errorsAsString .= sprintf("[%s %s] %s (in %s - line %d, column %d)\n", + LIBXML_ERR_WARNING === $error['level'] ? 'WARNING' : 'ERROR', + $error['code'], + $error['message'], + $error['file'], + $error['line'], + $error['column'] + ); + } + + return $errorsAsString; + } + + private static function getSchema(string $xliffVersion): string + { + if ('1.2' === $xliffVersion) { + $schemaSource = file_get_contents(__DIR__.'/../Resources/schemas/xliff-core-1.2-strict.xsd'); + $xmlUri = 'http://www.w3.org/2001/xml.xsd'; + } elseif ('2.0' === $xliffVersion) { + $schemaSource = file_get_contents(__DIR__.'/../Resources/schemas/xliff-core-2.0.xsd'); + $xmlUri = 'informativeCopiesOf3rdPartySchemas/w3c/xml.xsd'; + } else { + throw new InvalidArgumentException(sprintf('No support implemented for loading XLIFF version "%s".', $xliffVersion)); + } + + return self::fixXmlLocation($schemaSource, $xmlUri); + } + + /** + * Internally changes the URI of a dependent xsd to be loaded locally. + */ + private static function fixXmlLocation(string $schemaSource, string $xmlUri): string + { + $newPath = str_replace('\\', '/', __DIR__).'/../Resources/schemas/xml.xsd'; + $parts = explode('/', $newPath); + $locationstart = 'file:///'; + if (0 === stripos($newPath, 'phar://')) { + $tmpfile = tempnam(sys_get_temp_dir(), 'symfony'); + if ($tmpfile) { + copy($newPath, $tmpfile); + $parts = explode('/', str_replace('\\', '/', $tmpfile)); + } else { + array_shift($parts); + $locationstart = 'phar:///'; + } + } + + $drive = '\\' === \DIRECTORY_SEPARATOR ? array_shift($parts).'/' : ''; + $newPath = $locationstart.$drive.implode('/', array_map('rawurlencode', $parts)); + + return str_replace($xmlUri, $newPath, $schemaSource); + } + + /** + * Returns the XML errors of the internal XML parser. + */ + private static function getXmlErrors(bool $internalErrors): array + { + $errors = array(); + foreach (libxml_get_errors() as $error) { + $errors[] = array( + 'level' => LIBXML_ERR_WARNING == $error->level ? 'WARNING' : 'ERROR', + 'code' => $error->code, + 'message' => trim($error->message), + 'file' => $error->file ?: 'n/a', + 'line' => $error->line, + 'column' => $error->column, + ); + } + + libxml_clear_errors(); + libxml_use_internal_errors($internalErrors); + + return $errors; + } +} diff --git a/vendor/symfony/translation/composer.json b/vendor/symfony/translation/composer.json index 64ab46b31..7d5df7302 100644 --- a/vendor/symfony/translation/composer.json +++ b/vendor/symfony/translation/composer.json @@ -17,6 +17,7 @@ ], "require": { "php": "^7.1.3", + "symfony/contracts": "^1.0.2", "symfony/polyfill-mbstring": "~1.0" }, "require-dev": { @@ -33,6 +34,9 @@ "symfony/dependency-injection": "<3.4", "symfony/yaml": "<3.4" }, + "provide": { + "symfony/translation-contracts-implementation": "1.0" + }, "suggest": { "symfony/config": "", "symfony/yaml": "", @@ -47,7 +51,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-master": "4.1-dev" + "dev-master": "4.2-dev" } } } diff --git a/vendor/symfony/translation/phpunit.xml.dist b/vendor/symfony/translation/phpunit.xml.dist index 1fafa4691..21d324618 100644 --- a/vendor/symfony/translation/phpunit.xml.dist +++ b/vendor/symfony/translation/phpunit.xml.dist @@ -1,7 +1,7 @@ value = $identifier; - if (0 < $i = strrpos($identifier, '\\')) { - $this->attr['ellipsis'] = \strlen($identifier) - $i; - $this->attr['ellipsis-type'] = 'class'; - $this->attr['ellipsis-tail'] = 1; - } - try { if (null !== $callable) { if ($callable instanceof \Closure) { @@ -58,8 +54,31 @@ class ClassStub extends ConstStub $r = new \ReflectionClass($r[0]); } } + + if (false !== strpos($identifier, "class@anonymous\0")) { + $this->value = $identifier = preg_replace_callback('/class@anonymous\x00.*?\.php0x?[0-9a-fA-F]++/', function ($m) { + return \class_exists($m[0], false) ? get_parent_class($m[0]).'@anonymous' : $m[0]; + }, $identifier); + } + + if (null !== $callable && $r instanceof \ReflectionFunctionAbstract) { + $s = ReflectionCaster::castFunctionAbstract($r, array(), new Stub(), true); + $s = ReflectionCaster::getSignature($s); + + if ('()' === substr($identifier, -2)) { + $this->value = substr_replace($identifier, $s, -2); + } else { + $this->value .= $s; + } + } } catch (\ReflectionException $e) { return; + } finally { + if (0 < $i = strrpos($this->value, '\\')) { + $this->attr['ellipsis'] = \strlen($this->value) - $i; + $this->attr['ellipsis-type'] = 'class'; + $this->attr['ellipsis-tail'] = 1; + } } if ($f = $r->getFileName()) { @@ -75,9 +94,9 @@ class ClassStub extends ConstStub } if (!\is_array($callable)) { - $callable = new static($callable); + $callable = new static($callable, $callable); } elseif (\is_string($callable[0])) { - $callable[0] = new static($callable[0]); + $callable[0] = new static($callable[0], $callable); } else { $callable[1] = new static($callable[1], $callable); } diff --git a/vendor/symfony/var-dumper/Caster/ExceptionCaster.php b/vendor/symfony/var-dumper/Caster/ExceptionCaster.php index 49df71da7..f3af638d9 100644 --- a/vendor/symfony/var-dumper/Caster/ExceptionCaster.php +++ b/vendor/symfony/var-dumper/Caster/ExceptionCaster.php @@ -71,7 +71,9 @@ class ExceptionCaster if (isset($a[$xPrefix.'previous'], $a[$trace]) && $a[$xPrefix.'previous'] instanceof \Exception) { $b = (array) $a[$xPrefix.'previous']; - self::traceUnshift($b[$xPrefix.'trace'], \get_class($a[$xPrefix.'previous']), $b[$prefix.'file'], $b[$prefix.'line']); + $class = \get_class($a[$xPrefix.'previous']); + $class = 'c' === $class[0] && 0 === strpos($class, "class@anonymous\0") ? get_parent_class($class).'@anonymous' : $class; + self::traceUnshift($b[$xPrefix.'trace'], $class, $b[$prefix.'file'], $b[$prefix.'line']); $a[$trace] = new TraceStub($b[$xPrefix.'trace'], false, 0, -\count($a[$trace]->value)); } @@ -279,6 +281,12 @@ class ExceptionCaster } unset($a[$xPrefix.'string'], $a[Caster::PREFIX_DYNAMIC.'xdebug_message'], $a[Caster::PREFIX_DYNAMIC.'__destructorException']); + if (isset($a[Caster::PREFIX_PROTECTED.'message']) && false !== strpos($a[Caster::PREFIX_PROTECTED.'message'], "class@anonymous\0")) { + $a[Caster::PREFIX_PROTECTED.'message'] = preg_replace_callback('/class@anonymous\x00.*?\.php0x?[0-9a-fA-F]++/', function ($m) { + return \class_exists($m[0], false) ? get_parent_class($m[0]).'@anonymous' : $m[0]; + }, $a[Caster::PREFIX_PROTECTED.'message']); + } + if (isset($a[Caster::PREFIX_PROTECTED.'file'], $a[Caster::PREFIX_PROTECTED.'line'])) { $a[Caster::PREFIX_PROTECTED.'file'] = new LinkStub($a[Caster::PREFIX_PROTECTED.'file'], $a[Caster::PREFIX_PROTECTED.'line']); } diff --git a/vendor/symfony/var-dumper/Caster/IntlCaster.php b/vendor/symfony/var-dumper/Caster/IntlCaster.php new file mode 100644 index 000000000..a69813079 --- /dev/null +++ b/vendor/symfony/var-dumper/Caster/IntlCaster.php @@ -0,0 +1,171 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * @author Nicolas Grekas + * @author Jan Schädlich + */ +class IntlCaster +{ + public static function castMessageFormatter(\MessageFormatter $c, array $a, Stub $stub, $isNested) + { + $a += array( + Caster::PREFIX_VIRTUAL.'locale' => $c->getLocale(), + Caster::PREFIX_VIRTUAL.'pattern' => $c->getPattern(), + ); + + return self::castError($c, $a); + } + + public static function castNumberFormatter(\NumberFormatter $c, array $a, Stub $stub, $isNested, $filter = 0) + { + $a += array( + Caster::PREFIX_VIRTUAL.'locale' => $c->getLocale(), + Caster::PREFIX_VIRTUAL.'pattern' => $c->getPattern(), + ); + + if ($filter & Caster::EXCLUDE_VERBOSE) { + $stub->cut += 3; + + return self::castError($c, $a); + } + + $a += array( + Caster::PREFIX_VIRTUAL.'attributes' => new EnumStub( + array( + 'PARSE_INT_ONLY' => $c->getAttribute(\NumberFormatter::PARSE_INT_ONLY), + 'GROUPING_USED' => $c->getAttribute(\NumberFormatter::GROUPING_USED), + 'DECIMAL_ALWAYS_SHOWN' => $c->getAttribute(\NumberFormatter::DECIMAL_ALWAYS_SHOWN), + 'MAX_INTEGER_DIGITS' => $c->getAttribute(\NumberFormatter::MAX_INTEGER_DIGITS), + 'MIN_INTEGER_DIGITS' => $c->getAttribute(\NumberFormatter::MIN_INTEGER_DIGITS), + 'INTEGER_DIGITS' => $c->getAttribute(\NumberFormatter::INTEGER_DIGITS), + 'MAX_FRACTION_DIGITS' => $c->getAttribute(\NumberFormatter::MAX_FRACTION_DIGITS), + 'MIN_FRACTION_DIGITS' => $c->getAttribute(\NumberFormatter::MIN_FRACTION_DIGITS), + 'FRACTION_DIGITS' => $c->getAttribute(\NumberFormatter::FRACTION_DIGITS), + 'MULTIPLIER' => $c->getAttribute(\NumberFormatter::MULTIPLIER), + 'GROUPING_SIZE' => $c->getAttribute(\NumberFormatter::GROUPING_SIZE), + 'ROUNDING_MODE' => $c->getAttribute(\NumberFormatter::ROUNDING_MODE), + 'ROUNDING_INCREMENT' => $c->getAttribute(\NumberFormatter::ROUNDING_INCREMENT), + 'FORMAT_WIDTH' => $c->getAttribute(\NumberFormatter::FORMAT_WIDTH), + 'PADDING_POSITION' => $c->getAttribute(\NumberFormatter::PADDING_POSITION), + 'SECONDARY_GROUPING_SIZE' => $c->getAttribute(\NumberFormatter::SECONDARY_GROUPING_SIZE), + 'SIGNIFICANT_DIGITS_USED' => $c->getAttribute(\NumberFormatter::SIGNIFICANT_DIGITS_USED), + 'MIN_SIGNIFICANT_DIGITS' => $c->getAttribute(\NumberFormatter::MIN_SIGNIFICANT_DIGITS), + 'MAX_SIGNIFICANT_DIGITS' => $c->getAttribute(\NumberFormatter::MAX_SIGNIFICANT_DIGITS), + 'LENIENT_PARSE' => $c->getAttribute(\NumberFormatter::LENIENT_PARSE), + ) + ), + Caster::PREFIX_VIRTUAL.'text_attributes' => new EnumStub( + array( + 'POSITIVE_PREFIX' => $c->getTextAttribute(\NumberFormatter::POSITIVE_PREFIX), + 'POSITIVE_SUFFIX' => $c->getTextAttribute(\NumberFormatter::POSITIVE_SUFFIX), + 'NEGATIVE_PREFIX' => $c->getTextAttribute(\NumberFormatter::NEGATIVE_PREFIX), + 'NEGATIVE_SUFFIX' => $c->getTextAttribute(\NumberFormatter::NEGATIVE_SUFFIX), + 'PADDING_CHARACTER' => $c->getTextAttribute(\NumberFormatter::PADDING_CHARACTER), + 'CURRENCY_CODE' => $c->getTextAttribute(\NumberFormatter::CURRENCY_CODE), + 'DEFAULT_RULESET' => $c->getTextAttribute(\NumberFormatter::DEFAULT_RULESET), + 'PUBLIC_RULESETS' => $c->getTextAttribute(\NumberFormatter::PUBLIC_RULESETS), + ) + ), + Caster::PREFIX_VIRTUAL.'symbols' => new EnumStub( + array( + 'DECIMAL_SEPARATOR_SYMBOL' => $c->getSymbol(\NumberFormatter::DECIMAL_SEPARATOR_SYMBOL), + 'GROUPING_SEPARATOR_SYMBOL' => $c->getSymbol(\NumberFormatter::GROUPING_SEPARATOR_SYMBOL), + 'PATTERN_SEPARATOR_SYMBOL' => $c->getSymbol(\NumberFormatter::PATTERN_SEPARATOR_SYMBOL), + 'PERCENT_SYMBOL' => $c->getSymbol(\NumberFormatter::PERCENT_SYMBOL), + 'ZERO_DIGIT_SYMBOL' => $c->getSymbol(\NumberFormatter::ZERO_DIGIT_SYMBOL), + 'DIGIT_SYMBOL' => $c->getSymbol(\NumberFormatter::DIGIT_SYMBOL), + 'MINUS_SIGN_SYMBOL' => $c->getSymbol(\NumberFormatter::MINUS_SIGN_SYMBOL), + 'PLUS_SIGN_SYMBOL' => $c->getSymbol(\NumberFormatter::PLUS_SIGN_SYMBOL), + 'CURRENCY_SYMBOL' => $c->getSymbol(\NumberFormatter::CURRENCY_SYMBOL), + 'INTL_CURRENCY_SYMBOL' => $c->getSymbol(\NumberFormatter::INTL_CURRENCY_SYMBOL), + 'MONETARY_SEPARATOR_SYMBOL' => $c->getSymbol(\NumberFormatter::MONETARY_SEPARATOR_SYMBOL), + 'EXPONENTIAL_SYMBOL' => $c->getSymbol(\NumberFormatter::EXPONENTIAL_SYMBOL), + 'PERMILL_SYMBOL' => $c->getSymbol(\NumberFormatter::PERMILL_SYMBOL), + 'PAD_ESCAPE_SYMBOL' => $c->getSymbol(\NumberFormatter::PAD_ESCAPE_SYMBOL), + 'INFINITY_SYMBOL' => $c->getSymbol(\NumberFormatter::INFINITY_SYMBOL), + 'NAN_SYMBOL' => $c->getSymbol(\NumberFormatter::NAN_SYMBOL), + 'SIGNIFICANT_DIGIT_SYMBOL' => $c->getSymbol(\NumberFormatter::SIGNIFICANT_DIGIT_SYMBOL), + 'MONETARY_GROUPING_SEPARATOR_SYMBOL' => $c->getSymbol(\NumberFormatter::MONETARY_GROUPING_SEPARATOR_SYMBOL), + ) + ), + ); + + return self::castError($c, $a); + } + + public static function castIntlTimeZone(\IntlTimeZone $c, array $a, Stub $stub, $isNested) + { + $a += array( + Caster::PREFIX_VIRTUAL.'display_name' => $c->getDisplayName(), + Caster::PREFIX_VIRTUAL.'id' => $c->getID(), + Caster::PREFIX_VIRTUAL.'raw_offset' => $c->getRawOffset(), + ); + + if ($c->useDaylightTime()) { + $a += array( + Caster::PREFIX_VIRTUAL.'dst_savings' => $c->getDSTSavings(), + ); + } + + return self::castError($c, $a); + } + + public static function castIntlCalendar(\IntlCalendar $c, array $a, Stub $stub, $isNested, $filter = 0) + { + $a += array( + Caster::PREFIX_VIRTUAL.'type' => $c->getType(), + Caster::PREFIX_VIRTUAL.'first_day_of_week' => $c->getFirstDayOfWeek(), + Caster::PREFIX_VIRTUAL.'minimal_days_in_first_week' => $c->getMinimalDaysInFirstWeek(), + Caster::PREFIX_VIRTUAL.'repeated_wall_time_option' => $c->getRepeatedWallTimeOption(), + Caster::PREFIX_VIRTUAL.'skipped_wall_time_option' => $c->getSkippedWallTimeOption(), + Caster::PREFIX_VIRTUAL.'time' => $c->getTime(), + Caster::PREFIX_VIRTUAL.'type' => $c->getType(), + Caster::PREFIX_VIRTUAL.'in_daylight_time' => $c->inDaylightTime(), + Caster::PREFIX_VIRTUAL.'is_lenient' => $c->isLenient(), + Caster::PREFIX_VIRTUAL.'time_zone' => ($filter & Caster::EXCLUDE_VERBOSE) ? new CutStub($c->getTimeZone()) : $c->getTimeZone(), + ); + + return self::castError($c, $a); + } + + public static function castIntlDateFormatter(\IntlDateFormatter $c, array $a, Stub $stub, $isNested, $filter = 0) + { + $a += array( + Caster::PREFIX_VIRTUAL.'locale' => $c->getLocale(), + Caster::PREFIX_VIRTUAL.'pattern' => $c->getPattern(), + Caster::PREFIX_VIRTUAL.'calendar' => $c->getCalendar(), + Caster::PREFIX_VIRTUAL.'time_zone_id' => $c->getTimeZoneId(), + Caster::PREFIX_VIRTUAL.'time_type' => $c->getTimeType(), + Caster::PREFIX_VIRTUAL.'date_type' => $c->getDateType(), + Caster::PREFIX_VIRTUAL.'calendar_object' => ($filter & Caster::EXCLUDE_VERBOSE) ? new CutStub($c->getCalendarObject()) : $c->getCalendarObject(), + Caster::PREFIX_VIRTUAL.'time_zone' => ($filter & Caster::EXCLUDE_VERBOSE) ? new CutStub($c->getTimeZone()) : $c->getTimeZone(), + ); + + return self::castError($c, $a); + } + + private static function castError($c, array $a): array + { + if ($errorCode = $c->getErrorCode()) { + $a += array( + Caster::PREFIX_VIRTUAL.'error_code' => $errorCode, + Caster::PREFIX_VIRTUAL.'error_message' => $c->getErrorMessage(), + ); + } + + return $a; + } +} diff --git a/vendor/symfony/var-dumper/Caster/MemcachedCaster.php b/vendor/symfony/var-dumper/Caster/MemcachedCaster.php new file mode 100644 index 000000000..99a33bca6 --- /dev/null +++ b/vendor/symfony/var-dumper/Caster/MemcachedCaster.php @@ -0,0 +1,79 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * @author Jan Schädlich + */ +class MemcachedCaster +{ + private static $optionConstants; + private static $defaultOptions; + + public static function castMemcached(\Memcached $c, array $a, Stub $stub, $isNested) + { + $a += array( + Caster::PREFIX_VIRTUAL.'servers' => $c->getServerList(), + Caster::PREFIX_VIRTUAL.'options' => new EnumStub( + self::getNonDefaultOptions($c) + ), + ); + + return $a; + } + + private static function getNonDefaultOptions(\Memcached $c) + { + self::$defaultOptions = self::$defaultOptions ?? self::discoverDefaultOptions(); + self::$optionConstants = self::$optionConstants ?? self::getOptionConstants(); + + $nonDefaultOptions = array(); + foreach (self::$optionConstants as $constantKey => $value) { + if (self::$defaultOptions[$constantKey] !== $option = $c->getOption($value)) { + $nonDefaultOptions[$constantKey] = $option; + } + } + + return $nonDefaultOptions; + } + + private static function discoverDefaultOptions() + { + $defaultMemcached = new \Memcached(); + $defaultMemcached->addServer('127.0.0.1', 11211); + + $defaultOptions = array(); + self::$optionConstants = self::$optionConstants ?? self::getOptionConstants(); + + foreach (self::$optionConstants as $constantKey => $value) { + $defaultOptions[$constantKey] = $defaultMemcached->getOption($value); + } + + return $defaultOptions; + } + + private static function getOptionConstants() + { + $reflectedMemcached = new \ReflectionClass(\Memcached::class); + + $optionConstants = array(); + foreach ($reflectedMemcached->getConstants() as $constantKey => $value) { + if (0 === strpos($constantKey, 'OPT_')) { + $optionConstants[$constantKey] = $value; + } + } + + return $optionConstants; + } +} diff --git a/vendor/symfony/var-dumper/Caster/ProxyManagerCaster.php b/vendor/symfony/var-dumper/Caster/ProxyManagerCaster.php new file mode 100644 index 000000000..da037b6b3 --- /dev/null +++ b/vendor/symfony/var-dumper/Caster/ProxyManagerCaster.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use ProxyManager\Proxy\ProxyInterface; +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * @author Nicolas Grekas + */ +class ProxyManagerCaster +{ + public static function castProxy(ProxyInterface $c, array $a, Stub $stub, $isNested) + { + if ($parent = \get_parent_class($c)) { + $stub->class .= ' - '.$parent; + } + $stub->class .= '@proxy'; + + return $a; + } +} diff --git a/vendor/symfony/var-dumper/Caster/RedisCaster.php b/vendor/symfony/var-dumper/Caster/RedisCaster.php index 112097fd9..0fcd9d96f 100644 --- a/vendor/symfony/var-dumper/Caster/RedisCaster.php +++ b/vendor/symfony/var-dumper/Caster/RedisCaster.php @@ -26,6 +26,24 @@ class RedisCaster 2 => 'IGBINARY', // Optional Redis::SERIALIZER_IGBINARY ); + private static $mode = array( + \Redis::ATOMIC => 'ATOMIC', + \Redis::MULTI => 'MULTI', + \Redis::PIPELINE => 'PIPELINE', + ); + + private static $compression = array( + 0 => 'NONE', // Redis::COMPRESSION_NONE + 1 => 'LZF', // Redis::COMPRESSION_LZF + ); + + private static $failover = array( + \RedisCluster::FAILOVER_NONE => 'NONE', + \RedisCluster::FAILOVER_ERROR => 'ERROR', + \RedisCluster::FAILOVER_DISTRIBUTE => 'DISTRIBUTE', + \RedisCluster::FAILOVER_DISTRIBUTE_SLAVES => 'DISTRIBUTE_SLAVES', + ); + public static function castRedis(\Redis $c, array $a, Stub $stub, $isNested) { $prefix = Caster::PREFIX_VIRTUAL; @@ -36,23 +54,19 @@ class RedisCaster ); } - $ser = $c->getOption(\Redis::OPT_SERIALIZER); - $retry = \defined('Redis::OPT_SCAN') ? $c->getOption(\Redis::OPT_SCAN) : 0; + $mode = $c->getMode(); return $a + array( $prefix.'isConnected' => $connected, $prefix.'host' => $c->getHost(), $prefix.'port' => $c->getPort(), $prefix.'auth' => $c->getAuth(), + $prefix.'mode' => isset(self::$mode[$mode]) ? new ConstStub(self::$mode[$mode], $mode) : $mode, $prefix.'dbNum' => $c->getDbNum(), $prefix.'timeout' => $c->getTimeout(), + $prefix.'lastError' => $c->getLastError(), $prefix.'persistentId' => $c->getPersistentID(), - $prefix.'options' => new EnumStub(array( - 'READ_TIMEOUT' => $c->getOption(\Redis::OPT_READ_TIMEOUT), - 'SERIALIZER' => isset(self::$serializer[$ser]) ? new ConstStub(self::$serializer[$ser], $ser) : $ser, - 'PREFIX' => $c->getOption(\Redis::OPT_PREFIX), - 'SCAN' => new ConstStub($retry ? 'RETRY' : 'NORETRY', $retry), - )), + $prefix.'options' => self::getRedisOptions($c), ); } @@ -63,6 +77,74 @@ class RedisCaster return $a + array( $prefix.'hosts' => $c->_hosts(), $prefix.'function' => ClassStub::wrapCallable($c->_function()), + $prefix.'lastError' => $c->getLastError(), + $prefix.'options' => self::getRedisOptions($c), ); } + + public static function castRedisCluster(\RedisCluster $c, array $a, Stub $stub, $isNested) + { + $prefix = Caster::PREFIX_VIRTUAL; + $failover = $c->getOption(\RedisCluster::OPT_SLAVE_FAILOVER); + + $a += array( + $prefix.'_masters' => $c->_masters(), + $prefix.'_redir' => $c->_redir(), + $prefix.'mode' => new ConstStub($c->getMode() ? 'MULTI' : 'ATOMIC', $c->getMode()), + $prefix.'lastError' => $c->getLastError(), + $prefix.'options' => self::getRedisOptions($c, array( + 'SLAVE_FAILOVER' => isset(self::$failover[$failover]) ? new ConstStub(self::$failover[$failover], $failover) : $failover, + )), + ); + + return $a; + } + + /** + * @param \Redis|\RedisArray|\RedisCluster $redis + */ + private static function getRedisOptions($redis, array $options = array()): EnumStub + { + $serializer = $redis->getOption(\Redis::OPT_SERIALIZER); + if (\is_array($serializer)) { + foreach ($serializer as &$v) { + if (isset(self::$serializer[$v])) { + $v = new ConstStub(self::$serializer[$v], $v); + } + } + } elseif (isset(self::$serializer[$serializer])) { + $serializer = new ConstStub(self::$serializer[$serializer], $serializer); + } + + $compression = \defined('Redis::OPT_COMPRESSION') ? $redis->getOption(\Redis::OPT_COMPRESSION) : 0; + if (\is_array($compression)) { + foreach ($compression as &$v) { + if (isset(self::$compression[$v])) { + $v = new ConstStub(self::$compression[$v], $v); + } + } + } elseif (isset(self::$compression[$compression])) { + $compression = new ConstStub(self::$compression[$compression], $compression); + } + + $retry = \defined('Redis::OPT_SCAN') ? $redis->getOption(\Redis::OPT_SCAN) : 0; + if (\is_array($retry)) { + foreach ($retry as &$v) { + $v = new ConstStub($v ? 'RETRY' : 'NORETRY', $v); + } + } else { + $retry = new ConstStub($retry ? 'RETRY' : 'NORETRY', $retry); + } + + $options += array( + 'TCP_KEEPALIVE' => \defined('Redis::OPT_TCP_KEEPALIVE') ? $redis->getOption(\Redis::OPT_TCP_KEEPALIVE) : 0, + 'READ_TIMEOUT' => $redis->getOption(\Redis::OPT_READ_TIMEOUT), + 'COMPRESSION' => $compression, + 'SERIALIZER' => $serializer, + 'PREFIX' => $redis->getOption(\Redis::OPT_PREFIX), + 'SCAN' => $retry, + ); + + return new EnumStub($options); + } } diff --git a/vendor/symfony/var-dumper/Caster/ReflectionCaster.php b/vendor/symfony/var-dumper/Caster/ReflectionCaster.php index c625e787d..35a764a50 100644 --- a/vendor/symfony/var-dumper/Caster/ReflectionCaster.php +++ b/vendor/symfony/var-dumper/Caster/ReflectionCaster.php @@ -38,6 +38,20 @@ class ReflectionCaster $a = static::castFunctionAbstract($c, $a, $stub, $isNested, $filter); + if (false === strpos($c->name, '{closure}')) { + $stub->class = isset($a[$prefix.'class']) ? $a[$prefix.'class']->value.'::'.$c->name : $c->name; + unset($a[$prefix.'class']); + } + unset($a[$prefix.'extra']); + + $stub->class .= self::getSignature($a); + + if ($filter & Caster::EXCLUDE_VERBOSE) { + $stub->cut += ($c->getFileName() ? 2 : 0) + \count($a); + + return array(); + } + if (isset($a[$prefix.'parameters'])) { foreach ($a[$prefix.'parameters']->value as &$v) { $param = $v; @@ -51,14 +65,11 @@ class ReflectionCaster } } - if (!($filter & Caster::EXCLUDE_VERBOSE) && $f = $c->getFileName()) { + if ($f = $c->getFileName()) { $a[$prefix.'file'] = new LinkStub($f, $c->getStartLine()); $a[$prefix.'line'] = $c->getStartLine().' to '.$c->getEndLine(); } - $prefix = Caster::PREFIX_DYNAMIC; - unset($a['name'], $a[$prefix.'this'], $a[$prefix.'parameter'], $a[Caster::PREFIX_VIRTUAL.'extra']); - return $a; } @@ -294,6 +305,52 @@ class ReflectionCaster return $a; } + public static function getSignature(array $a) + { + $prefix = Caster::PREFIX_VIRTUAL; + $signature = ''; + + if (isset($a[$prefix.'parameters'])) { + foreach ($a[$prefix.'parameters']->value as $k => $param) { + $signature .= ', '; + if ($type = $param->getType()) { + if (!$param->isOptional() && $param->allowsNull()) { + $signature .= '?'; + } + $signature .= substr(strrchr('\\'.$type->getName(), '\\'), 1).' '; + } + $signature .= $k; + + if (!$param->isDefaultValueAvailable()) { + continue; + } + $v = $param->getDefaultValue(); + $signature .= ' = '; + + if ($param->isDefaultValueConstant()) { + $signature .= substr(strrchr('\\'.$param->getDefaultValueConstantName(), '\\'), 1); + } elseif (null === $v) { + $signature .= 'null'; + } elseif (\is_array($v)) { + $signature .= $v ? '[…'.\count($v).']' : '[]'; + } elseif (\is_string($v)) { + $signature .= 10 > \strlen($v) && false === strpos($v, '\\') ? "'{$v}'" : "'…".\strlen($v)."'"; + } elseif (\is_bool($v)) { + $signature .= $v ? 'true' : 'false'; + } else { + $signature .= $v; + } + } + } + $signature = (empty($a[$prefix.'returnsReference']) ? '' : '&').'('.substr($signature, 2).')'; + + if (isset($a[$prefix.'returnType'])) { + $signature .= ': '.substr(strrchr('\\'.$a[$prefix.'returnType'], '\\'), 1); + } + + return $signature; + } + private static function addExtra(&$a, \Reflector $c) { $x = isset($a[Caster::PREFIX_VIRTUAL.'extra']) ? $a[Caster::PREFIX_VIRTUAL.'extra']->value : array(); diff --git a/vendor/symfony/var-dumper/Cloner/AbstractCloner.php b/vendor/symfony/var-dumper/Cloner/AbstractCloner.php index f8dfa97c9..38891f1d8 100644 --- a/vendor/symfony/var-dumper/Cloner/AbstractCloner.php +++ b/vendor/symfony/var-dumper/Cloner/AbstractCloner.php @@ -81,6 +81,7 @@ abstract class AbstractCloner implements ClonerInterface 'Symfony\Component\VarDumper\Caster\FrameStub' => array('Symfony\Component\VarDumper\Caster\ExceptionCaster', 'castFrameStub'), 'Symfony\Component\Debug\Exception\SilencedErrorContext' => array('Symfony\Component\VarDumper\Caster\ExceptionCaster', 'castSilencedErrorContext'), + 'ProxyManager\Proxy\ProxyInterface' => array('Symfony\Component\VarDumper\Caster\ProxyManagerCaster', 'castProxy'), 'PHPUnit_Framework_MockObject_MockObject' => array('Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'), 'Prophecy\Prophecy\ProphecySubjectInterface' => array('Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'), 'Mockery\MockInterface' => array('Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'), @@ -107,6 +108,7 @@ abstract class AbstractCloner implements ClonerInterface 'Redis' => array('Symfony\Component\VarDumper\Caster\RedisCaster', 'castRedis'), 'RedisArray' => array('Symfony\Component\VarDumper\Caster\RedisCaster', 'castRedisArray'), + 'RedisCluster' => array('Symfony\Component\VarDumper\Caster\RedisCaster', 'castRedisCluster'), 'DateTimeInterface' => array('Symfony\Component\VarDumper\Caster\DateCaster', 'castDateTime'), 'DateInterval' => array('Symfony\Component\VarDumper\Caster\DateCaster', 'castInterval'), @@ -115,6 +117,14 @@ abstract class AbstractCloner implements ClonerInterface 'GMP' => array('Symfony\Component\VarDumper\Caster\GmpCaster', 'castGmp'), + 'MessageFormatter' => array('Symfony\Component\VarDumper\Caster\IntlCaster', 'castMessageFormatter'), + 'NumberFormatter' => array('Symfony\Component\VarDumper\Caster\IntlCaster', 'castNumberFormatter'), + 'IntlTimeZone' => array('Symfony\Component\VarDumper\Caster\IntlCaster', 'castIntlTimeZone'), + 'IntlCalendar' => array('Symfony\Component\VarDumper\Caster\IntlCaster', 'castIntlCalendar'), + 'IntlDateFormatter' => array('Symfony\Component\VarDumper\Caster\IntlCaster', 'castIntlDateFormatter'), + + 'Memcached' => array('Symfony\Component\VarDumper\Caster\MemcachedCaster', 'castMemcached'), + ':curl' => array('Symfony\Component\VarDumper\Caster\ResourceCaster', 'castCurl'), ':dba' => array('Symfony\Component\VarDumper\Caster\ResourceCaster', 'castDba'), ':dba persistent' => array('Symfony\Component\VarDumper\Caster\ResourceCaster', 'castDba'), diff --git a/vendor/symfony/var-dumper/Cloner/Data.php b/vendor/symfony/var-dumper/Cloner/Data.php index 0dbff7ae5..0604a38f5 100644 --- a/vendor/symfony/var-dumper/Cloner/Data.php +++ b/vendor/symfony/var-dumper/Cloner/Data.php @@ -115,9 +115,7 @@ class Data implements \ArrayAccess, \Countable, \IteratorAggregate throw new \LogicException(sprintf('%s object holds non-iterable type "%s".', self::class, \gettype($value))); } - foreach ($value as $k => $v) { - yield $k => $v; - } + yield from $value; } public function __get($key) diff --git a/vendor/symfony/var-dumper/Dumper/HtmlDumper.php b/vendor/symfony/var-dumper/Dumper/HtmlDumper.php index 0edb97cdc..e15a2b644 100644 --- a/vendor/symfony/var-dumper/Dumper/HtmlDumper.php +++ b/vendor/symfony/var-dumper/Dumper/HtmlDumper.php @@ -23,6 +23,41 @@ class HtmlDumper extends CliDumper { public static $defaultOutput = 'php://output'; + protected static $themes = array( + 'dark' => array( + 'default' => 'background-color:#18171B; color:#FF8400; line-height:1.2em; font:12px Menlo, Monaco, Consolas, monospace; word-wrap: break-word; white-space: pre-wrap; position:relative; z-index:99999; word-break: break-all', + 'num' => 'font-weight:bold; color:#1299DA', + 'const' => 'font-weight:bold', + 'str' => 'font-weight:bold; color:#56DB3A', + 'note' => 'color:#1299DA', + 'ref' => 'color:#A0A0A0', + 'public' => 'color:#FFFFFF', + 'protected' => 'color:#FFFFFF', + 'private' => 'color:#FFFFFF', + 'meta' => 'color:#B729D9', + 'key' => 'color:#56DB3A', + 'index' => 'color:#1299DA', + 'ellipsis' => 'color:#FF8400', + 'ns' => 'user-select:none;', + ), + 'light' => array( + 'default' => 'background:none; color:#CC7832; line-height:1.2em; font:12px Menlo, Monaco, Consolas, monospace; word-wrap: break-word; white-space: pre-wrap; position:relative; z-index:99999; word-break: break-all', + 'num' => 'font-weight:bold; color:#1299DA', + 'const' => 'font-weight:bold', + 'str' => 'font-weight:bold; color:#629755;', + 'note' => 'color:#6897BB', + 'ref' => 'color:#6E6E6E', + 'public' => 'color:#262626', + 'protected' => 'color:#262626', + 'private' => 'color:#262626', + 'meta' => 'color:#B729D9', + 'key' => 'color:#789339', + 'index' => 'color:#1299DA', + 'ellipsis' => 'color:#CC7832', + 'ns' => 'user-select:none;', + ), + ); + protected $dumpHeader; protected $dumpPrefix = '
    ';
         protected $dumpSuffix = '
    '; @@ -30,21 +65,7 @@ class HtmlDumper extends CliDumper protected $colors = true; protected $headerIsDumped = false; protected $lastDepth = -1; - protected $styles = array( - 'default' => 'background-color:#18171B; color:#FF8400; line-height:1.2em; font:12px Menlo, Monaco, Consolas, monospace; word-wrap: break-word; white-space: pre-wrap; position:relative; z-index:99999; word-break: break-all', - 'num' => 'font-weight:bold; color:#1299DA', - 'const' => 'font-weight:bold', - 'str' => 'font-weight:bold; color:#56DB3A', - 'note' => 'color:#1299DA', - 'ref' => 'color:#A0A0A0', - 'public' => 'color:#FFFFFF', - 'protected' => 'color:#FFFFFF', - 'private' => 'color:#FFFFFF', - 'meta' => 'color:#B729D9', - 'key' => 'color:#56DB3A', - 'index' => 'color:#1299DA', - 'ellipsis' => 'color:#FF8400', - ); + protected $styles; private $displayOptions = array( 'maxDepth' => 1, @@ -61,6 +82,7 @@ class HtmlDumper extends CliDumper AbstractDumper::__construct($output, $charset, $flags); $this->dumpId = 'sf-dump-'.mt_rand(); $this->displayOptions['fileLinkFormat'] = ini_get('xdebug.file_link_format') ?: get_cfg_var('xdebug.file_link_format'); + $this->styles = static::$themes['dark'] ?? self::$themes['dark']; } /** @@ -72,6 +94,15 @@ class HtmlDumper extends CliDumper $this->styles = $styles + $this->styles; } + public function setTheme(string $themeName) + { + if (!isset(static::$themes[$themeName])) { + throw new \InvalidArgumentException(sprintf('Theme "%s" does not exist in class "%s".', $themeName, static::class)); + } + + $this->setStyles(static::$themes[$themeName]); + } + /** * Configures display options. * @@ -473,6 +504,9 @@ return function (root, x) { if (currentNode) { reveal(currentNode); highlight(root, currentNode, state.nodes); + if ('scrollIntoView' in currentNode) { + currentNode.scrollIntoView(); + } } counter.textContent = (state.isEmpty() ? 0 : state.idx + 1) + ' of ' + state.count(); } @@ -837,9 +871,21 @@ EOHTML } $v = "".preg_replace_callback(static::$controlCharsRx, function ($c) use ($map) { - $s = ''; + $s = $b = ' .sf-dump .sf-dump-ref { color: #6E6E6E; } .dumped-tag > .sf-dump .sf-dump-ellipsis { color: #CC7832; max-width: 100em; } .dumped-tag > .sf-dump .sf-dump-ellipsis-path { max-width: 5em; } +.dumped-tag > .sf-dump .sf-dump-ns { user-select: none; } diff --git a/vendor/symfony/var-dumper/Resources/functions/dump.php b/vendor/symfony/var-dumper/Resources/functions/dump.php index 248f25512..e1543a8df 100644 --- a/vendor/symfony/var-dumper/Resources/functions/dump.php +++ b/vendor/symfony/var-dumper/Resources/functions/dump.php @@ -32,14 +32,12 @@ if (!function_exists('dump')) { } if (!function_exists('dd')) { - function dd($var, ...$moreVars) + function dd(...$vars) { - VarDumper::dump($var); - - foreach ($moreVars as $v) { + foreach ($vars as $v) { VarDumper::dump($v); } - exit(1); + die(1); } } diff --git a/vendor/symfony/var-dumper/Tests/Caster/ExceptionCasterTest.php b/vendor/symfony/var-dumper/Tests/Caster/ExceptionCasterTest.php index 4f9b538a0..aab1a9f38 100644 --- a/vendor/symfony/var-dumper/Tests/Caster/ExceptionCasterTest.php +++ b/vendor/symfony/var-dumper/Tests/Caster/ExceptionCasterTest.php @@ -223,6 +223,23 @@ Exception { #file: "%sExceptionCasterTest.php" #line: 28 } +EODUMP; + + $this->assertDumpMatchesFormat($expectedDump, $e, Caster::EXCLUDE_VERBOSE); + } + + public function testAnonymous() + { + $e = new \Exception(sprintf('Boo "%s" ba.', \get_class(new class('Foo') extends \Exception { + }))); + + $expectedDump = <<<'EODUMP' +Exception { + #message: "Boo "Exception@anonymous" ba." + #code: 0 + #file: "%sExceptionCasterTest.php" + #line: %d +} EODUMP; $this->assertDumpMatchesFormat($expectedDump, $e, Caster::EXCLUDE_VERBOSE); diff --git a/vendor/symfony/var-dumper/Tests/Caster/IntlCasterTest.php b/vendor/symfony/var-dumper/Tests/Caster/IntlCasterTest.php new file mode 100644 index 000000000..7c8e02858 --- /dev/null +++ b/vendor/symfony/var-dumper/Tests/Caster/IntlCasterTest.php @@ -0,0 +1,299 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Tests\Caster; + +use PHPUnit\Framework\TestCase; +use Symfony\Component\VarDumper\Test\VarDumperTestTrait; + +/** + * @requires extension intl + */ +class IntlCasterTest extends TestCase +{ + use VarDumperTestTrait; + + public function testMessageFormatter() + { + $var = new \MessageFormatter('en', 'Hello {name}'); + + $expected = <<assertDumpEquals($expected, $var); + } + + public function testCastNumberFormatter() + { + $var = new \NumberFormatter('en', \NumberFormatter::DECIMAL); + + $expectedLocale = $var->getLocale(); + $expectedPattern = $var->getPattern(); + + $expectedAttribute1 = $var->getAttribute(\NumberFormatter::PARSE_INT_ONLY); + $expectedAttribute2 = $var->getAttribute(\NumberFormatter::GROUPING_USED); + $expectedAttribute3 = $var->getAttribute(\NumberFormatter::DECIMAL_ALWAYS_SHOWN); + $expectedAttribute4 = $var->getAttribute(\NumberFormatter::MAX_INTEGER_DIGITS); + $expectedAttribute5 = $var->getAttribute(\NumberFormatter::MIN_INTEGER_DIGITS); + $expectedAttribute6 = $var->getAttribute(\NumberFormatter::INTEGER_DIGITS); + $expectedAttribute7 = $var->getAttribute(\NumberFormatter::MAX_FRACTION_DIGITS); + $expectedAttribute8 = $var->getAttribute(\NumberFormatter::MIN_FRACTION_DIGITS); + $expectedAttribute9 = $var->getAttribute(\NumberFormatter::FRACTION_DIGITS); + $expectedAttribute10 = $var->getAttribute(\NumberFormatter::MULTIPLIER); + $expectedAttribute11 = $var->getAttribute(\NumberFormatter::GROUPING_SIZE); + $expectedAttribute12 = $var->getAttribute(\NumberFormatter::ROUNDING_MODE); + $expectedAttribute13 = number_format($var->getAttribute(\NumberFormatter::ROUNDING_INCREMENT), 1); + $expectedAttribute14 = $var->getAttribute(\NumberFormatter::FORMAT_WIDTH); + $expectedAttribute15 = $var->getAttribute(\NumberFormatter::PADDING_POSITION); + $expectedAttribute16 = $var->getAttribute(\NumberFormatter::SECONDARY_GROUPING_SIZE); + $expectedAttribute17 = $var->getAttribute(\NumberFormatter::SIGNIFICANT_DIGITS_USED); + $expectedAttribute18 = $var->getAttribute(\NumberFormatter::MIN_SIGNIFICANT_DIGITS); + $expectedAttribute19 = $var->getAttribute(\NumberFormatter::MAX_SIGNIFICANT_DIGITS); + $expectedAttribute20 = $var->getAttribute(\NumberFormatter::LENIENT_PARSE); + + $expectedTextAttribute1 = $var->getTextAttribute(\NumberFormatter::POSITIVE_PREFIX); + $expectedTextAttribute2 = $var->getTextAttribute(\NumberFormatter::POSITIVE_SUFFIX); + $expectedTextAttribute3 = $var->getTextAttribute(\NumberFormatter::NEGATIVE_PREFIX); + $expectedTextAttribute4 = $var->getTextAttribute(\NumberFormatter::NEGATIVE_SUFFIX); + $expectedTextAttribute5 = $var->getTextAttribute(\NumberFormatter::PADDING_CHARACTER); + $expectedTextAttribute6 = $var->getTextAttribute(\NumberFormatter::CURRENCY_CODE); + $expectedTextAttribute7 = $var->getTextAttribute(\NumberFormatter::DEFAULT_RULESET) ? 'true' : 'false'; + $expectedTextAttribute8 = $var->getTextAttribute(\NumberFormatter::PUBLIC_RULESETS) ? 'true' : 'false'; + + $expectedSymbol1 = $var->getSymbol(\NumberFormatter::DECIMAL_SEPARATOR_SYMBOL); + $expectedSymbol2 = $var->getSymbol(\NumberFormatter::GROUPING_SEPARATOR_SYMBOL); + $expectedSymbol3 = $var->getSymbol(\NumberFormatter::PATTERN_SEPARATOR_SYMBOL); + $expectedSymbol4 = $var->getSymbol(\NumberFormatter::PERCENT_SYMBOL); + $expectedSymbol5 = $var->getSymbol(\NumberFormatter::ZERO_DIGIT_SYMBOL); + $expectedSymbol6 = $var->getSymbol(\NumberFormatter::DIGIT_SYMBOL); + $expectedSymbol7 = $var->getSymbol(\NumberFormatter::MINUS_SIGN_SYMBOL); + $expectedSymbol8 = $var->getSymbol(\NumberFormatter::PLUS_SIGN_SYMBOL); + $expectedSymbol9 = $var->getSymbol(\NumberFormatter::CURRENCY_SYMBOL); + $expectedSymbol10 = $var->getSymbol(\NumberFormatter::INTL_CURRENCY_SYMBOL); + $expectedSymbol11 = $var->getSymbol(\NumberFormatter::MONETARY_SEPARATOR_SYMBOL); + $expectedSymbol12 = $var->getSymbol(\NumberFormatter::EXPONENTIAL_SYMBOL); + $expectedSymbol13 = $var->getSymbol(\NumberFormatter::PERMILL_SYMBOL); + $expectedSymbol14 = $var->getSymbol(\NumberFormatter::PAD_ESCAPE_SYMBOL); + $expectedSymbol15 = $var->getSymbol(\NumberFormatter::INFINITY_SYMBOL); + $expectedSymbol16 = $var->getSymbol(\NumberFormatter::NAN_SYMBOL); + $expectedSymbol17 = $var->getSymbol(\NumberFormatter::SIGNIFICANT_DIGIT_SYMBOL); + $expectedSymbol18 = $var->getSymbol(\NumberFormatter::MONETARY_GROUPING_SEPARATOR_SYMBOL); + + $expected = <<assertDumpEquals($expected, $var); + } + + public function testCastIntlTimeZoneWithDST() + { + $var = \IntlTimeZone::createTimeZone('America/Los_Angeles'); + + $expectedDisplayName = $var->getDisplayName(); + $expectedDSTSavings = $var->getDSTSavings(); + $expectedID = $var->getID(); + $expectedRawOffset = $var->getRawOffset(); + + $expected = <<assertDumpEquals($expected, $var); + } + + public function testCastIntlTimeZoneWithoutDST() + { + $var = \IntlTimeZone::createTimeZone('Asia/Bangkok'); + + $expectedDisplayName = $var->getDisplayName(); + $expectedID = $var->getID(); + $expectedRawOffset = $var->getRawOffset(); + + $expected = <<assertDumpEquals($expected, $var); + } + + public function testCastIntlCalendar() + { + $var = \IntlCalendar::createInstance('America/Los_Angeles', 'en'); + + $expectedType = $var->getType(); + $expectedFirstDayOfWeek = $var->getFirstDayOfWeek(); + $expectedMinimalDaysInFirstWeek = $var->getMinimalDaysInFirstWeek(); + $expectedRepeatedWallTimeOption = $var->getRepeatedWallTimeOption(); + $expectedSkippedWallTimeOption = $var->getSkippedWallTimeOption(); + $expectedTime = $var->getTime().'.0'; + $expectedInDaylightTime = $var->inDaylightTime() ? 'true' : 'false'; + $expectedIsLenient = $var->isLenient() ? 'true' : 'false'; + + $expectedTimeZone = $var->getTimeZone(); + $expectedTimeZoneDisplayName = $expectedTimeZone->getDisplayName(); + $expectedTimeZoneID = $expectedTimeZone->getID(); + $expectedTimeZoneRawOffset = $expectedTimeZone->getRawOffset(); + $expectedTimeZoneDSTSavings = $expectedTimeZone->getDSTSavings(); + + $expected = <<assertDumpEquals($expected, $var); + } + + public function testCastDateFormatter() + { + $var = new \IntlDateFormatter('en', \IntlDateFormatter::TRADITIONAL, \IntlDateFormatter::TRADITIONAL); + + $expectedLocale = $var->getLocale(); + $expectedPattern = $var->getPattern(); + $expectedCalendar = $var->getCalendar(); + $expectedTimeZoneId = $var->getTimeZoneId(); + $expectedTimeType = $var->getTimeType(); + $expectedDateType = $var->getDateType(); + + $expectedCalendarObject = $var->getCalendarObject(); + $expectedCalendarObjectType = $expectedCalendarObject->getType(); + $expectedCalendarObjectFirstDayOfWeek = $expectedCalendarObject->getFirstDayOfWeek(); + $expectedCalendarObjectMinimalDaysInFirstWeek = $expectedCalendarObject->getMinimalDaysInFirstWeek(); + $expectedCalendarObjectRepeatedWallTimeOption = $expectedCalendarObject->getRepeatedWallTimeOption(); + $expectedCalendarObjectSkippedWallTimeOption = $expectedCalendarObject->getSkippedWallTimeOption(); + $expectedCalendarObjectTime = $expectedCalendarObject->getTime().'.0'; + $expectedCalendarObjectInDaylightTime = $expectedCalendarObject->inDaylightTime() ? 'true' : 'false'; + $expectedCalendarObjectIsLenient = $expectedCalendarObject->isLenient() ? 'true' : 'false'; + + $expectedCalendarObjectTimeZone = $expectedCalendarObject->getTimeZone(); + $expectedCalendarObjectTimeZoneDisplayName = $expectedCalendarObjectTimeZone->getDisplayName(); + $expectedCalendarObjectTimeZoneID = $expectedCalendarObjectTimeZone->getID(); + $expectedCalendarObjectTimeZoneRawOffset = $expectedCalendarObjectTimeZone->getRawOffset(); + $expectedCalendarObjectTimeZoneDSTSavings = $expectedCalendarObjectTimeZone->getDSTSavings(); + + $expectedTimeZone = $var->getTimeZone(); + $expectedTimeZoneDisplayName = $expectedTimeZone->getDisplayName(); + $expectedTimeZoneID = $expectedTimeZone->getID(); + $expectedTimeZoneRawOffset = $expectedTimeZone->getRawOffset(); + $expectedTimeZoneDSTSavings = $expectedTimeZone->getDSTSavings(); + + $expected = <<assertDumpEquals($expected, $var); + } +} diff --git a/vendor/symfony/var-dumper/Tests/Caster/MemcachedCasterTest.php b/vendor/symfony/var-dumper/Tests/Caster/MemcachedCasterTest.php new file mode 100644 index 000000000..df48390af --- /dev/null +++ b/vendor/symfony/var-dumper/Tests/Caster/MemcachedCasterTest.php @@ -0,0 +1,93 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Tests\Caster; + +use PHPUnit\Framework\TestCase; +use Symfony\Component\VarDumper\Test\VarDumperTestTrait; + +/** + * @author Jan Schädlich + */ +class MemcachedCasterTest extends TestCase +{ + use VarDumperTestTrait; + + public function testCastMemcachedWithDefaultOptions() + { + if (!class_exists('Memcached')) { + $this->markTestSkipped('Memcached not available'); + } + + $var = new \Memcached(); + $var->addServer('127.0.0.1', 11211); + $var->addServer('127.0.0.2', 11212); + + $expected = << array:3 [ + "host" => "127.0.0.1" + "port" => 11211 + "type" => "TCP" + ] + 1 => array:3 [ + "host" => "127.0.0.2" + "port" => 11212 + "type" => "TCP" + ] + ] + options: {} +} +EOTXT; + $this->assertDumpEquals($expected, $var); + } + + public function testCastMemcachedWithCustomOptions() + { + if (!class_exists('Memcached')) { + $this->markTestSkipped('Memcached not available'); + } + + $var = new \Memcached(); + $var->addServer('127.0.0.1', 11211); + $var->addServer('127.0.0.2', 11212); + + // set a subset of non default options to test boolean, string and integer output + $var->setOption(\Memcached::OPT_COMPRESSION, false); + $var->setOption(\Memcached::OPT_PREFIX_KEY, 'pre'); + $var->setOption(\Memcached::OPT_DISTRIBUTION, \Memcached::DISTRIBUTION_CONSISTENT); + + $expected = <<<'EOTXT' +Memcached { + servers: array:2 [ + 0 => array:3 [ + "host" => "127.0.0.1" + "port" => 11211 + "type" => "TCP" + ] + 1 => array:3 [ + "host" => "127.0.0.2" + "port" => 11212 + "type" => "TCP" + ] + ] + options: { + OPT_COMPRESSION: false + OPT_PREFIX_KEY: "pre" + OPT_DISTRIBUTION: 1 + } +} +EOTXT; + + $this->assertDumpEquals($expected, $var); + } +} diff --git a/vendor/symfony/var-dumper/Tests/Caster/RedisCasterTest.php b/vendor/symfony/var-dumper/Tests/Caster/RedisCasterTest.php index f724639d4..3edbed638 100644 --- a/vendor/symfony/var-dumper/Tests/Caster/RedisCasterTest.php +++ b/vendor/symfony/var-dumper/Tests/Caster/RedisCasterTest.php @@ -49,11 +49,15 @@ Redis {%A host: "127.0.0.1" port: 6379 auth: null + mode: ATOMIC dbNum: 0 timeout: 0.0 + lastError: null persistentId: null options: { + TCP_KEEPALIVE: 0 READ_TIMEOUT: 0.0 + COMPRESSION: NONE SERIALIZER: NONE PREFIX: null SCAN: NORETRY diff --git a/vendor/symfony/var-dumper/Tests/Caster/ReflectionCasterTest.php b/vendor/symfony/var-dumper/Tests/Caster/ReflectionCasterTest.php index 828fc30bf..64aa52a01 100644 --- a/vendor/symfony/var-dumper/Tests/Caster/ReflectionCasterTest.php +++ b/vendor/symfony/var-dumper/Tests/Caster/ReflectionCasterTest.php @@ -68,14 +68,14 @@ EOTXT $var = function ($x) use ($a, &$b) {}; $this->assertDumpMatchesFormat( - <<markTestSkipped('Not for HHVM.'); + } + $var = array( + (new \ReflectionMethod($this, __FUNCTION__))->getClosure($this), + (new \ReflectionMethod(__CLASS__, 'tearDownAfterClass'))->getClosure(), + ); + + $this->assertDumpMatchesFormat( + << Symfony\Component\VarDumper\Tests\Caster\ReflectionCasterTest::testFromCallableClosureCaster() { + this: Symfony\Component\VarDumper\Tests\Caster\ReflectionCasterTest { …} + file: "%sReflectionCasterTest.php" + line: "%d to %d" + } + 1 => %sTestCase::tearDownAfterClass() { + file: "%sTestCase.php" + line: "%d to %d" + } +] +EOTXT + , $var + ); + } + public function testClosureCasterExcludingVerbosity() { - $var = function () {}; + $var = function &($a = 5) {}; - $expectedDump = <<assertDumpEquals($expectedDump, $var, Caster::EXCLUDE_VERBOSE); + $this->assertDumpEquals('Closure&($a = 5) { …6}', $var, Caster::EXCLUDE_VERBOSE); } public function testReflectionParameter() @@ -140,7 +161,7 @@ EOTXT $this->assertDumpMatchesFormat( <<array:1 [ - 0 => "hello" + 0 => "hello(?stdClass $a, stdClass $b = null)" ] EODUMP; @@ -185,6 +185,27 @@ EODUMP; 0 => "hello" ] +EODUMP; + + $this->assertStringMatchesFormat($expectedDump, $dump); + } + + public function testClassStubWithAnonymousClass() + { + $var = array(new ClassStub(\get_class(new class() extends \Exception { + }))); + + $cloner = new VarCloner(); + $dumper = new HtmlDumper(); + $dumper->setDumpHeader(''); + $dumper->setDumpBoundaries('', ''); + $dump = $dumper->dump($cloner->cloneVar($var), true, array('fileLinkFormat' => '%f:%l')); + + $expectedDump = <<<'EODUMP' +array:1 [ + 0 => "Exception@anonymous" +] + EODUMP; $this->assertStringMatchesFormat($expectedDump, $dump); diff --git a/vendor/symfony/var-dumper/Tests/Dumper/CliDumperTest.php b/vendor/symfony/var-dumper/Tests/Dumper/CliDumperTest.php index d25f88d16..919d4e4a7 100644 --- a/vendor/symfony/var-dumper/Tests/Dumper/CliDumperTest.php +++ b/vendor/symfony/var-dumper/Tests/Dumper/CliDumperTest.php @@ -61,7 +61,10 @@ array:24 [ 5 => -INF 6 => {$intMax} "str" => "déjà\\n" - 7 => b"é\\x00" + 7 => b""" + é\\x00test\\t\\n + ing + """ "[]" => [] "res" => stream resource {@{$res} %A wrapper_type: "plainfile" @@ -75,7 +78,7 @@ array:24 [ +foo: "foo" +"bar": "bar" } - "closure" => Closure {#%d + "closure" => Closure(\$a, PDO &\$b = null) {#%d class: "Symfony\Component\VarDumper\Tests\Dumper\CliDumperTest" this: Symfony\Component\VarDumper\Tests\Dumper\CliDumperTest {#%d …} parameters: { diff --git a/vendor/symfony/var-dumper/Tests/Dumper/HtmlDumperTest.php b/vendor/symfony/var-dumper/Tests/Dumper/HtmlDumperTest.php index ac2f8f2c3..af3db4b75 100644 --- a/vendor/symfony/var-dumper/Tests/Dumper/HtmlDumperTest.php +++ b/vendor/symfony/var-dumper/Tests/Dumper/HtmlDumperTest.php @@ -63,8 +63,11 @@ class HtmlDumperTest extends TestCase 4 => INF 5 => -INF 6 => {$intMax} - "str" => "d&%s;j&%s;\\n" - 7 => b"&%s;\\x00" + "str" => "d&%s;j&%s;\\n" + 7 => b""" + é\\x00test\\t\\n + ing + """ "[]" => [] "res" => stream resource @{$res} %A wrapper_type: "plainfile" @@ -78,7 +81,7 @@ class HtmlDumperTest extends TestCase +foo: "foo" +"bar": "bar" } - "closure" => Closure {#%d + "closure" => Closure(\$a, PDO &\$b = null) {#%d class: "Symfony\Component\VarDumper\Tests\Dumper\HtmlDumperTest" this: HtmlDumperTest {#%d &%s;} diff --git a/vendor/symfony/var-dumper/Tests/Fixtures/FooInterface.php b/vendor/symfony/var-dumper/Tests/Fixtures/FooInterface.php index 874110a5b..172958b47 100644 --- a/vendor/symfony/var-dumper/Tests/Fixtures/FooInterface.php +++ b/vendor/symfony/var-dumper/Tests/Fixtures/FooInterface.php @@ -7,5 +7,5 @@ interface FooInterface /** * Hello. */ - public function foo(); + public function foo(?\stdClass $a, \stdClass $b = null); } diff --git a/vendor/symfony/var-dumper/Tests/Fixtures/dumb-var.php b/vendor/symfony/var-dumper/Tests/Fixtures/dumb-var.php index 59ee19bda..780f3b28d 100644 --- a/vendor/symfony/var-dumper/Tests/Fixtures/dumb-var.php +++ b/vendor/symfony/var-dumper/Tests/Fixtures/dumb-var.php @@ -17,7 +17,7 @@ $g = fopen(__FILE__, 'r'); $var = array( 'number' => 1, null, 'const' => 1.1, true, false, NAN, INF, -INF, PHP_INT_MAX, - 'str' => "déjà\n", "\xE9\x00", + 'str' => "déjà\n", "\xE9\x00test\t\ning", '[]' => array(), 'res' => $g, 'obj' => $foo, diff --git a/vendor/symfony/var-dumper/VarDumper.php b/vendor/symfony/var-dumper/VarDumper.php index a9ed05b3b..ff0cc948e 100644 --- a/vendor/symfony/var-dumper/VarDumper.php +++ b/vendor/symfony/var-dumper/VarDumper.php @@ -29,7 +29,13 @@ class VarDumper { if (null === self::$handler) { $cloner = new VarCloner(); - $dumper = \in_array(\PHP_SAPI, array('cli', 'phpdbg'), true) ? new CliDumper() : new HtmlDumper(); + + if (isset($_SERVER['VAR_DUMPER_FORMAT'])) { + $dumper = 'html' === $_SERVER['VAR_DUMPER_FORMAT'] ? new HtmlDumper() : new CliDumper(); + } else { + $dumper = \in_array(\PHP_SAPI, array('cli', 'phpdbg')) ? new CliDumper() : new HtmlDumper(); + } + self::$handler = function ($var) use ($cloner, $dumper) { $dumper->dump($cloner->cloneVar($var)); }; diff --git a/vendor/symfony/var-dumper/composer.json b/vendor/symfony/var-dumper/composer.json index 59e920172..5cf48475a 100644 --- a/vendor/symfony/var-dumper/composer.json +++ b/vendor/symfony/var-dumper/composer.json @@ -47,7 +47,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-master": "4.1-dev" + "dev-master": "4.2-dev" } } } diff --git a/vendor/symfony/var-dumper/phpunit.xml.dist b/vendor/symfony/var-dumper/phpunit.xml.dist index 4a25f42db..3243fcd02 100644 --- a/vendor/symfony/var-dumper/phpunit.xml.dist +++ b/vendor/symfony/var-dumper/phpunit.xml.dist @@ -1,7 +1,7 @@ getHeaderLine('X-Rewrite-Url'); + if ($httpXRewriteUrl !== null) { + $requestUri = $httpXRewriteUrl; + } + + $httpXOriginalUrl = $request->getHeaderLine('X-Original-Url'); + if ($httpXOriginalUrl !== null) { + $requestUri = $httpXOriginalUrl; + } + + if ($requestUri !== null) { + $request = $request->withUri(new Uri($requestUri)); + } + + return $handler->handle($request); + } + ``` + + If you use middleware such as the above, make sure you also instruct your web + server to strip any incoming headers of the same name so that you can + guarantee they are issued by the ISAPI_Rewrite module. + +### Deprecated + +- Nothing. + +### Removed + +- Nothing. + +### Fixed + +- Nothing. + +## 1.8.3 - 2018-07-24 + +### Added + +- Nothing. + +### Changed + +- Nothing. + +### Deprecated + +- Nothing. + +### Removed + +- Nothing. + +### Fixed + +- [#321](https://github.com/zendframework/zend-diactoros/pull/321) updates the logic in `Uri::withPort()` to ensure that it checks that the + value provided is either an integer or a string integer, as only those values + may be cast to integer without data loss. + +- [#320](https://github.com/zendframework/zend-diactoros/pull/320) adds checking within `Response` to ensure that the provided reason + phrase is a string; an `InvalidArgumentException` is now raised if it is not. This change + ensures the class adheres strictly to the PSR-7 specification. + +- [#319](https://github.com/zendframework/zend-diactoros/pull/319) provides a fix to `Zend\Diactoros\Response` that ensures that the status + code returned is _always_ an integer (and never a string containing an + integer), thus ensuring it strictly adheres to the PSR-7 specification. + +## 1.8.2 - 2018-07-19 + +### Added + +- Nothing. + +### Changed + +- Nothing. + +### Deprecated + +- Nothing. + +### Removed + +- Nothing. + +### Fixed + +- [#318](https://github.com/zendframework/zend-diactoros/pull/318) fixes the logic for discovering whether an HTTPS scheme is in play + to be case insensitive when comparing header and SAPI values, ensuring no + false negative lookups occur. + +- [#314](https://github.com/zendframework/zend-diactoros/pull/314) modifies error handling around opening a file resource within + `Zend\Diactoros\Stream::setStream()` to no longer use the second argument to + `set_error_handler()`, and instead check the error type in the handler itself; + this fixes an issue when the handler is nested inside another error handler, + which currently has buggy behavior within the PHP engine. + +## 1.8.1 - 2018-07-09 + +### Added + +- Nothing. + +### Changed + +- [#313](https://github.com/zendframework/zend-diactoros/pull/313) changes the reason phrase associated with the status code 425 + to "Too Early", corresponding to a new definition of the code as specified by the IANA. + +### Deprecated + +- Nothing. + +### Removed + +- Nothing. + +### Fixed + +- [#312](https://github.com/zendframework/zend-diactoros/pull/312) fixes how the `normalizeUploadedFiles()` utility function handles nested trees of + uploaded files, ensuring it detects them properly. + +## 1.8.0 - 2018-06-27 + +### Added + +- [#307](https://github.com/zendframework/zend-diactoros/pull/307) adds the following functions under the `Zend\Diactoros` namespace, each of + which may be used to derive artifacts from SAPI supergloabls for the purposes + of generating a `ServerRequest` instance: + - `normalizeServer(array $server, callable $apacheRequestHeaderCallback = null) : array` + (main purpose is to aggregate the `Authorization` header in the SAPI params + when under Apache) + - `marshalProtocolVersionFromSapi(array $server) : string` + - `marshalMethodFromSapi(array $server) : string` + - `marshalUriFromSapi(array $server, array $headers) : Uri` + - `marshalHeadersFromSapi(array $server) : array` + - `parseCookieHeader(string $header) : array` + - `createUploadedFile(array $spec) : UploadedFile` (creates the instance from + a normal `$_FILES` entry) + - `normalizeUploadedFiles(array $files) : UploadedFileInterface[]` (traverses + a potentially nested array of uploaded file instances and/or `$_FILES` + entries, including those aggregated under mod_php, php-fpm, and php-cgi in + order to create a flat array of `UploadedFileInterface` instances to use in a + request) + +### Changed + +- Nothing. + +### Deprecated + +- [#307](https://github.com/zendframework/zend-diactoros/pull/307) deprecates `ServerRequestFactory::normalizeServer()`; the method is + no longer used internally, and users should instead use `Zend\Diactoros\normalizeServer()`, + to which it proxies. + +- [#307](https://github.com/zendframework/zend-diactoros/pull/307) deprecates `ServerRequestFactory::marshalHeaders()`; the method is + no longer used internally, and users should instead use `Zend\Diactoros\marshalHeadersFromSapi()`, + to which it proxies. + +- [#307](https://github.com/zendframework/zend-diactoros/pull/307) deprecates `ServerRequestFactory::marshalUriFromServer()`; the method + is no longer used internally. Users should use `marshalUriFromSapi()` instead. + +- [#307](https://github.com/zendframework/zend-diactoros/pull/307) deprecates `ServerRequestFactory::marshalRequestUri()`. the method is no longer + used internally, and currently proxies to `marshalUriFromSapi()`, pulling the + discovered path from the `Uri` instance returned by that function. Users + should use `marshalUriFromSapi()` instead. + +- [#307](https://github.com/zendframework/zend-diactoros/pull/307) deprecates `ServerRequestFactory::marshalHostAndPortFromHeaders()`; the method + is no longer used internally, and currently proxies to `marshalUriFromSapi()`, + pulling the discovered host and port from the `Uri` instance returned by that + function. Users should use `marshalUriFromSapi()` instead. + +- [#307](https://github.com/zendframework/zend-diactoros/pull/307) deprecates `ServerRequestFactory::getHeader()`; the method is no longer + used internally. Users should copy and paste the functionality into their own + applications if needed, or rely on headers from a fully-populated `Uri` + instance instead. + +- [#307](https://github.com/zendframework/zend-diactoros/pull/307) deprecates `ServerRequestFactory::stripQueryString()`; the method is no longer + used internally, and users can mimic the functionality via the expression + `$path = explode('?', $path, 2)[0];`. + +- [#307](https://github.com/zendframework/zend-diactoros/pull/307) deprecates `ServerRequestFactory::normalizeFiles()`; the functionality + is no longer used internally, and users can use `normalizeUploadedFiles()` as + a replacement. + +- [#303](https://github.com/zendframework/zend-diactoros/pull/303) deprecates `Zend\Diactoros\Response\EmitterInterface` and its various implementations. These are now provided via the + [zendframework/zend-httphandlerrunner](https://docs.zendframework.com/zend-httphandlerrunner) package as 1:1 substitutions. + +- [#303](https://github.com/zendframework/zend-diactoros/pull/303) deprecates the `Zend\Diactoros\Server` class. Users are directed to the `RequestHandlerRunner` class from the + [zendframework/zend-httphandlerrunner](https://docs.zendframework.com/zend-httphandlerrunner) package as an alternative. + +### Removed + +- Nothing. + +### Fixed + +- Nothing. + +## 1.7.2 - 2018-05-29 + +### Added + +- Nothing. + +### Changed + +- Nothing. + +### Deprecated + +- Nothing. + +### Removed + +- Nothing. + +### Fixed + +- [#301](https://github.com/zendframework/zend-diactoros/pull/301) adds stricter comparisons within the `uri` class to ensure non-empty + values are not treated as empty. + +## 1.7.1 - 2018-02-26 + +### Added + +- Nothing. + +### Changed + +- [#293](https://github.com/zendframework/zend-diactoros/pull/293) updates + `Uri::getHost()` to cast the value via `strtolower()` before returning it. + While this represents a change, it is fixing a bug in our implementation: + the PSR-7 specification for the method, which follows IETF RFC 3986 section + 3.2.2, requires that the host name be normalized to lowercase. + +### Deprecated + +- Nothing. + +### Removed + +- Nothing. + +### Fixed + +- [#290](https://github.com/zendframework/zend-diactoros/pull/290) fixes + `Stream::getSize()` such that it checks that the result of `fstat` was + succesful before attempting to return its `size` member; in the case of an + error, it now returns `null`. + +## 1.7.0 - 2018-01-04 + +### Added + +- [#285](https://github.com/zendframework/zend-diactoros/pull/285) adds a new + custom response type, `Zend\Diactoros\Response\XmlResponse`, for generating + responses representing XML. Usage is the same as with the `HtmlResponse` or + `TextResponse`; the response generated will have a `Content-Type: + application/xml` header by default. + +- [#280](https://github.com/zendframework/zend-diactoros/pull/280) adds the + response status code/phrase pairing "103 Early Hints" to the + `Response::$phrases` property. This is a new status proposed via + [RFC 8297](https://datatracker.ietf.org/doc/rfc8297/). + +- [#279](https://github.com/zendframework/zend-diactoros/pull/279) adds explicit + support for PHP 7.2; previously, we'd allowed build failures, though none + occured; we now require PHP 7.2 builds to pass. + +### Changed + +- Nothing. + +### Deprecated + +- Nothing. + +### Removed + +- Nothing. + +### Fixed + +- Nothing. + +## 1.6.1 - 2017-10-12 + +### Added + +- Nothing. + +### Changed + +- [#273](https://github.com/zendframework/zend-diactoros/pull/273) updates each + of the SAPI emitter implementations to emit the status line after emitting + other headers; this is done to ensure that the status line is not overridden + by PHP. + +### Deprecated + +- Nothing. + +### Removed + +- Nothing. + +### Fixed + +- [#273](https://github.com/zendframework/zend-diactoros/pull/273) modifies how + the `SapiEmitterTrait` calls `header()` to ensure that a response code is + _always_ passed as the third argument; this is done to prevent PHP from + silently overriding it. + +## 1.6.0 - 2017-09-13 + +### Added + +- Nothing. + +### Changed + +- [#270](https://github.com/zendframework/zend-diactoros/pull/270) changes the + behavior of `Zend\Diactoros\Server`: it no longer creates an output buffer. + +- [#270](https://github.com/zendframework/zend-diactoros/pull/270) changes the + behavior of the two SAPI emitters in two backwards-incompatible ways: + + - They no longer auto-inject a `Content-Length` header. If you need this + functionality, zendframework/zend-expressive-helpers 4.1+ provides it via + `Zend\Expressive\Helper\ContentLengthMiddleware`. + + - They no longer flush the output buffer. Instead, if headers have been sent, + or the output buffer exists and has a non-zero length, the emitters raise an + exception, as mixed PSR-7/output buffer content creates a blocking issue. + If you are emitting content via `echo`, `print`, `var_dump`, etc., or not + catching PHP errors or exceptions, you will need to either fix your + application to always work with a PSR-7 response, or provide your own + emitters that allow mixed output mechanisms. + +### Deprecated + +- Nothing. + +### Removed + +- Nothing. + +### Fixed + +- Nothing. + +## 1.5.0 - 2017-08-22 + +### Added + +- [#205](https://github.com/zendframework/zend-diactoros/pull/205) adds support + for PHP 7.2. + +- [#250](https://github.com/zendframework/zend-diactoros/pull/250) adds a new + API to `JsonResponse` to avoid the need for decoding the response body in + order to make changes to the underlying content. New methods include: + - `getPayload()`: retrieve the unencoded payload. + - `withPayload($data)`: create a new instance with the given data. + - `getEncodingOptions()`: retrieve the flags to use when encoding the payload + to JSON. + - `withEncodingOptions(int $encodingOptions)`: create a new instance that uses + the provided flags when encoding the payload to JSON. + +### Changed + +- [#249](https://github.com/zendframework/zend-diactoros/pull/249) changes the + behavior of the various `Uri::with*()` methods slightly: if the value + represents no change, these methods will return the same instance instead of a + new one. + +- [#248](https://github.com/zendframework/zend-diactoros/pull/248) changes the + behavior of `Uri::getUserInfo()` slightly: it now (correctly) returns the + percent-encoded values for the user and/or password, per RFC 3986 Section + 3.2.1. `withUserInfo()` will percent-encode values, using a mechanism that + prevents double-encoding. + +- [#243](https://github.com/zendframework/zend-diactoros/pull/243) changes the + exception messages thrown by `UploadedFile::getStream()` and `moveTo()` when + an upload error exists to include details about the upload error. + +- [#233](https://github.com/zendframework/zend-diactoros/pull/233) adds a new + argument to `SapiStreamEmitter::emit`, `$maxBufferLevel` **between** the + `$response` and `$maxBufferLength` arguments. This was done because the + `Server::listen()` method passes only the response and `$maxBufferLevel` to + emitters; previously, this often meant that streams were being chunked 2 bytes + at a time versus the expected default of 8kb. + + If you were calling the `SapiStreamEmitter::emit()` method manually + previously, you will need to update your code. + +### Deprecated + +- Nothing. + +### Removed + +- [#205](https://github.com/zendframework/zend-diactoros/pull/205) and + [#243](https://github.com/zendframework/zend-diactoros/pull/243) **remove + support for PHP versions prior to 5.6 as well as HHVM**. + +### Fixed + +- [#248](https://github.com/zendframework/zend-diactoros/pull/248) fixes how the + `Uri` class provides user-info within the URI authority; the value is now + correctly percent-encoded , per RFC 3986 Section 3.2.1. + +## 1.4.1 - 2017-08-17 + +### Added + +- Nothing. + +### Deprecated + +- Nothing. + +### Removed + +- [#260](https://github.com/zendframework/zend-diactoros/pull/260) removes + support for HHVM, as tests have failed against it for some time. + +### Fixed + +- [#247](https://github.com/zendframework/zend-diactoros/pull/247) fixes the + `Stream` and `RelativeStream` `__toString()` method implementations to check + if the stream `isSeekable()` before attempting to `rewind()` it, ensuring that + the method does not raise exceptions (PHP does not allow exceptions in that + method). In particular, this fixes an issue when using AWS S3 streams. + +- [#252](https://github.com/zendframework/zend-diactoros/pull/252) provides a + fix to the `SapiEmitterTrait` to ensure that any `Set-Cookie` headers in the + response instance do not override those set by PHP when a session is created + and/or regenerated. + +- [#257](https://github.com/zendframework/zend-diactoros/pull/257) provides a + fix for the `PhpInputStream::read()` method to ensure string content that + evaluates as empty (including `0`) is still cached. + +- [#258](https://github.com/zendframework/zend-diactoros/pull/258) updates the + `Uri::filterPath()` method to allow parens within a URI path, per [RFC 3986 + section 3.3](https://tools.ietf.org/html/rfc3986#section-3.3) (parens are + within the character set "sub-delims"). + +## 1.4.0 - 2017-04-06 + +### Added + +- [#219](https://github.com/zendframework/zend-diactoros/pull/219) adds two new + classes, `Zend\Diactoros\Request\ArraySerializer` and + `Zend\Diactoros\Response\ArraySerializer`. Each exposes the static methods + `toArray()` and `fromArray()`, allowing de/serialization of messages from and + to arrays. + +- [#236](https://github.com/zendframework/zend-diactoros/pull/236) adds two new + constants to the `Response` class: `MIN_STATUS_CODE_VALUE` and + `MAX_STATUS_CODE_VALUE`. + +### Changes + +- [#240](https://github.com/zendframework/zend-diactoros/pull/240) changes the + behavior of `ServerRequestFactory::fromGlobals()` when no `$cookies` argument + is present. Previously, it would use `$_COOKIES`; now, if a `Cookie` header is + present, it will parse and use that to populate the instance instead. + + This change allows utilizing cookies that contain period characters (`.`) in + their names (PHP's built-in cookie handling renames these to replace `.` with + `_`, which can lead to synchronization issues with clients). + +- [#235](https://github.com/zendframework/zend-diactoros/pull/235) changes the + behavior of `Uri::__toString()` to better follow proscribed behavior in PSR-7. + In particular, prior to this release, if a scheme was missing but an authority + was present, the class was incorrectly returning a value that did not include + a `//` prefix. As of this release, it now does this correctly. + +### Deprecated + +- Nothing. + +### Removed + +- Nothing. + +### Fixed + +- Nothing. + +## 1.3.11 - 2017-04-06 + +### Added + +- Nothing. + +### Changes + +- [#241](https://github.com/zendframework/zend-diactoros/pull/241) changes the + constraint by which the package provides `psr/http-message-implementation` to + simply `1.0` instead of `~1.0.0`, to follow how other implementations provide + PSR-7. + +### Deprecated + +- Nothing. + +### Removed + +- Nothing. + +### Fixed + +- [#161](https://github.com/zendframework/zend-diactoros/pull/161) adds + additional validations to header names and values to ensure no malformed values + are provided. + +- [#234](https://github.com/zendframework/zend-diactoros/pull/234) fixes a + number of reason phrases in the `Response` instance, and adds automation from + the canonical IANA sources to ensure any new phrases added are correct. + +## 1.3.10 - 2017-01-23 + +### Added + +- Nothing. + +### Deprecated + +- Nothing. + +### Removed + +- Nothing. + +### Fixed + +- [#226](https://github.com/zendframework/zend-diactoros/pull/226) fixed an + issue with the `SapiStreamEmitter` causing the response body to be cast + to `(string)` and also be read as a readable stream, potentially producing + double output. + +## 1.3.9 - 2017-01-17 + +### Added + +- Nothing. + +### Deprecated + +- Nothing. + +### Removed + +- Nothing. + +### Fixed + +- [#223](https://github.com/zendframework/zend-diactoros/issues/223) + [#224](https://github.com/zendframework/zend-diactoros/pull/224) fixed an issue + with the `SapiStreamEmitter` consuming too much memory when producing output + for readable bodies. + +## 1.3.8 - 2017-01-05 + +### Added + +- Nothing. + +### Deprecated + +- Nothing. + +### Removed + +- Nothing. + +### Fixed + +- [#222](https://github.com/zendframework/zend-diactoros/pull/222) fixes the + `SapiStreamEmitter`'s handling of the `Content-Range` header to properly only + emit a range of bytes if the header value is in the form `bytes {first-last}/length`. + This allows using other range units, such as `items`, without incorrectly + emitting truncated content. + +## 1.3.7 - 2016-10-11 + +### Added + +- [#208](https://github.com/zendframework/zend-diactoros/pull/208) adds several + missing response codes to `Zend\Diactoros\Response`, including: + - 226 ('IM used') + - 308 ('Permanent Redirect') + - 444 ('Connection Closed Without Response') + - 499 ('Client Closed Request') + - 510 ('Not Extended') + - 599 ('Network Connect Timeout Error') +- [#211](https://github.com/zendframework/zend-diactoros/pull/211) adds support + for UTF-8 characters in query strings handled by `Zend\Diactoros\Uri`. + +### Deprecated + +- Nothing. + +### Removed + +- Nothing. + +### Fixed + +- Nothing. + +## 1.3.6 - 2016-09-07 + +### Added + +- [#170](https://github.com/zendframework/zend-diactoros/pull/170) prepared + documentation for publication at https://zendframework.github.io/zend-diactoros/ +- [#165](https://github.com/zendframework/zend-diactoros/pull/165) adds support + for Apache `REDIRECT_HTTP_*` header detection in the `ServerRequestFactory`. +- [#166](https://github.com/zendframework/zend-diactoros/pull/166) adds support + for UTF-8 characters in URI paths. +- [#204](https://github.com/zendframework/zend-diactoros/pull/204) adds testing + against PHP 7.1 release-candidate builds. + +### Deprecated + +- Nothing. + +### Removed + +- Nothing. + +### Fixed + +- [#186](https://github.com/zendframework/zend-diactoros/pull/186) fixes a typo + in a variable name within the `SapiStreamEmitter`. +- [#200](https://github.com/zendframework/zend-diactoros/pull/200) updates the + `SapiStreamEmitter` to implement a check for `isSeekable()` prior to attempts + to rewind; this allows it to work with non-seekable streams such as the + `CallbackStream`. +- [#169](https://github.com/zendframework/zend-diactoros/pull/169) ensures that + response serialization always provides a `\r\n\r\n` sequence following the + headers, even when no message body is present, to ensure it conforms with RFC + 7230. +- [#175](https://github.com/zendframework/zend-diactoros/pull/175) updates the + `Request` class to set the `Host` header from the URI host if no header is + already present. (Ensures conformity with PSR-7 specification.) +- [#197](https://github.com/zendframework/zend-diactoros/pull/197) updates the + `Uri` class to ensure that string serialization does not include a colon after + the host name if no port is present in the instance. + +## 1.3.5 - 2016-03-17 + +### Added + +- Nothing. + +### Deprecated + +- Nothing. + +### Removed + +- Nothing. + +### Fixed + +- [#160](https://github.com/zendframework/zend-diactoros/pull/160) fixes HTTP + protocol detection in the `ServerRequestFactory` to work correctly with HTTP/2. + +## 1.3.4 - 2016-03-17 + +### Added + +- [#119](https://github.com/zendframework/zend-diactoros/pull/119) adds the 451 + (Unavailable for Legal Reasons) status code to the `Response` class. + +### Deprecated + +- Nothing. + +### Removed + +- Nothing. + +### Fixed + +- [#117](https://github.com/zendframework/zend-diactoros/pull/117) provides + validation of the HTTP protocol version. +- [#127](https://github.com/zendframework/zend-diactoros/pull/127) now properly + removes attributes with `null` values when calling `withoutAttribute()`. +- [#132](https://github.com/zendframework/zend-diactoros/pull/132) updates the + `ServerRequestFactory` to marshal the request path fragment, if present. +- [#142](https://github.com/zendframework/zend-diactoros/pull/142) updates the + exceptions thrown by `HeaderSecurity` to include the header name and/or + value. +- [#148](https://github.com/zendframework/zend-diactoros/pull/148) fixes several + stream operations to ensure they raise exceptions when the internal pointer + is at an invalid position. +- [#151](https://github.com/zendframework/zend-diactoros/pull/151) ensures + URI fragments are properly encoded. + +## 1.3.3 - 2016-01-04 + +### Added + +- Nothing. + +### Deprecated + +- Nothing. + +### Removed + +- Nothing. + +### Fixed + +- [#135](https://github.com/zendframework/zend-diactoros/pull/135) fixes the + behavior of `ServerRequestFactory::marshalHeaders()` to no longer omit + `Cookie` headers from the aggregated headers. While the values are parsed and + injected into the cookie params, it's useful to have access to the raw headers + as well. + +## 1.3.2 - 2015-12-22 + +### Added + +- [#124](https://github.com/zendframework/zend-diactoros/pull/124) adds four + more optional arguments to the `ServerRequest` constructor: + - `array $cookies` + - `array $queryParams` + - `null|array|object $parsedBody` + - `string $protocolVersion` + `ServerRequestFactory` was updated to pass values for each of these parameters + when creating an instance, instead of using the related `with*()` methods on + an instance. + +### Deprecated + +- Nothing. + +### Removed + +- Nothing. + +### Fixed + +- [#122](https://github.com/zendframework/zend-diactoros/pull/122) updates the + `ServerRequestFactory` to retrieve the HTTP protocol version and inject it in + the generated `ServerRequest`, which previously was not performed. + +## 1.3.1 - 2015-12-16 + +### Added + +- Nothing. + +### Deprecated + +- Nothing. + +### Removed + +- Nothing. + +### Fixed + +- [#113](https://github.com/zendframework/zend-diactoros/pull/113) fixes an + issue in the response serializer, ensuring that the status code in the + deserialized response is an integer. +- [#115](https://github.com/zendframework/zend-diactoros/pull/115) fixes an + issue in the various text-basd response types (`TextResponse`, `HtmlResponse`, + and `JsonResponse`); due to the fact that the constructor was not + rewinding the message body stream, `getContents()` was thus returning `null`, + as the pointer was at the end of the stream. The constructor now rewinds the + stream after populating it in the constructor. + +## 1.3.0 - 2015-12-15 + +### Added + +- [#110](https://github.com/zendframework/zend-diactoros/pull/110) adds + `Zend\Diactoros\Response\SapiEmitterTrait`, which provides the following + private method definitions: + - `injectContentLength()` + - `emitStatusLine()` + - `emitHeaders()` + - `flush()` + - `filterHeader()` + The `SapiEmitter` implementation has been updated to remove those methods and + instead compose the trait. +- [#111](https://github.com/zendframework/zend-diactoros/pull/111) adds + a new emitter implementation, `SapiStreamEmitter`; this emitter type will + loop through the stream instead of emitting it in one go, and supports content + ranges. + +### Deprecated + +- Nothing. + +### Removed + +- Nothing. + +### Fixed + +- Nothing. + +## 1.2.1 - 2015-12-15 + +### Added + +- Nothing. + +### Deprecated + +- Nothing. + +### Removed + +- Nothing. + +### Fixed + +- [#101](https://github.com/zendframework/zend-diactoros/pull/101) fixes the + `withHeader()` implementation to ensure that if the header existed previously + but using a different casing strategy, the previous version will be removed + in the cloned instance. +- [#103](https://github.com/zendframework/zend-diactoros/pull/103) fixes the + constructor of `Response` to ensure that null status codes are not possible. +- [#99](https://github.com/zendframework/zend-diactoros/pull/99) fixes + validation of header values submitted via request and response constructors as + follows: + - numeric (integer and float) values are now properly allowed (this solves + some reported issues with setting Content-Length headers) + - invalid header names (non-string values or empty strings) now raise an + exception. + - invalid individual header values (non-string, non-numeric) now raise an + exception. + +## 1.2.0 - 2015-11-24 + +### Added + +- [#88](https://github.com/zendframework/zend-diactoros/pull/88) updates the + `SapiEmitter` to emit a `Content-Length` header with the content length as + reported by the response body stream, assuming that + `StreamInterface::getSize()` returns an integer. +- [#77](https://github.com/zendframework/zend-diactoros/pull/77) adds a new + response type, `Zend\Diactoros\Response\TextResponse`, for returning plain + text responses. By default, it sets the content type to `text/plain; + charset=utf-8`; per the other response types, the signature is `new + TextResponse($text, $status = 200, array $headers = [])`. +- [#90](https://github.com/zendframework/zend-diactoros/pull/90) adds a new + `Zend\Diactoros\CallbackStream`, allowing you to back a stream with a PHP + callable (such as a generator) to generate the message content. Its + constructor accepts the callable: `$stream = new CallbackStream($callable);` + +### Deprecated + +- Nothing. + +### Removed + +- Nothing. + +### Fixed + +- [#77](https://github.com/zendframework/zend-diactoros/pull/77) updates the + `HtmlResponse` to set the charset to utf-8 by default (if no content type + header is provided at instantiation). + +## 1.1.4 - 2015-10-16 + +### Added + +- [#98](https://github.com/zendframework/zend-diactoros/pull/98) adds + `JSON_UNESCAPED_SLASHES` to the default `json_encode` flags used by + `Zend\Diactoros\Response\JsonResponse`. + +### Deprecated + +- Nothing. + +### Removed + +- Nothing. + +### Fixed + +- [#96](https://github.com/zendframework/zend-diactoros/pull/96) updates + `withPort()` to allow `null` port values (indicating usage of default for + the given scheme). +- [#91](https://github.com/zendframework/zend-diactoros/pull/91) fixes the + logic of `withUri()` to do a case-insensitive check for an existing `Host` + header, replacing it with the new one. + +## 1.1.3 - 2015-08-10 + +### Added + +- [#73](https://github.com/zendframework/zend-diactoros/pull/73) adds caching of + the vendor directory to the Travis-CI configuration, to speed up builds. + +### Deprecated + +- Nothing. + +### Removed + +- Nothing. + +### Fixed + +- [#71](https://github.com/zendframework/zend-diactoros/pull/71) fixes the + docblock of the `JsonResponse` constructor to typehint the `$data` argument + as `mixed`. +- [#73](https://github.com/zendframework/zend-diactoros/pull/73) changes the + behavior in `Request` such that if it marshals a stream during instantiation, + the stream is marked as writeable (specifically, mode `wb+`). +- [#85](https://github.com/zendframework/zend-diactoros/pull/85) updates the + behavior of `Zend\Diactoros\Uri`'s various `with*()` methods that are + documented as accepting strings to raise exceptions on non-string input. + Previously, several simply passed non-string input on verbatim, others + normalized the input, and a few correctly raised the exceptions. Behavior is + now consistent across each. +- [#87](https://github.com/zendframework/zend-diactoros/pull/87) fixes + `UploadedFile` to ensure that `moveTo()` works correctly in non-SAPI + environments when the file provided to the constructor is a path. + +## 1.1.2 - 2015-07-12 + +### Added + +- Nothing. + +### Deprecated + +- Nothing. + +### Removed + +- Nothing. + +### Fixed + +- [#67](https://github.com/zendframework/zend-diactoros/pull/67) ensures that + the `Stream` class only accepts `stream` resources, not any resource. + +## 1.1.1 - 2015-06-25 + +### Added + +- Nothing. + +### Deprecated + +- Nothing. + +### Removed + +- Nothing. + +### Fixed + +- [#64](https://github.com/zendframework/zend-diactoros/pull/64) fixes the + behavior of `JsonResponse` with regards to serialization of `null` and scalar + values; the new behavior is to serialize them verbatim, without any casting. + +## 1.1.0 - 2015-06-24 + +### Added + +- [#52](https://github.com/zendframework/zend-diactoros/pull/52), + [#58](https://github.com/zendframework/zend-diactoros/pull/58), + [#59](https://github.com/zendframework/zend-diactoros/pull/59), and + [#61](https://github.com/zendframework/zend-diactoros/pull/61) create several + custom response types for simplifying response creation: + + - `Zend\Diactoros\Response\HtmlResponse` accepts HTML content via its + constructor, and sets the `Content-Type` to `text/html`. + - `Zend\Diactoros\Response\JsonResponse` accepts data to serialize to JSON via + its constructor, and sets the `Content-Type` to `application/json`. + - `Zend\Diactoros\Response\EmptyResponse` allows creating empty, read-only + responses, with a default status code of 204. + - `Zend\Diactoros\Response\RedirectResponse` allows specifying a URI for the + `Location` header in the constructor, with a default status code of 302. + + Each also accepts an optional status code, and optional headers (which can + also be used to provide an alternate `Content-Type` in the case of the HTML + and JSON responses). + +### Deprecated + +- Nothing. + +### Removed + +- [#43](https://github.com/zendframework/zend-diactoros/pull/43) removed both + `ServerRequestFactory::marshalUri()` and `ServerRequestFactory::marshalHostAndPort()`, + which were deprecated prior to the 1.0 release. + +### Fixed + +- [#29](https://github.com/zendframework/zend-diactoros/pull/29) fixes request + method validation to allow any valid token as defined by [RFC + 7230](http://tools.ietf.org/html/rfc7230#appendix-B). This allows usage of + custom request methods, vs a static, hard-coded list. + +## 1.0.5 - 2015-06-24 + +### Added + +- Nothing. + +### Deprecated + +- Nothing. + +### Removed + +- Nothing. + +### Fixed + +- [#60](https://github.com/zendframework/zend-diactoros/pull/60) fixes + the behavior of `UploadedFile` when the `$errorStatus` provided at + instantiation is not `UPLOAD_ERR_OK`. Prior to the fix, an + `InvalidArgumentException` would occur at instantiation due to the fact that + the upload file was missing or invalid. With the fix, no exception is raised + until a call to `moveTo()` or `getStream()` is made. + +## 1.0.4 - 2015-06-23 + +This is a security release. + +A patch has been applied to `Zend\Diactoros\Uri::filterPath()` that ensures that +paths can only begin with a single leading slash. This prevents the following +potential security issues: + +- XSS vectors. If the URI path is used for links or form targets, this prevents + cases where the first segment of the path resembles a domain name, thus + creating scheme-relative links such as `//example.com/foo`. With the patch, + the leading double slash is reduced to a single slash, preventing the XSS + vector. +- Open redirects. If the URI path is used for `Location` or `Link` headers, + without a scheme and authority, potential for open redirects exist if clients + do not prepend the scheme and authority. Again, preventing a double slash + corrects the vector. + +If you are using `Zend\Diactoros\Uri` for creating links, form targets, or +redirect paths, and only using the path segment, we recommend upgrading +immediately. + +### Added + +- [#25](https://github.com/zendframework/zend-diactoros/pull/25) adds + documentation. Documentation is written in markdown, and can be converted to + HTML using [bookdown](http://bookdown.io). New features now MUST include + documentation for acceptance. + +### Deprecated + +- Nothing. + +### Removed + +- Nothing. + +### Fixed + +- [#51](https://github.com/zendframework/zend-diactoros/pull/51) fixes + `MessageTrait::getHeaderLine()` to return an empty string instead of `null` if + the header is undefined (which is the behavior specified in PSR-7). +- [#57](https://github.com/zendframework/zend-diactoros/pull/57) fixes the + behavior of how the `ServerRequestFactory` marshals upload files when they are + represented as a nested associative array. +- [#49](https://github.com/zendframework/zend-diactoros/pull/49) provides several + fixes that ensure that Diactoros complies with the PSR-7 specification: + - `MessageInterface::getHeaderLine()` MUST return a string (that string CAN be + empty). Previously, Diactoros would return `null`. + - If no `Host` header is set, the `$preserveHost` flag MUST be ignored when + calling `withUri()` (previously, Diactoros would not set the `Host` header + if `$preserveHost` was `true`, but no `Host` header was present). + - The request method MUST be a string; it CAN be empty. Previously, Diactoros + would return `null`. + - The request MUST return a `UriInterface` instance from `getUri()`; that + instance CAN be empty. Previously, Diactoros would return `null`; now it + lazy-instantiates an empty `Uri` instance on initialization. +- [ZF2015-05](http://framework.zend.com/security/advisory/ZF2015-05) was + addressed by altering `Uri::filterPath()` to prevent emitting a path prepended + with multiple slashes. + +## 1.0.3 - 2015-06-04 + +### Added + +- [#48](https://github.com/zendframework/zend-diactoros/pull/48) drops the + minimum supported PHP version to 5.4, to allow an easier upgrade path for + Symfony 2.7 users, and potential Drupal 8 usage. + +### Deprecated + +- Nothing. + +### Removed + +- Nothing. + +### Fixed + +- Nothing. + +## 1.0.2 - 2015-06-04 + +### Added + +- [#27](https://github.com/zendframework/zend-diactoros/pull/27) adds phonetic + pronunciation of "Diactoros" to the README file. +- [#36](https://github.com/zendframework/zend-diactoros/pull/36) adds property + annotations to the class-level docblock of `Zend\Diactoros\RequestTrait` to + ensure properties inherited from the `MessageTrait` are inherited by + implementations. + +### Deprecated + +- Nothing. + +### Removed + +- Nothing. +- +### Fixed + +- [#41](https://github.com/zendframework/zend-diactoros/pull/41) fixes the + namespace for test files to begin with `ZendTest` instead of `Zend`. +- [#46](https://github.com/zendframework/zend-diactoros/pull/46) ensures that + the cookie and query params for the `ServerRequest` implementation are + initialized as arrays. +- [#47](https://github.com/zendframework/zend-diactoros/pull/47) modifies the + internal logic in `HeaderSecurity::isValid()` to use a regular expression + instead of character-by-character comparisons, improving performance. + +## 1.0.1 - 2015-05-26 + +### Added + +- [#10](https://github.com/zendframework/zend-diactoros/pull/10) adds + `Zend\Diactoros\RelativeStream`, which will return stream contents relative to + a given offset (i.e., a subset of the stream). `AbstractSerializer` was + updated to create a `RelativeStream` when creating the body of a message, + which will prevent duplication of the stream in-memory. +- [#21](https://github.com/zendframework/zend-diactoros/pull/21) adds a + `.gitattributes` file that excludes directories and files not needed for + production; this will further minify the package for production use cases. + +### Deprecated + +- Nothing. + +### Removed + +- Nothing. + +### Fixed + +- [#9](https://github.com/zendframework/zend-diactoros/pull/9) ensures that + attributes are initialized to an empty array, ensuring that attempts to + retrieve single attributes when none are defined will not produce errors. +- [#14](https://github.com/zendframework/zend-diactoros/pull/14) updates + `Zend\Diactoros\Request` to use a `php://temp` stream by default instead of + `php://memory`, to ensure requests do not create an out-of-memory condition. +- [#15](https://github.com/zendframework/zend-diactoros/pull/15) updates + `Zend\Diactoros\Stream` to ensure that write operations trigger an exception + if the stream is not writeable. Additionally, it adds more robust logic for + determining if a stream is writeable. + +## 1.0.0 - 2015-05-21 + +First stable release, and first release as `zend-diactoros`. + +### Added + +- Nothing. + +### Deprecated + +- Nothing. + +### Removed + +- Nothing. + +### Fixed + +- Nothing. diff --git a/vendor/zendframework/zend-diactoros/CONDUCT.md b/vendor/zendframework/zend-diactoros/CONDUCT.md new file mode 100644 index 000000000..c663d2be9 --- /dev/null +++ b/vendor/zendframework/zend-diactoros/CONDUCT.md @@ -0,0 +1,43 @@ +# Contributor Code of Conduct + +The Zend Framework project adheres to [The Code Manifesto](http://codemanifesto.com) +as its guidelines for contributor interactions. + +## The Code Manifesto + +We want to work in an ecosystem that empowers developers to reach their +potential — one that encourages growth and effective collaboration. A space that +is safe for all. + +A space such as this benefits everyone that participates in it. It encourages +new developers to enter our field. It is through discussion and collaboration +that we grow, and through growth that we improve. + +In the effort to create such a place, we hold to these values: + +1. **Discrimination limits us.** This includes discrimination on the basis of + race, gender, sexual orientation, gender identity, age, nationality, technology + and any other arbitrary exclusion of a group of people. +2. **Boundaries honor us.** Your comfort levels are not everyone’s comfort + levels. Remember that, and if brought to your attention, heed it. +3. **We are our biggest assets.** None of us were born masters of our trade. + Each of us has been helped along the way. Return that favor, when and where + you can. +4. **We are resources for the future.** As an extension of #3, share what you + know. Make yourself a resource to help those that come after you. +5. **Respect defines us.** Treat others as you wish to be treated. Make your + discussions, criticisms and debates from a position of respectfulness. Ask + yourself, is it true? Is it necessary? Is it constructive? Anything less is + unacceptable. +6. **Reactions require grace.** Angry responses are valid, but abusive language + and vindictive actions are toxic. When something happens that offends you, + handle it assertively, but be respectful. Escalate reasonably, and try to + allow the offender an opportunity to explain themselves, and possibly correct + the issue. +7. **Opinions are just that: opinions.** Each and every one of us, due to our + background and upbringing, have varying opinions. The fact of the matter, is + that is perfectly acceptable. Remember this: if you respect your own + opinions, you should respect the opinions of others. +8. **To err is human.** You might not intend it, but mistakes do happen and + contribute to build experience. Tolerate honest mistakes, and don't hesitate + to apologize if you make one yourself. diff --git a/vendor/zendframework/zend-diactoros/CONTRIBUTING.md b/vendor/zendframework/zend-diactoros/CONTRIBUTING.md new file mode 100644 index 000000000..817ba7bff --- /dev/null +++ b/vendor/zendframework/zend-diactoros/CONTRIBUTING.md @@ -0,0 +1,228 @@ +# CONTRIBUTING + +## RESOURCES + +If you wish to contribute to Zend Framework, please be sure to +read/subscribe to the following resources: + + - [Coding Standards](https://github.com/zendframework/zf2/wiki/Coding-Standards) + - [Contributor's Guide](http://framework.zend.com/participate/contributor-guide) + - ZF Contributor's mailing list: + Archives: http://zend-framework-community.634137.n4.nabble.com/ZF-Contributor-f680267.html + Subscribe: zf-contributors-subscribe@lists.zend.com + - ZF Contributor's IRC channel: + #zftalk.dev on Freenode.net + +If you are working on new features or refactoring [create a proposal](https://github.com/zendframework/zend-diactoros/issues/new). + +## Reporting Potential Security Issues + +If you have encountered a potential security vulnerability, please **DO NOT** report it on the public +issue tracker: send it to us at [zf-security@zend.com](mailto:zf-security@zend.com) instead. +We will work with you to verify the vulnerability and patch it as soon as possible. + +When reporting issues, please provide the following information: + +- Component(s) affected +- A description indicating how to reproduce the issue +- A summary of the security vulnerability and impact + +We request that you contact us via the email address above and give the project +contributors a chance to resolve the vulnerability and issue a new release prior +to any public exposure; this helps protect users and provides them with a chance +to upgrade and/or update in order to protect their applications. + +For sensitive email communications, please use [our PGP key](http://framework.zend.com/zf-security-pgp-key.asc). + +## Documentation + +Documentation is in [GitHub Flavored Markdown](https://help.github.com/articles/github-flavored-markdown/), +and rendered using [bookdown](http://bookdown.io). Please read and follow the [general documentation +guidelines](https://github.com/zendframework/documentation/blob/master/CONTRIBUTING.md) when +providing documentation. + +All new features **must** include documentation before they may be accepted and merged. + +## RUNNING TESTS + +To run tests: + +- Clone the repository: + + ```console + $ git clone git@github.com:zendframework/zend-diactoros.git + $ cd + ``` + +- Install dependencies via composer: + + ```console + $ curl -sS https://getcomposer.org/installer | php -- + $ ./composer.phar install + ``` + + If you don't have `curl` installed, you can also download `composer.phar` from https://getcomposer.org/ + +- Run the tests via `phpunit` and the provided PHPUnit config, like in this example: + + ```console + $ ./vendor/bin/phpunit + ``` + +## Running Coding Standards Checks + +This component uses [phpcs](https://github.com/squizlabs/PHP_CodeSniffer) for coding +standards checks, and provides configuration for our selected checks. +`phpcs` is installed by default via Composer. + +To run checks only: + +```console +$ composer cs-check +``` + +`phpcs` also installs a tool named `phpcbf` which can attempt to fix problems +for you: + +```console +$ composer cs-fix +``` + +If you allow phpcbf to fix CS issues, please re-run the tests to ensure +they pass, and make sure you add and commit the changes after verification. + +## Recommended Workflow for Contributions + +Your first step is to establish a public repository from which we can +pull your work into the master repository. We recommend using +[GitHub](https://github.com), as that is where the component is already hosted. + +1. Setup a [GitHub account](http://github.com/), if you haven't yet +2. Fork the repository (http://github.com/zendframework/zend-diactoros) +3. Clone the canonical repository locally and enter it. + + ```console + $ git clone git://github.com/zendframework/zend-diactoros.git + $ cd zend-diactoros + ``` + +4. Add a remote to your fork; substitute your GitHub username in the command + below. + + ```console + $ git remote add {username} git@github.com:{username}/zend-diactoros.git + $ git fetch {username} + ``` + +### Keeping Up-to-Date + +Periodically, you should update your fork or personal repository to +match the canonical repository. Assuming you have setup your local repository +per the instructions above, you can do the following: + + +```console +$ git checkout master +$ git fetch origin +$ git rebase origin/master +# OPTIONALLY, to keep your remote up-to-date - +$ git push {username} master:master +``` + +If you're tracking other branches -- for example, the "develop" branch, where +new feature development occurs -- you'll want to do the same operations for that +branch; simply substitute "develop" for "master". + +### Working on a patch + +We recommend you do each new feature or bugfix in a new branch. This simplifies +the task of code review as well as the task of merging your changes into the +canonical repository. + +A typical workflow will then consist of the following: + +1. Create a new local branch based off either your master or develop branch. +2. Switch to your new local branch. (This step can be combined with the + previous step with the use of `git checkout -b`.) +3. Do some work, commit, repeat as necessary. +4. Push the local branch to your remote repository. +5. Send a pull request. + +The mechanics of this process are actually quite trivial. Below, we will +create a branch for fixing an issue in the tracker. + +```console +$ git checkout -b hotfix/9295 +Switched to a new branch 'hotfix/9295' +``` + +... do some work ... + + +```console +$ git commit +``` + +... write your log message ... + + +```console +$ git push {username} hotfix/9295:hotfix/9295 +Counting objects: 38, done. +Delta compression using up to 2 threads. +Compression objects: 100% (18/18), done. +Writing objects: 100% (20/20), 8.19KiB, done. +Total 20 (delta 12), reused 0 (delta 0) +To ssh://git@github.com/{username}/zend-diactoros.git + b5583aa..4f51698 HEAD -> master +``` + +To send a pull request, you have two options. + +If using GitHub, you can do the pull request from there. Navigate to +your repository, select the branch you just created, and then select the +"Pull Request" button in the upper right. Select the user/organization +"zendframework" as the recipient. + +If using your own repository - or even if using GitHub - you can use `git +format-patch` to create a patchset for us to apply; in fact, this is +**recommended** for security-related patches. If you use `format-patch`, please +send the patches as attachments to: + +- zf-devteam@zend.com for patches without security implications +- zf-security@zend.com for security patches + +#### What branch to issue the pull request against? + +Which branch should you issue a pull request against? + +- For fixes against the stable release, issue the pull request against the + "master" branch. +- For new features, or fixes that introduce new elements to the public API (such + as new public methods or properties), issue the pull request against the + "develop" branch. + +### Branch Cleanup + +As you might imagine, if you are a frequent contributor, you'll start to +get a ton of branches both locally and on your remote. + +Once you know that your changes have been accepted to the master +repository, we suggest doing some cleanup of these branches. + +- Local branch cleanup + + ```console + $ git branch -d + ``` + +- Remote branch removal + + ```console + $ git push {username} : + ``` + + +## Conduct + +Please see our [CONDUCT.md](CONDUCT.md) to understand expected behavior when interacting with others in the project. diff --git a/vendor/zendframework/zend-diactoros/LICENSE.md b/vendor/zendframework/zend-diactoros/LICENSE.md new file mode 100644 index 000000000..c7e9a85d7 --- /dev/null +++ b/vendor/zendframework/zend-diactoros/LICENSE.md @@ -0,0 +1,12 @@ +Copyright (c) 2015-2016, Zend Technologies USA, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +- Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +- Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +- Neither the name of Zend Technologies USA, Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/zendframework/zend-diactoros/README.md b/vendor/zendframework/zend-diactoros/README.md new file mode 100644 index 000000000..fadb18c24 --- /dev/null +++ b/vendor/zendframework/zend-diactoros/README.md @@ -0,0 +1,34 @@ +# zend-diactoros + +Master: +[![Build status][Master image]][Master] +[![Coverage Status][Master coverage image]][Master coverage] +Develop: +[![Build status][Develop image]][Develop] +[![Coverage Status][Develop coverage image]][Develop coverage] + +> Diactoros (pronunciation: `/dɪʌktɒrɒs/`): an epithet for Hermes, meaning literally, "the messenger." + +This package supercedes and replaces [phly/http](https://github.com/phly/http). + +`zend-diactoros` is a PHP package containing implementations of the [accepted PSR-7 HTTP message interfaces](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-7-http-message.md), as well as a "server" implementation similar to [node's http.Server](http://nodejs.org/api/http.html). + +* File issues at https://github.com/zendframework/zend-diactoros/issues +* Issue patches to https://github.com/zendframework/zend-diactoros/pulls + +## Documentation + +Documentation is available at: + +- https://zendframework.github.io/zend-diactoros/ + +Source files for documentation are [in the doc/ tree](doc/). + + [Master]: https://travis-ci.org/zendframework/zend-diactoros + [Master image]: https://secure.travis-ci.org/zendframework/zend-diactoros.svg?branch=master + [Master coverage image]: https://img.shields.io/coveralls/zendframework/zend-diactoros/master.svg + [Master coverage]: https://coveralls.io/r/zendframework/zend-diactoros?branch=master + [Develop]: https://github.com/zendframework/zend-diactoros/tree/develop + [Develop image]: https://secure.travis-ci.org/zendframework/zend-diactoros.svg?branch=develop + [Develop coverage image]: https://coveralls.io/repos/zendframework/zend-diactoros/badge.svg?branch=develop + [Develop coverage]: https://coveralls.io/r/zendframework/zend-diactoros?branch=develop diff --git a/vendor/zendframework/zend-diactoros/composer.json b/vendor/zendframework/zend-diactoros/composer.json new file mode 100644 index 000000000..ddb91d964 --- /dev/null +++ b/vendor/zendframework/zend-diactoros/composer.json @@ -0,0 +1,74 @@ +{ + "name": "zendframework/zend-diactoros", + "description": "PSR HTTP Message implementations", + "type": "library", + "license": "BSD-2-Clause", + "keywords": [ + "http", + "psr", + "psr-7" + ], + "homepage": "https://github.com/zendframework/zend-diactoros", + "support": { + "issues": "https://github.com/zendframework/zend-diactoros/issues", + "source": "https://github.com/zendframework/zend-diactoros" + }, + "config": { + "sort-packages": true + }, + "extra": { + "branch-alias": { + "dev-master": "1.8.x-dev", + "dev-develop": "1.9.x-dev", + "dev-release-2.0": "2.0.x-dev" + } + }, + "require": { + "php": "^5.6 || ^7.0", + "psr/http-message": "^1.0" + }, + "require-dev": { + "ext-dom": "*", + "ext-libxml": "*", + "php-http/psr7-integration-tests": "dev-master", + "phpunit/phpunit": "^5.7.16 || ^6.0.8 || ^7.2.7", + "zendframework/zend-coding-standard": "~1.0" + }, + "provide": { + "psr/http-message-implementation": "1.0" + }, + "autoload": { + "files": [ + "src/functions/create_uploaded_file.php", + "src/functions/marshal_headers_from_sapi.php", + "src/functions/marshal_method_from_sapi.php", + "src/functions/marshal_protocol_version_from_sapi.php", + "src/functions/marshal_uri_from_sapi.php", + "src/functions/normalize_server.php", + "src/functions/normalize_uploaded_files.php", + "src/functions/parse_cookie_header.php" + ], + "psr-4": { + "Zend\\Diactoros\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "ZendTest\\Diactoros\\": "test/" + }, + "files": [ + "test/TestAsset/Functions.php", + "test/TestAsset/SapiResponse.php" + ] + }, + "scripts": { + "check": [ + "@cs-check", + "@test" + ], + "cs-check": "phpcs", + "cs-fix": "phpcbf", + "test": "phpunit --colors=always", + "test-coverage": "phpunit --colors=always --coverage-clover clover.xml" + } +} diff --git a/vendor/zendframework/zend-diactoros/composer.lock b/vendor/zendframework/zend-diactoros/composer.lock new file mode 100644 index 000000000..261ae10c6 --- /dev/null +++ b/vendor/zendframework/zend-diactoros/composer.lock @@ -0,0 +1,1695 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "7ca0087aabf01eb8dbf67e0ae741f2f2", + "packages": [ + { + "name": "psr/http-message", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "time": "2016-08-06T14:39:51+00:00" + } + ], + "packages-dev": [ + { + "name": "doctrine/instantiator", + "version": "1.0.5", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d", + "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d", + "shasum": "" + }, + "require": { + "php": ">=5.3,<8.0-DEV" + }, + "require-dev": { + "athletic/athletic": "~0.1.8", + "ext-pdo": "*", + "ext-phar": "*", + "phpunit/phpunit": "~4.0", + "squizlabs/php_codesniffer": "~2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "http://ocramius.github.com/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://github.com/doctrine/instantiator", + "keywords": [ + "constructor", + "instantiate" + ], + "time": "2015-06-14T21:17:01+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.7.0", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e", + "reference": "3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "require-dev": { + "doctrine/collections": "^1.0", + "doctrine/common": "^2.6", + "phpunit/phpunit": "^4.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + }, + "files": [ + "src/DeepCopy/deep_copy.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "time": "2017-10-19T19:58:43+00:00" + }, + { + "name": "phar-io/manifest", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "2df402786ab5368a0169091f61a7c1e0eb6852d0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/2df402786ab5368a0169091f61a7c1e0eb6852d0", + "reference": "2df402786ab5368a0169091f61a7c1e0eb6852d0", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-phar": "*", + "phar-io/version": "^1.0.1", + "php": "^5.6 || ^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "time": "2017-03-05T18:14:27+00:00" + }, + { + "name": "phar-io/version", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "a70c0ced4be299a63d32fa96d9281d03e94041df" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/a70c0ced4be299a63d32fa96d9281d03e94041df", + "reference": "a70c0ced4be299a63d32fa96d9281d03e94041df", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "time": "2017-03-05T17:38:23+00:00" + }, + { + "name": "php-http/psr7-integration-tests", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/php-http/psr7-integration-tests.git", + "reference": "5dfefb2da33ca24ae20c971b725c9a6fe7403008" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/psr7-integration-tests/zipball/5dfefb2da33ca24ae20c971b725c9a6fe7403008", + "reference": "5dfefb2da33ca24ae20c971b725c9a6fe7403008", + "shasum": "" + }, + "require": { + "php": "^5.4 || ^7.0", + "phpunit/phpunit": "^5.4 || ^6.0 || ^7.0", + "psr/http-message": "^1.0" + }, + "require-dev": { + "guzzlehttp/psr7": "^1.4", + "nyholm/psr7": "dev-master", + "ringcentral/psr7": "^1.2", + "slim/http": "^0.3", + "zendframework/zend-diactoros": "^1.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Psr7Test\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com" + } + ], + "description": "Test suite for PSR7", + "homepage": "http://php-http.org", + "keywords": [ + "psr-7", + "test" + ], + "time": "2018-09-02T10:01:55+00:00" + }, + { + "name": "phpdocumentor/reflection-common", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", + "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", + "shasum": "" + }, + "require": { + "php": ">=5.5" + }, + "require-dev": { + "phpunit/phpunit": "^4.6" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": [ + "src" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "time": "2017-09-11T18:02:19+00:00" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "4.3.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "94fd0001232e47129dd3504189fa1c7225010d08" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/94fd0001232e47129dd3504189fa1c7225010d08", + "reference": "94fd0001232e47129dd3504189fa1c7225010d08", + "shasum": "" + }, + "require": { + "php": "^7.0", + "phpdocumentor/reflection-common": "^1.0.0", + "phpdocumentor/type-resolver": "^0.4.0", + "webmozart/assert": "^1.0" + }, + "require-dev": { + "doctrine/instantiator": "~1.0.5", + "mockery/mockery": "^1.0", + "phpunit/phpunit": "^6.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "time": "2017-11-30T07:14:17+00:00" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "0.4.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/9c977708995954784726e25d0cd1dddf4e65b0f7", + "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7", + "shasum": "" + }, + "require": { + "php": "^5.5 || ^7.0", + "phpdocumentor/reflection-common": "^1.0" + }, + "require-dev": { + "mockery/mockery": "^0.9.4", + "phpunit/phpunit": "^5.2||^4.8.24" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "time": "2017-07-14T14:27:02+00:00" + }, + { + "name": "phpspec/prophecy", + "version": "1.7.6", + "source": { + "type": "git", + "url": "https://github.com/phpspec/prophecy.git", + "reference": "33a7e3c4fda54e912ff6338c48823bd5c0f0b712" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/33a7e3c4fda54e912ff6338c48823bd5c0f0b712", + "reference": "33a7e3c4fda54e912ff6338c48823bd5c0f0b712", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.0.2", + "php": "^5.3|^7.0", + "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0", + "sebastian/comparator": "^1.1|^2.0|^3.0", + "sebastian/recursion-context": "^1.0|^2.0|^3.0" + }, + "require-dev": { + "phpspec/phpspec": "^2.5|^3.2", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.7.x-dev" + } + }, + "autoload": { + "psr-0": { + "Prophecy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Konstantin Kudryashov", + "email": "ever.zet@gmail.com", + "homepage": "http://everzet.com" + }, + { + "name": "Marcello Duarte", + "email": "marcello.duarte@gmail.com" + } + ], + "description": "Highly opinionated mocking framework for PHP 5.3+", + "homepage": "https://github.com/phpspec/prophecy", + "keywords": [ + "Double", + "Dummy", + "fake", + "mock", + "spy", + "stub" + ], + "time": "2018-04-18T13:57:24+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "5.3.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "c89677919c5dd6d3b3852f230a663118762218ac" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/c89677919c5dd6d3b3852f230a663118762218ac", + "reference": "c89677919c5dd6d3b3852f230a663118762218ac", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-xmlwriter": "*", + "php": "^7.0", + "phpunit/php-file-iterator": "^1.4.2", + "phpunit/php-text-template": "^1.2.1", + "phpunit/php-token-stream": "^2.0.1", + "sebastian/code-unit-reverse-lookup": "^1.0.1", + "sebastian/environment": "^3.0", + "sebastian/version": "^2.0.1", + "theseer/tokenizer": "^1.1" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "suggest": { + "ext-xdebug": "^2.5.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.3.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "time": "2018-04-06T15:36:58+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "1.4.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/730b01bc3e867237eaac355e06a36b85dd93a8b4", + "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "time": "2017-11-27T13:52:08+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "time": "2015-06-21T13:50:34+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "1.0.9", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3dcf38ca72b158baf0bc245e9184d3fdffa9c46f", + "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f", + "shasum": "" + }, + "require": { + "php": "^5.3.3 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "time": "2017-02-26T11:10:40+00:00" + }, + { + "name": "phpunit/php-token-stream", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-token-stream.git", + "reference": "791198a2c6254db10131eecfe8c06670700904db" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/791198a2c6254db10131eecfe8c06670700904db", + "reference": "791198a2c6254db10131eecfe8c06670700904db", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.2.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Wrapper around PHP's tokenizer extension.", + "homepage": "https://github.com/sebastianbergmann/php-token-stream/", + "keywords": [ + "tokenizer" + ], + "time": "2017-11-27T05:48:46+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "6.5.9", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "093ca5508174cd8ab8efe44fd1dde447adfdec8f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/093ca5508174cd8ab8efe44fd1dde447adfdec8f", + "reference": "093ca5508174cd8ab8efe44fd1dde447adfdec8f", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "myclabs/deep-copy": "^1.6.1", + "phar-io/manifest": "^1.0.1", + "phar-io/version": "^1.0", + "php": "^7.0", + "phpspec/prophecy": "^1.7", + "phpunit/php-code-coverage": "^5.3", + "phpunit/php-file-iterator": "^1.4.3", + "phpunit/php-text-template": "^1.2.1", + "phpunit/php-timer": "^1.0.9", + "phpunit/phpunit-mock-objects": "^5.0.5", + "sebastian/comparator": "^2.1", + "sebastian/diff": "^2.0", + "sebastian/environment": "^3.1", + "sebastian/exporter": "^3.1", + "sebastian/global-state": "^2.0", + "sebastian/object-enumerator": "^3.0.3", + "sebastian/resource-operations": "^1.0", + "sebastian/version": "^2.0.1" + }, + "conflict": { + "phpdocumentor/reflection-docblock": "3.0.2", + "phpunit/dbunit": "<3.0" + }, + "require-dev": { + "ext-pdo": "*" + }, + "suggest": { + "ext-xdebug": "*", + "phpunit/php-invoker": "^1.1" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.5.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "time": "2018-07-03T06:40:40+00:00" + }, + { + "name": "phpunit/phpunit-mock-objects", + "version": "5.0.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", + "reference": "6f9a3c8bf34188a2b53ce2ae7a126089c53e0a9f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/6f9a3c8bf34188a2b53ce2ae7a126089c53e0a9f", + "reference": "6f9a3c8bf34188a2b53ce2ae7a126089c53e0a9f", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.0.5", + "php": "^7.0", + "phpunit/php-text-template": "^1.2.1", + "sebastian/exporter": "^3.1" + }, + "conflict": { + "phpunit/phpunit": "<6.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.5" + }, + "suggest": { + "ext-soap": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Mock Object library for PHPUnit", + "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", + "keywords": [ + "mock", + "xunit" + ], + "time": "2018-07-13T03:27:23+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", + "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.7 || ^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "time": "2017-03-04T06:30:41+00:00" + }, + { + "name": "sebastian/comparator", + "version": "2.1.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "34369daee48eafb2651bea869b4b15d75ccc35f9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/34369daee48eafb2651bea869b4b15d75ccc35f9", + "reference": "34369daee48eafb2651bea869b4b15d75ccc35f9", + "shasum": "" + }, + "require": { + "php": "^7.0", + "sebastian/diff": "^2.0 || ^3.0", + "sebastian/exporter": "^3.1" + }, + "require-dev": { + "phpunit/phpunit": "^6.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "time": "2018-02-01T13:46:46+00:00" + }, + { + "name": "sebastian/diff", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "347c1d8b49c5c3ee30c7040ea6fc446790e6bddd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/347c1d8b49c5c3ee30c7040ea6fc446790e6bddd", + "reference": "347c1d8b49c5c3ee30c7040ea6fc446790e6bddd", + "shasum": "" + }, + "require": { + "php": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff" + ], + "time": "2017-08-03T08:09:46+00:00" + }, + { + "name": "sebastian/environment", + "version": "3.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "cd0871b3975fb7fc44d11314fd1ee20925fce4f5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/cd0871b3975fb7fc44d11314fd1ee20925fce4f5", + "reference": "cd0871b3975fb7fc44d11314fd1ee20925fce4f5", + "shasum": "" + }, + "require": { + "php": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "http://www.github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "time": "2017-07-01T08:51:00+00:00" + }, + { + "name": "sebastian/exporter", + "version": "3.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "234199f4528de6d12aaa58b612e98f7d36adb937" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/234199f4528de6d12aaa58b612e98f7d36adb937", + "reference": "234199f4528de6d12aaa58b612e98f7d36adb937", + "shasum": "" + }, + "require": { + "php": "^7.0", + "sebastian/recursion-context": "^3.0" + }, + "require-dev": { + "ext-mbstring": "*", + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "http://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "time": "2017-04-03T13:19:02+00:00" + }, + { + "name": "sebastian/global-state", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", + "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", + "shasum": "" + }, + "require": { + "php": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "suggest": { + "ext-uopz": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "time": "2017-04-27T15:39:26+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/7cfd9e65d11ffb5af41198476395774d4c8a84c5", + "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5", + "shasum": "" + }, + "require": { + "php": "^7.0", + "sebastian/object-reflector": "^1.1.1", + "sebastian/recursion-context": "^3.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "time": "2017-08-03T12:35:26+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "773f97c67f28de00d397be301821b06708fca0be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/773f97c67f28de00d397be301821b06708fca0be", + "reference": "773f97c67f28de00d397be301821b06708fca0be", + "shasum": "" + }, + "require": { + "php": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "time": "2017-03-29T09:07:27+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", + "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", + "shasum": "" + }, + "require": { + "php": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "time": "2017-03-03T06:23:57+00:00" + }, + { + "name": "sebastian/resource-operations", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/resource-operations.git", + "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", + "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", + "shasum": "" + }, + "require": { + "php": ">=5.6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides a list of PHP built-in functions that operate on resources", + "homepage": "https://www.github.com/sebastianbergmann/resource-operations", + "time": "2015-07-28T20:34:47+00:00" + }, + { + "name": "sebastian/version", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", + "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "time": "2016-10-03T07:35:21+00:00" + }, + { + "name": "squizlabs/php_codesniffer", + "version": "2.9.1", + "source": { + "type": "git", + "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", + "reference": "dcbed1074f8244661eecddfc2a675430d8d33f62" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/dcbed1074f8244661eecddfc2a675430d8d33f62", + "reference": "dcbed1074f8244661eecddfc2a675430d8d33f62", + "shasum": "" + }, + "require": { + "ext-simplexml": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": ">=5.1.2" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "bin": [ + "scripts/phpcs", + "scripts/phpcbf" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "classmap": [ + "CodeSniffer.php", + "CodeSniffer/CLI.php", + "CodeSniffer/Exception.php", + "CodeSniffer/File.php", + "CodeSniffer/Fixer.php", + "CodeSniffer/Report.php", + "CodeSniffer/Reporting.php", + "CodeSniffer/Sniff.php", + "CodeSniffer/Tokens.php", + "CodeSniffer/Reports/", + "CodeSniffer/Tokenizers/", + "CodeSniffer/DocGenerators/", + "CodeSniffer/Standards/AbstractPatternSniff.php", + "CodeSniffer/Standards/AbstractScopeSniff.php", + "CodeSniffer/Standards/AbstractVariableSniff.php", + "CodeSniffer/Standards/IncorrectPatternException.php", + "CodeSniffer/Standards/Generic/Sniffs/", + "CodeSniffer/Standards/MySource/Sniffs/", + "CodeSniffer/Standards/PEAR/Sniffs/", + "CodeSniffer/Standards/PSR1/Sniffs/", + "CodeSniffer/Standards/PSR2/Sniffs/", + "CodeSniffer/Standards/Squiz/Sniffs/", + "CodeSniffer/Standards/Zend/Sniffs/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Greg Sherwood", + "role": "lead" + } + ], + "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", + "homepage": "http://www.squizlabs.com/php-codesniffer", + "keywords": [ + "phpcs", + "standards" + ], + "time": "2017-05-22T02:43:20+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "cb2f008f3f05af2893a87208fe6a6c4985483f8b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/cb2f008f3f05af2893a87208fe6a6c4985483f8b", + "reference": "cb2f008f3f05af2893a87208fe6a6c4985483f8b", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "time": "2017-04-07T12:08:54+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.3.0", + "source": { + "type": "git", + "url": "https://github.com/webmozart/assert.git", + "reference": "0df1908962e7a3071564e857d86874dad1ef204a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozart/assert/zipball/0df1908962e7a3071564e857d86874dad1ef204a", + "reference": "0df1908962e7a3071564e857d86874dad1ef204a", + "shasum": "" + }, + "require": { + "php": "^5.3.3 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.6", + "sebastian/version": "^1.0.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "time": "2018-01-29T19:49:41+00:00" + }, + { + "name": "zendframework/zend-coding-standard", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-coding-standard.git", + "reference": "893316d2904e93f1c74c1384b6d7d57778299cb6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-coding-standard/zipball/893316d2904e93f1c74c1384b6d7d57778299cb6", + "reference": "893316d2904e93f1c74c1384b6d7d57778299cb6", + "shasum": "" + }, + "require": { + "squizlabs/php_codesniffer": "^2.7" + }, + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Zend Framework coding standard", + "keywords": [ + "Coding Standard", + "zf" + ], + "time": "2016-11-09T21:30:43+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": { + "php-http/psr7-integration-tests": 20 + }, + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": "^5.6 || ^7.0" + }, + "platform-dev": { + "ext-dom": "*", + "ext-libxml": "*" + } +} diff --git a/vendor/zendframework/zend-diactoros/mkdocs.yml b/vendor/zendframework/zend-diactoros/mkdocs.yml new file mode 100644 index 000000000..a08660646 --- /dev/null +++ b/vendor/zendframework/zend-diactoros/mkdocs.yml @@ -0,0 +1,16 @@ +docs_dir: doc/book +site_dir: doc/html +pages: + - index.md + - Overview: overview.md + - Installation: install.md + - Usage: usage.md + - Reference: + - "Custom Responses": custom-responses.md + - "Emitting Responses": emitting-responses.md + - Serialization: serialization.md + - API: api.md +site_name: zend-diactoros +site_description: 'zend-diactoros: PSR-7 HTTP message implementation' +repo_url: 'https://github.com/zendframework/zend-diactoros' +copyright: 'Copyright (c) 2016 Zend Technologies USA Inc.' diff --git a/vendor/zendframework/zend-diactoros/src/AbstractSerializer.php b/vendor/zendframework/zend-diactoros/src/AbstractSerializer.php new file mode 100644 index 000000000..cd07fa6df --- /dev/null +++ b/vendor/zendframework/zend-diactoros/src/AbstractSerializer.php @@ -0,0 +1,160 @@ +eof()) { + $char = $stream->read(1); + + if ($crFound && $char === self::LF) { + $crFound = false; + break; + } + + // CR NOT followed by LF + if ($crFound && $char !== self::LF) { + throw new UnexpectedValueException('Unexpected carriage return detected'); + } + + // LF in isolation + if (! $crFound && $char === self::LF) { + throw new UnexpectedValueException('Unexpected line feed detected'); + } + + // CR found; do not append + if ($char === self::CR) { + $crFound = true; + continue; + } + + // Any other character: append + $line .= $char; + } + + // CR found at end of stream + if ($crFound) { + throw new UnexpectedValueException("Unexpected end of headers"); + } + + return $line; + } + + /** + * Split the stream into headers and body content. + * + * Returns an array containing two elements + * + * - The first is an array of headers + * - The second is a StreamInterface containing the body content + * + * @param StreamInterface $stream + * @return array + * @throws UnexpectedValueException For invalid headers. + */ + protected static function splitStream(StreamInterface $stream) + { + $headers = []; + $currentHeader = false; + + while ($line = self::getLine($stream)) { + if (preg_match(';^(?P[!#$%&\'*+.^_`\|~0-9a-zA-Z-]+):(?P.*)$;', $line, $matches)) { + $currentHeader = $matches['name']; + if (! isset($headers[$currentHeader])) { + $headers[$currentHeader] = []; + } + $headers[$currentHeader][] = ltrim($matches['value']); + continue; + } + + if (! $currentHeader) { + throw new UnexpectedValueException('Invalid header detected'); + } + + if (! preg_match('#^[ \t]#', $line)) { + throw new UnexpectedValueException('Invalid header continuation'); + } + + // Append continuation to last header value found + $value = array_pop($headers[$currentHeader]); + $headers[$currentHeader][] = $value . ltrim($line); + } + + // use RelativeStream to avoid copying initial stream into memory + return [$headers, new RelativeStream($stream, $stream->tell())]; + } + + /** + * Serialize headers to string values. + * + * @param array $headers + * @return string + */ + protected static function serializeHeaders(array $headers) + { + $lines = []; + foreach ($headers as $header => $values) { + $normalized = self::filterHeader($header); + foreach ($values as $value) { + $lines[] = sprintf('%s: %s', $normalized, $value); + } + } + + return implode("\r\n", $lines); + } + + /** + * Filter a header name to wordcase + * + * @param string $header + * @return string + */ + protected static function filterHeader($header) + { + $filtered = str_replace('-', ' ', $header); + $filtered = ucwords($filtered); + return str_replace(' ', '-', $filtered); + } +} diff --git a/vendor/zendframework/zend-diactoros/src/CallbackStream.php b/vendor/zendframework/zend-diactoros/src/CallbackStream.php new file mode 100644 index 000000000..9537a3496 --- /dev/null +++ b/vendor/zendframework/zend-diactoros/src/CallbackStream.php @@ -0,0 +1,185 @@ +attach($callback); + } + + /** + * {@inheritdoc} + */ + public function __toString() + { + return $this->getContents(); + } + + /** + * {@inheritdoc} + */ + public function close() + { + $this->callback = null; + } + + /** + * {@inheritdoc} + */ + public function detach() + { + $callback = $this->callback; + $this->callback = null; + return $callback; + } + + /** + * Attach a new callback to the instance. + * + * @param callable $callback + * @throws InvalidArgumentException for callable callback + */ + public function attach(callable $callback) + { + $this->callback = $callback; + } + + /** + * {@inheritdoc} + */ + public function getSize() + { + } + + /** + * {@inheritdoc} + */ + public function tell() + { + throw new RuntimeException('Callback streams cannot tell position'); + } + + /** + * {@inheritdoc} + */ + public function eof() + { + return empty($this->callback); + } + + /** + * {@inheritdoc} + */ + public function isSeekable() + { + return false; + } + + /** + * {@inheritdoc} + */ + public function seek($offset, $whence = SEEK_SET) + { + throw new RuntimeException('Callback streams cannot seek position'); + } + + /** + * {@inheritdoc} + */ + public function rewind() + { + throw new RuntimeException('Callback streams cannot rewind position'); + } + + /** + * {@inheritdoc} + */ + public function isWritable() + { + return false; + } + + /** + * {@inheritdoc} + */ + public function write($string) + { + throw new RuntimeException('Callback streams cannot write'); + } + + /** + * {@inheritdoc} + */ + public function isReadable() + { + return false; + } + + /** + * {@inheritdoc} + */ + public function read($length) + { + throw new RuntimeException('Callback streams cannot read'); + } + + /** + * {@inheritdoc} + */ + public function getContents() + { + $callback = $this->detach(); + return $callback ? $callback() : ''; + } + + /** + * {@inheritdoc} + */ + public function getMetadata($key = null) + { + $metadata = [ + 'eof' => $this->eof(), + 'stream_type' => 'callback', + 'seekable' => false + ]; + + if (null === $key) { + return $metadata; + } + + if (! array_key_exists($key, $metadata)) { + return null; + } + + return $metadata[$key]; + } +} diff --git a/vendor/zendframework/zend-diactoros/src/Exception/DeprecatedMethodException.php b/vendor/zendframework/zend-diactoros/src/Exception/DeprecatedMethodException.php new file mode 100644 index 000000000..59a2e4194 --- /dev/null +++ b/vendor/zendframework/zend-diactoros/src/Exception/DeprecatedMethodException.php @@ -0,0 +1,19 @@ + 254 + ) { + continue; + } + + $string .= $value[$i]; + } + + return $string; + } + + /** + * Validate a header value. + * + * Per RFC 7230, only VISIBLE ASCII characters, spaces, and horizontal + * tabs are allowed in values; header continuations MUST consist of + * a single CRLF sequence followed by a space or horizontal tab. + * + * @see http://en.wikipedia.org/wiki/HTTP_response_splitting + * @param string $value + * @return bool + */ + public static function isValid($value) + { + $value = (string) $value; + + // Look for: + // \n not preceded by \r, OR + // \r not followed by \n, OR + // \r\n not followed by space or horizontal tab; these are all CRLF attacks + if (preg_match("#(?:(?:(? array of values. + * + * @var array + */ + protected $headers = []; + + /** + * Map of normalized header name to original name used to register header. + * + * @var array + */ + protected $headerNames = []; + + /** + * @var string + */ + private $protocol = '1.1'; + + /** + * @var StreamInterface + */ + private $stream; + + /** + * Retrieves the HTTP protocol version as a string. + * + * The string MUST contain only the HTTP version number (e.g., "1.1", "1.0"). + * + * @return string HTTP protocol version. + */ + public function getProtocolVersion() + { + return $this->protocol; + } + + /** + * Return an instance with the specified HTTP protocol version. + * + * The version string MUST contain only the HTTP version number (e.g., + * "1.1", "1.0"). + * + * This method MUST be implemented in such a way as to retain the + * immutability of the message, and MUST return an instance that has the + * new protocol version. + * + * @param string $version HTTP protocol version + * @return static + */ + public function withProtocolVersion($version) + { + $this->validateProtocolVersion($version); + $new = clone $this; + $new->protocol = $version; + return $new; + } + + /** + * Retrieves all message headers. + * + * The keys represent the header name as it will be sent over the wire, and + * each value is an array of strings associated with the header. + * + * // Represent the headers as a string + * foreach ($message->getHeaders() as $name => $values) { + * echo $name . ": " . implode(", ", $values); + * } + * + * // Emit headers iteratively: + * foreach ($message->getHeaders() as $name => $values) { + * foreach ($values as $value) { + * header(sprintf('%s: %s', $name, $value), false); + * } + * } + * + * @return array Returns an associative array of the message's headers. Each + * key MUST be a header name, and each value MUST be an array of strings. + */ + public function getHeaders() + { + return $this->headers; + } + + /** + * Checks if a header exists by the given case-insensitive name. + * + * @param string $header Case-insensitive header name. + * @return bool Returns true if any header names match the given header + * name using a case-insensitive string comparison. Returns false if + * no matching header name is found in the message. + */ + public function hasHeader($header) + { + return isset($this->headerNames[strtolower($header)]); + } + + /** + * Retrieves a message header value by the given case-insensitive name. + * + * This method returns an array of all the header values of the given + * case-insensitive header name. + * + * If the header does not appear in the message, this method MUST return an + * empty array. + * + * @param string $header Case-insensitive header field name. + * @return string[] An array of string values as provided for the given + * header. If the header does not appear in the message, this method MUST + * return an empty array. + */ + public function getHeader($header) + { + if (! $this->hasHeader($header)) { + return []; + } + + $header = $this->headerNames[strtolower($header)]; + + return $this->headers[$header]; + } + + /** + * Retrieves a comma-separated string of the values for a single header. + * + * This method returns all of the header values of the given + * case-insensitive header name as a string concatenated together using + * a comma. + * + * NOTE: Not all header values may be appropriately represented using + * comma concatenation. For such headers, use getHeader() instead + * and supply your own delimiter when concatenating. + * + * If the header does not appear in the message, this method MUST return + * an empty string. + * + * @param string $name Case-insensitive header field name. + * @return string A string of values as provided for the given header + * concatenated together using a comma. If the header does not appear in + * the message, this method MUST return an empty string. + */ + public function getHeaderLine($name) + { + $value = $this->getHeader($name); + if (empty($value)) { + return ''; + } + + return implode(',', $value); + } + + /** + * Return an instance with the provided header, replacing any existing + * values of any headers with the same case-insensitive name. + * + * While header names are case-insensitive, the casing of the header will + * be preserved by this function, and returned from getHeaders(). + * + * This method MUST be implemented in such a way as to retain the + * immutability of the message, and MUST return an instance that has the + * new and/or updated header and value. + * + * @param string $header Case-insensitive header field name. + * @param string|string[] $value Header value(s). + * @return static + * @throws \InvalidArgumentException for invalid header names or values. + */ + public function withHeader($header, $value) + { + $this->assertHeader($header); + + $normalized = strtolower($header); + + $new = clone $this; + if ($new->hasHeader($header)) { + unset($new->headers[$new->headerNames[$normalized]]); + } + + $value = $this->filterHeaderValue($value); + + $new->headerNames[$normalized] = $header; + $new->headers[$header] = $value; + + return $new; + } + + /** + * Return an instance with the specified header appended with the + * given value. + * + * Existing values for the specified header will be maintained. The new + * value(s) will be appended to the existing list. If the header did not + * exist previously, it will be added. + * + * This method MUST be implemented in such a way as to retain the + * immutability of the message, and MUST return an instance that has the + * new header and/or value. + * + * @param string $header Case-insensitive header field name to add. + * @param string|string[] $value Header value(s). + * @return static + * @throws \InvalidArgumentException for invalid header names or values. + */ + public function withAddedHeader($header, $value) + { + $this->assertHeader($header); + + if (! $this->hasHeader($header)) { + return $this->withHeader($header, $value); + } + + $header = $this->headerNames[strtolower($header)]; + + $new = clone $this; + $value = $this->filterHeaderValue($value); + $new->headers[$header] = array_merge($this->headers[$header], $value); + return $new; + } + + /** + * Return an instance without the specified header. + * + * Header resolution MUST be done without case-sensitivity. + * + * This method MUST be implemented in such a way as to retain the + * immutability of the message, and MUST return an instance that removes + * the named header. + * + * @param string $header Case-insensitive header field name to remove. + * @return static + */ + public function withoutHeader($header) + { + if (! $this->hasHeader($header)) { + return clone $this; + } + + $normalized = strtolower($header); + $original = $this->headerNames[$normalized]; + + $new = clone $this; + unset($new->headers[$original], $new->headerNames[$normalized]); + return $new; + } + + /** + * Gets the body of the message. + * + * @return StreamInterface Returns the body as a stream. + */ + public function getBody() + { + return $this->stream; + } + + /** + * Return an instance with the specified message body. + * + * The body MUST be a StreamInterface object. + * + * This method MUST be implemented in such a way as to retain the + * immutability of the message, and MUST return a new instance that has the + * new body stream. + * + * @param StreamInterface $body Body. + * @return static + * @throws \InvalidArgumentException When the body is not valid. + */ + public function withBody(StreamInterface $body) + { + $new = clone $this; + $new->stream = $body; + return $new; + } + + private function getStream($stream, $modeIfNotInstance) + { + if ($stream instanceof StreamInterface) { + return $stream; + } + + if (! is_string($stream) && ! is_resource($stream)) { + throw new InvalidArgumentException( + 'Stream must be a string stream resource identifier, ' + . 'an actual stream resource, ' + . 'or a Psr\Http\Message\StreamInterface implementation' + ); + } + + return new Stream($stream, $modeIfNotInstance); + } + + /** + * Filter a set of headers to ensure they are in the correct internal format. + * + * Used by message constructors to allow setting all initial headers at once. + * + * @param array $originalHeaders Headers to filter. + */ + private function setHeaders(array $originalHeaders) + { + $headerNames = $headers = []; + + foreach ($originalHeaders as $header => $value) { + $value = $this->filterHeaderValue($value); + + $this->assertHeader($header); + + $headerNames[strtolower($header)] = $header; + $headers[$header] = $value; + } + + $this->headerNames = $headerNames; + $this->headers = $headers; + } + + /** + * Validate the HTTP protocol version + * + * @param string $version + * @throws InvalidArgumentException on invalid HTTP protocol version + */ + private function validateProtocolVersion($version) + { + if (empty($version)) { + throw new InvalidArgumentException( + 'HTTP protocol version can not be empty' + ); + } + if (! is_string($version)) { + throw new InvalidArgumentException(sprintf( + 'Unsupported HTTP protocol version; must be a string, received %s', + (is_object($version) ? get_class($version) : gettype($version)) + )); + } + + // HTTP/1 uses a "." numbering scheme to indicate + // versions of the protocol, while HTTP/2 does not. + if (! preg_match('#^(1\.[01]|2)$#', $version)) { + throw new InvalidArgumentException(sprintf( + 'Unsupported HTTP protocol version "%s" provided', + $version + )); + } + } + + /** + * @param mixed $values + * @return string[] + */ + private function filterHeaderValue($values) + { + if (! is_array($values)) { + $values = [$values]; + } + + if ([] === $values) { + throw new InvalidArgumentException( + 'Invalid header value: must be a string or array of strings; ' + . 'cannot be an empty array' + ); + } + + return array_map(function ($value) { + HeaderSecurity::assertValid($value); + + return (string) $value; + }, array_values($values)); + } + + /** + * Ensure header name and values are valid. + * + * @param string $name + * + * @throws InvalidArgumentException + */ + private function assertHeader($name) + { + HeaderSecurity::assertValidName($name); + } +} diff --git a/vendor/zendframework/zend-diactoros/src/PhpInputStream.php b/vendor/zendframework/zend-diactoros/src/PhpInputStream.php new file mode 100644 index 000000000..8713d0270 --- /dev/null +++ b/vendor/zendframework/zend-diactoros/src/PhpInputStream.php @@ -0,0 +1,91 @@ +reachedEof) { + return $this->cache; + } + + $this->getContents(); + return $this->cache; + } + + /** + * {@inheritdoc} + */ + public function isWritable() + { + return false; + } + + /** + * {@inheritdoc} + */ + public function read($length) + { + $content = parent::read($length); + if (! $this->reachedEof) { + $this->cache .= $content; + } + + if ($this->eof()) { + $this->reachedEof = true; + } + + return $content; + } + + /** + * {@inheritdoc} + */ + public function getContents($maxLength = -1) + { + if ($this->reachedEof) { + return $this->cache; + } + + $contents = stream_get_contents($this->resource, $maxLength); + $this->cache .= $contents; + + if ($maxLength === -1 || $this->eof()) { + $this->reachedEof = true; + } + + return $contents; + } +} diff --git a/vendor/zendframework/zend-diactoros/src/RelativeStream.php b/vendor/zendframework/zend-diactoros/src/RelativeStream.php new file mode 100644 index 000000000..5f2eb915e --- /dev/null +++ b/vendor/zendframework/zend-diactoros/src/RelativeStream.php @@ -0,0 +1,180 @@ +decoratedStream = $decoratedStream; + $this->offset = (int)$offset; + } + + /** + * {@inheritdoc} + */ + public function __toString() + { + if ($this->isSeekable()) { + $this->seek(0); + } + return $this->getContents(); + } + + /** + * {@inheritdoc} + */ + public function close() + { + $this->decoratedStream->close(); + } + + /** + * {@inheritdoc} + */ + public function detach() + { + return $this->decoratedStream->detach(); + } + + /** + * {@inheritdoc} + */ + public function getSize() + { + return $this->decoratedStream->getSize() - $this->offset; + } + + /** + * {@inheritdoc} + */ + public function tell() + { + return $this->decoratedStream->tell() - $this->offset; + } + + /** + * {@inheritdoc} + */ + public function eof() + { + return $this->decoratedStream->eof(); + } + + /** + * {@inheritdoc} + */ + public function isSeekable() + { + return $this->decoratedStream->isSeekable(); + } + + /** + * {@inheritdoc} + */ + public function seek($offset, $whence = SEEK_SET) + { + if ($whence == SEEK_SET) { + return $this->decoratedStream->seek($offset + $this->offset, $whence); + } + return $this->decoratedStream->seek($offset, $whence); + } + + /** + * {@inheritdoc} + */ + public function rewind() + { + return $this->seek(0); + } + + /** + * {@inheritdoc} + */ + public function isWritable() + { + return $this->decoratedStream->isWritable(); + } + + /** + * {@inheritdoc} + */ + public function write($string) + { + if ($this->tell() < 0) { + throw new RuntimeException('Invalid pointer position'); + } + return $this->decoratedStream->write($string); + } + + /** + * {@inheritdoc} + */ + public function isReadable() + { + return $this->decoratedStream->isReadable(); + } + + /** + * {@inheritdoc} + */ + public function read($length) + { + if ($this->tell() < 0) { + throw new RuntimeException('Invalid pointer position'); + } + return $this->decoratedStream->read($length); + } + + /** + * {@inheritdoc} + */ + public function getContents() + { + if ($this->tell() < 0) { + throw new RuntimeException('Invalid pointer position'); + } + return $this->decoratedStream->getContents(); + } + + /** + * {@inheritdoc} + */ + public function getMetadata($key = null) + { + return $this->decoratedStream->getMetadata($key); + } +} diff --git a/vendor/zendframework/zend-diactoros/src/Request.php b/vendor/zendframework/zend-diactoros/src/Request.php new file mode 100644 index 000000000..422862ec6 --- /dev/null +++ b/vendor/zendframework/zend-diactoros/src/Request.php @@ -0,0 +1,73 @@ +initialize($uri, $method, $body, $headers); + } + + /** + * {@inheritdoc} + */ + public function getHeaders() + { + $headers = $this->headers; + if (! $this->hasHeader('host') + && $this->uri->getHost() + ) { + $headers['Host'] = [$this->getHostFromUri()]; + } + + return $headers; + } + + /** + * {@inheritdoc} + */ + public function getHeader($header) + { + if (! $this->hasHeader($header)) { + if (strtolower($header) === 'host' + && $this->uri->getHost() + ) { + return [$this->getHostFromUri()]; + } + + return []; + } + + $header = $this->headerNames[strtolower($header)]; + + return $this->headers[$header]; + } +} diff --git a/vendor/zendframework/zend-diactoros/src/Request/ArraySerializer.php b/vendor/zendframework/zend-diactoros/src/Request/ArraySerializer.php new file mode 100644 index 000000000..f5e25eba2 --- /dev/null +++ b/vendor/zendframework/zend-diactoros/src/Request/ArraySerializer.php @@ -0,0 +1,87 @@ + $request->getMethod(), + 'request_target' => $request->getRequestTarget(), + 'uri' => (string) $request->getUri(), + 'protocol_version' => $request->getProtocolVersion(), + 'headers' => $request->getHeaders(), + 'body' => (string) $request->getBody(), + ]; + } + + /** + * Deserialize a request array to a request instance. + * + * @param array $serializedRequest + * @return Request + * @throws UnexpectedValueException when cannot deserialize response + */ + public static function fromArray(array $serializedRequest) + { + try { + $uri = self::getValueFromKey($serializedRequest, 'uri'); + $method = self::getValueFromKey($serializedRequest, 'method'); + $body = new Stream('php://memory', 'wb+'); + $body->write(self::getValueFromKey($serializedRequest, 'body')); + $headers = self::getValueFromKey($serializedRequest, 'headers'); + $requestTarget = self::getValueFromKey($serializedRequest, 'request_target'); + $protocolVersion = self::getValueFromKey($serializedRequest, 'protocol_version'); + + return (new Request($uri, $method, $body, $headers)) + ->withRequestTarget($requestTarget) + ->withProtocolVersion($protocolVersion); + } catch (\Exception $exception) { + throw new UnexpectedValueException('Cannot deserialize request', null, $exception); + } + } + + /** + * @param array $data + * @param string $key + * @param string $message + * @return mixed + * @throws UnexpectedValueException + */ + private static function getValueFromKey(array $data, $key, $message = null) + { + if (isset($data[$key])) { + return $data[$key]; + } + if ($message === null) { + $message = sprintf('Missing "%s" key in serialized request', $key); + } + throw new UnexpectedValueException($message); + } +} diff --git a/vendor/zendframework/zend-diactoros/src/Request/Serializer.php b/vendor/zendframework/zend-diactoros/src/Request/Serializer.php new file mode 100644 index 000000000..201486317 --- /dev/null +++ b/vendor/zendframework/zend-diactoros/src/Request/Serializer.php @@ -0,0 +1,154 @@ +write($message); + return self::fromStream($stream); + } + + /** + * Deserialize a request stream to a request instance. + * + * @param StreamInterface $stream + * @return Request + * @throws UnexpectedValueException when errors occur parsing the message. + */ + public static function fromStream(StreamInterface $stream) + { + if (! $stream->isReadable() || ! $stream->isSeekable()) { + throw new InvalidArgumentException('Message stream must be both readable and seekable'); + } + + $stream->rewind(); + + list($method, $requestTarget, $version) = self::getRequestLine($stream); + $uri = self::createUriFromRequestTarget($requestTarget); + + list($headers, $body) = self::splitStream($stream); + + return (new Request($uri, $method, $body, $headers)) + ->withProtocolVersion($version) + ->withRequestTarget($requestTarget); + } + + /** + * Serialize a request message to a string. + * + * @param RequestInterface $request + * @return string + */ + public static function toString(RequestInterface $request) + { + $httpMethod = $request->getMethod(); + if (empty($httpMethod)) { + throw new UnexpectedValueException('Object can not be serialized because HTTP method is empty'); + } + $headers = self::serializeHeaders($request->getHeaders()); + $body = (string) $request->getBody(); + $format = '%s %s HTTP/%s%s%s'; + + if (! empty($headers)) { + $headers = "\r\n" . $headers; + } + if (! empty($body)) { + $headers .= "\r\n\r\n"; + } + + return sprintf( + $format, + $httpMethod, + $request->getRequestTarget(), + $request->getProtocolVersion(), + $headers, + $body + ); + } + + /** + * Retrieve the components of the request line. + * + * Retrieves the first line of the stream and parses it, raising an + * exception if it does not follow specifications; if valid, returns a list + * with the method, target, and version, in that order. + * + * @param StreamInterface $stream + * @return array + */ + private static function getRequestLine(StreamInterface $stream) + { + $requestLine = self::getLine($stream); + + if (! preg_match( + '#^(?P[!\#$%&\'*+.^_`|~a-zA-Z0-9-]+) (?P[^\s]+) HTTP/(?P[1-9]\d*\.\d+)$#', + $requestLine, + $matches + )) { + throw new UnexpectedValueException('Invalid request line detected'); + } + + return [$matches['method'], $matches['target'], $matches['version']]; + } + + /** + * Create and return a Uri instance based on the provided request target. + * + * If the request target is of authority or asterisk form, an empty Uri + * instance is returned; otherwise, the value is used to create and return + * a new Uri instance. + * + * @param string $requestTarget + * @return Uri + */ + private static function createUriFromRequestTarget($requestTarget) + { + if (preg_match('#^https?://#', $requestTarget)) { + return new Uri($requestTarget); + } + + if (preg_match('#^(\*|[^/])#', $requestTarget)) { + return new Uri(); + } + + return new Uri($requestTarget); + } +} diff --git a/vendor/zendframework/zend-diactoros/src/RequestTrait.php b/vendor/zendframework/zend-diactoros/src/RequestTrait.php new file mode 100644 index 000000000..a1bdc3de0 --- /dev/null +++ b/vendor/zendframework/zend-diactoros/src/RequestTrait.php @@ -0,0 +1,324 @@ +validateMethod($method); + + $this->method = $method ?: ''; + $this->uri = $this->createUri($uri); + $this->stream = $this->getStream($body, 'wb+'); + + $this->setHeaders($headers); + + // per PSR-7: attempt to set the Host header from a provided URI if no + // Host header is provided + if (! $this->hasHeader('Host') && $this->uri->getHost()) { + $this->headerNames['host'] = 'Host'; + $this->headers['Host'] = [$this->getHostFromUri()]; + } + } + + /** + * Create and return a URI instance. + * + * If `$uri` is a already a `UriInterface` instance, returns it. + * + * If `$uri` is a string, passes it to the `Uri` constructor to return an + * instance. + * + * If `$uri is null, creates and returns an empty `Uri` instance. + * + * Otherwise, it raises an exception. + * + * @param null|string|UriInterface $uri + * @return UriInterface + * @throws InvalidArgumentException + */ + private function createUri($uri) + { + if ($uri instanceof UriInterface) { + return $uri; + } + if (is_string($uri)) { + return new Uri($uri); + } + if ($uri === null) { + return new Uri(); + } + throw new InvalidArgumentException( + 'Invalid URI provided; must be null, a string, or a Psr\Http\Message\UriInterface instance' + ); + } + + /** + * Retrieves the message's request target. + * + * Retrieves the message's request-target either as it will appear (for + * clients), as it appeared at request (for servers), or as it was + * specified for the instance (see withRequestTarget()). + * + * In most cases, this will be the origin-form of the composed URI, + * unless a value was provided to the concrete implementation (see + * withRequestTarget() below). + * + * If no URI is available, and no request-target has been specifically + * provided, this method MUST return the string "/". + * + * @return string + */ + public function getRequestTarget() + { + if (null !== $this->requestTarget) { + return $this->requestTarget; + } + + $target = $this->uri->getPath(); + if ($this->uri->getQuery()) { + $target .= '?' . $this->uri->getQuery(); + } + + if (empty($target)) { + $target = '/'; + } + + return $target; + } + + /** + * Create a new instance with a specific request-target. + * + * If the request needs a non-origin-form request-target — e.g., for + * specifying an absolute-form, authority-form, or asterisk-form — + * this method may be used to create an instance with the specified + * request-target, verbatim. + * + * This method MUST be implemented in such a way as to retain the + * immutability of the message, and MUST return a new instance that has the + * changed request target. + * + * @link http://tools.ietf.org/html/rfc7230#section-2.7 (for the various + * request-target forms allowed in request messages) + * @param mixed $requestTarget + * @return static + * @throws InvalidArgumentException if the request target is invalid. + */ + public function withRequestTarget($requestTarget) + { + if (preg_match('#\s#', $requestTarget)) { + throw new InvalidArgumentException( + 'Invalid request target provided; cannot contain whitespace' + ); + } + + $new = clone $this; + $new->requestTarget = $requestTarget; + return $new; + } + + /** + * Retrieves the HTTP method of the request. + * + * @return string Returns the request method. + */ + public function getMethod() + { + return $this->method; + } + + /** + * Return an instance with the provided HTTP method. + * + * While HTTP method names are typically all uppercase characters, HTTP + * method names are case-sensitive and thus implementations SHOULD NOT + * modify the given string. + * + * This method MUST be implemented in such a way as to retain the + * immutability of the message, and MUST return an instance that has the + * changed request method. + * + * @param string $method Case-insensitive method. + * @return static + * @throws InvalidArgumentException for invalid HTTP methods. + */ + public function withMethod($method) + { + $this->validateMethod($method); + $new = clone $this; + $new->method = $method; + return $new; + } + + /** + * Retrieves the URI instance. + * + * This method MUST return a UriInterface instance. + * + * @link http://tools.ietf.org/html/rfc3986#section-4.3 + * @return UriInterface Returns a UriInterface instance + * representing the URI of the request, if any. + */ + public function getUri() + { + return $this->uri; + } + + /** + * Returns an instance with the provided URI. + * + * This method will update the Host header of the returned request by + * default if the URI contains a host component. If the URI does not + * contain a host component, any pre-existing Host header will be carried + * over to the returned request. + * + * You can opt-in to preserving the original state of the Host header by + * setting `$preserveHost` to `true`. When `$preserveHost` is set to + * `true`, the returned request will not update the Host header of the + * returned message -- even if the message contains no Host header. This + * means that a call to `getHeader('Host')` on the original request MUST + * equal the return value of a call to `getHeader('Host')` on the returned + * request. + * + * This method MUST be implemented in such a way as to retain the + * immutability of the message, and MUST return an instance that has the + * new UriInterface instance. + * + * @link http://tools.ietf.org/html/rfc3986#section-4.3 + * @param UriInterface $uri New request URI to use. + * @param bool $preserveHost Preserve the original state of the Host header. + * @return static + */ + public function withUri(UriInterface $uri, $preserveHost = false) + { + $new = clone $this; + $new->uri = $uri; + + if ($preserveHost && $this->hasHeader('Host')) { + return $new; + } + + if (! $uri->getHost()) { + return $new; + } + + $host = $uri->getHost(); + if ($uri->getPort()) { + $host .= ':' . $uri->getPort(); + } + + $new->headerNames['host'] = 'Host'; + + // Remove an existing host header if present, regardless of current + // de-normalization of the header name. + // @see https://github.com/zendframework/zend-diactoros/issues/91 + foreach (array_keys($new->headers) as $header) { + if (strtolower($header) === 'host') { + unset($new->headers[$header]); + } + } + + $new->headers['Host'] = [$host]; + + return $new; + } + + /** + * Validate the HTTP method + * + * @param null|string $method + * @throws InvalidArgumentException on invalid HTTP method. + */ + private function validateMethod($method) + { + if (null === $method) { + return; + } + + if (! is_string($method)) { + throw new InvalidArgumentException(sprintf( + 'Unsupported HTTP method; must be a string, received %s', + (is_object($method) ? get_class($method) : gettype($method)) + )); + } + + if (! preg_match('/^[!#$%&\'*+.^_`\|~0-9a-z-]+$/i', $method)) { + throw new InvalidArgumentException(sprintf( + 'Unsupported HTTP method "%s" provided', + $method + )); + } + } + + /** + * Retrieve the host from the URI instance + * + * @return string + */ + private function getHostFromUri() + { + $host = $this->uri->getHost(); + $host .= $this->uri->getPort() ? ':' . $this->uri->getPort() : ''; + return $host; + } +} diff --git a/vendor/zendframework/zend-diactoros/src/Response.php b/vendor/zendframework/zend-diactoros/src/Response.php new file mode 100644 index 000000000..17cae64e5 --- /dev/null +++ b/vendor/zendframework/zend-diactoros/src/Response.php @@ -0,0 +1,198 @@ + 'Continue', + 101 => 'Switching Protocols', + 102 => 'Processing', + 103 => 'Early Hints', + // SUCCESS CODES + 200 => 'OK', + 201 => 'Created', + 202 => 'Accepted', + 203 => 'Non-Authoritative Information', + 204 => 'No Content', + 205 => 'Reset Content', + 206 => 'Partial Content', + 207 => 'Multi-Status', + 208 => 'Already Reported', + 226 => 'IM Used', + // REDIRECTION CODES + 300 => 'Multiple Choices', + 301 => 'Moved Permanently', + 302 => 'Found', + 303 => 'See Other', + 304 => 'Not Modified', + 305 => 'Use Proxy', + 306 => 'Switch Proxy', // Deprecated to 306 => '(Unused)' + 307 => 'Temporary Redirect', + 308 => 'Permanent Redirect', + // CLIENT ERROR + 400 => 'Bad Request', + 401 => 'Unauthorized', + 402 => 'Payment Required', + 403 => 'Forbidden', + 404 => 'Not Found', + 405 => 'Method Not Allowed', + 406 => 'Not Acceptable', + 407 => 'Proxy Authentication Required', + 408 => 'Request Timeout', + 409 => 'Conflict', + 410 => 'Gone', + 411 => 'Length Required', + 412 => 'Precondition Failed', + 413 => 'Payload Too Large', + 414 => 'URI Too Long', + 415 => 'Unsupported Media Type', + 416 => 'Range Not Satisfiable', + 417 => 'Expectation Failed', + 418 => 'I\'m a teapot', + 421 => 'Misdirected Request', + 422 => 'Unprocessable Entity', + 423 => 'Locked', + 424 => 'Failed Dependency', + 425 => 'Too Early', + 426 => 'Upgrade Required', + 428 => 'Precondition Required', + 429 => 'Too Many Requests', + 431 => 'Request Header Fields Too Large', + 444 => 'Connection Closed Without Response', + 451 => 'Unavailable For Legal Reasons', + // SERVER ERROR + 499 => 'Client Closed Request', + 500 => 'Internal Server Error', + 501 => 'Not Implemented', + 502 => 'Bad Gateway', + 503 => 'Service Unavailable', + 504 => 'Gateway Timeout', + 505 => 'HTTP Version Not Supported', + 506 => 'Variant Also Negotiates', + 507 => 'Insufficient Storage', + 508 => 'Loop Detected', + 510 => 'Not Extended', + 511 => 'Network Authentication Required', + 599 => 'Network Connect Timeout Error', + ]; + + /** + * @var string + */ + private $reasonPhrase; + + /** + * @var int + */ + private $statusCode; + + /** + * @param string|resource|StreamInterface $body Stream identifier and/or actual stream resource + * @param int $status Status code for the response, if any. + * @param array $headers Headers for the response, if any. + * @throws InvalidArgumentException on any invalid element. + */ + public function __construct($body = 'php://memory', $status = 200, array $headers = []) + { + $this->setStatusCode($status); + $this->stream = $this->getStream($body, 'wb+'); + $this->setHeaders($headers); + } + + /** + * {@inheritdoc} + */ + public function getStatusCode() + { + return $this->statusCode; + } + + /** + * {@inheritdoc} + */ + public function getReasonPhrase() + { + return $this->reasonPhrase; + } + + /** + * {@inheritdoc} + */ + public function withStatus($code, $reasonPhrase = '') + { + $new = clone $this; + $new->setStatusCode($code, $reasonPhrase); + return $new; + } + + /** + * Set a valid status code. + * + * @param int $code + * @param string $reasonPhrase + * @throws InvalidArgumentException on an invalid status code. + */ + private function setStatusCode($code, $reasonPhrase = '') + { + if (! is_numeric($code) + || is_float($code) + || $code < static::MIN_STATUS_CODE_VALUE + || $code > static::MAX_STATUS_CODE_VALUE + ) { + throw new InvalidArgumentException(sprintf( + 'Invalid status code "%s"; must be an integer between %d and %d, inclusive', + is_scalar($code) ? $code : gettype($code), + static::MIN_STATUS_CODE_VALUE, + static::MAX_STATUS_CODE_VALUE + )); + } + + if (! is_string($reasonPhrase)) { + throw new InvalidArgumentException(sprintf( + 'Unsupported response reason phrase; must be a string, received %s', + is_object($reasonPhrase) ? get_class($reasonPhrase) : gettype($reasonPhrase) + )); + } + + if ($reasonPhrase === '' && isset($this->phrases[$code])) { + $reasonPhrase = $this->phrases[$code]; + } + + $this->reasonPhrase = $reasonPhrase; + $this->statusCode = (int) $code; + } +} diff --git a/vendor/zendframework/zend-diactoros/src/Response/ArraySerializer.php b/vendor/zendframework/zend-diactoros/src/Response/ArraySerializer.php new file mode 100644 index 000000000..7afe41947 --- /dev/null +++ b/vendor/zendframework/zend-diactoros/src/Response/ArraySerializer.php @@ -0,0 +1,86 @@ + $response->getStatusCode(), + 'reason_phrase' => $response->getReasonPhrase(), + 'protocol_version' => $response->getProtocolVersion(), + 'headers' => $response->getHeaders(), + 'body' => (string) $response->getBody(), + ]; + } + + /** + * Deserialize a response array to a response instance. + * + * @param array $serializedResponse + * @return Response + * @throws UnexpectedValueException when cannot deserialize response + */ + public static function fromArray(array $serializedResponse) + { + try { + $body = new Stream('php://memory', 'wb+'); + $body->write(self::getValueFromKey($serializedResponse, 'body')); + + $statusCode = self::getValueFromKey($serializedResponse, 'status_code'); + $headers = self::getValueFromKey($serializedResponse, 'headers'); + $protocolVersion = self::getValueFromKey($serializedResponse, 'protocol_version'); + $reasonPhrase = self::getValueFromKey($serializedResponse, 'reason_phrase'); + + return (new Response($body, $statusCode, $headers)) + ->withProtocolVersion($protocolVersion) + ->withStatus($statusCode, $reasonPhrase); + } catch (\Exception $exception) { + throw new UnexpectedValueException('Cannot deserialize response', null, $exception); + } + } + + /** + * @param array $data + * @param string $key + * @param string $message + * @return mixed + * @throws UnexpectedValueException + */ + private static function getValueFromKey(array $data, $key, $message = null) + { + if (isset($data[$key])) { + return $data[$key]; + } + if ($message === null) { + $message = sprintf('Missing "%s" key in serialized request', $key); + } + throw new UnexpectedValueException($message); + } +} diff --git a/vendor/zendframework/zend-diactoros/src/Response/EmitterInterface.php b/vendor/zendframework/zend-diactoros/src/Response/EmitterInterface.php new file mode 100644 index 000000000..044148642 --- /dev/null +++ b/vendor/zendframework/zend-diactoros/src/Response/EmitterInterface.php @@ -0,0 +1,34 @@ +createBody($html), + $status, + $this->injectContentType('text/html; charset=utf-8', $headers) + ); + } + + /** + * Create the message body. + * + * @param string|StreamInterface $html + * @return StreamInterface + * @throws InvalidArgumentException if $html is neither a string or stream. + */ + private function createBody($html) + { + if ($html instanceof StreamInterface) { + return $html; + } + + if (! is_string($html)) { + throw new InvalidArgumentException(sprintf( + 'Invalid content (%s) provided to %s', + (is_object($html) ? get_class($html) : gettype($html)), + __CLASS__ + )); + } + + $body = new Stream('php://temp', 'wb+'); + $body->write($html); + $body->rewind(); + return $body; + } +} diff --git a/vendor/zendframework/zend-diactoros/src/Response/InjectContentTypeTrait.php b/vendor/zendframework/zend-diactoros/src/Response/InjectContentTypeTrait.php new file mode 100644 index 000000000..445e1324b --- /dev/null +++ b/vendor/zendframework/zend-diactoros/src/Response/InjectContentTypeTrait.php @@ -0,0 +1,37 @@ + + * JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_AMP | JSON_HEX_QUOT | JSON_UNESCAPED_SLASHES + * + * + * @const int + */ + const DEFAULT_JSON_FLAGS = 79; + + /** + * @var mixed + */ + private $payload; + + /** + * @var int + */ + private $encodingOptions; + + /** + * Create a JSON response with the given data. + * + * Default JSON encoding is performed with the following options, which + * produces RFC4627-compliant JSON, capable of embedding into HTML. + * + * - JSON_HEX_TAG + * - JSON_HEX_APOS + * - JSON_HEX_AMP + * - JSON_HEX_QUOT + * - JSON_UNESCAPED_SLASHES + * + * @param mixed $data Data to convert to JSON. + * @param int $status Integer status code for the response; 200 by default. + * @param array $headers Array of headers to use at initialization. + * @param int $encodingOptions JSON encoding options to use. + * @throws InvalidArgumentException if unable to encode the $data to JSON. + */ + public function __construct( + $data, + $status = 200, + array $headers = [], + $encodingOptions = self::DEFAULT_JSON_FLAGS + ) { + $this->setPayload($data); + $this->encodingOptions = $encodingOptions; + + $json = $this->jsonEncode($data, $this->encodingOptions); + $body = $this->createBodyFromJson($json); + + $headers = $this->injectContentType('application/json', $headers); + + parent::__construct($body, $status, $headers); + } + + /** + * @return mixed + */ + public function getPayload() + { + return $this->payload; + } + + /** + * @param $data + * + * @return JsonResponse + */ + public function withPayload($data) + { + $new = clone $this; + $new->setPayload($data); + return $this->updateBodyFor($new); + } + + /** + * @return int + */ + public function getEncodingOptions() + { + return $this->encodingOptions; + } + + /** + * @param int $encodingOptions + * + * @return JsonResponse + */ + public function withEncodingOptions($encodingOptions) + { + $new = clone $this; + $new->encodingOptions = $encodingOptions; + return $this->updateBodyFor($new); + } + + /** + * @param string $json + * + * @return Stream + */ + private function createBodyFromJson($json) + { + $body = new Stream('php://temp', 'wb+'); + $body->write($json); + $body->rewind(); + + return $body; + } + + /** + * Encode the provided data to JSON. + * + * @param mixed $data + * @param int $encodingOptions + * @return string + * @throws InvalidArgumentException if unable to encode the $data to JSON. + */ + private function jsonEncode($data, $encodingOptions) + { + if (is_resource($data)) { + throw new InvalidArgumentException('Cannot JSON encode resources'); + } + + // Clear json_last_error() + json_encode(null); + + $json = json_encode($data, $encodingOptions); + + if (JSON_ERROR_NONE !== json_last_error()) { + throw new InvalidArgumentException(sprintf( + 'Unable to encode data to JSON in %s: %s', + __CLASS__, + json_last_error_msg() + )); + } + + return $json; + } + + /** + * @param $data + */ + private function setPayload($data) + { + if (is_object($data)) { + $data = clone $data; + } + + $this->payload = $data; + } + + /** + * Update the response body for the given instance. + * + * @param self $toUpdate Instance to update. + * @return JsonResponse Returns a new instance with an updated body. + */ + private function updateBodyFor(self $toUpdate) + { + $json = $this->jsonEncode($toUpdate->payload, $toUpdate->encodingOptions); + $body = $this->createBodyFromJson($json); + return $toUpdate->withBody($body); + } +} diff --git a/vendor/zendframework/zend-diactoros/src/Response/RedirectResponse.php b/vendor/zendframework/zend-diactoros/src/Response/RedirectResponse.php new file mode 100644 index 000000000..800428cdb --- /dev/null +++ b/vendor/zendframework/zend-diactoros/src/Response/RedirectResponse.php @@ -0,0 +1,52 @@ +assertNoPreviousOutput(); + + $this->emitHeaders($response); + $this->emitStatusLine($response); + $this->emitBody($response); + } + + /** + * Emit the message body. + * + * @param ResponseInterface $response + */ + private function emitBody(ResponseInterface $response) + { + echo $response->getBody(); + } +} diff --git a/vendor/zendframework/zend-diactoros/src/Response/SapiEmitterTrait.php b/vendor/zendframework/zend-diactoros/src/Response/SapiEmitterTrait.php new file mode 100644 index 000000000..a0c1107bb --- /dev/null +++ b/vendor/zendframework/zend-diactoros/src/Response/SapiEmitterTrait.php @@ -0,0 +1,112 @@ + 0 && ob_get_length() > 0) { + throw new RuntimeException('Output has been emitted previously; cannot emit response'); + } + } + + /** + * Emit the status line. + * + * Emits the status line using the protocol version and status code from + * the response; if a reason phrase is available, it, too, is emitted. + * + * It is important to mention that this method should be called after + * `emitHeaders()` in order to prevent PHP from changing the status code of + * the emitted response. + * + * @param ResponseInterface $response + * + * @see \Zend\Diactoros\Response\SapiEmitterTrait::emitHeaders() + */ + private function emitStatusLine(ResponseInterface $response) + { + $reasonPhrase = $response->getReasonPhrase(); + $statusCode = $response->getStatusCode(); + + header(sprintf( + 'HTTP/%s %d%s', + $response->getProtocolVersion(), + $statusCode, + ($reasonPhrase ? ' ' . $reasonPhrase : '') + ), true, $statusCode); + } + + /** + * Emit response headers. + * + * Loops through each header, emitting each; if the header value + * is an array with multiple values, ensures that each is sent + * in such a way as to create aggregate headers (instead of replace + * the previous). + * + * @param ResponseInterface $response + */ + private function emitHeaders(ResponseInterface $response) + { + $statusCode = $response->getStatusCode(); + + foreach ($response->getHeaders() as $header => $values) { + $name = $this->filterHeader($header); + $first = $name === 'Set-Cookie' ? false : true; + foreach ($values as $value) { + header(sprintf( + '%s: %s', + $name, + $value + ), $first, $statusCode); + $first = false; + } + } + } + + /** + * Filter a header name to wordcase + * + * @param string $header + * @return string + */ + private function filterHeader($header) + { + $filtered = str_replace('-', ' ', $header); + $filtered = ucwords($filtered); + return str_replace(' ', '-', $filtered); + } +} diff --git a/vendor/zendframework/zend-diactoros/src/Response/SapiStreamEmitter.php b/vendor/zendframework/zend-diactoros/src/Response/SapiStreamEmitter.php new file mode 100644 index 000000000..9da36ff84 --- /dev/null +++ b/vendor/zendframework/zend-diactoros/src/Response/SapiStreamEmitter.php @@ -0,0 +1,134 @@ +assertNoPreviousOutput(); + $this->emitHeaders($response); + $this->emitStatusLine($response); + + $range = $this->parseContentRange($response->getHeaderLine('Content-Range')); + + if (is_array($range) && $range[0] === 'bytes') { + $this->emitBodyRange($range, $response, $maxBufferLength); + return; + } + + $this->emitBody($response, $maxBufferLength); + } + + /** + * Emit the message body. + * + * @param ResponseInterface $response + * @param int $maxBufferLength + */ + private function emitBody(ResponseInterface $response, $maxBufferLength) + { + $body = $response->getBody(); + + if ($body->isSeekable()) { + $body->rewind(); + } + + if (! $body->isReadable()) { + echo $body; + return; + } + + while (! $body->eof()) { + echo $body->read($maxBufferLength); + } + } + + /** + * Emit a range of the message body. + * + * @param array $range + * @param ResponseInterface $response + * @param int $maxBufferLength + */ + private function emitBodyRange(array $range, ResponseInterface $response, $maxBufferLength) + { + list($unit, $first, $last, $length) = $range; + + $body = $response->getBody(); + + $length = $last - $first + 1; + + if ($body->isSeekable()) { + $body->seek($first); + + $first = 0; + } + + if (! $body->isReadable()) { + echo substr($body->getContents(), $first, $length); + return; + } + + $remaining = $length; + + while ($remaining >= $maxBufferLength && ! $body->eof()) { + $contents = $body->read($maxBufferLength); + $remaining -= strlen($contents); + + echo $contents; + } + + if ($remaining > 0 && ! $body->eof()) { + echo $body->read($remaining); + } + } + + /** + * Parse content-range header + * http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.16 + * + * @param string $header + * @return false|array [unit, first, last, length]; returns false if no + * content range or an invalid content range is provided + */ + private function parseContentRange($header) + { + if (preg_match('/(?P[\w]+)\s+(?P\d+)-(?P\d+)\/(?P\d+|\*)/', $header, $matches)) { + return [ + $matches['unit'], + (int) $matches['first'], + (int) $matches['last'], + $matches['length'] === '*' ? '*' : (int) $matches['length'], + ]; + } + return false; + } +} diff --git a/vendor/zendframework/zend-diactoros/src/Response/Serializer.php b/vendor/zendframework/zend-diactoros/src/Response/Serializer.php new file mode 100644 index 000000000..918643c6b --- /dev/null +++ b/vendor/zendframework/zend-diactoros/src/Response/Serializer.php @@ -0,0 +1,111 @@ +write($message); + return static::fromStream($stream); + } + + /** + * Parse a response from a stream. + * + * @param StreamInterface $stream + * @return Response + * @throws InvalidArgumentException when the stream is not readable. + * @throws UnexpectedValueException when errors occur parsing the message. + */ + public static function fromStream(StreamInterface $stream) + { + if (! $stream->isReadable() || ! $stream->isSeekable()) { + throw new InvalidArgumentException('Message stream must be both readable and seekable'); + } + + $stream->rewind(); + + list($version, $status, $reasonPhrase) = self::getStatusLine($stream); + list($headers, $body) = self::splitStream($stream); + + return (new Response($body, $status, $headers)) + ->withProtocolVersion($version) + ->withStatus((int) $status, $reasonPhrase); + } + + /** + * Create a string representation of a response. + * + * @param ResponseInterface $response + * @return string + */ + public static function toString(ResponseInterface $response) + { + $reasonPhrase = $response->getReasonPhrase(); + $headers = self::serializeHeaders($response->getHeaders()); + $body = (string) $response->getBody(); + $format = 'HTTP/%s %d%s%s%s'; + + if (! empty($headers)) { + $headers = "\r\n" . $headers; + } + + $headers .= "\r\n\r\n"; + + return sprintf( + $format, + $response->getProtocolVersion(), + $response->getStatusCode(), + ($reasonPhrase ? ' ' . $reasonPhrase : ''), + $headers, + $body + ); + } + + /** + * Retrieve the status line for the message. + * + * @param StreamInterface $stream + * @return array Array with three elements: 0 => version, 1 => status, 2 => reason + * @throws UnexpectedValueException if line is malformed + */ + private static function getStatusLine(StreamInterface $stream) + { + $line = self::getLine($stream); + + if (! preg_match( + '#^HTTP/(?P[1-9]\d*\.\d) (?P[1-5]\d{2})(\s+(?P.+))?$#', + $line, + $matches + )) { + throw new UnexpectedValueException('No status line detected'); + } + + return [$matches['version'], $matches['status'], isset($matches['reason']) ? $matches['reason'] : '']; + } +} diff --git a/vendor/zendframework/zend-diactoros/src/Response/TextResponse.php b/vendor/zendframework/zend-diactoros/src/Response/TextResponse.php new file mode 100644 index 000000000..6ed2a601e --- /dev/null +++ b/vendor/zendframework/zend-diactoros/src/Response/TextResponse.php @@ -0,0 +1,80 @@ +createBody($text), + $status, + $this->injectContentType('text/plain; charset=utf-8', $headers) + ); + } + + /** + * Create the message body. + * + * @param string|StreamInterface $text + * @return StreamInterface + * @throws InvalidArgumentException if $html is neither a string or stream. + */ + private function createBody($text) + { + if ($text instanceof StreamInterface) { + return $text; + } + + if (! is_string($text)) { + throw new InvalidArgumentException(sprintf( + 'Invalid content (%s) provided to %s', + (is_object($text) ? get_class($text) : gettype($text)), + __CLASS__ + )); + } + + $body = new Stream('php://temp', 'wb+'); + $body->write($text); + $body->rewind(); + return $body; + } +} diff --git a/vendor/zendframework/zend-diactoros/src/Response/XmlResponse.php b/vendor/zendframework/zend-diactoros/src/Response/XmlResponse.php new file mode 100644 index 000000000..5f81e9eeb --- /dev/null +++ b/vendor/zendframework/zend-diactoros/src/Response/XmlResponse.php @@ -0,0 +1,80 @@ +createBody($xml), + $status, + $this->injectContentType('application/xml; charset=utf-8', $headers) + ); + } + + /** + * Create the message body. + * + * @param string|StreamInterface $xml + * @return StreamInterface + * @throws InvalidArgumentException if $xml is neither a string or stream. + */ + private function createBody($xml) + { + if ($xml instanceof StreamInterface) { + return $xml; + } + + if (! is_string($xml)) { + throw new InvalidArgumentException(sprintf( + 'Invalid content (%s) provided to %s', + (is_object($xml) ? get_class($xml) : gettype($xml)), + __CLASS__ + )); + } + + $body = new Stream('php://temp', 'wb+'); + $body->write($xml); + $body->rewind(); + return $body; + } +} diff --git a/vendor/zendframework/zend-diactoros/src/Server.php b/vendor/zendframework/zend-diactoros/src/Server.php new file mode 100644 index 000000000..cca3917aa --- /dev/null +++ b/vendor/zendframework/zend-diactoros/src/Server.php @@ -0,0 +1,185 @@ +callback = $callback; + $this->request = $request; + $this->response = $response; + } + + /** + * Allow retrieving the request, response and callback as properties + * + * @param string $name + * @return mixed + * @throws OutOfBoundsException for invalid properties + */ + public function __get($name) + { + if (! property_exists($this, $name)) { + throw new OutOfBoundsException('Cannot retrieve arbitrary properties from server'); + } + return $this->{$name}; + } + + /** + * Set alternate response emitter to use. + * + * @param Response\EmitterInterface $emitter + */ + public function setEmitter(Response\EmitterInterface $emitter) + { + $this->emitter = $emitter; + } + + /** + * Create a Server instance + * + * Creates a server instance from the callback and the following + * PHP environmental values: + * + * - server; typically this will be the $_SERVER superglobal + * - query; typically this will be the $_GET superglobal + * - body; typically this will be the $_POST superglobal + * - cookies; typically this will be the $_COOKIE superglobal + * - files; typically this will be the $_FILES superglobal + * + * @param callable $callback + * @param array $server + * @param array $query + * @param array $body + * @param array $cookies + * @param array $files + * @return static + */ + public static function createServer( + callable $callback, + array $server, + array $query, + array $body, + array $cookies, + array $files + ) { + $request = ServerRequestFactory::fromGlobals($server, $query, $body, $cookies, $files); + $response = new Response(); + return new static($callback, $request, $response); + } + + /** + * Create a Server instance from an existing request object + * + * Provided a callback, an existing request object, and optionally an + * existing response object, create and return the Server instance. + * + * If no Response object is provided, one will be created. + * + * @param callable $callback + * @param ServerRequestInterface $request + * @param null|ResponseInterface $response + * @return static + */ + public static function createServerFromRequest( + callable $callback, + ServerRequestInterface $request, + ResponseInterface $response = null + ) { + if (! $response) { + $response = new Response(); + } + return new static($callback, $request, $response); + } + + /** + * "Listen" to an incoming request + * + * If provided a $finalHandler, that callable will be used for + * incomplete requests. + * + * @param null|callable $finalHandler + */ + public function listen(callable $finalHandler = null) + { + $callback = $this->callback; + + $response = $callback($this->request, $this->response, $finalHandler); + if (! $response instanceof ResponseInterface) { + $response = $this->response; + } + + $this->getEmitter()->emit($response); + } + + /** + * Retrieve the current response emitter. + * + * If none has been registered, lazy-loads a Response\SapiEmitter. + * + * @return Response\EmitterInterface + */ + private function getEmitter() + { + if (! $this->emitter) { + $this->emitter = new Response\SapiEmitter(); + } + + return $this->emitter; + } +} diff --git a/vendor/zendframework/zend-diactoros/src/ServerRequest.php b/vendor/zendframework/zend-diactoros/src/ServerRequest.php new file mode 100644 index 000000000..8523d59e1 --- /dev/null +++ b/vendor/zendframework/zend-diactoros/src/ServerRequest.php @@ -0,0 +1,291 @@ +validateUploadedFiles($uploadedFiles); + + if ($body === 'php://input') { + $body = new PhpInputStream(); + } + + $this->initialize($uri, $method, $body, $headers); + $this->serverParams = $serverParams; + $this->uploadedFiles = $uploadedFiles; + $this->cookieParams = $cookies; + $this->queryParams = $queryParams; + $this->parsedBody = $parsedBody; + $this->protocol = $protocol; + } + + /** + * {@inheritdoc} + */ + public function getServerParams() + { + return $this->serverParams; + } + + /** + * {@inheritdoc} + */ + public function getUploadedFiles() + { + return $this->uploadedFiles; + } + + /** + * {@inheritdoc} + */ + public function withUploadedFiles(array $uploadedFiles) + { + $this->validateUploadedFiles($uploadedFiles); + $new = clone $this; + $new->uploadedFiles = $uploadedFiles; + return $new; + } + + /** + * {@inheritdoc} + */ + public function getCookieParams() + { + return $this->cookieParams; + } + + /** + * {@inheritdoc} + */ + public function withCookieParams(array $cookies) + { + $new = clone $this; + $new->cookieParams = $cookies; + return $new; + } + + /** + * {@inheritdoc} + */ + public function getQueryParams() + { + return $this->queryParams; + } + + /** + * {@inheritdoc} + */ + public function withQueryParams(array $query) + { + $new = clone $this; + $new->queryParams = $query; + return $new; + } + + /** + * {@inheritdoc} + */ + public function getParsedBody() + { + return $this->parsedBody; + } + + /** + * {@inheritdoc} + */ + public function withParsedBody($data) + { + if (! is_array($data) && ! is_object($data) && null !== $data) { + throw new InvalidArgumentException(sprintf( + '%s expects a null, array, or object argument; received %s', + __METHOD__, + gettype($data) + )); + } + + $new = clone $this; + $new->parsedBody = $data; + return $new; + } + + /** + * {@inheritdoc} + */ + public function getAttributes() + { + return $this->attributes; + } + + /** + * {@inheritdoc} + */ + public function getAttribute($attribute, $default = null) + { + if (! array_key_exists($attribute, $this->attributes)) { + return $default; + } + + return $this->attributes[$attribute]; + } + + /** + * {@inheritdoc} + */ + public function withAttribute($attribute, $value) + { + $new = clone $this; + $new->attributes[$attribute] = $value; + return $new; + } + + /** + * {@inheritdoc} + */ + public function withoutAttribute($attribute) + { + $new = clone $this; + unset($new->attributes[$attribute]); + return $new; + } + + /** + * Proxy to receive the request method. + * + * This overrides the parent functionality to ensure the method is never + * empty; if no method is present, it returns 'GET'. + * + * @return string + */ + public function getMethod() + { + if (empty($this->method)) { + return 'GET'; + } + return $this->method; + } + + /** + * Set the request method. + * + * Unlike the regular Request implementation, the server-side + * normalizes the method to uppercase to ensure consistency + * and make checking the method simpler. + * + * This methods returns a new instance. + * + * @param string $method + * @return self + */ + public function withMethod($method) + { + $this->validateMethod($method); + $new = clone $this; + $new->method = $method; + return $new; + } + + /** + * Recursively validate the structure in an uploaded files array. + * + * @param array $uploadedFiles + * @throws InvalidArgumentException if any leaf is not an UploadedFileInterface instance. + */ + private function validateUploadedFiles(array $uploadedFiles) + { + foreach ($uploadedFiles as $file) { + if (is_array($file)) { + $this->validateUploadedFiles($file); + continue; + } + + if (! $file instanceof UploadedFileInterface) { + throw new InvalidArgumentException('Invalid leaf in uploaded files structure'); + } + } + } +} diff --git a/vendor/zendframework/zend-diactoros/src/ServerRequestFactory.php b/vendor/zendframework/zend-diactoros/src/ServerRequestFactory.php new file mode 100644 index 000000000..b56a0deee --- /dev/null +++ b/vendor/zendframework/zend-diactoros/src/ServerRequestFactory.php @@ -0,0 +1,240 @@ +host = $uri->getHost(); + $accumulator->port = $uri->getPort(); + } + + /** + * Detect the base URI for the request + * + * Looks at a variety of criteria in order to attempt to autodetect a base + * URI, including rewrite URIs, proxy URIs, etc. + * + * @deprecated since 1.8.0; use Zend\Diactoros\marshalUriFromSapi() instead, + * and pull the path from the Uri instance that function returns. + * @param array $server + * @return string + */ + public static function marshalRequestUri(array $server) + { + $uri = marshalUriFromSapi($server, []); + return $uri->getPath(); + } + + /** + * Strip the query string from a path + * + * @deprecated since 1.8.0; no longer used internally. + * @param mixed $path + * @return string + */ + public static function stripQueryString($path) + { + return explode('?', $path, 2)[0]; + } +} diff --git a/vendor/zendframework/zend-diactoros/src/Stream.php b/vendor/zendframework/zend-diactoros/src/Stream.php new file mode 100644 index 000000000..20ee0577a --- /dev/null +++ b/vendor/zendframework/zend-diactoros/src/Stream.php @@ -0,0 +1,359 @@ +setStream($stream, $mode); + } + + /** + * {@inheritdoc} + */ + public function __toString() + { + if (! $this->isReadable()) { + return ''; + } + + try { + if ($this->isSeekable()) { + $this->rewind(); + } + + return $this->getContents(); + } catch (RuntimeException $e) { + return ''; + } + } + + /** + * {@inheritdoc} + */ + public function close() + { + if (! $this->resource) { + return; + } + + $resource = $this->detach(); + fclose($resource); + } + + /** + * {@inheritdoc} + */ + public function detach() + { + $resource = $this->resource; + $this->resource = null; + return $resource; + } + + /** + * Attach a new stream/resource to the instance. + * + * @param string|resource $resource + * @param string $mode + * @throws InvalidArgumentException for stream identifier that cannot be + * cast to a resource + * @throws InvalidArgumentException for non-resource stream + */ + public function attach($resource, $mode = 'r') + { + $this->setStream($resource, $mode); + } + + /** + * {@inheritdoc} + */ + public function getSize() + { + if (null === $this->resource) { + return null; + } + + $stats = fstat($this->resource); + if ($stats !== false) { + return $stats['size']; + } + + return null; + } + + /** + * {@inheritdoc} + */ + public function tell() + { + if (! $this->resource) { + throw new RuntimeException('No resource available; cannot tell position'); + } + + $result = ftell($this->resource); + if (! is_int($result)) { + throw new RuntimeException('Error occurred during tell operation'); + } + + return $result; + } + + /** + * {@inheritdoc} + */ + public function eof() + { + if (! $this->resource) { + return true; + } + + return feof($this->resource); + } + + /** + * {@inheritdoc} + */ + public function isSeekable() + { + if (! $this->resource) { + return false; + } + + $meta = stream_get_meta_data($this->resource); + return $meta['seekable']; + } + + /** + * {@inheritdoc} + */ + public function seek($offset, $whence = SEEK_SET) + { + if (! $this->resource) { + throw new RuntimeException('No resource available; cannot seek position'); + } + + if (! $this->isSeekable()) { + throw new RuntimeException('Stream is not seekable'); + } + + $result = fseek($this->resource, $offset, $whence); + + if (0 !== $result) { + throw new RuntimeException('Error seeking within stream'); + } + + return true; + } + + /** + * {@inheritdoc} + */ + public function rewind() + { + return $this->seek(0); + } + + /** + * {@inheritdoc} + */ + public function isWritable() + { + if (! $this->resource) { + return false; + } + + $meta = stream_get_meta_data($this->resource); + $mode = $meta['mode']; + + return ( + strstr($mode, 'x') + || strstr($mode, 'w') + || strstr($mode, 'c') + || strstr($mode, 'a') + || strstr($mode, '+') + ); + } + + /** + * {@inheritdoc} + */ + public function write($string) + { + if (! $this->resource) { + throw new RuntimeException('No resource available; cannot write'); + } + + if (! $this->isWritable()) { + throw new RuntimeException('Stream is not writable'); + } + + $result = fwrite($this->resource, $string); + + if (false === $result) { + throw new RuntimeException('Error writing to stream'); + } + return $result; + } + + /** + * {@inheritdoc} + */ + public function isReadable() + { + if (! $this->resource) { + return false; + } + + $meta = stream_get_meta_data($this->resource); + $mode = $meta['mode']; + + return (strstr($mode, 'r') || strstr($mode, '+')); + } + + /** + * {@inheritdoc} + */ + public function read($length) + { + if (! $this->resource) { + throw new RuntimeException('No resource available; cannot read'); + } + + if (! $this->isReadable()) { + throw new RuntimeException('Stream is not readable'); + } + + $result = fread($this->resource, $length); + + if (false === $result) { + throw new RuntimeException('Error reading stream'); + } + + return $result; + } + + /** + * {@inheritdoc} + */ + public function getContents() + { + if (! $this->isReadable()) { + throw new RuntimeException('Stream is not readable'); + } + + $result = stream_get_contents($this->resource); + if (false === $result) { + throw new RuntimeException('Error reading from stream'); + } + return $result; + } + + /** + * {@inheritdoc} + */ + public function getMetadata($key = null) + { + if (null === $key) { + return stream_get_meta_data($this->resource); + } + + $metadata = stream_get_meta_data($this->resource); + if (! array_key_exists($key, $metadata)) { + return null; + } + + return $metadata[$key]; + } + + /** + * Set the internal stream resource. + * + * @param string|resource $stream String stream target or stream resource. + * @param string $mode Resource mode for stream target. + * @throws InvalidArgumentException for invalid streams or resources. + */ + private function setStream($stream, $mode = 'r') + { + $error = null; + $resource = $stream; + + if (is_string($stream)) { + set_error_handler(function ($e) use (&$error) { + if ($e !== E_WARNING) { + return; + } + + $error = $e; + }); + $resource = fopen($stream, $mode); + restore_error_handler(); + } + + if ($error) { + throw new InvalidArgumentException('Invalid stream reference provided'); + } + + if (! is_resource($resource) || 'stream' !== get_resource_type($resource)) { + throw new InvalidArgumentException( + 'Invalid stream provided; must be a string stream identifier or stream resource' + ); + } + + if ($stream !== $resource) { + $this->stream = $stream; + } + + $this->resource = $resource; + } +} diff --git a/vendor/zendframework/zend-diactoros/src/UploadedFile.php b/vendor/zendframework/zend-diactoros/src/UploadedFile.php new file mode 100644 index 000000000..c260b0c13 --- /dev/null +++ b/vendor/zendframework/zend-diactoros/src/UploadedFile.php @@ -0,0 +1,283 @@ + 'There is no error, the file uploaded with success', + UPLOAD_ERR_INI_SIZE => 'The uploaded file exceeds the upload_max_filesize directive in php.ini', + UPLOAD_ERR_FORM_SIZE => 'The uploaded file exceeds the MAX_FILE_SIZE directive that was ' + . 'specified in the HTML form', + UPLOAD_ERR_PARTIAL => 'The uploaded file was only partially uploaded', + UPLOAD_ERR_NO_FILE => 'No file was uploaded', + UPLOAD_ERR_NO_TMP_DIR => 'Missing a temporary folder', + UPLOAD_ERR_CANT_WRITE => 'Failed to write file to disk', + UPLOAD_ERR_EXTENSION => 'A PHP extension stopped the file upload.', + ]; + + /** + * @var string|null + */ + private $clientFilename; + + /** + * @var string|null + */ + private $clientMediaType; + + /** + * @var int + */ + private $error; + + /** + * @var null|string + */ + private $file; + + /** + * @var bool + */ + private $moved = false; + + /** + * @var int + */ + private $size; + + /** + * @var null|StreamInterface + */ + private $stream; + + /** + * @param string|resource $streamOrFile + * @param int $size + * @param int $errorStatus + * @param string|null $clientFilename + * @param string|null $clientMediaType + * @throws InvalidArgumentException + */ + public function __construct($streamOrFile, $size, $errorStatus, $clientFilename = null, $clientMediaType = null) + { + if ($errorStatus === UPLOAD_ERR_OK) { + if (is_string($streamOrFile)) { + $this->file = $streamOrFile; + } + if (is_resource($streamOrFile)) { + $this->stream = new Stream($streamOrFile); + } + + if (! $this->file && ! $this->stream) { + if (! $streamOrFile instanceof StreamInterface) { + throw new InvalidArgumentException('Invalid stream or file provided for UploadedFile'); + } + $this->stream = $streamOrFile; + } + } + + if (! is_int($size)) { + throw new InvalidArgumentException('Invalid size provided for UploadedFile; must be an int'); + } + $this->size = $size; + + if (! is_int($errorStatus) + || 0 > $errorStatus + || 8 < $errorStatus + ) { + throw new InvalidArgumentException( + 'Invalid error status for UploadedFile; must be an UPLOAD_ERR_* constant' + ); + } + $this->error = $errorStatus; + + if (null !== $clientFilename && ! is_string($clientFilename)) { + throw new InvalidArgumentException( + 'Invalid client filename provided for UploadedFile; must be null or a string' + ); + } + $this->clientFilename = $clientFilename; + + if (null !== $clientMediaType && ! is_string($clientMediaType)) { + throw new InvalidArgumentException( + 'Invalid client media type provided for UploadedFile; must be null or a string' + ); + } + $this->clientMediaType = $clientMediaType; + } + + /** + * {@inheritdoc} + * @throws \RuntimeException if the upload was not successful. + */ + public function getStream() + { + if ($this->error !== UPLOAD_ERR_OK) { + throw new RuntimeException(sprintf( + 'Cannot retrieve stream due to upload error: %s', + self::ERROR_MESSAGES[$this->error] + )); + } + + if ($this->moved) { + throw new RuntimeException('Cannot retrieve stream after it has already been moved'); + } + + if ($this->stream instanceof StreamInterface) { + return $this->stream; + } + + $this->stream = new Stream($this->file); + return $this->stream; + } + + /** + * {@inheritdoc} + * + * @see http://php.net/is_uploaded_file + * @see http://php.net/move_uploaded_file + * @param string $targetPath Path to which to move the uploaded file. + * @throws \RuntimeException if the upload was not successful. + * @throws \InvalidArgumentException if the $path specified is invalid. + * @throws \RuntimeException on any error during the move operation, or on + * the second or subsequent call to the method. + */ + public function moveTo($targetPath) + { + if ($this->moved) { + throw new RuntimeException('Cannot move file; already moved!'); + } + + if ($this->error !== UPLOAD_ERR_OK) { + throw new RuntimeException(sprintf( + 'Cannot retrieve stream due to upload error: %s', + self::ERROR_MESSAGES[$this->error] + )); + } + + if (! is_string($targetPath) || empty($targetPath)) { + throw new InvalidArgumentException( + 'Invalid path provided for move operation; must be a non-empty string' + ); + } + + $targetDirectory = dirname($targetPath); + if (! is_dir($targetDirectory) || ! is_writable($targetDirectory)) { + throw new RuntimeException(sprintf( + 'The target directory `%s` does not exists or is not writable', + $targetDirectory + )); + } + + $sapi = PHP_SAPI; + switch (true) { + case (empty($sapi) || 0 === strpos($sapi, 'cli') || ! $this->file): + // Non-SAPI environment, or no filename present + $this->writeFile($targetPath); + break; + default: + // SAPI environment, with file present + if (false === move_uploaded_file($this->file, $targetPath)) { + throw new RuntimeException('Error occurred while moving uploaded file'); + } + break; + } + + $this->moved = true; + } + + /** + * {@inheritdoc} + * + * @return int|null The file size in bytes or null if unknown. + */ + public function getSize() + { + return $this->size; + } + + /** + * {@inheritdoc} + * + * @see http://php.net/manual/en/features.file-upload.errors.php + * @return int One of PHP's UPLOAD_ERR_XXX constants. + */ + public function getError() + { + return $this->error; + } + + /** + * {@inheritdoc} + * + * @return string|null The filename sent by the client or null if none + * was provided. + */ + public function getClientFilename() + { + return $this->clientFilename; + } + + /** + * {@inheritdoc} + */ + public function getClientMediaType() + { + return $this->clientMediaType; + } + + /** + * Write internal stream to given path + * + * @param string $path + */ + private function writeFile($path) + { + $handle = fopen($path, 'wb+'); + if (false === $handle) { + throw new RuntimeException('Unable to write to designated path'); + } + + $stream = $this->getStream(); + $stream->rewind(); + while (! $stream->eof()) { + fwrite($handle, $stream->read(4096)); + } + + fclose($handle); + } +} diff --git a/vendor/zendframework/zend-diactoros/src/Uri.php b/vendor/zendframework/zend-diactoros/src/Uri.php new file mode 100644 index 000000000..5dcfb0e23 --- /dev/null +++ b/vendor/zendframework/zend-diactoros/src/Uri.php @@ -0,0 +1,706 @@ + 80, + 'https' => 443, + ]; + + /** + * @var string + */ + private $scheme = ''; + + /** + * @var string + */ + private $userInfo = ''; + + /** + * @var string + */ + private $host = ''; + + /** + * @var int + */ + private $port; + + /** + * @var string + */ + private $path = ''; + + /** + * @var string + */ + private $query = ''; + + /** + * @var string + */ + private $fragment = ''; + + /** + * generated uri string cache + * @var string|null + */ + private $uriString; + + /** + * @param string $uri + * @throws InvalidArgumentException on non-string $uri argument + */ + public function __construct($uri = '') + { + if ('' === $uri) { + return; + } + + if (! is_string($uri)) { + throw new InvalidArgumentException(sprintf( + 'URI passed to constructor must be a string; received "%s"', + is_object($uri) ? get_class($uri) : gettype($uri) + )); + } + + $this->parseUri($uri); + } + + /** + * Operations to perform on clone. + * + * Since cloning usually is for purposes of mutation, we reset the + * $uriString property so it will be re-calculated. + */ + public function __clone() + { + $this->uriString = null; + } + + /** + * {@inheritdoc} + */ + public function __toString() + { + if (null !== $this->uriString) { + return $this->uriString; + } + + $this->uriString = static::createUriString( + $this->scheme, + $this->getAuthority(), + $this->getPath(), // Absolute URIs should use a "/" for an empty path + $this->query, + $this->fragment + ); + + return $this->uriString; + } + + /** + * {@inheritdoc} + */ + public function getScheme() + { + return $this->scheme; + } + + /** + * {@inheritdoc} + */ + public function getAuthority() + { + if ('' === $this->host) { + return ''; + } + + $authority = $this->host; + if ('' !== $this->userInfo) { + $authority = $this->userInfo . '@' . $authority; + } + + if ($this->isNonStandardPort($this->scheme, $this->host, $this->port)) { + $authority .= ':' . $this->port; + } + + return $authority; + } + + /** + * Retrieve the user-info part of the URI. + * + * This value is percent-encoded, per RFC 3986 Section 3.2.1. + * + * {@inheritdoc} + */ + public function getUserInfo() + { + return $this->userInfo; + } + + /** + * {@inheritdoc} + */ + public function getHost() + { + return $this->host; + } + + /** + * {@inheritdoc} + */ + public function getPort() + { + return $this->isNonStandardPort($this->scheme, $this->host, $this->port) + ? $this->port + : null; + } + + /** + * {@inheritdoc} + */ + public function getPath() + { + return $this->path; + } + + /** + * {@inheritdoc} + */ + public function getQuery() + { + return $this->query; + } + + /** + * {@inheritdoc} + */ + public function getFragment() + { + return $this->fragment; + } + + /** + * {@inheritdoc} + */ + public function withScheme($scheme) + { + if (! is_string($scheme)) { + throw new InvalidArgumentException(sprintf( + '%s expects a string argument; received %s', + __METHOD__, + is_object($scheme) ? get_class($scheme) : gettype($scheme) + )); + } + + $scheme = $this->filterScheme($scheme); + + if ($scheme === $this->scheme) { + // Do nothing if no change was made. + return $this; + } + + $new = clone $this; + $new->scheme = $scheme; + + return $new; + } + + /** + * Create and return a new instance containing the provided user credentials. + * + * The value will be percent-encoded in the new instance, but with measures + * taken to prevent double-encoding. + * + * {@inheritdoc} + */ + public function withUserInfo($user, $password = null) + { + if (! is_string($user)) { + throw new InvalidArgumentException(sprintf( + '%s expects a string user argument; received %s', + __METHOD__, + is_object($user) ? get_class($user) : gettype($user) + )); + } + if (null !== $password && ! is_string($password)) { + throw new InvalidArgumentException(sprintf( + '%s expects a string or null password argument; received %s', + __METHOD__, + is_object($password) ? get_class($password) : gettype($password) + )); + } + + $info = $this->filterUserInfoPart($user); + if (null !== $password) { + $info .= ':' . $this->filterUserInfoPart($password); + } + + if ($info === $this->userInfo) { + // Do nothing if no change was made. + return $this; + } + + $new = clone $this; + $new->userInfo = $info; + + return $new; + } + + /** + * {@inheritdoc} + */ + public function withHost($host) + { + if (! is_string($host)) { + throw new InvalidArgumentException(sprintf( + '%s expects a string argument; received %s', + __METHOD__, + is_object($host) ? get_class($host) : gettype($host) + )); + } + + if ($host === $this->host) { + // Do nothing if no change was made. + return $this; + } + + $new = clone $this; + $new->host = strtolower($host); + + return $new; + } + + /** + * {@inheritdoc} + */ + public function withPort($port) + { + if ($port !== null) { + if (! is_numeric($port) || is_float($port)) { + throw new InvalidArgumentException(sprintf( + 'Invalid port "%s" specified; must be an integer, an integer string, or null', + is_object($port) ? get_class($port) : gettype($port) + )); + } + + $port = (int) $port; + } + + if ($port === $this->port) { + // Do nothing if no change was made. + return $this; + } + + if ($port !== null && ($port < 1 || $port > 65535)) { + throw new InvalidArgumentException(sprintf( + 'Invalid port "%d" specified; must be a valid TCP/UDP port', + $port + )); + } + + $new = clone $this; + $new->port = $port; + + return $new; + } + + /** + * {@inheritdoc} + */ + public function withPath($path) + { + if (! is_string($path)) { + throw new InvalidArgumentException( + 'Invalid path provided; must be a string' + ); + } + + if (strpos($path, '?') !== false) { + throw new InvalidArgumentException( + 'Invalid path provided; must not contain a query string' + ); + } + + if (strpos($path, '#') !== false) { + throw new InvalidArgumentException( + 'Invalid path provided; must not contain a URI fragment' + ); + } + + $path = $this->filterPath($path); + + if ($path === $this->path) { + // Do nothing if no change was made. + return $this; + } + + $new = clone $this; + $new->path = $path; + + return $new; + } + + /** + * {@inheritdoc} + */ + public function withQuery($query) + { + if (! is_string($query)) { + throw new InvalidArgumentException( + 'Query string must be a string' + ); + } + + if (strpos($query, '#') !== false) { + throw new InvalidArgumentException( + 'Query string must not include a URI fragment' + ); + } + + $query = $this->filterQuery($query); + + if ($query === $this->query) { + // Do nothing if no change was made. + return $this; + } + + $new = clone $this; + $new->query = $query; + + return $new; + } + + /** + * {@inheritdoc} + */ + public function withFragment($fragment) + { + if (! is_string($fragment)) { + throw new InvalidArgumentException(sprintf( + '%s expects a string argument; received %s', + __METHOD__, + is_object($fragment) ? get_class($fragment) : gettype($fragment) + )); + } + + $fragment = $this->filterFragment($fragment); + + if ($fragment === $this->fragment) { + // Do nothing if no change was made. + return $this; + } + + $new = clone $this; + $new->fragment = $fragment; + + return $new; + } + + /** + * Parse a URI into its parts, and set the properties + * + * @param string $uri + */ + private function parseUri($uri) + { + $parts = parse_url($uri); + + if (false === $parts) { + throw new \InvalidArgumentException( + 'The source URI string appears to be malformed' + ); + } + + $this->scheme = isset($parts['scheme']) ? $this->filterScheme($parts['scheme']) : ''; + $this->userInfo = isset($parts['user']) ? $this->filterUserInfoPart($parts['user']) : ''; + $this->host = isset($parts['host']) ? strtolower($parts['host']) : ''; + $this->port = isset($parts['port']) ? $parts['port'] : null; + $this->path = isset($parts['path']) ? $this->filterPath($parts['path']) : ''; + $this->query = isset($parts['query']) ? $this->filterQuery($parts['query']) : ''; + $this->fragment = isset($parts['fragment']) ? $this->filterFragment($parts['fragment']) : ''; + + if (isset($parts['pass'])) { + $this->userInfo .= ':' . $parts['pass']; + } + } + + /** + * Create a URI string from its various parts + * + * @param string $scheme + * @param string $authority + * @param string $path + * @param string $query + * @param string $fragment + * @return string + */ + private static function createUriString($scheme, $authority, $path, $query, $fragment) + { + $uri = ''; + + if ('' !== $scheme) { + $uri .= sprintf('%s:', $scheme); + } + + if ('' !== $authority) { + $uri .= '//' . $authority; + } + + if ('' !== $path && '/' !== substr($path, 0, 1)) { + $path = '/' . $path; + } + + $uri .= $path; + + + if ('' !== $query) { + $uri .= sprintf('?%s', $query); + } + + if ('' !== $fragment) { + $uri .= sprintf('#%s', $fragment); + } + + return $uri; + } + + /** + * Is a given port non-standard for the current scheme? + * + * @param string $scheme + * @param string $host + * @param int $port + * @return bool + */ + private function isNonStandardPort($scheme, $host, $port) + { + if ('' === $scheme) { + return '' === $host || null !== $port; + } + + if ('' === $host || null === $port) { + return false; + } + + return ! isset($this->allowedSchemes[$scheme]) || $port !== $this->allowedSchemes[$scheme]; + } + + /** + * Filters the scheme to ensure it is a valid scheme. + * + * @param string $scheme Scheme name. + * + * @return string Filtered scheme. + */ + private function filterScheme($scheme) + { + $scheme = strtolower($scheme); + $scheme = preg_replace('#:(//)?$#', '', $scheme); + + if ('' === $scheme) { + return ''; + } + + if (! isset($this->allowedSchemes[$scheme])) { + throw new InvalidArgumentException(sprintf( + 'Unsupported scheme "%s"; must be any empty string or in the set (%s)', + $scheme, + implode(', ', array_keys($this->allowedSchemes)) + )); + } + + return $scheme; + } + + /** + * Filters a part of user info in a URI to ensure it is properly encoded. + * + * @param string $part + * @return string + */ + private function filterUserInfoPart($part) + { + // Note the addition of `%` to initial charset; this allows `|` portion + // to match and thus prevent double-encoding. + return preg_replace_callback( + '/(?:[^%' . self::CHAR_UNRESERVED . self::CHAR_SUB_DELIMS . ']+|%(?![A-Fa-f0-9]{2}))/u', + [$this, 'urlEncodeChar'], + $part + ); + } + + /** + * Filters the path of a URI to ensure it is properly encoded. + * + * @param string $path + * @return string + */ + private function filterPath($path) + { + $path = preg_replace_callback( + '/(?:[^' . self::CHAR_UNRESERVED . ')(:@&=\+\$,\/;%]+|%(?![A-Fa-f0-9]{2}))/u', + [$this, 'urlEncodeChar'], + $path + ); + + if ('' === $path) { + // No path + return $path; + } + + if ($path[0] !== '/') { + // Relative path + return $path; + } + + // Ensure only one leading slash, to prevent XSS attempts. + return '/' . ltrim($path, '/'); + } + + /** + * Filter a query string to ensure it is propertly encoded. + * + * Ensures that the values in the query string are properly urlencoded. + * + * @param string $query + * @return string + */ + private function filterQuery($query) + { + if ('' !== $query && strpos($query, '?') === 0) { + $query = substr($query, 1); + } + + $parts = explode('&', $query); + foreach ($parts as $index => $part) { + list($key, $value) = $this->splitQueryValue($part); + if ($value === null) { + $parts[$index] = $this->filterQueryOrFragment($key); + continue; + } + $parts[$index] = sprintf( + '%s=%s', + $this->filterQueryOrFragment($key), + $this->filterQueryOrFragment($value) + ); + } + + return implode('&', $parts); + } + + /** + * Split a query value into a key/value tuple. + * + * @param string $value + * @return array A value with exactly two elements, key and value + */ + private function splitQueryValue($value) + { + $data = explode('=', $value, 2); + if (! isset($data[1])) { + $data[] = null; + } + return $data; + } + + /** + * Filter a fragment value to ensure it is properly encoded. + * + * @param string $fragment + * @return string + */ + private function filterFragment($fragment) + { + if ('' !== $fragment && strpos($fragment, '#') === 0) { + $fragment = '%23' . substr($fragment, 1); + } + + return $this->filterQueryOrFragment($fragment); + } + + /** + * Filter a query string key or value, or a fragment. + * + * @param string $value + * @return string + */ + private function filterQueryOrFragment($value) + { + return preg_replace_callback( + '/(?:[^' . self::CHAR_UNRESERVED . self::CHAR_SUB_DELIMS . '%:@\/\?]+|%(?![A-Fa-f0-9]{2}))/u', + [$this, 'urlEncodeChar'], + $value + ); + } + + /** + * URL encode a character returned by a regex. + * + * @param array $matches + * @return string + */ + private function urlEncodeChar(array $matches) + { + return rawurlencode($matches[0]); + } +} diff --git a/vendor/zendframework/zend-diactoros/src/functions/create_uploaded_file.php b/vendor/zendframework/zend-diactoros/src/functions/create_uploaded_file.php new file mode 100644 index 000000000..7b41a425e --- /dev/null +++ b/vendor/zendframework/zend-diactoros/src/functions/create_uploaded_file.php @@ -0,0 +1,40 @@ + $value) { + // Apache prefixes environment variables with REDIRECT_ + // if they are added by rewrite rules + if (strpos($key, 'REDIRECT_') === 0) { + $key = substr($key, 9); + + // We will not overwrite existing variables with the + // prefixed versions, though + if (array_key_exists($key, $server)) { + continue; + } + } + + if ($value && strpos($key, 'HTTP_') === 0) { + $name = strtr(strtolower(substr($key, 5)), '_', '-'); + $headers[$name] = $value; + continue; + } + + if ($value && strpos($key, 'CONTENT_') === 0) { + $name = 'content-' . strtolower(substr($key, 8)); + $headers[$name] = $value; + continue; + } + } + + return $headers; +} diff --git a/vendor/zendframework/zend-diactoros/src/functions/marshal_method_from_sapi.php b/vendor/zendframework/zend-diactoros/src/functions/marshal_method_from_sapi.php new file mode 100644 index 000000000..c666e4e0a --- /dev/null +++ b/vendor/zendframework/zend-diactoros/src/functions/marshal_method_from_sapi.php @@ -0,0 +1,19 @@ +[1-9]\d*(?:\.\d)?)$#', $server['SERVER_PROTOCOL'], $matches)) { + throw new UnexpectedValueException(sprintf( + 'Unrecognized protocol version (%s)', + $server['SERVER_PROTOCOL'] + )); + } + + return $matches['version']; +} diff --git a/vendor/zendframework/zend-diactoros/src/functions/marshal_uri_from_sapi.php b/vendor/zendframework/zend-diactoros/src/functions/marshal_uri_from_sapi.php new file mode 100644 index 000000000..decaafb83 --- /dev/null +++ b/vendor/zendframework/zend-diactoros/src/functions/marshal_uri_from_sapi.php @@ -0,0 +1,212 @@ +withScheme($scheme); + + // Set the host + list($host, $port) = $marshalHostAndPort($headers, $server); + if (! empty($host)) { + $uri = $uri->withHost($host); + if (! empty($port)) { + $uri = $uri->withPort($port); + } + } + + // URI path + $path = $marshalRequestPath($server); + + // Strip query string + $path = explode('?', $path, 2)[0]; + + // URI query + $query = ''; + if (isset($server['QUERY_STRING'])) { + $query = ltrim($server['QUERY_STRING'], '?'); + } + + // URI fragment + $fragment = ''; + if (strpos($path, '#') !== false) { + list($path, $fragment) = explode('#', $path, 2); + } + + return $uri + ->withPath($path) + ->withFragment($fragment) + ->withQuery($query); +} diff --git a/vendor/zendframework/zend-diactoros/src/functions/normalize_server.php b/vendor/zendframework/zend-diactoros/src/functions/normalize_server.php new file mode 100644 index 000000000..2db4a4a01 --- /dev/null +++ b/vendor/zendframework/zend-diactoros/src/functions/normalize_server.php @@ -0,0 +1,51 @@ + $value) { + if (is_array($value)) { + // Traverse + $normalized[$key] = $recursiveNormalize( + $tmpNameTree[$key], + $sizeTree[$key], + $errorTree[$key], + isset($nameTree[$key]) ? $nameTree[$key] : null, + isset($typeTree[$key]) ? $typeTree[$key] : null + ); + continue; + } + $normalized[$key] = createUploadedFile([ + 'tmp_name' => $tmpNameTree[$key], + 'size' => $sizeTree[$key], + 'error' => $errorTree[$key], + 'name' => isset($nameTree[$key]) ? $nameTree[$key] : null, + 'type' => isset($typeTree[$key]) ? $typeTree[$key] : null + ]); + } + return $normalized; + }; + + /** + * Normalize an array of file specifications. + * + * Loops through all nested files (as determined by receiving an array to the + * `tmp_name` key of a `$_FILES` specification) and returns a normalized array + * of UploadedFile instances. + * + * This function normalizes a `$_FILES` array representing a nested set of + * uploaded files as produced by the php-fpm SAPI, CGI SAPI, or mod_php + * SAPI. + * + * @param array $files + * @return UploadedFile[] + */ + $normalizeUploadedFileSpecification = function (array $files = []) use (&$recursiveNormalize) { + if (! isset($files['tmp_name']) || ! is_array($files['tmp_name']) + || ! isset($files['size']) || ! is_array($files['size']) + || ! isset($files['error']) || ! is_array($files['error']) + ) { + throw new InvalidArgumentException(sprintf( + '$files provided to %s MUST contain each of the keys "tmp_name",' + . ' "size", and "error", with each represented as an array;' + . ' one or more were missing or non-array values', + __FUNCTION__ + )); + } + + return $recursiveNormalize( + $files['tmp_name'], + $files['size'], + $files['error'], + isset($files['name']) ? $files['name'] : null, + isset($files['type']) ? $files['type'] : null + ); + }; + + $normalized = []; + foreach ($files as $key => $value) { + if ($value instanceof UploadedFileInterface) { + $normalized[$key] = $value; + continue; + } + + if (is_array($value) && isset($value['tmp_name']) && is_array($value['tmp_name'])) { + $normalized[$key] = $normalizeUploadedFileSpecification($value); + continue; + } + + if (is_array($value) && isset($value['tmp_name'])) { + $normalized[$key] = createUploadedFile($value); + continue; + } + + if (is_array($value)) { + $normalized[$key] = normalizeUploadedFiles($value); + continue; + } + + throw new InvalidArgumentException('Invalid value in files specification'); + } + return $normalized; +} diff --git a/vendor/zendframework/zend-diactoros/src/functions/parse_cookie_header.php b/vendor/zendframework/zend-diactoros/src/functions/parse_cookie_header.php new file mode 100644 index 000000000..b3b565147 --- /dev/null +++ b/vendor/zendframework/zend-diactoros/src/functions/parse_cookie_header.php @@ -0,0 +1,41 @@ +[!#$%&\'*+-.0-9A-Z^_`a-z|~]+) + = + (?P"?) + (?P[\x21\x23-\x2b\x2d-\x3a\x3c-\x5b\x5d-\x7e]*) + (?P=DQUOTE) + (?=\\n?[ \t]*$|;[ ]) + )x', $cookieHeader, $matches, PREG_SET_ORDER); + + $cookies = []; + + foreach ($matches as $match) { + $cookies[$match['name']] = urldecode($match['value']); + } + + return $cookies; +}